查看原文
其他

最佳实践 | 安信证券:完美结合悬镜灵脉IAST形成DevSecOps解决方案

悬镜安全 2022-12-29

The following article is from A9 Team Author Starting


   摘要   



“客户就是我们的超级产品经理”,本文来自安信证券安全团队A9 Team的真实声音,让我们一同了解安信证券的DevSecOps最佳实践。


   背景   



在2014年Gartner提出的十大信息安全技术中,提出了交互式应用程序安全测试(IAST)。概念的前瞻性随着科技的发展和时代的变化,IAST逐渐成为安全领域中重要的一环。

Gartner副总裁兼院士级分析师Neil MacDonald表示:“企业正投入越来越多的资源以应对信息安全与风险。尽管如此,攻击的频率与精密度却越来越高。高阶锁定目标的攻击与软件中的安全漏洞,让移动化、云端、社交与大数据所产生的“力量连结(Nexus of Forces)”在创造全新商机的同时也带来了更多令人头疼的破坏性问题。

伴随着力量连结商机而来的是风险。负责信息安全与风险的领导者们必须全面掌握最新的科技趋势,才能规划、达成以及维护有效的信息安全与风险管理项目,同时实现商机并管理好风险。”


   现状   



交互式应用程序安全检测(IAST)已完全实现接入DevOps流水线,采用悬镜灵脉IAST灰盒安全测试平台,实现集自动化测试、人工测试、自动化检测于一体,多语言多场景的覆盖,不仅局限于传统开发方式,还包含云原生,配合微服务进行改造。


采用动态污点追踪被动插桩模式,解决传统应用安全测试过程中重放数据包产生的脏数据问题,支持企业内部严控网络测试流量和移动应用数据包加密场景。


   实践   



一、介绍


交互式应用程序安全测试(IAST)将静态应用程序安全测试(SAST)与动态应用程序安全测试(DAST)技术进行结合。其目的是要通过SAST与DAST技术之间的互动以提升应用程序安全测试的准确度。


IAST集合了SAST与DAST最好的优点于一单一解决方案。有了这套方法,就能确认或排除已侦测到的漏洞是否可能遭到攻击,并判断漏洞来源在应用程序代码中的位置。


二、原理


IAST具有极高的漏洞检出率和极低的漏洞误报率,跟踪到漏洞接口与对应的代码片段,嵌入DevSecOps中实现自动化检测。

插桩模式,通过下载对应挂载agent,跟随应用同步启动,无论是自动化API测试或者人工测试,探针都能获取对应的请求、代码数据流、代码控制流,基于以上进行综合判断,准确定位到漏洞所在的代码文件、行数、函数及参数。



采用基于动态污点追踪的运行时应用插桩技术,在应用程序运行过程中实时跟踪监控并记录程序变量、寄存器和内存等的值,确定污点数据能否从污点源传播到污点汇聚点。


动态污点追踪技术能够比较准确地获得应用程序执行过程中各变量和存储单元的状态,可以获得更多的程序运行实时的上下文信息,这极大的方便了检测时对各类数据分析的全面需求,可以更好的进行一些普通黑盒或者白盒不能完成的漏洞检测。


三、优势

(1)精确性高,标记请求参数,污点标记跟踪,误报率高,同时还支持漏洞重现验证,提高安全人员工作效率;

(2)自动化程序高,可通过流水线结合调用,整个过程无需安全人员介入,无需额外安全测试时间投入,不会对现有开发流程造成任何影响,符合敏捷开发和 DevOps 模式下软件产品快速迭代、快速交付的要求;

(3)侵入性低,通过rancher容器部署采用sidecar方式,无须引入agent至应用中,保证了应用在测试与生产的一致性;

(4)配合API测试以及人工测试,完整覆盖测试用例,全面测试,避免因安全扫描不全面而遗漏存在的问题。


四、落地


1.  传统部署(Ansible)

1.1  流程图



1.2  流程简介


1.下载agent,传递所需参数到playbook.yaml文件中;


2.在应用进行API自动化测试或者手工测试时,自动进行安全扫描,无需任何操作;


3.获取扫描结果,判断是否通过阈值;通过进行下一步,未通过流水线失败;


4.下载扫描报告,存放至对应位置,同步上传至上线流程。


1.3  相关配置


(1)修改playbook.yaml文件


  • 添加下列代码


- hosts: "{{envName}}"

  vars:

    - envNamepath: /home/devops/model-one

    - iastProjectName: iastProjectName

    - iastNodeName: iastNodeName

  tasks:

    - name: deploy files

      shell: cd {{envNamepath}}/springboot && sudo chmod 777 ./start.sh && nohup ./start.sh {{iastProjectName}} {{iastNodeName}} {{envName}} &  #传递所需参数


(2)修改启动脚本


#!/bin/sh

IAST_OPTS=""

iastProjectName=$1

iastNodeName=$2

envName=$3

#Download IAST Agent

if [ "$envName" = "uat" ]; then

  #此示例使用appuser用户 请根据自身实际情况替换为应用用户

  mkdir /home/appuser/.xmirror

  curl -k https://[IP]/iast/static/node/java/agent.jar >> /home/appuser/.xmirror/agent.jar

  AGENT_PROFILE=" -javaagent:/home/appuser/.xmirror/agent.jar"

  IAST_OPTS=" $AGENT_PROFILE -Dxmiast.ip=[IP] -Dxmiast.port=[端口]-Dxmiast.projectname=$iastProjectName -Dxmiast.nodename=$iastNodeName -Dxmiast.writeconfig=false "

fi

 

将$IAST_OPTS加入启动命令中,示例如下

#start

java $SKYWALKING $IAST_OPTS $JAVA_OPTS $JAVA_MEM_OPTS $OOM_OPTS -jar app.jar &


注:请把 -javaagent 参数放在 -jar 参数之前,否则很可能无法加载。


2.  容器部署(Rancher\Kubernetes)

2.1  流程图



2.2  流程简介


(1)修改yaml文件


  • 添加env指定环境变量


spec:

  containers:

    - name: model-one

      image: {{imageName}}

      imagePullPolicy: Always

      env:

        - name: envName

          value: {{envName}}

         - name: iastProjectName

           value: {{iastProjectName}}

         - name: iastNodeName

           value: {{iastNodeName}}


  • 主容器挂载


volumeMounts:

  # 指定数据卷

  - mountPath: /home/appuser/.xmirror    #主容器数据卷的挂载路径,此处以appuser用户为例子,如果是root用户,可以修改为/root/.xmirror

    name: iast-agent-vol                 #主容器挂载卷名必须与初始化容器挂载卷名一致


  • Sidercar容器挂载


# 初始化容器,因为 pod 内的容器是共享存储和网络环境的,所以选择以这种方式来接入

initContainers:

  - image:[镜像]

      name: iast-agent

      volumeMounts:

          # 以临时卷的方式挂载,本质上是把这个目录共享给标准容器

          - mountPath: /root/.xmirror          #存放agent的路径

              name: iast-agent-vol               #此处初始化容器挂载卷名必须与主容器挂载卷名保持一致

volumes:

    - emptyDir: {}

         name: iast-agent-vol                   #此处是声明挂载卷类型,名字保持一致


(2)修改启动脚本


IAST_OPTS=""

if [ "$envName" = "uat" ]; then

  #此示例使用appuser用户 请根据自身实际情况替换为应用用户

  AGENT_PROFILE=" -javaagent:/home/appuser/.xmirror/agent.jar"

  IAST_OPTS="$AGENT_PROFILE -Dxmiast.ip=[IP] -Dxmiast.port=[端口]-Dxmiast.projectname=$iastProjectName -Dxmiast.nodename=$iastNodeName -Dxmiast.writeconfig=false "

fi


将$IAST_OPTS加入启动命令中,示例如下

#start

Java $SKYWALKING $IAST_OPTS $JAVA_OPTS $JAVA_MEM_OPTS $OOM_OPTS -jar app.jar &


注:请把 -javaagent 参数放在 -jar 参数之前,否则很可能无法加载。



推荐阅读

1. “IAST技术进阶系列(一):关键语言支持”

2. IAST 技术进阶系列(二):全场景多核驱动

3. IAST技术进阶系列(三):高并发&高可用场景支持

4. 技术分享 | 悬镜周幸讲解《云原生下的IAST落地实践》

5. 《中国DevOps现状调查报告》发布,悬镜 IAST 工具市场应用率第一


关于悬镜安全


悬镜安全,DevSecOps敏捷安全领导者。由北京大学网络安全技术研究团队“XMIRROR”发起创立,致力以AI技术赋能敏捷安全,专注于DevSecOps软件供应链持续威胁一体化检测防御。核心的DevSecOps智适应威胁管理解决方案包括以深度学习技术为核心的威胁建模、开源治理、风险发现、威胁模拟、检测响应等多个维度的自主创新产品及实战攻防对抗为特色的政企安全服务,为金融、能源、泛互联网、IoT、云服务及汽车制造等行业用户提供创新灵活的智适应安全管家解决方案。更多信息请访问悬镜安全官网:www.xmirror.cn


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存