原创 Starting A9 Team 2022-02-18 22:25
    1、前言
    在过去一年中,我司三个入选试点的系统顺利通过由中国信息通信研究院开展的《研发运营一体化(DevOps)能力成熟度模型》持续交付3级评估,落实数字化敏捷研发管理体系,获得了业界的认可,同时把DevOps能力域逐步推广到其他系统。本文介绍我司在DevSecOps实践中,交互式应用程序安全检测(IAST)的建设,欢迎各位大佬拍砖。

    2、背景
    在2014年Gartner提出的十大信息安全技术中,提出了交互式应用程序安全测试(IAST)。概念的前瞻性随着科技的发展和时代的变化,IAST逐渐成为安全领域中重要的一环。
    Gartner副总裁兼院士级分析师Neil MacDonald表示:“企业正投入越来越多的资源以应对信息安全与风险。尽管如此,攻击的频率与精密度却越来越高。高阶锁定目标的攻击与软件中的安全漏洞,让移动化、云端、社交与大数据所产生的“力量连结(Nexus of Forces)”在创造全新商机的同时也带来了更多令人头疼的破坏性问题。伴随着力量连结商机而来的是风险。负责信息安全与风险的领导者们必须全面掌握最新的科技趋势,才能规划、达成以及维护有效的信息安全与风险管理项目,同时实现商机并管理好风险。”

    3、现状
    交互式应用程序安全检测(IAST)已完全实现接入DevOps流水线,采用悬镜灵脉IAST灰盒安全测试平台,实现集自动化测试、人工测试、自动化检测于一体,多语言多场景的覆盖,不仅局限于传统开发方式,还包含云原生,配合微服务进行改造。采用动态污点追踪被动插桩模式,解决传统应用安全测试过程中重放数据包产生的脏数据问题,支持企业内部严控网络测试流量和移动应用数据包加密场景。

    4、实践
    4.1、介绍
    交互式应用程序安全测试(IAST)将静态应用程序安全测试(SAST)与动态应用程序安全测试(DAST)技术进行结合。其目的是要通过SAST与DAST技术之间的互动以提升应用程序安全测试的准确度。IAST集合了SAST与DAST最好的优点于一单一解决方案。有了这套方法,就能确认或排除已侦测到的漏洞是否可能遭到攻击,并判断漏洞来源在应用程序代码中的位置。

    4.2、原理
    IAST具有极高的漏洞检出率和极低的漏洞误报率,跟踪到漏洞接口与对应的代码片段,嵌入DevSecOps中实现自动化检测。
    插桩模式,通过下载对应挂载agent,跟随应用同步启动,无论是自动化API测试或者人工测试,探针都能获取对应的请求、代码数据流、代码控制流,基于以上进行综合判断,准确定位到漏洞所在的代码文件、行数、函数及参数。

    DevSecOps:交互式应用安全测试集成实践 - 图1

    采用基于动态污点追踪的运行时应用插桩技术,在应用程序运行过程中实时跟踪监控并记录程序变量、寄存器和内存等的值,确定污点数据能否从污点源传播到污点汇聚点。动态污点追踪技术能够比较准确地获得应用程序执行过程中各变量和存储单元的状态,可以获得更多的程序运行实时的上下文信息,这极大的方便了检测时对各类数据分析的全面需求,可以更好的进行一些普通黑盒或者白盒不能完成的漏洞检测。

    4.3、优势
    l 精确性高,标记请求参数,污点标记跟踪,误报率高,同时还支持漏洞重现验证,提高安全人员工作效率。
    l 自动化程序高,可通过流水线结合调用,整个过程无需安全人员介入,无需额外安全测试时间投入,不会对现有开发流程造成任何影响,符合敏捷开发和 DevOps 模式下软件产品快速迭代、快速交付的要求。
    l 侵入性低,通过rancher容器部署采用sidecar方式,无须引入agent至应用中,保证了应用在测试与生产的一致性。
    l 配合API测试以及人工测试,完整覆盖测试用例,全面测试,避免因安全扫描不全面而遗漏存在的问题。

    4.4、落地
    4.4.1、传统部署(Ansible)
    4.4.1.1、流程图

    DevSecOps:交互式应用安全测试集成实践 - 图2

    4.4.1.2、流程简介
    1)下载agent,传递所需参数到playbook.yaml文件中
    2)在应用进行API自动化测试或者手工测试时,自动进行安全扫描,无需任何操作
    3)获取扫描结果,判断是否通过阈值;通过进行下一步,未通过流水线失败
    4)下载扫描报告,存放至对应位置,同步上传至上线流程

    4.4.1.2、相关配置
    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 参数之前,否则很可能无法加载。

    4.4.2、容器部署(Rancher\Kubernetes)
    4.4.2.1、流程图

    DevSecOps:交互式应用安全测试集成实践 - 图3

    4.4.2.2、流程简介
    1)修改yaml文件或者配置sidecar,实现agent挂载
    2)在应用进行API自动化测试或者手工测试时,自动进行安全扫描,无需任何操作
    3)获取扫描结果,判断是否通过阈值;通过进行下一步,未通过流水线失败
    4)下载扫描报告,存放至对应位置,同步上传至上线流程

    4.4.2.2、相关配置
    1)修改yaml文件
    l 添加env指定环境变量

    spec:
    containers:
    - name: model-one
    image: {{imageName}}
    imagePullPolicy: Always
    env:
    - name: envName
    value: {{envName}}
    - name: iastProjectName
    value: {{iastProjectName}}
    - name: iastNodeName
    value: {{iastNodeName}}

    l 主容器挂载

    volumeMounts:
    # 指定数据卷
    - mountPath: /home/appuser/.xmirror #主容器数据卷的挂载路径,此处以appuser用户为例子,如果是root用户,可以修改为/root/.xmirror
    name: iast-agent-vol #主容器挂载卷名必须与初始化容器挂载卷名一致

    l 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 参数之前,否则很可能无法加载。

    5、相关资料
    安信证券再获 DevOps持续交付3+级水平认证
    https://www.essence.com.cn/news/2451241?columnId=003004
    悬镜周幸讲解《云原生下的IAST落地实践》
    IAST技术分享系列