今天,天气转凉。无法外出浪荡,只得心血来潮码码码~
今天我们要探讨下几个问题,Jenkins应该如何和SonarQube和MobSF来配合完成代码静态检测,实现应用打包并完成MobSF应用包检测来达到持续集成,说得漂亮点CI/CD(装点B)
一、Jenkins、SonarQube和MobSF骚骚引荐一哈
Jenkins:
Jenkins大叔长这样
Jenkins其实是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
SonarQube:
![]()
SonarQube是一个代码质量管理的开源平台,用于管理源代码质量。它通过插件的形式可以支持包括Java、C#、C/C++、JS等等二十多种开发语言的代码质量管理和检测。
MobSF:
![]()
移动安全框架 (MobSF) 是一个智能化、一体化的开源移动应用(Android / iOS)自动测试框架,能够对以上两种移动应用进行静态和动态分析(动态分析目前暂时只支持Android)。它可以有效、快速地对应用APK 和IPA文件 及压缩的源代码进行审计分析。同时,MobSF 也能够通过其API Fuzzer功能模块,对 Web API 的安全性进行检测,如收集信息,分析安全头部信息,识别移动API 的具体漏洞,如XXE、SSRF、路径遍历,IDOR以及其他的与会话和API调用速率限制有关的逻辑问题。
二、先瞅瞅Jenkins、SonarQube和MobSF怎么个合作方式
第一种方式,是GitLab、Jenkins和SonarQube、MobSF合作

第二种方式,是GitLab、SonarQube、MobSF和其他第三方CI/CD服务商合作,当然它是要收费的

三、如何在Jenkins打包Job中配置SonarQube
3.1 初始化操作
最简单的你看这篇文章最起码的Jenkins得部署好吧,Jenkins 应用打包服务Job弄好了吧?,SonarQube部署好了吧?如果没有请度娘下安装部署教程,都部署好了再来看看这篇文章。不然你也不会呀,操作得一步步整~
3.2 首先我们需要在SonarQube端生成User Token
先登录SonarQube服务器,然后My Account -> Security -> User Access Token,这就生成了SonarQube的用户Token,请复制保存好,因为只出现一次!!! 如图3.2

3.3 在Jenkins端安装插件Sonar-Scanner
路线图为:Manage Jenkins > Manage Plugins > Available搜索Sonar-Scanner,安装并重启Jenkins。如图3.3

3.4 将前面生成的SonarQube用户Token,加入到Jenkins
路线图为:Jenkins > Credentials > System > Global Credentials > Add Credentials
如图3.4

3.5 在Jenkins上添加SonarQube Server
路线图:Manage Jenkins > Configure System > SonarQube Servers

3.6 为Jenkins添加Sonar-Scanner
路线图: Manage Jenkins > Global Tool Configuration > SonarQube Scanner > Add SonarQube-Scanner

3.7 然后在已经存在的打包Job中进行配置
首先,在Jenkins Dashboard主页选取你需要进行SonarQube配置的Job,为其配置在Build Triggers Model中允许GitLab通过webhook调起该Job
如果找不到该项,请安装GitLab plugin、GitLab API Plugin、GitLab Merge Request Builder、GitLab Authentication,如图3.7.1

然后,在Job配置中的Build Model添加SonarQube Scanner,如图3.7.2

3.8 在GitLab端允许Webhook勾子
路线图:GitLab端选择要配置的Project > Settings > Integrations
如图3.8.1

注意:
这里的问题是:GitLab仓库在公用网络,而基本上Jenkins我们一般部署在办公室本地网络,可能GitLab不能通过Webhook调起Jenkins Job。可能需要网管介入配合。
配置好Webhook后,你可以测试它,webhook是否成功,如图3.8.2,图3.8.3


3.9 最后我们就可以Build Jenkins Job了,看是否我们配置成功了
现在我们有两种方式构建Jenkins Job: 手动点击Build Now和Gitlab Webhook。 构建完成后我们可以看到SonarQube扫码结果,也可以点击进入SonarQube网页看具体信息。如图3.9

3.10 最后给大家提供一下配置参考,怕大家看不懂或者不想听偶废话,想听听原班
人马的废话呢
应该是要搭梯子的:https://digitalave.github.io/spring/2020/05/09/GitLab-Integration-with-Jenkins.html
四、Jenkins配置MobSF安装包检测服务Job
4.1 首要条件
旧事重提,请在本地部署好MobSF,网上都有教程,这里不提了~
4.2 我们需要在Jenkins中新建一个Pipeline项目
路线图:Jenkins > New Item > Pipeline
如图4.2

4.3 在Pipeline项目配置中添加Custom Parameter
Default Value: 描述的是APK构建后的目录,也就是我们从哪里获取安装包
如图4.3

4.4 在Pipeline项目配置Build Triggers中设置该Job的依赖工程
PS: 啥意思呢? 就是配置这个MobSF服务该在哪个阶段被执行,我们是设置在Jenkins打包完成后,在调起MobSF检测服务Job
如图4.4

4.5 在Pipeline项目配置中添加脚本
填入Pipeline Script,他将在我们配置的安装包目录中查找应用安装包,然后上传到MobSF,再开启安装包扫码操作,最后下载扫码结果PDF到你设置的文件目录
如图4.5

Pipeline Script 脚本如下:
import java.text.SimpleDateFormat
pipeline {
agent any
stages{
stage('Analysis') {
steps {
script {
dir(INPUT_LOCATION) {
files = findFiles(glob: '*-release.apk')
}
echo 'Test Script files'
files.each { f ->
def TASK_COLLECTION = [:]
TASK_COLLECTION["MOBSF"] = {
//上传应用包到MobSF
def AUTH_KEY = '**********your REST API Key'
upload_cmd = "curl -F 'file=@${env.INPUT_LOCATION}${f}' http://localhost:8000/api/v1/upload -H 'Authorization:${AUTH_KEY}'"
upload_result = sh label: 'Upload Binary', returnStdout: true, script: upload_cmd
def response_map = readJSON text: upload_result
def app_type = response_map["scan_type"]
sh "echo $app_type"
def app_hash = response_map["hash"]
sh "echo $app_hash"
def app_name = response_map["file_name"]
sh "echo $app_name"
//分析扫描检测应用包
scan_start_cmd = "curl -X POST --url http://localhost:8000/api/v1/scan --data 'scan_type=${app_type}&file_name=${app_name}&hash=${app_hash}' -H 'Authorization:${AUTH_KEY}'"
sh label: 'Start Scan of Binary', returnStdout: true, script: scan_start_cmd
def dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH:mm")
def date = new Date()
def time =dateFormat.format(date)
//下载检测结果pdf到制定目录
scan_download_report="curl -# -o ${env.INPUT_LOCATION}/MobSF_Report_${time}.pdf -X POST --url http://localhost:8000/api/v1/download_pdf --data 'hash=${app_hash}' -H 'Authorization:${AUTH_KEY}'"
report_text = sh label: 'Start Scan of Download Report', returnStdout: true, script: scan_download_report
sh "echo $report_text"
}
parallel(TASK_COLLECTION)
}
}
}
}
}
}
这里在脚本里有一些比如说上传应用包到MobSF,启动MobSF扫描检测和下载检测结果等脚本命令我们其实可以在MobSF页面端可以看到,一般路径在:https://localhost:8000 > API DOCS。大家可以在页面上找到相关命令,如图4.5

4.6 我们构建MobSF Pipeline Job之后就会得到结果
如图4.6所示

4.7 最后还是丢给大家一个连接吧
配置参考连接:https://riis.com/blog/pentesting_at_scale/
五、结语
持续集成、持续交付也是软件开发中的重要一环,如此的部署和配置,以及Jenkins、SonarQube、MobSF一起联调合作的配置也是需要了解和掌握的。
希望如果对你有点帮助的话,请不要吝啬你的赞,它将激励偶继续码字~
申明:禁用于商业用途,如若转载,请附带原文链接。https://www.jianshu.com/p/622a5d4f0dad蟹蟹~
网友评论