这个牛逼的开源安全工具,让我成为运维“安全专家”。认识MurphySecurity这款开源漏洞检测工具,主要是因为前段时间的log4j2漏洞。最近我们公司频繁的研发上线,基本都是在修复log4j2的漏洞。我被他们惹恼了。就找他们研发的负责人商量一下,能不能集成一些自动化的工具,在上线前检测这类漏洞,比如log4j2或者fastjson之类的问题。经过一番调研,公司正好有几位研发开发人员在使用MurphySecurity的IDE插件。看到他还有一个可以集成到Jenkins的命令行工具,就试了一下,效果还不错。解决核心问题将代码安全检测能力集成到CI流程中,在代码打包前对代码进行安全扫描,保证公司代码库中项目的质量,同时也减轻项目发布压力。并且持续集成中的任何一个环节都是自动完成的,不需要过多的人工干预,有利于减少重复流程,节省时间和工作量。目前效果:Jenkins每次构建时,自动检测代码中的三方开源组件,识别漏洞配置规则。如果发现严重漏洞,构建结果将被中断并推送到飞书群。相关研发可以看集成过程1.Jenkinsfile在项目根目录下放一个Jenkinsfile文件(因为Jenkins是单节点的,为了防止机器故障导致数据丢失,Jenkinsfile文件会存放在项目中,不是在Jenkins机器上)**pipline内容:逻辑是代码拉下来后,通过MurphySecurityCLI检测代码,然后通过Linux工具jq分析检测到的数据。如果检测结果中存在“强烈建议修复”,则打包过程将被终止。pipeline{agent{label"xxxxx"}//指定在哪个节点上执行构建操作,这里指定执行节点的标签options{timestamps()//记录时间buildDiscarder(logRotator(numToKeepStr:'10'))//Onlykeep10buildhistorytimeout(time:1,unit:'HOURS')//流水线超时设置1h}stages{stage("pullcode"){//Pullcodestagesteps{script{gitcredentialsId:'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',url:'https://xxx.xxxxxx.com/xxxx/xxxxxxxxxxx.git'}}}stage("Test"){//在代码测试阶段,由于各种因素,公司的测试代码无法直接访问senttoSteps{sh'echo"buildproject"'}}stage("murphysecscan"){//MurphySecurityCLI检测阶段环境{API_TOKEN=credentials('murphysec-token')//{murphysec-token}是在Jenkins中创建的Murphy安全访问令牌凭证。默认情况下,Murphy安全CLI工具会将变量名{API_TOKEN}读取为它自己的{--token}参数}steps{sh'''NUM=`murphysec扫描。--serverhttp://xxx.xxxxx.com/--json|jq。|jq".comps|map(select(.show_level==1))|length"`if[$NUM-ne0];thenfalsefi'''}}stage("build"){//在代码构造中阶段,由于各种因素,公司的测试代码无法直接发送,参考步骤{sh'echo"buildproject"'}}stage("publishproject"){//在代码上传阶段,由于各种因素,公司的测试代码无法直接发送,参考步骤{sh'echo"publishproject"'}}}post{//构建后运行成功{//所有步骤执行成功后执行脚本。currentBuild.description="\n打包成功!"sh'''DATE=`date"+%Y-%m-%d_%H:%M:%S"`sh/usr/local/script/feishu.sh"Project:'$JOB_NAME'\\n结果:打包成功!感动发布过程\\nTime:'$DATE'\\nNode:'$NODE_NAME'"'''}}failure{//只要其中一个步骤执行失败就执行脚本{//feishu.sh脚本是一个simpleshell脚本,存放在构建机上,用于将构建返回的结果信息通过脚本发送给飞书群currentBuild.description="\n打包失败!"sh'''DATE=`date"+%Y-%m-%d_%H:%M:%S"`sh/usr/local/script/feishu.sh"项目:'$JOB_NAME'\\n结果:打包失败!\\n时间:'$DATE'\\n节点:'$NODE_NAME'\\n原因:项目中有组件强烈建议修复!"'''}}}}feishu.shcontent#!/bin/bash##调用飞书群机器人webhooks接口向群发信息api=https://open.feishu.cn/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcurl-XPOST\$api\-H'Content-Type:application/json'\-d'{"msg_type":"post","content":{"post":{"zh_cn":{"title":"Jenkins“,“内容”:[[{"tag":"text","un_escape":true,"text":"'$1'"}],[]]}}}}'调用飞书群机器人的webhooks接口发送信息给group2.在Jenkins上设置脚本路径在Jenkins后台找到项目后,配置管理AdvancedProjectOptions->Pipeline->ScriptPath=Jenkinsfile,这样JenkisnCI执行时,pipline流程会执行里面的逻辑Jenkinsfile3.配置Webhooks项目配置Webhooks,以便项目更新后自动触发Jenkins。注意:Jenkins需要安装plugins,Git,GitlabPluginJenkins配置buildtriggers勾选Buildwhenachangsis...选项,该URL在gitlab项目Webhooks中会被用来创建一个Secrettoken供GitlabWebhooks验证。Gitlab的配置URL是GItlab[buildtrigger]Buildwhenachangsis......Jenkins项目中的URLSercettoken是创建的Secrettoken4。飞书通知应该做好异常处理。某个阶段抛出异常后,要及时通知,以免影响打包。构建过程如下图所示:不同的构建结果通过邮寄方式通知。我这里使用的飞书群机器人调用机器人webhooks将构建结果发送到群里。当项目测试不通过时,可在后台导入测试结果,发送给开发商进行维修参考。关于MurphySecurityCLIMurphySecurity推出的一款开源工具,用于在命令行检测指定目录下代码的依赖安全问题,也可以基于CLI工具实现CI流程中的检测。开源地址:https://github.com/murphysecurity/murphysec欢迎您的反馈和交流!
