• 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   国内
    
    • 1
    • 2
    • 3
    • 4
    linux 安装jdk11 文档:
    https://blog.51cto.com/u_16175449/6648723
    
    • 1
    • 2

    k8s中安装sonarqube

    简介:

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

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

    其中Community Edition (社区版) 免费的
    在这里插入图片描述
    我是在docker官方镜像找的lts镜像下载的lts版:
    在这里插入图片描述
    https://www.sonarsource.com/products/sonarqube/downloads/ 其他版本下载地址
    在这里插入图片描述

    Helm 方式

    目前只支持Helm v3
    此链接对应这k8s支持的版本号:
    https://artifacthub.io/packages/helm/sonarqube/sonarqube-dce/10.0.0+521
    在这里插入图片描述
    官方部署文档参考,目前社区版不支持集群的方式:

    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
    
    • 1
    • 2
    • 3
    • 4

    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
    • 2
    • 3

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    上面的yaml中,我们使用的storageClassName: "juicefs-sc"
    并且使用了无头服务(仅集群使用),可以改成nodeport(可对外提供服务)
    
    • 1
    • 2

    2.安装sonarqube

    因为安装的是社区版,数据库是内嵌的,所以提示只作用于测试,且不能升级
    而社区版只有sonarqube:lts-community 这个版本的镜像是最稳定且外嵌数据库的
    
    下列yml中,nodePort: 30003 需要自行修改为集群中未被占用端口
    
    • 1
    • 2
    • 3
    • 4
    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101

    创建成功后查看pvc

    存储大小可以在上面的yml中自行调整,我测试给的比较小
    
    • 1
    [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
    
    • 1
    • 2
    • 3
    • 4

    登录Sonarqube

    admin/admin  端口30003
    
    • 1

    在这里插入图片描述
    安装中文插件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    生成key并记录key

    在这里插入图片描述

    Jenkins+SonarQube代码审查

    在这里插入图片描述

    安装SonarQube Scanner插件

    在这里插入图片描述
    在这里插入图片描述

    在全局工具中配置sonarqube

    在这里插入图片描述
    在这里插入图片描述
    这里需要注意,并不是安装最新版,这个版本需要知道你目前安装jenkins时的java版本,我这里用的java11,所以需要去安装java11支持的sonarqube版本,不然会报以下错误
    在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述
    可以看到为4.8,所以我们安装4.8的版本
    在这里插入图片描述

    添加SonarQube凭证

    在这里插入图片描述

    在这里插入图片描述

    Jenkins进行SonarQube配置

    在这里插入图片描述

    在项目中添加sonarqube检查

    以自由风格为例:打开test01
    在这里插入图片描述
    在这里插入图片描述

    # 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    常用基础配置解释

    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表示要扫描的项目目录
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    直接构建
    在这里插入图片描述
    在sonarqube服务器上刷新,查看结果
    在这里插入图片描述
    在这里插入图片描述

    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库数据进行对比,如果检查发现扫描的组件存在已知的易受攻击的漏洞则标识,最后生成报告进行展示。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    dependency-check下载地址
    https://owasp.org/www-project-dependency-check/
    
    https://jeremylong.github.io/DependencyCheck/  官方文档地址
    https://github.com/jeremylong/DependencyCheck   gitlab地址
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    上传到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/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    jenkins配置

    下载插件
    在这里插入图片描述
    配置全局工具
    在这里插入图片描述
    在构建步骤选择增加构建步骤选择Dependency_check
    在这里插入图片描述
    在这里插入图片描述
    直接构建
    在这里插入图片描述
    在这里插入图片描述
    进入这个目录,把html下载下来打开直接打开
    在这里插入图片描述
    在这里插入图片描述

    在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版本为:

    在这里插入图片描述
    2.下载下来之后使用:mvn clean package 生成jar包
    将下载的sonar-dependency-check-plugin的jar包插件复制到sonarQube的extensions/plugins目录下,并且重启sonarqube,如果是镜像,需要手动编写Dockerfile,放入后生成新的镜像

    在这里插入图片描述
    3.返回到jenkins页面,在需要扫描的工程中,配置owasp的报告文件路径

    sonar.dependencyCheck.htmlReportPath=./dependency-check-report.html
    sonar.dependencyCheck.summarize=true
    sonar.dependencyCheck.securityHotspot=true
    
    • 1
    • 2
    • 3

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

  • 相关阅读:
    MySQL 约束条件,关键字练习,其他语句
    java包装类
    Excel自定义排序和求和
    nano的CAN通信
    pytest +allure在测试中的应用
    线上JAVA应用平稳运行一段时间后出现JVM崩溃问题 | 京东云技术团队
    Java学生管理系统(纯练手)
    SCI英语论文长难句攻略
    JSON decoding error: Invalid UTF-8 start byte 0xb6
    计算机网络(二、物理层)
  • 原文地址:https://blog.csdn.net/weixin_48190891/article/details/133082137