搭建基於SornaQube的自動化安全程式碼檢測平臺
一、背景和目的
近年來,隨著新業務、新技術的快速發展,應用軟體安全缺陷層出不窮。雖然一般情況下,開發者基本都會有單元測試、每日構建、功能測試等環節來保證應用的可用性。但在安全缺陷方面,缺乏安全意識、技能和工具,最終導致了安全缺陷的出現。
對於軟體開發安全意識和軟體開發安全技能方面本文中不再做詳述,軟體開發者可通過培訓和實踐提高自身意識和技能,本文目的主要是提供一種思路和方法,讓軟體開發者像測試軟體功能一樣,測試軟體安全缺陷,並且能夠融入到整個的軟體開發過程中。
二、自動化安全程式碼檢測平臺概述
2.1. 什麼是安全程式碼審計工具?
程式碼安全審計工具是以靜態的方式在程式中查詢可能存在的安全缺陷,如:緩衝區溢位、空指標引用、資源洩露和SQL注入等。安全程式碼測試工具目前比較多,例如Fortify、FindBugs等,大家感興趣可以通過網際網路搜尋到這些工具的一些描述,本文中也不再贅述。
2.2. 軟體開發人員是否可以自行直接利用這些安全程式碼審計工具完成測試?
答案在理論上是可以的,但是在實踐中基本是很難落地。原因有如下幾點:
1)工具眾多,很難選擇;
2)工具誤報較高,如何提高準確率,軟體開發人員很難處理;
3)單一工具如何與開發過程進行結合。
4)安全程式碼審計工作在企業裡很有可能是安全專業人員的職責,這樣企業裡會出現安全和開發隔離的情況。
2.3. 什麼是自動化安全程式碼檢測平臺
自動化安全程式碼檢測平臺應該具有以下的幾個功能:
1)能夠融入到軟體開發的過程中
2)自動、高效、準確的進行檢測
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(最少4gG)
作業系統: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,操作如下:
apt-get update apt-get 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 rootALL=(ALL:ALL) ALL qubeALL=(ALL:ALL) ALL
儲存退出,qube使用者就擁有了sudo許可權
新增好此使用者後,我們就使用該使用者登入並完成後續的操作。
3.3.3. 安裝 SVN 服務端
1. 安裝SVN服務端
sudo apt-get 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
官網下載如下,要登陸的
首先,在本機開啟網站 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 wgethttps://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
安裝比較簡單,直接解壓即可:
sudo apt-get install unzip unzip sonarqube-6.7.1.zip unzip sonar-scanner-cli-3.0.3.778.zip
由於解壓以後檔案目錄名稱較長,可以使用mv命令來更改名稱,更改為:
/opt/sonarqube/和 /opt /sonar-scanner
3. 配置環境變數
sudo 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/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
切換至使用者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. 設定環境變數,操作如下:
sudo 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設定好,點選系統管理—》系統設定:
注意:使用映象時,需要把此處進行配置成自己伺服器的IP。
2. 全域性工具配置中整合jdk、Maven,點選系統管理-->>全域性工具配置,然後按照頁面提示填入相應引數,如下圖所示:
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 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/
然後儲存即可
登入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