场景导入
目前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安装。该方式对于大规模部署及容器等环境极为适用。
如若转载,请注明原文地址