一、背景和目的
近年來,隨著新業(yè)務、新技術的快速發(fā)展,應用軟件安全缺陷層出不窮。雖然一般情況下,開發(fā)者基本都會有單元測試、每日構建、功能測試等環(huán)節(jié)來保證應用的可用性。但在安全缺陷方面,缺乏安全意識、技能和工具,最終導致了安全缺陷的出現(xiàn)。
對于軟件開發(fā)安全意識和軟件開發(fā)安全技能方面本文中不再做詳述,軟件開發(fā)者可通過培訓和實踐提高自身意識和技能,本文目的主要是提供一種思路和方法,讓軟件開發(fā)者像測試軟件功能一樣,測試軟件安全缺陷,并且能夠融入到整個的軟件開發(fā)過程中。
二、自動化安全代碼檢測平臺概述
2.1. 什么是安全代碼審計工具?
代碼安全審計工具是以靜態(tài)的方式在程序中查找可能存在的安全缺陷,如:緩沖區(qū)溢出、空指針引用、資源泄露和SQL注入等。安全代碼測試工具目前比較多,例如Fortify、FindBugs等,大家感興趣可以通過互聯(lián)網(wǎng)搜索到這些工具的一些描述,本文中也不再贅述。
2.2. 軟件開發(fā)人員是否可以自行直接利用這些安全代碼審計工具完成測試?
答案在理論上是可以的,但是在實踐中基本是很難落地。原因有如下幾點:
1)工具眾多,很難選擇;
2)工具誤報較高,如何提高準確率,軟件開發(fā)人員很難處理;
3)單一工具如何與開發(fā)過程進行結合。
4)安全代碼審計工作在企業(yè)里很有可能是安全專業(yè)人員的職責,這樣企業(yè)里會出現(xiàn)安全和開發(fā)隔離的情況。
2.3. 什么是自動化安全代碼檢測平臺
自動化安全代碼檢測平臺應該具有以下的幾個功能:
1)能夠融入到軟件開發(fā)的過程中
2)自動、高效、準確的進行檢測
3)自動生成檢測報告,供項目管理者和開發(fā)人員查看
三、搭建基于SonarQube的自動化安全代碼檢測平臺搭建實踐
3.1. 檢測平臺概述
這個平臺環(huán)境主要是基于Jenkins、SVN、Maven、SonarQube集成搭建的,下面分別大概介紹一下這幾個軟件:
Jenkins(本次環(huán)境使用的是:sonarqube-6.7.6)是一個開源軟件項目,是基于Java開發(fā)的一種持續(xù)集成工具,用于監(jiān)控持續(xù)重復的工作,旨在提供一個開放易用的軟件平臺,使軟件的持續(xù)集成變成可能。先了解一下持續(xù)集成的概念:持續(xù)集成是一種軟件開發(fā)實踐,即團隊開發(fā)成員經(jīng)常集成它們的工作,通過每個成員每天至少集成一次,也就意味著每天可能會發(fā)生多次集成。每次集成都通過自動化的構建(包括編譯,發(fā)布,自動化測試)來驗證,從而盡早地發(fā)現(xiàn)集成錯誤。而 Jenkins就是基于Java開發(fā)的一種持續(xù)集成工具,用于監(jiān)控持續(xù)重復的工作。
SVN(本次環(huán)境使用的是:Subversion1.9.7)是Subversion的簡稱,是一個開放源代碼的版本控制系統(tǒng),用于多個人共同開發(fā)同一個項目,共用資源的目的。
Maven(本次環(huán)境使用的是:Maven 3.5.2)是通過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。Maven主要做了兩件事:統(tǒng)一開發(fā)規(guī)范與工具、統(tǒng)一管理jar包。
SonarQube(本次環(huán)境使用的是:6.7.6)是一個用于代碼質量管理的開源平臺,用于管理源代碼的質量,可以從七個維度檢測代碼質量通過插件形式,可以支持包括java,C#,C/C++等二十幾種編程語言的代碼質量管理與檢測。
3.2. 自動化安全代碼檢測平臺搭建的核心思路。
在基于SonarQube的平臺中,SVN是檢測的入口,SonarQube是檢測的主要工具和檢測報告生成出口,Jenkins作為一個持續(xù)集成工具將SVN和SonarQube關聯(lián)起來,監(jiān)控SVN的動作并適時觸發(fā)SonarQube對提交的代碼進行檢測。SonarQube類似一個路由器,以插件的形式集成了許多缺陷檢測工具,由于大多數(shù)檢測工具要求對輸入的項目進行編譯并提取相關的信息,因此,在本平臺上也安裝了Maven。在SonarQube開始檢測之前,Jenkins首先調用Maven對代碼進行編譯,然后將源代碼和編譯的輸出信息送給SonarQube進行檢測。
將這些工具集成在一起的好處在于:
1. 在代碼審計融入到軟件項目的持續(xù)開發(fā)過程中,自動生成高質量的檢測報告,無需人工干預,提高了軟件開發(fā)效率;
2. SonarQube以插件的形式可以集成眾多的檢測工具,目前已知可以支持XX種工具。檢測工具的更新升級,不會影響到正常的軟件開發(fā)流程;
3. 以阿里云鏡像的方式提供給大家使用,最大限度的保護了個人和公司的知識產(chǎn)權,方便工具的落地使用。
目前,我們的團隊還在不斷地集成新的工具,以及開發(fā)更加高效和精確的檢測器,保證了平臺的持續(xù)更新升級,大家在簡單配置之后,能夠體檢到最好的代碼審計服務。
3.3. 搭建方法和步驟
3.3.1. 基礎環(huán)境準備
硬件要求:
CPU:1核心
內存:4G(最少4G)
操作系統(tǒng):linux(Ubuntu,CentOS均可)
然后,系統(tǒng)啟動后,使用root安裝jdk1.8和MySQL,并修改環(huán)境配置文件,具體操作命令可參考如下:
1. 安裝JDK1.8.0_151,操作如下:
a. 在官方網(wǎng)站上下載tar包,并上傳至目錄/usr/bin下,然后是用tar命令解壓;
b. 添加環(huán)境變量配置,命令如下:
vi /etc/profile
在該文件的末尾加上以下內容后保存:
#JDK JAVA_HOME=/usr/bin/jdk1.8.0_151 JRE_HOME=/usr/bin/jdk1.8.0_151/jre CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH PATH=$JAVA_HOME/bin:$PATH
c. 更新生效,并測試,命令如下:
source /etc/profile jave -version
如果返回了java的版本信息,即設置成功。
2. 安裝MySQL 5.7.20,操作如下:
yum update yum install -y mysql-server mysql-client
在安裝過程中,會要求設置root密碼,設置的密碼為:mysql
安裝完成后,使用root用戶登錄MySQL數(shù)據(jù)庫,登陸成功即安裝成功,命令為:
mysql -u root -p
3.3.2. 新建用戶
一般情況下,開發(fā)者不能直接使用root用戶來管理和使用系統(tǒng),最好通過一個專有用戶來進行操作,因此我們新建一個用戶qube,具體命令為:
adduser qube
本鏡像中,qube用戶的密碼設置為admin
如果需要給qube用戶sudu權限,可修改/etc/sudoers文件,具體操作如下:
vi /etc/sudoers
修改文件內容如下:
# User privilege specification root ALL=(ALL:ALL) ALL qube ALL=(ALL:ALL) ALL
保存退出,qube用戶就擁有了sudo權限
添加好此用戶后,我們就使用該用戶登錄并完成后續(xù)的操作。
3.3.3. 安裝SVN服務端
1. 安裝SVN服務端
yum install subversion
2. 配置SVN服務端
mkdir -p /opt/svn/repos svnadmin create /opt/svn/repos
接下來,進行身份認證、權限等相關配置。配置文件都在/opt/svn/repos/目錄下,我們主要關心的是conf和db文件,conf文件夾下是存放主配置文件和用戶、權限位置,db文件夾是存放svn轉儲后的數(shù)據(jù)、在conf目錄下authz文件是設置用戶權限,passwd文件是存儲用戶及密碼,svnserve.conf是主配置文件,先配置主配置文件:
vim svnserve.conf
anon-access = none /**匿名用戶不可讀不可寫**/ auth-access = write /**授權用戶可寫**/ password-db = passwd /**指定賬號密碼配置文件**/ authz-db = authz /**指定權限配置文件**/ realm = /opt/svn/repos /**指定版本庫所在目錄**/
再配置passwd文件:
vim passwd
#格式是用戶名=密碼,采用明文密碼。這里設置了一個用戶admin,密碼為admin
[users] admin = admin
最后配置authz文件
vim authz
#增加以下信息,admin擁有根目錄所有權限
[/] admin = rw
3. 啟動服務
輸入命令:
svnserve -d -r /opt/svn/repos
4. 驗證
輸入命令:
netstat -antp |grep svnserve
出現(xiàn)以下信息,即正常:
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 28967/svnserve
3.3.4. 安裝Sonarqube和Sonar-scanner
1. 下載SonarQube和Sonar-scanner
可從以下信息得到下載:
點擊這個http://www.linuxidc.com/Linux/2013-12/93755.htm 鏈接關注 Linux公社官方微信,關注后回復數(shù)字157962。即可得到網(wǎng)友的分享密碼。
如果取消關注Linux公社公眾號,即使再次關注,也將無法提供本服務!
鏈接:https://pan.baidu.com/s/13Xq93FJ0RWFkLre2ILQdlA 密碼:獲得見上面的方法,地址失效請在下面留言。
——————————————分割線——————————————
官網(wǎng)下載如下,要登陸的
首先,在本機打開網(wǎng)站http://www.sonarqube.org/downloads/,
找到下載地址:https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.7.1.zip
和https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778.zip
然后下載:
cd /opt wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.7.1.zip wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778.zip
2. 安裝SonarQube和Sonar-scanner
安裝比較簡單,直接解壓即可:
yum install unzip unzip sonarqube-6.7.1.zip unzip sonar-scanner-cli-3.0.3.778.zip
由于解壓以后文件目錄名稱較長,可以使用mv命令來更改名稱,更改為:
/opt/sonarqube/和/opt/sonar-scanner
3. 配置環(huán)境變量
vim /etc/profile
加入以下內容:
#SonarQube export SONAR_HOME=/opt/sonarqube/ export SONAR_RUNNER_HOME=/opt/sonar-scanner/ export PATH=$PATH:$SONAR_RUNNER_HOME/bin
保存退出vi后,更新:
. /etc/profile
4. 創(chuàng)建數(shù)據(jù)庫sonar
登陸MySQL
mysql -u root -p
創(chuàng)建sonar數(shù)據(jù)庫和用戶(用戶名和密碼都為sonar)
mysql> CREATE DATABASE sonar DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; Query OK, 1 row affected (0.00 sec) mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar'; Query OK, 0 rows affected (0.10 sec)
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar'; Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql>
5. 配置sonarqube,修改配置文件sonar.properties
cd /opt/sonarqube/conf
vim sonar.properties
修改內容:
sonar.jdbc.username=sonar 數(shù)據(jù)庫用戶名 sonar.jdbc.password=sonar 數(shù)據(jù)庫密碼 sonar.jdbc.url=jdbc:mysql:// localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false sonar.web.port=9000
6. 配置sonar-scanner,修改配置文件sonar-scanner.properties
cd /opt/sonar-scanner/conf
vim sonar-scanner.properties
修改內容:
sonar.host.url=http://localhost:9000 sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
7. 運行sonarqube