1、背景和目的html
近年來,隨着新業務、新技術的快速發展,應用軟件安全缺陷層出不窮。雖然通常狀況下,開發者基本都會有單元測試、每日構建、功能測試等環節來保證應用的可用性。但在安全缺陷方面,缺少安全意識、技能和工具,最終致使了安全缺陷的出現。java
對於軟件開發安全意識和軟件開發安全技能方面本文中再也不作詳述,軟件開發者可經過培訓和實踐提升自身意識和技能,本文目的主要是提供一種思路和方法,讓軟件開發者像測試軟件功能同樣,測試軟件安全缺陷,而且可以融入到整個的軟件開發過程當中。mysql
2、自動化安全代碼檢測平臺概述linux
2.1. 什麼是安全代碼審計工具?web
代碼安全審計工具是以靜態的方式在程序中查找可能存在的安全缺陷,如:緩衝區溢出、空指針引用、資源泄露和SQL注入等。安全代碼測試工具目前比較多,例如Fortify、FindBugs等,你們感興趣能夠經過互聯網搜索到這些工具的一些描述,本文中也再也不贅述。sql
2.2. 軟件開發人員是否能夠自行直接利用這些安全代碼審計工具完成測試?數據庫
答案在理論上是能夠的,可是在實踐中基本是很難落地。緣由有以下幾點:apache
1)工具衆多,很難選擇;編程
2)工具誤報較高,如何提升準確率,軟件開發人員很難處理;ubuntu
3)單一工具如何與開發過程進行結合。
4)安全代碼審計工做在企業裏頗有多是安全專業人員的職責,這樣企業裏會出現安全和開發隔離的狀況。
2.3. 什麼是自動化安全代碼檢測平臺
自動化安全代碼檢測平臺應該具備如下的幾個功能:
1)可以融入到軟件開發的過程當中
2)自動、高效、準確的進行檢測
3)自動生成檢測報告,供項目管理者和開發人員查看
3、搭建基於SonarQube的自動化安全代碼檢測平臺搭建實踐
3.1. 檢測平臺概述
這個平臺環境主要是基於Jenkins、SVN、Maven、SonarQube集成搭建的,下面分別大概介紹一下這幾個軟件:
Jenkins(本次環境使用的是:sonarqube-6.7.6)是一個開源軟件項目,是基於Java開發的一種持續集成工具,用於監控持續重複的工做,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。先了解一下持續集成的概念:持續集成是一種軟件開發實踐,即團隊開發成員常常集成它們的工做,經過每一個成員天天至少集成一次,也就意味着天天可能會發生屢次集成。每次集成都經過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘早地發現集成錯誤。而 Jenkins就是基於Java開發的一種持續集成工具,用於監控持續重複的工做。
SVN(本次環境使用的是:Subversion1.9.7)是Subversion的簡稱,是一個開放源代碼的版本控制系統,用於多我的共同開發同一個項目,共用資源的目的。
Maven(本次環境使用的是:Maven 3.5.2)是經過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。Maven主要作了兩件事:統一開發規範與工具、統一管理jar包。
SonarQube(本次環境使用的是:6.7.6)是一個用於代碼質量管理的開源平臺,用於管理源代碼的質量,能夠從七個維度檢測代碼質量經過插件形式,能夠支持包括java,C#,C/C++等二十幾種編程語言的代碼質量管理與檢測。
3.2. 自動化安全代碼檢測平臺搭建的核心思路。
在基於SonarQube的平臺中,SVN是檢測的入口,SonarQube是檢測的主要工具和檢測報告生成出口,Jenkins做爲一個持續集成工具將SVN和SonarQube關聯起來,監控SVN的動做並適時觸發SonarQube對提交的代碼進行檢測。SonarQube相似一個路由器,以插件的形式集成了許多缺陷檢測工具,因爲大多數檢測工具要求對輸入的項目進行編譯並提取相關的信息,所以,在本平臺上也安裝了Maven。在SonarQube開始檢測以前,Jenkins首先調用Maven對代碼進行編譯,而後將源代碼和編譯的輸出信息送給SonarQube進行檢測。
將這些工具集成在一塊兒的好處在於:
1. 在代碼審計融入到軟件項目的持續開發過程當中,自動生成高質量的檢測報告,無需人工干預,提升了軟件開發效率;
2. SonarQube以插件的形式能夠集成衆多的檢測工具,目前已知能夠支持XX種工具。檢測工具的更新升級,不會影響到正常的軟件開發流程;
3. 以阿里雲鏡像的方式提供給你們使用,最大限度的保護了我的和公司的知識產權,方便工具的落地使用。
目前,咱們的團隊還在不斷地集成新的工具,以及開發更加高效和精確的檢測器,保證了平臺的持續更新升級,你們在簡單配置以後,可以體檢到最好的代碼審計服務。
3.3. 搭建方法和步驟
3.3.1. 基礎環境準備
硬件要求:
CPU:1核心
內存:4G(最少4G)
操做系統:linux(ubuntu,centos都可)
而後,系統啓動後,使用root安裝jdk1.8和MySQL,並修改環境配置文件,具體操做命令可參考以下:
1. 安裝JDK1.8.0_151,操做以下:
a. 在官方網站上下載tar包,並上傳至目錄/usr/bin下,而後是用tar命令解壓;
b. 添加環境變量配置,命令以下:
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數據庫,登錄成功即安裝成功,命令爲:
mysql -u root -p
3.3.2. 新建用戶
通常狀況下,開發者不能直接使用root用戶來管理和使用系統,最好經過一個專有用戶來進行操做,所以咱們新建一個用戶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權限
添加好此用戶後,咱們就使用該用戶登陸並完成後續的操做。
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轉儲後的數據、在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
出現如下信息,即正常:
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
百度網盤地址:
連接: https://pan.baidu.com/s/1O0DJR8gW3OWbrWp8rz9kAw
提取碼: kn8n
官網新版下載以下,
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.1.zip
舊版
首先,在本機打開網站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. 配置環境變量
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. 建立數據庫sonar
登錄MySQL
mysql -u root -p
建立sonar數據庫和用戶(用戶名和密碼都爲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 數據庫用戶名 sonar.jdbc.password=sonar 數據庫密碼 sonar.jdbc.url=jdbc:mysql:// localhost:3306/sonar?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
切換至用戶qube,root用戶啓動會失敗
cd /opt/sonarqube/bin/linux-x86-64 ./sonar.sh start
8. 驗證
在本地瀏覽器輸入:http://服務器ip:9000/
能打開頁面即正常。(初次啓動時間大概在2分鐘左右)
9. 修改管理員密碼和安裝中文插件
點擊右上角 login,輸入用戶名和密碼admin admin
(第一次登陸會有一個配置嚮導,直接跳過便可)。而後進入後,再點擊右上角的圖標,選擇my account,修改密碼(admin)
點擊菜單administrator,而後選擇marketplant,搜索Chinese,就能看到中文插件,安裝並選擇重啓服務便可。
3.3.5. 安裝Maven
1. 下載Maven
首先,在本機打開網站http://maven.apache.org/download.cgi
找到下載地址:http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz
而後下載:
cd /opt wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz
2. 安裝Maven
安裝比較簡單,直接解壓便可:
tar -xf apache-maven-3.5.2-bin.tar.gz
而後爲了管理方便mv更改目錄名稱爲maven
mv apache-maven-3.5.2 maven
3. 設置環境變量,操做以下:
vim /etc/profile
在/etc/profile文件最後加入:
#Maven export M2_HOME=/opt/maven export CLASSPATH=$CLASSPATH:$M2_HOME/lib export PATH=$PATH:$M2_HOME/bin
保存退出,並加載配置
. /etc/profile
4. 驗證
執行mvn –v查看maven版本信息,即正常
3.3.6 安裝Tomcat
1. 下載Tomcat-8.5.24
首先,在本機打開網站http://mirrors.shuosc.org/apache/tomcat/
找到下載地址:http://mirrors.shuosc.org/apache/tomcat/tomcat-8/v8.5.24/bin/apache-tomcat-8.5.24.tar.gz
而後下載:
cd /opt wget http://mirrors.shuosc.org/apache/tomcat/tomcat-8/v8.5.24/bin/apache-tomcat-8.5.24.tar.gz
2. 安裝Tomcat
tar -xf apache-tomcat-8.5.24.tar.gz mv apache-tomcat-8.5.24 tomcat cd /opt/tomcat/bin/ tar -xf commons-daemon-native.tar.gz
3. 啓動Tomcat
cd /opt/tomcat/bin/ ./catalina.sh start
4. 驗證
在本機瀏覽器裏輸入: http://服務器公網IP:8080 能打開頁面即正常。
3.3.7 安裝Jenkins
1. 下載Jenkins
本次採用war包形式安裝,也可用其餘方式安裝。
cd /opt wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.138.3/jenkins.war
2. 安裝Jenkins
Jenkins安裝比較簡單,直接複製到tomcat的webapps目錄下便可,操做以下:
mv /opt/jenkins.war /opt/tomcat/webapps/
3. 配置Jenkins
在本地瀏覽器中,輸入http://服務器IP:8080/jenkins,打開頁面後初次登陸根據提示須要輸入cat /root/.jcd senkins/secrets/initialAdminPassword文件中的內容後,點擊登陸。此時還會須要你選擇插件的安裝,咱們選擇默認安裝「Install suggested plugins」便可(此安裝時間根據網絡狀況大概在10分鐘以上)。
插件安裝完之後會提示創建身份認證相關的配置,咱們直接跳過進入主頁中修改便可。用戶名和密碼爲admin/admin
3.3.8 自動化安全代碼檢測環境的集成
安裝完這些基礎軟件之後,須要在Jenkins中進行集成,具體操做以下:
1. 系統設置,將SonarQube Server 和 Jenkins URL設置好,點擊系統管理—》系統設置:
要是token 不能設置就不要設置了!!!!
2. 全局工具配置中集成jdk、Maven,點擊系統管理-->>全局工具配置,而後按照頁面提示填入相應參數,以下圖所示:
3.3.9 Jenkins結合SonarQube插件的安裝
1 安裝SonarQube Scanner for Jenkins
2 安裝Sonar Gerrit Plugin
這兩個插件必須安裝
3.4. 自動化安全代碼檢測平臺的使用示例
按照咱們前面提到的核心思路,咱們在Jenkins中建立任務來檢測咱們的代碼(本鏡像中,建立了一個helloWorld的工程,你們使用配置可參考)。大概操做以下:
3.4.1. 新建任務,選擇構建一個maven項目,點擊肯定。
3.4.2. 項目配置中,須要配置源碼管理、觸發器和build任務。
1. 首先,寫上一些項目的描述信息,不寫也行。
2. 配置觸發器
3 源碼管理
4. build任務:
其中Analysis properties的內容可參考以下:
參考一:
sonar.login=admin sonar.password=admin sonar.projectKey=test sonar.projectName=test sonar.projectVersion=0.1 # 支持變量,例如 $VERSION sonar.sources=. sonar.binaries=bin sonar.java.binaries=.
參考二:
sonar.projectKey=my:project # this is the name displayed in theSonarQube UI sonar.projectName=helloWorld sonar.projectVersion=1.3.12 # Path is relative to thesonar-project.properties file. Replace "\" by "/" onWindows. # Since SonarQube 4.2, this property isoptional if sonar.modules is set. # If not set, SonarQube starts looking forsource code from the directory containing # the sonar-project.properties file. sonar.sources=src sonar.binaries=bin # Encoding of the source code. Default isdefault system encoding #sonar.sourceEncoding=UTF-8 sonar.java.binaries=/opt/
若是是自由風格的代碼,會有一下不一樣的地方:
1 構建觸發器,可根據狀況設置,我才用的是定時構建
2 構建環境
若是前邊 token那邊沒有添加這裏就選無,若是添加成功了,就選擇成功的用戶
3 構建
我採用的是mvn 打包方式
而後保存便可
登陸Sonarqube
在本機輸入http://服務器ip:9000/,填入用戶名admin和密碼admin後,修改SCM設置,否則Jenkins構建時會報錯,輸入SVN帳號和密碼
報錯內容大體以下:
ERROR: Error during SonarQube Scanner execution ERROR: Error when executing blame for file pom.xml ERROR: Caused by: svn: E170001: Authentication required for '<http://172.16.x.x:xxxx> Welcome to testcode SVN' ERROR: ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging. WARN: Unable to locate 'report-task.txt' in the workspace. Did the SonarScanner succedeed? ERROR: SonarQube scanner exited with non-zero code: 1 Finished: FAILURE
3.4.3. 上傳項目,並檢測
1. 咱們在本機上安裝svn客戶端,我使用的是TortoiseSVN,而後配置鏈接服務器,上傳項目。
2. 在Jenkins剛剛建立的任務中,點擊當即「當即構建」,此時咱們將在窗口右側看到構建的進度,若是構建成功後,任務會提示執行成功。
3.4.3 查看項目代碼的檢測結果
登陸Sonarqube,咱們將在首頁上就能看到檢測結果:
參考:https://www.freebuf.com/articles/security-management/160897.html
http://www.freebuf.com/news/162977.html