IAST技術知識-Java環境Agent部署知識乾貨分享

杭州孝道科技發表於2022-06-10

場景匯入

目前 IAST應用環境中,Java應用佔據了90%以上。傳統IAST對Java應用進行Agent安裝時,需要修改Tomcat、WebLogic等的啟動指令碼,增加javaagent引數來實現Agent的安裝載入。


對於安裝人員來說, Agent安裝需要知悉Web容器的安裝路徑,並且需要對每個容器的啟動指令碼進行修改,最後重啟Web容器,完成Agent的安裝。

在實際的使用過程中,部署人員常常由於指令碼修改不當、找不到 Web容器等問題導致安裝失敗。除此之外,當團隊需要對幾百上千個應用進行安裝測試時,對安裝人員來說將是一項異常艱鉅的任務。此外,若後期需要對Agent進行升級或者解除安裝操作也將是一場運維災難。


Agent 部署技術基礎

JDK從1.5版本開始引入了 java.lang.instrument 包,可以通過其更方便地實現位元組碼增強。核心功能由 java.lang.instrument.Instrumentation 提供,這個介面的方法提供了註冊類檔案轉換器、獲取所有已載入的類等功能,允許對已載入和未載入的類進行修改。

JDK5中,開發人員只能在JVM啟動時指定一個java agent,在premain中操作位元組碼,這種Instrumentaion方式僅限於main方法執行前,存在很大的侷限性。從JDK6開始引入了動態 Attach Agen t的方案,可以在JVM啟動後任意時刻遠端載入Agent,jstack、jps、jmap等工具都是利用Attach API來實現的。

Instrumentation的第一種使用方式是通過JVM的啟動引數-javaagent來啟動,一個典型的使用方式如下所示:

 

SecPoint.jar中,AgentMain類有一個靜態的premain方法,JVM在類載入時會先執行AgentMain類的premain方法,再執行Java應用本身的main方法。在premain方法中可以對class檔案進行修改。這種位元組碼修改的方式並不會對原始碼做任何修改,但是可以實現對JVM中的類的動態修改和增強,從而捕獲應用程式的資料傳播過程。

Instrumentation的第二種方式是在JVM執行以後在任意時刻通過Attach API遠端載入Agent的jar包。在啟動時載入的Agent會呼叫premain方法,動態Attach的Agent會執行agentmain方法。Attach的發起端是一個獨立的java程式,這個java程式會呼叫`VirtualMachine.attach`方法開始和目標JVM進行跨程式通訊,從而實現位元組碼增強。

安全玻璃盒經驗

目前,【安全玻璃盒】孝道科技IAST為了滿足真實場景下大規模部署的場景,針對Java Agent的安裝方式做了多種方式的功能實現,使得使用者能夠根據實際需求靈活選擇部署方式,儘可能將Agent安裝過程自動化,減輕部署及後續運維的工作量。

1. 手動java agent部署

這種方式即為傳統的javaagent部署方式,首先需要將Agent下載至應用伺服器中,之後修改對應Web容器的啟動指令碼(例如,tomcat需要修catalina.sh或者catalina.bat),在指定位置新增javaagent等引數後重啟容器即可完成安裝部署。

2. 自動java agent 部署

該方式由安裝人員或者在後臺指定Web容器的位置,並Agent下載至應用伺服器後,通過使用“install”引數啟動Agent後,將自動修改Web容器啟動指令碼中的啟動指令碼,在其中新增對應的引數。例如:

 


3. Attach 部署

Attach部署方式需要JDK6以上版本,並且需要伺服器中具備JDK環境(JRE不包含tools.jar和attach.so)。將Agent下載至應用伺服器後,通過啟動Agent並選擇需要繫結的java程式,即可針對指定java服務完成Agent安裝部署。

 

 

4. 一鍵指令碼部署

自動化指令碼的方式能夠通過統一的指令碼實現對不同應用環境的 Java服務進行Agent部署安裝,當在應用伺服器執行指令碼後,能夠自動從後臺伺服器下載Agent至伺服器中,並自動對java進行進行Attach安裝。該方式對於大規模部署及容器等環境極為適用。

關注【安全玻璃盒】公眾號,獲取更多安全知識!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70001305/viewspace-2899935/,如需轉載,請註明出處,否則將追究法律責任。

相關文章