这款牛逼的开源安全工具让我这个运维也变成“安全专家”

简介: 这款牛逼的开源安全工具让我这个运维也变成“安全专家”

背景


我是一家互联网公司的 DevOps 工程师,平常负责公司服务的上线发布流程。我和墨菲安全的这款开源的漏洞检测工具结缘,主要是因为前段时间log4j2 的漏洞,最近我们公司的研发频繁的上线基本上都是修复 log4j2 的漏洞,我被他们整烦了。就找他们研发的负责人讨论是不是能够在上线前集成一些自动化的工具来检测这样的漏洞,比如 log4j2 或者 fastjson 类似这样的问题。


经过一番调研,公司刚好有几个研发正在用墨菲安全的IDE插件,我看他也有一个命令行的工具,可以集成到 Jenkins 里面,于是就试了试,效果还不错。


核心问题解决


将代码安全检测能力集成至CI流程,在代码打包前即对代码进行安全扫描,保证公司代码库内项目的质量,同时也会减少项目发布时的压力。且持续集成中的任何一个环节都是自动完成的,无需太多人工干预,有利于减少重复过程以节省时间和工作量。


目前实现的效果


1、每次 Jenkins 构建的时候自动检测代码中存在的三方开源组件,并识别漏洞

2、配置规则,识别到严重漏洞就中断构建

3、结果推送到飞书群里,相关研发都能看到


集成流程


1.Jenkinsfile


在项目根目录放一个 Jenkinsfile 文件(因为 Jenkins 为单节点,为了防止机器故障造成数据丢失,所以 Jenkinsfile 文件都会存在项目里,而不是存在 Jenkins 这台机器上)**

1.png

pipline 内容:该逻辑为代码下拉后,通过墨菲安全 CLI 对代码进行检测,然后通过 Linux 工具 jq 来对检测出的数据进行解析,如检测结果存在’强烈建议修复’则终止打包流程。

pipeline{
    agent { label "xxxxx"}    // 指定在哪台节点上执行构建操作,这里指定执行节点的标签
    options {
        timestamps()    // 日志记录时间
        buildDiscarder(logRotator(numToKeepStr: '10'))    // 只保留10个构建历史
        timeout(time: 1, unit: 'HOURS')   //流水线超时设置1h
    }
    stages {
        stage("pull code"){    // 拉取代码阶段
            steps{
                script{
                    git credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx', url: 'https://xxx.xxxxxx.com/xxxx/xxxxxxxxxxx.git'
                }
            }
        }
        stage("Test"){    // 代码测试阶段,因各种因素影响,不能直接将公司测试代码发出来,参照即可
            steps{
                sh 'echo "build project"'
            }
        }
        stage("murphysec scan") {    // 墨菲安全CLI检测阶段
            environment {
                API_TOKEN = credentials('murphysec-token')    // {murphusec-token}是Jenkins内创建的墨菲安全访问令牌凭据,墨菲安全CLI工具默认会读取{API_TOKEN}这个变量名当作自己的{--token}参数
                }
            steps{
                sh '''
                    NUM=`murphysec scan . --server http://xxx.xxxxx.com/ --json | jq . | jq ".comps | map(select(.show_level == 1)) | length"`
                    if [ $NUM -ne 0 ];then
                        false
                    fi
                '''
            }
        }
        stage("build"){    // 代码构建阶段,因各种因素影响,不能直接将公司测试代码发出来,参照即可
            steps{
                sh 'echo "build project"'
            }
        }
        stage("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{    // feishu.sh脚本是一个简单的shell脚本,存放在构建机器上,用于将构建返回的结果信息通过脚本发送至飞书群内
                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.sh内容


#!/bin/bash
## 调用飞书群机器人的webhooks接口将信息发送至群内
api=https://open.feishu.cn/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
curl -X POST \
  $api \
  -H 'Content-Type: application/json' \
  -d '{
    "msg_type": "post",
    "content": {
        "post": {
            "zh_cn": {
                "title": "Jenkins",
                "content": [
                    [
                        {
                            "tag": "text",
                            "un_escape": true,
                            "text": "'$1'"
                        }
                    ],
                    [
                    ]
                ]
            }
        }
    }
}'

调用飞书群机器人的webhooks接口将信息发送至群内


2. 在Jenkins上设置脚本路径


在Jenkins后台找到项目后,配置管理 Advanced Project Options -> Pipeline -> Script Path = Jenkinsfile ,这样Jenkisn CI 执行的时候,pipline流程就会执行Jenkinsfile里的逻辑。

1.png


3. 配置Webhooks


项目配置Webhooks,以便项目在更新后,能够自动触发Jenkins

注意:Jenkins需安装插件,Git、Gitlab Plugin

1.png

Jenkins配置


构建触发器勾选 Build when a changs is …选项,该URL在gitlab项目webhooks中会用到

1.png

创建Secret token,用于Gitlab Webhooks做验证

1.png

Gitlab 配置


网址是 GItlab [构建触发器] Build when a changs is …处的 URL

Sercet 令牌为 Jenkins 项目内创建的 Secret token

1.png


4.飞书通知


做好异常处理,某个stage抛出异常后,要及时做出通知,避免影响打包。


下图为构建流程:

1.png

通过post来对不同的构建结果做出通知,我这里采用的飞书群组机器人,调用机器人webhooks将构建结果发送到群内。项目检测未通过时,可以在后台将检测结果导入发送给开发人员做修复参考。

1.png


关于墨菲安全CLI


墨菲安全推出的一款开源工具,用于在命令行检测指定目录代码的依赖安全问题,也可以基于 CLI 工具实现在 CI 流程的检测。


开源地址 :https://github.com/murphysecurity/murphysec

欢迎大家的反馈和交流!


相关文章
|
2月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
62 3
|
2月前
|
运维 监控 安全
安全运维:入侵检测与防御实战指南
安全运维:入侵检测与防御实战指南 【10月更文挑战第9天】
117 3
|
2月前
|
人工智能 运维 自然语言处理
对话蚂蚁开源蒋炜:让 Agent 把运维人员从 24 小时的待命中解放出来
当整个行业的智慧都集中在一件事情上时,比起闭门造车,开源一定能带来更好的技术迭代和发展。CodeFuse 「编码挑战季」活动火热进行中,诚邀广大开发者们参与编码挑战
107 3
对话蚂蚁开源蒋炜:让 Agent 把运维人员从 24 小时的待命中解放出来
|
18天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
41 4
|
20天前
|
运维 监控 数据安全/隐私保护
自动化运维工具的设计与实现
【10月更文挑战第34天】在现代IT基础设施管理中,自动化运维工具扮演着至关重要的角色。它们不仅提高了运维效率,还确保了服务的连续性和稳定性。本文将深入探讨如何设计并实现一个自动化运维工具,从需求分析到功能实现,再到最终的测试与部署。我们将通过一个简单的代码示例来展示如何自动执行常见的运维任务,如日志清理和性能监控。文章旨在为读者提供一套完整的方法论,以便他们能够构建自己的自动化运维解决方案。
|
1月前
|
运维 Kubernetes 网络协议
运维之道:从新手到专家的成长之路
【10月更文挑战第21天】 本文旨在探讨运维领域的成长路径,通过分享个人经历和行业见解,为读者提供一条从入门到精通的清晰路线图。我们将从基础技能的学习开始,逐步深入到高级技巧的应用,最终达到专业水平的提升。文章强调了持续学习和实践的重要性,并鼓励读者在面对挑战时保持积极态度,不断探索未知领域。
27 6
|
1月前
|
运维 Kubernetes 网络协议
运维之道:从新手到专家的成长路径
【10月更文挑战第22天】 本文将探讨运维领域内,个人如何从一名初学者成长为行业专家的过程。通过分析学习路线、必备技能、实践经验积累以及持续学习的重要性,旨在为那些渴望在IT运维领域取得成就的人提供指导和启发。
|
2月前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。
|
29天前
|
机器学习/深度学习 运维 Kubernetes
运维之道:从新手到专家的转变
【10月更文挑战第24天】 本文旨在探讨运维人员如何从初学者成长为领域专家,通过分析运维行业的现状、面临的挑战以及必备技能,提供一系列实用的建议和策略。文章强调了持续学习、实践经验积累和技术趋势把握的重要性,并结合具体案例,展示了运维专家的成长路径。
|
29天前
|
运维 Prometheus 监控
运维之道:从新手到专家的旅程
【10月更文挑战第24天】 在数字化时代,运维工作如同一座桥梁,连接着技术与业务,确保系统的稳定运行。本文将带你踏上一段从运维新手成长为专家的旅程,探索运维的核心价值、技能提升路径以及面对挑战时的应对策略。通过深入浅出的语言和生动的案例,让你领略运维世界的奥秘与魅力。
14 0