一、背景和目的
近年来,随着新业务、新技术的快速发展,应用软件安全缺陷层出不穷。虽然一般情况下,开发者基本都会有单元测试、每日构建、功能测试等环节来保证应用的可用性。但在安全缺陷方面,缺乏安全意识、技能和工具,最终导致了安全缺陷的出现。
对于软件开发安全意识和软件开发安全技能方面本文中不再做详述,软件开发者可通过培训和实践提高自身意识和技能,本文目的主要是提供一种思路和方法,让软件开发者像测试软件功能一样,测试软件安全缺陷,并且能够融入到整个的软件开发过程中。
二、自动化安全代码检测平台概述
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(最少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
可从以下信息得到下载:
点击这个http://www.linuxidc.com/Linux/2013-12/93755.htm 链接关注 Linux公社官方微信,关注后回复数字157962。即可得到网友的分享密码。
如果取消关注Linux公社公众号,即使再次关注,也将无法提供本服务!
链接:https://pan.baidu.com/s/13Xq93FJ0RWFkLre2ILQdlA 密码:获得见上面的方法,地址失效请在下面留言。
——————————————分割线——————————————
官网下载如下,要登陆的
首先,在本机打开网站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/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