jenkins中添加sonnarqube与OWASP Dependency-Check

jenkins

jenkins离线插件地址:
http://updates.jenkins-ci.org/download/plugins
https://updates.jenkins.io/download/plugins           
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins   国内
linux 安装jdk11 文档:
https://blog.51cto.com/u_16175449/6648723

k8s中安装sonarqube

简介:

https://www.sonarsource.com/products/sonarqube/deployment/ 最新版镜像下载地址

注意这个是内置数据库的,内嵌数据库只能用于测试场景,内嵌数据库无法扩展,也无法升级到新版本的SonarQube,并且不能支持将你的数据迁移至其他数据库引擎

其中Community Edition (社区版) 免费的
jenkins中添加sonnarqube与OWASP Dependency-Check_第1张图片
我是在docker官方镜像找的lts镜像下载的lts版:
jenkins中添加sonnarqube与OWASP Dependency-Check_第2张图片
https://www.sonarsource.com/products/sonarqube/downloads/ 其他版本下载地址
jenkins中添加sonnarqube与OWASP Dependency-Check_第3张图片

Helm 方式

目前只支持Helm v3
此链接对应这k8s支持的版本号:
https://artifacthub.io/packages/helm/sonarqube/sonarqube-dce/10.0.0+521
jenkins中添加sonnarqube与OWASP Dependency-Check_第4张图片
官方部署文档参考,目前社区版不支持集群的方式:

https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/deploy-on-kubernetes/deploy-sonarqube-on-kubernetes/

helm repo add sonarqube https://SonarSource.github.io/helm-chart-sonarqube
helm repo update
kubectl create namespace sonarqube
helm upgrade --install -n sonarqube sonarqube sonarqube/sonarqube

Yml方式

1.新版本7.9之后已经不再支持myql数据库,所以我们换成PostgreSQL
2.需要在k8s中准备一个strageclss(后端可以是nfs、ceph、juicefs、clusterfs)

[root@k8s-master01 ~]# kubectl get sc
NAME                   PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
juicefs-sc (default)   csi.juicefs.com   Delete          Immediate           false                  7d4h

1.安装PostgreSQL

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-sonar
  labels:
    app: postgres-sonar
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-sonar
  template:
    metadata:
      labels:
        app: postgres-sonar
    spec:
      containers:
      - name: postgres-sonar
        image: postgres:11.4
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 5432
        env:                       #变量代入
        - name: POSTGRES_DB
          value: "sonarDB"         #库名
        - name: POSTGRES_USER
          value: "sonarUser"       #账号
        - name: POSTGRES_PASSWORD 
          value: "123456"          #密码
        resources:
          limits:
            cpu: 1000m
            memory: 2048Mi
          requests:
            cpu: 500m
            memory: 1024Mi
        volumeMounts:
          - name: data
            mountPath: /var/lib/postgresql/data  #挂载路径
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: postgres-data

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-data 
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "juicefs-sc"   #storageClass名称
  resources:
    requests:
      storage: 1Gi

---
apiVersion: v1
kind: Service
metadata:
  name: postgres-sonar
  labels:
    app: postgres-sonar
spec:
  clusterIP: None              #无头服务
  ports:
  - port: 5432
    protocol: TCP
    targetPort: 5432
  selector:
    app: postgres-sonar

上面的yaml中,我们使用的storageClassName: "juicefs-sc"
并且使用了无头服务(仅集群使用),可以改成nodeport(可对外提供服务)

2.安装sonarqube

因为安装的是社区版,数据库是内嵌的,所以提示只作用于测试,且不能升级
而社区版只有sonarqube:lts-community 这个版本的镜像是最稳定且外嵌数据库的

下列yml中,nodePort: 30003 需要自行修改为集群中未被占用端口
[root@k8s-master01 sonarkube]# cat sonarkube.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonarqube
  labels:
    app: sonarqube
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonarqube
  template:
    metadata:
      labels:
        app: sonarqube
    spec:
      initContainers:
      - name: init-sysctl
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      containers:
      - name: sonarqube
        image: sonarqube:lts-community
        ports:
        - containerPort: 9000
        env:
        - name: SONARQUBE_JDBC_USERNAME
          value: "sonarUser"
        - name: SONARQUBE_JDBC_PASSWORD
          value: "123456"
        - name: SONARQUBE_JDBC_URL
          value: "jdbc:postgresql://postgres-sonar:5432/sonarDB"  #链接上面的pg,用无头服务的方式
        livenessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
        readinessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
          failureThreshold: 6
        resources:
          limits:
            cpu: 2000m
            memory: 2048Mi
          requests:
            cpu: 1000m
            memory: 1024Mi
        volumeMounts:
        - mountPath: /opt/sonarqube/conf
          name: data
          subPath: conf
        - mountPath: /opt/sonarqube/data
          name: data
          subPath: data
        - mountPath: /opt/sonarqube/extensions
          name: data
          subPath: extensions
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: sonarqube-data  

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sonarqube-data 
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "juicefs-sc"
  resources:
    requests:
      storage: 20Gi

---
apiVersion: v1
kind: Service
metadata:
  name: sonarqube
  labels:
    app: sonarqube
spec:
  type: NodePort
  ports:
    - name: sonarqube
      port: 9000
      targetPort: 9000
      nodePort: 30003   
      protocol: TCP
  selector:
    app: sonarqube

创建成功后查看pvc

存储大小可以在上面的yml中自行调整,我测试给的比较小
[root@k8s-master01 sonarkube]# kubectl get pvc
NAME            STATUS   VOLUME           CAPACITY                  ACCESS MODES  STORAGECLASS   AGE
postgres-data   Bound    pvc-0e3885a1-a4bc-4a8d-aac0-87d1ed62ab56   1Gi     RWX   juicefs-sc     89m
sonarqube-data  Bound    pvc-88544679-f7b8-4db4-8545-c012f5d0cfe7   20Gi    RWX   juicefs-sc     83m

登录Sonarqube

admin/admin  端口30003

jenkins中添加sonnarqube与OWASP Dependency-Check_第5张图片
安装中文插件
jenkins中添加sonnarqube与OWASP Dependency-Check_第6张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第7张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第8张图片

生成key并记录key

jenkins中添加sonnarqube与OWASP Dependency-Check_第9张图片

Jenkins+SonarQube代码审查

jenkins中添加sonnarqube与OWASP Dependency-Check_第10张图片

安装SonarQube Scanner插件

jenkins中添加sonnarqube与OWASP Dependency-Check_第11张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第12张图片

在全局工具中配置sonarqube

jenkins中添加sonnarqube与OWASP Dependency-Check_第13张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第14张图片
这里需要注意,并不是安装最新版,这个版本需要知道你目前安装jenkins时的java版本,我这里用的java11,所以需要去安装java11支持的sonarqube版本,不然会报以下错误
jenkins中添加sonnarqube与OWASP Dependency-Check_第15张图片

jenkins中sonarqube scanner 对应的jdk版本:
https://docs.sonarsource.com/sonarqube/9.9/analyzing-source-code/scanners/sonarscanner/

jenkins中添加sonnarqube与OWASP Dependency-Check_第16张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第17张图片
可以看到为4.8,所以我们安装4.8的版本
jenkins中添加sonnarqube与OWASP Dependency-Check_第18张图片

添加SonarQube凭证

jenkins中添加sonnarqube与OWASP Dependency-Check_第19张图片

jenkins中添加sonnarqube与OWASP Dependency-Check_第20张图片

Jenkins进行SonarQube配置

jenkins中添加sonnarqube与OWASP Dependency-Check_第21张图片

在项目中添加sonarqube检查

以自由风格为例:打开test01
jenkins中添加sonnarqube与OWASP Dependency-Check_第22张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第23张图片

# must be unique in a given SonarQube instance 
sonar.projectKey=web_demo_freestyle
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=web_demo_freestyle 
sonar.projectVersion=1.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set. 
sonar.sources=. 
sonar.java.binaries=.
sonar.exclusions=**/test/**,**/target/**

sonar.java.source=11 
sonar.java.target=11

# Encoding of the source code. Default is default system encoding 
sonar.sourceEncoding=UTF-8

常用基础配置解释

sonar.projectKey=gpcore                       #sonar平台中相对应项目的key
sonar.projectName=gpcore                      #sonar平台中相对应项目的名字
sonar.sources=.                               #sonar检测的源文件目录,‘.’表示当前根目录下的所有文件目录;包含主要源文件的目录的逗号分隔路径
sonar.exclusions=**/*_test.go,**/vendor/**    #检测中排除的源文件(排除的源文件不参与检测,一般排除单元测试文件、配置文件等)
sonar.tests=.                                 #sonar检测的测试文件目录,‘.’表示当前根目录下的所有文件目录;包含测试源文件的目录的逗号分隔路径。从构建系统中读取MavenGradleMSBuild项目。否则默认为空。
sonar.test.inclusions=**/**_test.go           #检测中的测试源文件(指定单元测试文件)
sonar.test.exclusions=**/vendor/**            #检测中排除的测试源文件(排除的源文件不参与检测)

sonar.jdbc.usernamesonar.jdbc.password表示Sonar的数据库用户名和密码
sonar.host.url表示Sonar的监听地址和端口号,
sonar.sourceEncoding表示Sonar的编码方式,
sonar.jdbc.url表示数据库的链接方式,在这里我们的该项内容来源于Sonar的配置文件。sonar.projectKey为我们自定义的该Sonar Scanner的关键字,
sonar.projectName为该扫描项目的名称,
sonar.projectVersion表示Sonar项目的版本,
sonar.sources表示要扫描的项目目录

直接构建
jenkins中添加sonnarqube与OWASP Dependency-Check_第24张图片
在sonarqube服务器上刷新,查看结果
jenkins中添加sonnarqube与OWASP Dependency-Check_第25张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第26张图片

jenkins+OWASP Dependency-Check漏洞扫描

服务器部署OWASP Dependency-Check

Dependency-CheckOWASPOpen Web Application Security Project)的一个实用开源程序,用于识别项目依赖项并检查是否存在任何已知的,公开披露的漏洞。
目前,已支持Java.NETRubyNode.jsPython等语言编写的程序并为C/C++构建系统(autoconfcmake)提供了有限的支持。
而且该工具还是OWASP Top 10的解决方案的一部分。
Dependency-Check 支持面广(支持多种语言)、可集成性强,作为一款开源工具,在多年来的发展中已经支持和许多主流的软件进行集成
比如:命令行、AntMavenGradleJenkinsSonar等;具备使用方便,落地简单等优势。

DependencyCheck 实现原理
依赖性检查可用于扫描应用程序(及其依赖库),执行检查时会将 Common Platform Enumeration (CPE)国家漏洞数据库及NPM Public Advisories库下载到本地,再通过核心引擎中的一系列分析器检查项目依赖性,收集有关依赖项的信息。
然后根据收集的依赖项信息与本地的CPE&NPM库数据进行对比,如果检查发现扫描的组件存在已知的易受攻击的漏洞则标识,最后生成报告进行展示。
dependency-check下载地址
https://owasp.org/www-project-dependency-check/

https://jeremylong.github.io/DependencyCheck/  官方文档地址
https://github.com/jeremylong/DependencyCheck   gitlab地址

jenkins中添加sonnarqube与OWASP Dependency-Check_第27张图片

上传到jenkins所在服务器解压即可
[root@jenkins test01]# cd /data/owasp/
[root@jenkins owasp]# ll
total 30368
drwxrwxrwx. 7 root root      125 Sep 20 14:25 dependency-check
-rwxrwxrwx. 1 root root 31094435 Sep 20 14:22 dependency-check-8.4.0-release.zip

[root@jenkins test01]# chmod 777 -R  /data/owasp/

jenkins配置

下载插件
jenkins中添加sonnarqube与OWASP Dependency-Check_第28张图片
配置全局工具
jenkins中添加sonnarqube与OWASP Dependency-Check_第29张图片
在构建步骤选择增加构建步骤选择Dependency_check
jenkins中添加sonnarqube与OWASP Dependency-Check_第30张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第31张图片
直接构建
jenkins中添加sonnarqube与OWASP Dependency-Check_第32张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第33张图片
进入这个目录,把html下载下来打开直接打开
jenkins中添加sonnarqube与OWASP Dependency-Check_第34张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第35张图片

在sonarQube页面查看Dependency_check报告

1.下载dependency-check-sonar-plugin
https://github.com/dependency-check/dependency-check-sonar-plugin

一定要注意dependency-check-sonar-plugin与sonarQube的版本对应关系,我们部署的sonarQube是8.9,对应的dependency-check-sonar-plugin版本为:

jenkins中添加sonnarqube与OWASP Dependency-Check_第36张图片
2.下载下来之后使用:mvn clean package 生成jar包
将下载的sonar-dependency-check-plugin的jar包插件复制到sonarQube的extensions/plugins目录下,并且重启sonarqube,如果是镜像,需要手动编写Dockerfile,放入后生成新的镜像

jenkins中添加sonnarqube与OWASP Dependency-Check_第37张图片
3.返回到jenkins页面,在需要扫描的工程中,配置owasp的报告文件路径

sonar.dependencyCheck.htmlReportPath=./dependency-check-report.html
sonar.dependencyCheck.summarize=true
sonar.dependencyCheck.securityHotspot=true

4.注意执行顺序,先执行dependency-check,再执行sonarQube Scanner,因为sonar插件不会进行依赖扫描,需要通过dependency-check扫描完成后,读取配置文件,然后在页面展示的
jenkins中添加sonnarqube与OWASP Dependency-Check_第38张图片
jenkins中添加sonnarqube与OWASP Dependency-Check_第39张图片
5.构建完成后,在sonarQube页面,选择刚刚扫描的项目,选择更多,点击Dependency-Check,即可查看报告
jenkins中添加sonnarqube与OWASP Dependency-Check_第40张图片

你可能感兴趣的:(jenkins,sonarqube,owsap)