場景導入目前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 Agent的方案,可以在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安裝。該方式對於大規模部署及容器等環境極為適用。