IAST技術知識-Java環境Agent部署知識乾貨分享
場景匯入
目前 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 千方百計|IAST-Java環境Agent部署知識乾貨分享ASTJava
- 乾貨 | 知識圖譜的技術與應用
- 移動端開發乾貨知識分享
- 科普乾貨IT知識,Java的常見異常有哪些?Java
- 【知識分享】
- [NLP] 知識抽取技術
- [乾貨] 線段樹知識點總結
- 好程式設計師Java教程分享Java技術知識點總結程式設計師Java
- 【知識分享】如何去部署伺服器伺服器
- 前端開發 JavaScript 乾貨知識點彙總前端JavaScript
- 乾貨丨機器學習知識點(人工智慧篇)機器學習人工智慧
- 乾貨:計算機網路知識總結計算機網路
- 微機原理與介面技術知識點整理複習--純手打--純乾貨--
- Elasticsearch必知必會的乾貨知識二:ES索引操作技巧Elasticsearch索引
- Java個人技術知識點總結(框架篇)Java框架
- java面試需要掌握知識點|掘金技術徵文Java面試
- kafka知識整理——部署Kafka
- 全方位掌握OpenStack技術知識
- 【技術性】OO語言知識
- 藍芽Bluetooth技術小知識藍芽
- 知識分享--雲原生
- 知識分享--架構架構
- Flutter環境配置 + 基礎知識瞭解Flutter
- Java個人技術知識點總結(優化篇)Java優化
- Java知識拾遺:三大框架的技術起源Java框架
- Java知識整理Java
- 初識Java Java基礎知識Java
- 雲託管知識分享季,技術共創得獎勵
- 技術分享丨華為鯤鵬架構Redis知識二三事架構Redis
- 知識圖譜技術的新成果—KGB知識圖譜介紹
- 【知識分享】 伺服器基礎知識【初學者必看】伺服器
- 期貨期權知識
- 非常硬核的技術知識-CopyOnWrite思想
- 知識抽取簡述|得物技術
- Java個人技術知識點總結(資料庫篇)Java資料庫
- Java個人技術知識點總結(最佳化篇)Java
- Java個人技術知識點總結(業務場景篇)Java
- Java核心技術 卷1 基礎知識 部分筆記Java筆記