¶ Jenkins
更新时间: 2023-07-26 16:42:35
¶ 一、功能简介
通过与 Jenkins 集成,墨菲安全能够在流水线构建过程中自动运行,使用其强大的 CLI 工具对指定项目进行实时检测。这一功能极大地提高了安全问题的发现速度,帮助开发团队及时检测出漏洞,确保软件产品在线上的安全性和稳定性。
¶ 二、安装 CLI(商业版)
¶ 2.1 在Jeknins构建节点上安装墨菲安全CLI
- 点击 集成方式 -> Jenkins -> 下载CLI并上传到构建节点上 -> 添加执行权限
¶ 2.2 复制代码,后面需添加到jenkinsfile中
--server
和--token
参数已默认填充,直接复制代码使用即可
¶ 三、安装 CLI(SaaS版)
¶ 3.1 在Jeknins构建节点上安装墨菲安全CLI
- 点击 集成方式 -> CLI -> 构建节点安装 CLI -> 配置用户 token
¶ 四、配置 Jenkins
¶ 4.1 修改项目中的 Jenkinsfile
集成墨菲安全扫描步骤(这里以 murphysec-test 项目为例)
- 点击 Dashboard -> murphysec-test -> Configure -> 修改 Script 添加墨菲安全扫描步骤 -> Apply -> Save
- Jenkinsfile 添加墨菲安全扫描步骤示例:
(SaaS 版本无需指定 --server)
scan: 指定检测模式,您也可以选择其他检测模式,例如 binscan、dfscan
--server: 该参数填写私有化服务地址,例如 http://xxx.xxx.com (opens new window)
--token: 该参数填写个人 token,token 在墨菲安全服务后台获取
- 检测模式说明
scan: 通过扫描项目中的各种文件类型来检测开源漏洞,全方位从项目中的源代码、二进制等文件中,获取最全面的开源组件信息和存在的漏洞
binscan: 通过扫描二进制文件检测开源漏洞,专门针对二进制文件进行检测,识别二进制文件中的开源组件和存在的漏洞
dfscan: 通过扫描包管理文件,分析项目源代码中的依赖配置文件,识别项目中使用的开源组件和存在的漏洞
stage("murphysec scan") {
steps{
sh '''
murphysec scan . --server {Your service address} --token {Your token} --deep
'''
}
}
- 完整 Jenkinsfile 示例 + 注释:
pipeline { // 定义一个流水线
agent { label "ansible"} // 指定具有 "ansible" 标签的构建代理来执行这个流水线
stages { // 定义流水线中的各个阶段
stage("Pull code") { // 定义一个名为 "Pull code" 的阶段,用于拉取项目代码
steps {
script {
// 使用 Git 插件从指定仓库拉取代码,指定凭据和仓库 URL
git credentialsId: '18d41658-xxxx-xxxx-xxxx-d8455f4e240b', url: 'https://xxx.xxx.com/root/xxx.git'
}
}
}
stage("Build Project") { // 定义一个名为 "Build Project" 的阶段,用于构建项目
steps {
sh 'echo "Build Project"' // 在这里添加实际的构建命令
}
}
stage("murphysec scan") { //定义一个名为 "murphysec scan" 的阶段,用于执行墨菲安全扫描
steps {
// 执行墨菲安全的扫描命令
sh '''
murphysec scan . --server {Your service address} --token {Your token} --deep
'''
}
}
stage("Test") { // 定义一个名为 "Test" 的阶段,用于测试项目
steps {
sh 'echo "Test"' // 在这里添加实际的测试命令
}
}
stage("publish project") { // 定义一个名为 "publish project" 的阶段,用于发布项目
steps {
sh 'echo "publish project"' // 在这里添加实际的发布命令
}
}
}
post { // 定义构建完成后的操作
success { // 构建成功时执行以下操作
script {
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'"
'''
}
}
failure { // 构建失败时执行以下操作
script {
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原因:项目中存在强烈建议修复组件!"
'''
}
}
}
}
¶ 4.2 手动触发 Jenkins 流水线
- 点击 Dashboard -> murphysec-test -> Build Now
¶ 4.3 在 Jenkins 流水线中查看检测结果
- 点击 Dashboard -> murphysec-test -> 选择最近的一次 Build History -> Console Output
¶ 4.4 在墨菲安全后台查看项目检测结果
- 点击 项目管理 -> 点击项目
¶ 五、常见问题
¶ 问:是否需要在每台 Jenkins 构建节点上安装墨菲安全 CLI ?
答:如果您在 Jenkinsfile 中指定了使用某台节点做构建操作,那么只需要在这台节点上安装墨菲安全 CLI 即可,如果有很多台构建节点,那么需要在其他构建节点上都安装墨菲安全 CLI。
¶ 问:是否支持 Jenkins 流水线的阻断,比如违反规则的时候,Pipline 就不让他构建,并给出失败提醒?
答:支持,可以通过使用 jq 命令解析 json 格式的结果,判断如果有强烈建议修复的组件,则终止流水线,同时也可以添加别的规则。
- Jenkinsfile 添加墨菲安全扫描步骤并进行阻断示例:
stage("murphysec scan") {
steps{
sh '''
NUM=`murphysec scan . --server {Your service address} --token {Your token} --json | jq . | jq ".comps | map(select(.show_level == 1)) | length"`
if [ $NUM -ne 0 ];then
false
fi
'''
}
}
- 完整 Jenkinsfile 示例 + 注释:
pipeline { // 定义一个流水线
agent { label "ansible"} // 指定具有 "ansible" 标签的构建代理来执行这个流水线
stages { // 定义流水线中的各个阶段
stage("Pull code") { // 定义一个名为 "Pull code" 的阶段,用于拉取项目代码
steps {
script {
// 使用 Git 插件从指定仓库拉取代码,指定凭据和仓库 URL
git credentialsId: '18d41658-xxxx-xxxx-xxxx-d8455f4e240b', url: 'https://xxx.xxx.com/root/xxx.git'
}
}
}
stage("Build Project") { // 定义一个名为 "Build Project" 的阶段,用于构建项目
steps {
sh 'echo "Build Project"' // 在这里添加实际的构建命令
}
}
stage("murphysec scan") { //定义一个名为 "murphysec scan" 的阶段,用于执行墨菲安全扫描
steps {
// 运行 murphysec scan 命令并获取扫描结果,然后使用 jq 命令对其进行处理,以筛选出 show_level 等于1的组件。脚本会计算这些组件的数量,并将结果存储在NUM变量中。如果NUM不等于0(即存在 show_level 等于1的组件),脚本将返回false,表示失败
sh '''
NUM=`murphysec scan . --server {Your service address} --token {Your token} --json | jq . | jq ".comps | map(select(.show_level == 1)) | length"`
if [ $NUM -ne 0 ];then
false
fi
'''
}
}
stage("Test") { // 定义一个名为 "Test" 的阶段,用于测试项目
steps {
sh 'echo "Test"' // 在这里添加实际的测试命令
}
}
stage("publish project") { // 定义一个名为 "publish project" 的阶段,用于发布项目
steps {
sh 'echo "publish project"' // 在这里添加实际的发布命令
}
}
}
post { // 定义构建完成后的操作
success { // 构建成功时执行以下操作
script {
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'"
'''
}
}
failure { // 构建失败时执行以下操作
script {
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原因:项目中存在强烈建议修复组件!"
'''
}
}
}
}