代码分析与审计

代码审计工具平台

  • 综合新的代码分析平台
    • sonar支持自定义规则,较多公司使用
  • IDE辅助功能
    • xcode、android studio
    • 阿里巴巴java开发手册ide插件支持
  • 独立的静态分析工具
    • findbugs、androidlint studio
    • 阿里巴巴java开发手册ide插件支持
  • 独立的静态分析工具
    • findbugs、androidlint、scan-build
    • pmd阿里巴巴java开发手册pmd插件

代码审计关注的质量指标

image-20210223104149969

  • 代码坏味道
    • 代码规范
    • 技术债评估
  • bug和漏洞
  • 代码重复度
  • 单测与集成
    • 测试用例数量
    • 覆盖率

静态分析技术分类

  • 代码静态检查
    • 代码分析:lint系列,通过分析语法树和源代码,检查代码规范
    • 编译器分析:借助编译器获得代码关系
  • 字节码静态分析
    • 分析jar、war、dex等格式的文件,代表工具:findbugs

SonarQube平台

官方网站:https://www.sonarqube.org/

官方文档:https://docs.sonarqube.org/latest/

SonarQube插件:https://www.sonarplugins.com/

image-20210223105124407

SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。

主要的核心价值体现在如下几个方面:

  1. 检查代码是否遵循编程标准:如命名规范,编写的规范等。
  2. 检查设计存在的潜在缺陷:SonarQube 通过插件 Findbugs、Checkstyle 等工具检测代码存在的缺陷。
  3. 检测代码的重复代码量:SonarQube 可以展示项目中存在大量复制粘贴的代码。
  4. 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。
  5. 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。

SonarQube 平台主要是由 4 个部分组成

  • SonarQube Server
  • SonarQube Database
  • SonarQube Plugins
  • SonarQube Scanner

SonarQube平台工作流程

SonarQube 在进行代码质量管理时,会从下图 所示的七个纬度来分析项目的质量。

image-20210223115631025

SonarQube执行流程

image-20200820161947221

SonarQube结合Git、Jenkins的代码持续审查执行流程。SonarQube 需要数据库的支持,用于存储检测项目后的分析数据,同时为了实现可持续监测,还需要持续集成工具(如Jenkins)的支持,在构建版本前,通过Jenkins+Sonar 插件执行项目分析指令,最终的结果会通过SonarQube 服务器的Web 页面展示。下图是使用SonarQube做代码持续审查的流程图:

img

SonarQube平台安装与配置

注意:sonar7.9之后版本不支持mysql,oracle必须使用ojdbc7或者更高版本

环境准备

  • 系统:CentOS8
  • 数据库:postgres
  • SonarQube,最新的版本
  • Docker

安装

我们使用Docker安装SonarQube

postgres

  1. 拉取postgres镜像

    1
    [root@localhost ~]# docker pull postgres
  1. 启动postgres容器

    1
    [root@localhost ~]# docker run -d --name sonarqube_postgres -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar postgres

    默认端口:5432

###sonarqube

  1. 拉取sonarqube镜像

    1
    [root@localhost ~]# docker pull sonarqube

    lts表示稳定版

  2. 启动sonarqube容器

    1
    [root@localhost ~]# docker run -d --name sonarqube -p 9000:9000 --link sonarqube_postgres -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube_postgres:5432/sonar -v sonarqube_data:/opt/sonarqube/data -v sonarqube_extensions:/opt/sonarqube/extensions -v sonarqube_logs:/opt/sonarqube/logs sonarqube

    数据卷:

    • sonarqube_data:数据
    • sonarqube_extensions:插件
    • sonarqube_logs:日志
  3. 启动容器后,报错解决

    • 查看容器日志:docker logs -f 容器id|容器name

    • 错误信息

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      ……
      ERROR: [1] bootstrap checks failed
      [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
      2020.08.19 08:04:37 INFO es[][o.e.n.Node] stopping ...
      2020.08.19 08:04:37 INFO es[][o.e.n.Node] stopped
      2020.08.19 08:04:37 INFO es[][o.e.n.Node] closing ...
      2020.08.19 08:04:37 INFO es[][o.e.n.Node] closed
      2020.08.19 08:04:37 WARN app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 78
      2020.08.19 08:04:37 INFO app[][o.s.a.SchedulerImpl] Process[es] is stopped
      2020.08.19 08:04:37 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped

      从上面的log查看错误

      1
      2
      ERROR: [1] bootstrap checks failed
      [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
  • 解决方案

    1
    2
    3
    # vi /etc/sysctl.conf # 修改本地文件的内存大小值(添加,vm.max_map_count = 655360)
    # sysctl -p
    # 再次启动SonarQube,docker restart 容器id|容器name

以上安装步骤相当麻烦,是否可以有一次性搞定的方案呢?我们可以使用docker-compose进行容器编排的操作,编写docker-compose.yml文件

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
version: "3"

services:
sonarqube:
image: sonarqube
container_name: sonarqube
ports:
- 9000:9000
environment:
- SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube_postgres:5432/sonar
- SONARQUBE_JDBC_USERNAME=sonar
- SONARQUBE_JDBC_PASSWORD=sonar
volumes:
- sonarqube_conf:/opt/sonarqube/conf
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
- /usr/local/sonar_lib/sonarqube-community-branch-plugin-1.6.0.jar:/opt/sonarqube/extensions/plugins/sonarqube-community-branch-plugin.jar
- /usr/local/sonar_lib/sonarqube-community-branch-plugin-1.6.0.jar:/opt/sonarqube/lib/common/sonarqube-community-branch-plugin.jar
depends_on:
- sonarqube_postgres

sonarqube_postgres:
image: postgres
container_name: sonarqube_postgres
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data

volumes:
sonarqube_conf:
sonarqube_data:
sonarqube_logs:
sonarqube_extensions:
sonarqube_bundled-plugins:
postgresql:
postgresql_data:

注意:SonarQube在扫描代码是不能指定分支的,默认写死了master,如果修改分支则需要sonarqube-community-branch-plugin-1.6.0.jar插件,该插件的Github地址:https://github.com/mc1arke/sonarqube-community-branch-plugin

访问

image-20210223173155140

admin/admin登录后,会提示修改密码

SonarQube安装插件

登录进入首页,点击”Administration” -> “Marketplace”,注意:登录的账户有管理员的权限

image-20210223173546097

例如Java语言常用的相关插件:Checkstyle、Findbugs、SonarJava、PMD

插件安装会放到docker数据卷sonarqube_extensions,进入数据卷查看安装的插件

image-20210301112118565

也可到sonar插件的网站:https://www.sonarplugins.com/,搜索对应的插件下载,下载完成的插件放到数据sonarqube_extensions目录下,重启SonarQube即可。

代码扫描规则定制

SonarQube官网对不同语言指定了很多规则,通过扫描出来的结果,也是分高低优先级,但是有些规则不一定是根据我们编码可现的,如果用现有的规则扫描会误报很多的问题,因此我们的规则有效、直观,进行规则制定。

image-20210301105931982

定制规则是要由开发的规则规范来定制,可以参考阿里巴巴开发手册进行定制:https://github.com/alibaba/p3c

SonarQube Api

接口地址:http://sonar_url/web_api

image-20210224171831659