CICD-代码审计(漏洞扫描⼯具-代码审计静态代码分析和安全检测-代码覆盖率)CICD-代码审计
2019/09/04 Chenxin
需求说明
要实现的预期⽬标是什么?(安全,⾼效,规范?)->规范
后期考虑安全.
漏洞原理
参考
常见web漏洞原理分析
如果Java、PHP、ASP等程序语⾔的编程⼈员的安全意识不⾜,对程序参数输⼊等检查不严格等,会导致Web应⽤安全问题层出不穷。本⽂根据当前Web应⽤的安全情况,列举了Web应⽤程序常见的攻击原理及危害,并给出如何避免遭受Web攻击的建议。
Web应⽤漏洞原理
Web应⽤攻击是攻击者通过浏览器或攻击⼯具,在URL或者其它输⼊区域(如表单等),向Web服务器发送特殊请求,从中发现Web应⽤程序存在的漏洞,从⽽进⼀步操纵和控制⽹站,查看、修改未授权的信息。
Web应⽤的漏洞分类
1、信息泄露漏洞.
造成信息泄露主要有以下三种原因:
--Web服务器配置存在问题,导致⼀些系统⽂件或者配置⽂件暴露在互联⽹中;
--Web服务器本⾝存在漏洞,在浏览器中输⼊⼀些特殊的字符,可以访问未授权的⽂件或者动态脚本⽂件源码;
--Web⽹站的程序编写存在问题,对⽤户提交请求没有进⾏适当的过滤,直接使⽤⽤户提交上来的数据。
2、⽬录遍历漏洞
⽬录遍历漏洞是攻击者向Web服务器发送请求,通过在URL中或在有特殊意义的⽬录中附加“../”、或者附加“../”的⼀些变形(如“..\”或“..//”甚⾄其编码),导致攻击者能够访问未授权的⽬录,以及在Web服务器的根⽬录以外执⾏命令。
3、命令执⾏漏洞
命令执⾏漏洞是通过URL发起请求,在Web服务器端执⾏未授权的命令,获取系统信息,篡改系统配置,控制整个系统,使系统瘫痪等。
命令执⾏漏洞主要有两种情况:
--通过⽬录遍历漏洞,访问系统⽂件夹,执⾏指定的系统命令;
--攻击者提交特殊的字符或者命令,Web程序没有进⾏检测或者绕过Web应⽤程序过滤,把⽤户提交的请求作为指令进⾏解析,导致执⾏任意命令。
4、⽂件包含漏洞
⽂件包含漏洞是由攻击者向Web服务器发送请求时,在URL添加⾮法参数,Web服务器端程序变量过滤不严,把⾮法的⽂件名作为参数处理。这些⾮法的⽂件名可以是服务器本地的某个⽂件,也可以是
远端的某个恶意⽂件。由于这种漏洞是由php变量过滤不严导致的,所以只有基于PHP开发的Web应⽤程序才有可能存在⽂件包含漏洞。
5、SQL注⼊漏洞
SQL注⼊漏洞是由于Web应⽤程序没有对⽤户输⼊数据的合法性进⾏判断,攻击者通过Web页⾯的输⼊区域(如URL、表单等) ,⽤精⼼构造的SQL语句插⼊特殊字符和指令,通过和数据库交互获得私密信息或者篡改数据库信息。SQL注⼊攻击在Web攻击中⾮常流⾏,攻击者可以利⽤SQL注⼊漏洞获得管理员权限,在⽹页上加挂⽊马和各种恶意程序,盗取企业和⽤户敏感信息。
6、跨站脚本漏洞
跨站脚本漏洞是因为Web应⽤程序没有对⽤户提交的语句和变量进⾏过滤或限制,攻击者通过Web页⾯的输⼊区域向数据库或HTML页⾯中提交恶意代码,当⽤户打开有恶意代码的链接或页⾯时,恶意代码通过浏览器⾃动执⾏,从⽽达到攻击的⽬的。跨站脚本漏洞危害很⼤,尤其是⽬前被⼴泛使⽤的⽹络银⾏,通过跨站脚本漏洞攻击者可以冒充受害者访问⽤户重要账户,盗窃企业重要信息。
根据漏洞研究机构的调查显⽰,SQL注⼊漏洞和跨站脚本漏洞的普遍程度排名前两位。
SQL注⼊攻击原理
SQL注⼊攻击是通过构造巧妙的SQL语句,同⽹页提交的内容结合起来进⾏注⼊攻击。⽐较常⽤的⼿段有使⽤注释符号、恒等式(如1=1)、使⽤union语句进⾏联合查询、使⽤insert或update语句插⼊或修改数据等,此外还可以利⽤⼀些内置函数辅助攻击。
通过SQL注⼊漏洞攻击⽹站的步骤⼀般如下:
1探测⽹站是否存在SQL注⼊漏洞。
2探测后台数据库的类型。
3根据后台数据库的类型,探测系统表的信息。
4探测存在的表信息。
5探测表中存在的列信息。
6探测表中的数据信息。
跨站脚本攻击原理
跨站脚本攻击的⽬的是盗⾛客户端敏感信息,冒充受害者访问⽤户的重要账户。跨站脚本攻击主要有
以下三种形式:
1、本地跨站脚本攻击
B给A发送⼀个恶意构造的Web URL,A点击查看了这个URL,并将该页⾯保存到本地硬盘(或B构造的⽹页中存在这样的功能)。A在本地运⾏该⽹页,⽹页中嵌⼊的恶意脚本可以执⾏A电脑上A所持有的权限下的所有命令。
2、反射跨站脚本攻击
A经常浏览某个⽹站,此⽹站为B所拥有。A使⽤⽤户名/密码登录B⽹站,B⽹站存储下A的敏感信息(如银⾏帐户信息等)。C发现B的站点包含反射跨站脚本漏洞,编写⼀个利⽤漏洞的URL,域名为B⽹站,在URL后⾯嵌⼊了恶意脚本(如获取A的cookie⽂件),并通过邮件或社会⼯程学等⽅式欺骗A访问存在恶意的URL。当A使⽤C提供的URL访问B ⽹站时,由于B⽹站存在反射跨站脚本漏洞,嵌⼊到URL中的恶意脚本通过Web服务器返回给A,并在A浏览器中执⾏,A的敏感信息在完全不知情的情况下将发送给了C。
3、持久跨站脚本攻击
B拥有⼀个Web站点,该站点允许⽤户发布和浏览已发布的信息。C注意到B的站点具有持久跨站脚本
漏洞,C发布⼀个热点信息,吸引⽤户阅读。A⼀旦浏览该信息,其会话cookies或者其它信息将被C盗⾛。持久性跨站脚本攻击⼀般出现在论坛、留⾔簿等⽹页,攻击者通过留⾔,将攻击数据写⼊服务器数据库中,浏览该留⾔的⽤户的信息都会被泄漏。
Web应⽤漏洞的防御实现
对于以上常见的Web应⽤漏洞漏洞,可以从如下⼏个⽅⾯⼊⼿进⾏防御:
1Web应⽤开发者
⼤部分Web应⽤常见漏洞,都是在Web应⽤开发中,开发者没有对⽤户输⼊的参数进⾏检测或者检测不严格造成的。所以,Web应⽤开发者应该树⽴很强的安全意识,开发中编写安全代码;对⽤户提交的URL、查询关键字、HTTP头、POST数据等进⾏严格的检测和限制,只接受⼀定长度范围内、采⽤适当格式及编码的字符,阻塞、过滤或者忽略其它的任何字符。通过编写安全的Web应⽤代码,可以消除绝⼤部分的Web应⽤安全问题。
2Web⽹站管理员
作为负责⽹站⽇常维护管理⼯作Web管理员,应该及时跟踪并安装最新的、⽀撑Web⽹站运⾏的各种软件的安全补丁,确保攻击者⽆法通过软件漏洞对⽹站进⾏攻击。
除了软件本⾝的漏洞外,Web服务器、数据库等不正确的配置也可能导致Web应⽤安全问题。Web⽹站管理员应该对⽹站各种软件配置进⾏仔细检测,降低安全问题的出现可能。
此外,Web管理员还应该定期审计Web服务器⽇志,检测是否存在异常访问,及早发现潜在的安全问题。
3使⽤⽹络防攻击设备
前两种为事前预防⽅式,是⽐较理想化的情况。然⽽在现实中,Web应⽤系统的漏洞还是不可避免的存在:部分Web⽹站已经存在⼤量的安全漏洞,⽽Web开发者和⽹站管理员并没有意识到或发现这些安全漏洞。由于Web应⽤是采⽤HTTP协议,普通的防⽕墙设备⽆法对Web类攻击进⾏防御,因此可以使⽤IPS⼊侵防御设备来实现安全防护。
完整防护
⼀个完整的Web攻击防御解决⽅案,通过安全的Web应⽤程序、Web服务器软件、Web防攻击设备共同配合,确保整个⽹站的安全。任何⼀个简单的漏洞、疏忽都会造成整个⽹站受到攻击,造成巨⼤损失。此外,Web攻击防御是⼀个长期持续的⼯作,随着Web技术的发展和更新,Web攻击⼿段也不断发展,针对这些最新的安全威胁,需要及时调整Web安全防护策略,确保Web攻击防御的主动性,使Web⽹站在⼀个安全的环境中为企业和客户服务。
攻防之操作系统介绍
这⾥列出的5款linux发⾏版,它们包具备很好的的渗透测试⼯具以及其他⿊客⼯具.这⾥列表中⽬前最受欢迎的Linux发⾏版是Kail Linux,是因为它在渗透测试中⾮常流⾏.它的开发团队 Offensive security .
Kali Linux (最常⽤)
Kali Linux 在渗透测试和⽩帽⼦⽅⾯是业界领先的 Linux 发⾏版。默认情况下,该发⾏版附带了⼤量⼊侵和渗透的⼯具和软件,并且在全世界都得到了⼴泛认可。
BackBox
它包括了⼀些经常使⽤的安全和分析⼯具,可以⽤于从 web 应⽤分析到⽹络分析,从压⼒测试到嗅探,以及脆弱性分析、计算机取证分析和破解等等的各种⽤途。这个发⾏版的⼀⼤特点是,它的 Launchpad 软件库会持续更新各种⼯具的最新稳定版,它们都是⽩帽⿊客所熟知常⽤的。该发⾏版中的新⼯具集成和开发遵循了开源社区的标准,特别是 Debian ⾃由软件指导Debian Free Software Guidelines的标准。
Parrot Security (界⾯最炫酷)
是⼀个基于 Debian GNU/Linux 的发⾏版,并混以 Frozenbox OS 和 Kali linux 的部分特性,以提供最好的渗透和安全测试体验。它是由 Frozenbox Dev Team 开发的。
Parrot 采⽤ Kali 的软件库来更新⼤部分⼯具,不过也有提供其⾃⼰的定制软件的软件库。这也是为何它不只是⼀个简单的 Kali 修改版,⽽是⼀个建⽴在 Kali ⼯具库之上的新系统,因此,它引⼊了许多新功能和不同的开发选择。Parrot 使⽤ MATE 作为桌⾯环境,这是⼀个轻量级的、⾼效的 Gnome 2 家族的衍⽣品。还有来⾃ FrozenBox 的⾼度定制的迷⼈的图标、特制的主题和墙纸。系统外观是由该社区的成员以及关注该项⽬进展的 Frozenbox Network 的成员建议并设计的
deft
是⼀个 Ubuntu 定制版,带有⼀整套由数以千计的个⼈、团队和公司所创建的计算机取证程序和⽂档。它们每⼀个都可能采⽤了不同的许可证,它的许可证策略决定了哪些软件会被放到 deft 中和默认放到它的安装光盘中。
Pentoo
是⼀个⽤于渗透测试和安全评估的即⽤ CD 和 USB。它基于 Gentoo Linux ,提供了 32 位和 64 位的即⽤ CD 。Pentoo 也可以覆盖安装到现有的 Gentoo 环境中。它提供了特⾊的带有包注⼊补丁的 WIFI
驱动,GPGPU 破解软件,以及许多渗透测试和安全评估的软件。Pentoo 内核带有 grsecurity 和 PAX 加固补丁,其提供的⼆进制是由加固⼯具链编译⽽成的,其中⼀些⼯具还有最新的每⽇构建版本。
漏洞扫描
漏洞扫描⼯具
AWVS
国外商业收费软件,据了解⼀个License⼀年费⽤是2万多RMB。可见总体漏洞扫描概况,也可导出报告,报告提供漏洞明细说明、漏洞利⽤⽅式、修复建议。缺点是限制了并⾏扫描的⽹站数
⽹上有破解版.
OWASP Zed(ZAP)
来⾃OWASP项⽬组织的开源免费⼯具,提供漏洞扫描、爬⾍、Fuzz功能,该⼯具已集成于Kali Linux系统。
Nikto
⼀款开源软件,不仅可⽤于扫描发现⽹页⽂件漏洞,还⽀持检查⽹页服务器和CGI的安全问题。它⽀持指定特定类型漏洞的扫描、绕过IDC检测等配置。该⼯具已集成于Kali Linux系统。
BurpSuite
“Scanner”功能⽤于漏洞扫描,可设置扫描特定页⾯,⾃动扫描结束,可查看当前页⾯的漏洞总数和漏洞明细。虽说也有漏扫功能,但其核⼼功能不在于此,因此漏扫功能还是不如其他专业漏洞扫描⼯具。
Nessus
⾯向个⼈免费、⾯向商业收费的形式,不仅扫描Web⽹站漏洞,同时还会发现Web服务器、服务器操作系统等漏洞。个⼈⽤户只需在官⽹上注册账号即可获得激活码。它是⼀款Web⽹站形式的漏洞扫描⼯具。
Nessus (渗透测试⼯具,⽀持linux,mac,Windows)
Nessus漏洞扫描教程之安装Nessus⼯具
参考
Nessus基础知识
Nessus号称是世界上最流⾏的漏洞扫描程序,全世界有超过75000个组织在使⽤它。该⼯具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件,Nessus可同时在本机或远端上遥控,进⾏系统的漏洞分析扫描。对应渗透测试⼈员来说,Nessus是必不可少的⼯具之⼀。所以,本章将介绍Nessus⼯具的基础知识。
官⽅分为家庭版和专业版.⼀般选择家庭版就可以了.家庭版需要⼀个邮件地址来接收激活码(免费的).
Nessus概述
Nessus通常包括成千上万的最新的漏洞,各种各样的扫描选项,及易于使⽤的图形界⾯和有效的报告。Nessus之所以被⼈们喜爱,是因为该⼯具具有⼏个特点。如下所⽰:
q  提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。
q  不同于传统的漏洞扫描软件。Nessus可同时在本机或远程控制,进⾏系统的漏洞分析扫描。
q  其运作效能随着系统的资源⽽⾃⾏调整。如果将主机配置更多的资源(如加快CPU速度或增加内存⼤⼩),其效率表现可因为丰富资源⽽提⾼。
q  可⾃⾏定义插件。
q  NASL(Nessus Attack Scripting Language)是由Tenable所发出的语⾔,⽤来写⼊Nessus的安全测试选项。
q  完全⽀持SSL(Secure Socket Layer)。
OpenVAS
是开放式漏洞评估系统,也可以说它是⼀个包含着相关⼯具的⽹络扫描器。其核⼼部件是⼀个服务器,包括⼀套⽹络漏洞测试程序,可以检测远程系统和应⽤程序中的安全问题。
其他
⼀些其他商业漏洞扫描软件(Safe3 WVS、IBM公司的AppScan)、以及其他特定⽹站类型的扫描⼯具(针对jboss的jboss-autopwn、针对joomla的joomscan、针对wordpress的wpscan)
Java代码审计常⽤⼯具(部分⽀持,c++等)
静态分析
PMD (java静态分析)
需要安装到 Eclipse 或 IDEA.
PMD是⼀款采⽤BSD协议发布的Java程序代码检查⼯具。该⼯具可以做到检查Java代码中是否含有未使⽤的变量、是否含有空的抓取块、是否含有不必要的对象等。该软件功能强⼤,扫描效率⾼,是Java程序员debug的好帮⼿。
与其他分析⼯具不同的是,PMD通过静态分析获知代码错误。也就是说在不运⾏Java程序的情况下,报告错误。
PMD附带了许多可以直接使⽤的规则,利⽤这些规则可以出Java源程序的许多问题。
-此外,⽤户还可以⾃⼰定义规则。检查Java代码是否符合某些特定的编码规范。常见的类型如下:
潜在的bug:空的try/catch/finally/switch语句
未使⽤的代码:未使⽤的局部变量、参数、私有⽅法等
可选的代码:String/StringBuffer的滥⽤
复杂的表达式:不必须的if语句、可以使⽤while循环完成的for循环
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
循环体创建新对象:尽量不要再for或while循环体内实例化⼀个新对象
资源关闭:Connect,Result,Statement等使⽤之后确保关闭掉
coinw当前情况
⽼的代码问题太多,跑PMD后,没法看.
新的代码可以.
hpx
当前没有⽤,之后尝试安装到IDE⾥.
FindBugs (java bug静态分析)
同PMD,需要安装到IDE⾥.
通过⼀些必要的检查⼯具来去发现程序潜在的bug,尽管⼯具不能解决⼤部分问题,但是也是能够给我们带来很⼤帮助。
FindBugs是⼀款静态分析⼯具,检查程序潜在bug,在bug报告中快速定位到问题的代码上。
静态安全检测 (价格昂贵)
对于应⽤安全性的检测⽬前⼤多数是通过测试的⽅式来实现。
测试⼤体上分为⿊盒测试和⽩盒测试两种。
⿊盒测试⼀般使⽤的是渗透的⽅法,这种⽅法仍然带有明显的⿊盒测试本⾝的不⾜,需要⼤量的测试⽤例来进⾏覆盖,且测试完成后仍⽆法保证软件是否仍然存在风险。
现在⽩盒测试中源代码扫描越来越成为⼀种流⾏的技术,使⽤源代码扫描产品对软件进⾏代码扫描,⼀⽅⾯可以出潜在的风险,从内对软件进⾏检测,提⾼代码的安全性,另⼀⽅⾯也可以进⼀步提⾼代码的质量。
⿊盒的渗透测试和⽩盒的源代码扫描内外结合,可以使得软件的安全性得到很⼤程度的提⾼。
源代码分析技术由来已久.⽽在静态源代码安全分析⽅⾯,Fortify 公司和 Ounce Labs 公司的静态代码分析器都是⾮常不错的产品。
对于源代码安全检测领域⽬前的供应商有很多,这⾥我们选择其中的三款具有代表性的进⾏对⽐,分别是 Fortify公司的Fortify SCA,Security Innovation公司的Checkmarx Suite 和Armorize公司的CodeSecure。
Checkmarx (静态代码安全检测⼯具)
Checkmarx ⽩盒代码审计解决⽅案,主要通过采⽤独特的词汇分析技术和CxQL专利查询技术对应⽤程序源码进⾏静态分析检查。
⽆需编译,可以直接上传源码zip包,CheckMarx直接扫描源码;
规则可定制,⽤户可以根据不同的语⾔类型⾃定义选择检查规则,针对性强;
静态分析,代码⽆需运⾏;
增量扫描,再次扫描,只分析新增代码及相关⽂件;
低耦合,易于集成到软件开发的任何阶段。
开发者:以⾊列的⼀家⾼科技软件公司CheckMarx开发本软件CxSuite(其实就叫这个名字)。
服务器要求:window服务器部署
价格: ⼤约70万(软件)
Fortify SCA
Fortify SCA(Source Code Analysis).
Fortify Software公司是⼀家总部位于美国硅⾕,致⼒于提供应⽤软件安全开发⼯具和管理⽅案的⼚商。
开发⽣命周期中花最少的时间和成本去识别和修复软件源代码中的安全隐患。
Fortify SCA是Fortify360产品套装中的⼀部分,它使⽤fortify公司特有的X-Tier Dataflow™ analysis技术去检测软件安全问题。
优点:⽬前全球最⼤静态源代码检测⼚商、⽀持语⾔最多
缺点:价格昂贵、使⽤不⽅便.⼤约100万.
最新论坛网站源码
Armorize CodeSecure
Armorize CodeSecure阿码科技2006年,总部设⽴于美国加州,研发位于台湾.
阿码科技提供全⽅位⽹络安全解决⽅案,捍卫企业免于受到⿊客利⽤ Web 应⽤程序的漏洞所发动的攻击。
CodeSecure内建语法剖析功能⽆需依赖编译环境,任何⼈员均可利⽤ Web操作与集成开发环境双接⼝,出存在信息安全问题的源代码,并提供修补建议进⾏调整。CodeSecure依托于⾃⾏开发的主机进⾏远程源代码检测,在保证速度稳定的同时⽅便⽤户进⾏Web远程操作。
优点:Web结合硬件,速度快、独具特⾊的深度分析
缺点:⽀持语⾔种类较少、价格不菲.⼤约100万.
其他静态源代码检测产品
公司产品⽀持语⾔
art of defence Hypersource JAVA
Coverity Prevent JAVA .NET C/C++
开源 Flawfinder C/C++
Grammatech CodeSonar C/C++
HP DevInspect JAVA
KlocWork Insight JAVA .NET C/C++,C#
Ounce Labs Ounce 6 JAVA .NET
Parasoft JTEST等 JAVA .NET C/C++
SofCheck Inspector for JAVA JAVA
University of Maryland FindBugs JAVA
Veracode SecurityReview JAVA .NET
FindBug PMD/Lint4 JAVA
代码审计⼯具的部署与使⽤
请参考本⽂后半段部分.⽐如 sonar 等.
代码检测⼯具其实有很多,IDEA建议直接安装阿⾥代码检测插件(Alibaba Java Coding Guidelines),简单实⽤。
代码审计常⽤⼯具(其他语⾔)
PHP类
No1 Seay源代码审计⼯具
Seay源代码审计⼯具⼀款php代码审计⼯具,主要是运⽤于windows,这款⼯具可以发现常见的php漏洞,另外还⽀持⼀键审计、代码调试、函数定位、插件扩展、数据库执⾏监控等功能!
No2 rips源代码审计系统
Rips源代码审计系统是可以⽤于linux和windows上的⼀款源代码审计系统!使⽤⽅式很简单,直接将rips源码放在web应⽤的根⽬录下就可以了。(PHP)
代码覆盖率⼯具
代码覆盖率
代码覆盖(Code coverage)是软件测试中的⼀种度量,描述程式中源代码被测试的⽐例和程度,所得⽐例称为代码覆盖率。
代码覆盖率是衡量测试质量的⼀个重要指标。在对⼀个软件产品进⾏了单元测试、组装测试、集成测试以及接⼝测试等繁多的测试之后,我们能不能就此对软件的质量产⽣⼀定的信⼼呢?这就需要我们对测试的质量进⾏考察。如果测试仅覆盖了代码的⼀⼩部分,那么不管我们写了多少测试⽤例,我们也不能相信软件质量是有保证的。相反,如果测试覆盖到了软件的绝⼤部分代码,我们就能对软件的质量有⼀个合理的信⼼。
常⽤⼯具对⽐
Jacoco,Emma,Cobertura
Jacoco (覆盖率⼯具.可以集成到cicd⾥)
简介Jacoco
是⼀个开源的覆盖率⼯具。
Jacoco 可以嵌⼊到 Ant 、Maven 中,并提供了 EclEmma Eclipse 插件.
很多第三⽅的⼯具提供了对 Jacoco 的集成,如:Sonar、Jenkins、IDEA.
⽬前Java常⽤覆盖率⼯具Jacoco、Emma和Cobertura、Clover(商⽤)
建议集成到CICD流程⾥,统⼀规划.
部署参考
其他参考
向阳:我们⽬前在测试代码规范的⼯具。⽤的clang-format和tscancode。(都是c语⾔类的.tscancode是腾讯出的)
何庆:sonar+Jenkins.开发⾃⼰审计+安全部门审计
当前可采取⽅案
1.研发部门本地IDE安装PMD,findbugs插件,在每次合并到Git主分⽀(或发布分⽀)前进⾏检测排查.
2.Jenkins⾥配置Sonar.Jacoco可以根据情况决定是否集成进CICD.
3.使⽤安全检测软件扫描代码,如Nessus(家庭免费版).其他商业版,如Fortify SCA(100万).
Sonar 部署(属于代码审查审计部分)
参考
⽐较详细的说明了3种⽅案的步骤
sonarQube的主要参考
主要区别sonarQube 和 Scanner
简介
官⽹
sonar,即sonarqube,sonar scan. Sonar是⼀个⽤于代码质量管理的开源平台.
通过插件机制,Sonar 可以集成不同的测试⼯具,代码分析⼯具,以及持续集成⼯具,⽐如pmd-cpd、checkstyle、findbugs、Jenkins。
通过不同的插件对这些结果进⾏再加⼯处理,通过量化的⽅式度量代码质量的变化,从⽽可以⽅便地对不同规模和种类的⼯程进⾏代码质量管理。
同时 Sonar 还对⼤量的持续集成⼯具提供了接⼝⽀持,可以很⽅便地在持续集成中使⽤ Sonar。
此外,Sonar 的插件还可以对 Java 以外的其他编程语⾔提供⽀持(⽐如⽀持java,python,c++,go等等),对国际化以及报告⽂档化也有良好的⽀持.
官⽅特性说明:
Static code analysis for 15 languages:Java, JavaScript, C#, TypeScript, Kotlin, Ruby, Go, Scala, Flex, Python, PHP, HTML, CSS, XML and VB.NET
Detect Bugs & Vulnerabilities
Review Security Hotspots
Track Code Smells & fix your Technical Debt
Code Quality Metrics & History
CI/CD integration
Extensible, with 60+ community plugins
关于sonarQube Scanner说明
当配置好sonar的服务端后,接下来就要使⽤sonar检测我们的代码了,sonar主要是借助客户端检测⼯具来检测代码,所以要使⽤sonar就必须先在我们本地配置好客户端检测⼯具。
客户端可以通过IDE插件、Sonar-Scanner插件、Ant插件和Maven插件⽅式进⾏扫描分析。
常⽤的有扫描器有Sonar-Scanner和Sonar-Runner,使⽤起来都差不多。这⾥我使⽤Sonar-Scanner来作为检测客户端.
那么说,sonar scanner就是个客户端.
sonar可以从以下七个维度来检测代码质量
1、不遵循代码标准: sonar可以通过PMD,CheckStyle,Findbugs等代码规则检测⼯具规范代码的编写;
2、潜在的缺陷: sonar可以通过PMD,CheckStyle,Findbugs等代码规则检测⼯具检测出潜在的缺陷;
3、糟糕的代码复杂度分布: ⽂件、类、⽅法等,如果复杂度过⾼将难以改变,且如果没有⾃动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全⾯的
回归测试;
4、重复: 显然程序中包含⼤量复制粘贴的代码质量低下的,sonar可以展⽰源码中重复严重的地⽅;
5、注释不⾜或者过多: 没有注释将使代码可读性变差,特别是当不可避免地出现⼈员变动时,程序的可读性将⼤幅度下降;
6、缺乏单元测试: sonar可以很⽅便地统计并展⽰单元测试覆盖率;
7、糟糕的设计: 通过sonar可以出循环,展⽰包与包、类与类之间的相互依赖关系,可以展⽰⾃定义的架构规则。通过sonar可以管理第三⽅的jar包,可以利⽤
LCOM4检测单个任务规则的应⽤秦⾼,检测耦合。
SonarQube数据(库)说明
1.⾃带数据库模式(仅限于测试使⽤)
因sonar7.9版本以及以后的版本都不再⽀持mysql,故这⾥使⽤sonar⾃带的数据模式.Apache Derby 是Sonar⾃带并且默认安装使⽤的数据库(⽆需额外操作).
[root@localhost data]# pwd
/usr/local/sonarqube/data
[root@localhost data]#
This directory contains data of embedded database (H2 Database Engine). It's recommended for tests and demos only.
内嵌数据库只能⽤于测试场景
内嵌数据库⽆法扩展,也⽆法升级到新版本的SonarQube,并且不能⽀持将你的数据迁移⾄其他数据库引擎。
2.采⽤PG数据库模式
PGsql的安装部署请参考对应⽂档.在安装完sonar后,再进⾏sonar的sql配置.
SonarQube部署,设置
创建系统sonar⽤户
不能使⽤root⽤户哦.
useradd sonar
passwd sonar  # SonarLegend
安装jdk12
oracle官⽹下载最新的JDK(当前是JDK-12,⽣产系统⼤多装的是JDK-8u221不符合sonar要求).
安装完,设置环境变量.
[sonar@localhost ~]$ pwd
/home/sonar
[sonar@localhost ~]$ tail .bash_profile
export JAVA_HOME=/usr/local/jvm12
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export SONAR_HOME=/usr/local/sonarqube  # 请先安装sonar
export PATH=/usr/local/sonarqube/bin/linux-x86-64:$PATH
安装sonar
下载安装包
/downloads/ 下载sonar zip⽂件
wget binaries.sonarsource/Distribution/sonarqube/sonarqube-7.9.1.zip 为2019/07版本.
解压,放置到相应⽂件夹
unzip sonarqube-7.9.1.zip
mv sonarqube-7.9.1 /usr/local/sonarqube
配置数据库
cd ⾄ /usr/local/sonarqube/conf⽬录下,编辑sonar.properties ⽂件
修改以下⼏项(配置数据库路径、⽤户名、密码)
sonar.jdbc.url=jdbc:postgresql://localhost/sonar
sonar.jdbc.username=postgres
sonar.jdbc.password=PGsqlLG2019
因当前数据库中⽆sonar库,故需要先登录库⼿动创建⼀个 create database sonar(可以使⽤Navicat).当sonar启动成功后,会⾃动创建很多表.
碰到过的问题
查看/usr/local/sonarqube/logs/web.log⽂件,提⽰数据库连接问题.
Caused by: java.sql.SQLException: Cannot create PoolableConnectionFactory (致命错误: ⽤户 "postgres" Ident 认证失败)
原因是PG数据库的连接设置/var/lib/pgsql/11/data/f ⽂件配置错误.具体配置请参考PG⽂档说明.
启动⽅式
启动前准备⼯作
⽂件赋权(否则⽆法启动)
[sonar@localhost ~]$ ll /usr/local/sonarqube/
drwxr-xr-x 6 sonar sonar  94 7⽉  10 12:21 bin
drwxr-xr-x 2 sonar sonar  50 9⽉  9 15:56 conf
...
设置打开⽂件数
[root@localhost data]# tail /etc/f
*    soft    nproc    655360
*    hard    nproc    655360
*    soft    nofile    655360
*    hard    nofile    655360
设置vm.max_map_count
[root@localhost data]# tail /f
vm.max_map_count=262144
启动sonarQube
1)直接启动(推荐)
不使⽤root⽤户的原因是sonar需要JDK12,⽽root环境的是JDK8.
Sonar默认集成了jetty容器,可以直接启动提供服务,也可以通过脚本构建为war包,部署在tomcat容器中。
这⾥sonar⽤户登录系统,执⾏启动脚本
su - sonar # 获取sonar系统⽤户的环境变量(加载JDK12)
/usr/local/sonarqube/bin/linux-x86-64/sonar.sh console # 启动,通过直接控制台输出确认是否有报错
/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start # ⼀般启动⽅式.停⽌为 stop
在浏览器中访问: 192.168.3.227:9000/ 打开web控制台.
Sonar默认的端⼝是”9000”、默认的上下⽂路径是”/”、默认的⽹络接⼝是”0.0.0.0”,默认的管理员帐号和密码为:admin/admin (这个是在DB中的,这⾥通过sonar控制台⼿动修改为 So123456Nar )
启动端⼝
tcp        0      0 127.0.0.1:32000        0.0.0.0:*              LISTEN      18113/java
tcp6      0      0 :::9000                :::*                    LISTEN      18286/java
tcp6      0      0 127.0.0.1:9001          :::*                    LISTEN      18145/java
tcp6      0      0 127.0.0.1:40942        :::*                    LISTEN      18536/java
tcp6      0      0 127.0.0.1:9092          :::*                    LISTEN      18286/java
更换语⾔包
登录Sonar并选择Administration中,选择MarketPlace,搜索Chinese Pack,安装完成后,按照提⽰重启即可.
在 /usr/local/sonarqube/extensions/plugins/ 会多出 sonar-l10n-zh-plugin-1.29.jar 包.
2)作为Tomcat的Web项⽬启动(略过)
部署到Tomcat等应⽤服务器中进⾏启动
a. 确保conf/sonar.properties、f未被修改使⽤过
b. 执⾏如下命令⽣成war包,将⽣成的sonar.war部署到应⽤服务器中
$ ${SONAR_HOME}/war/build-war.sh
c. 启动Tomcat, 通过 localhost:8080/sonar 访问.
配置为系统服务
略.
尝试作为开机⾃启动,如
错误⽅式
/etc/rc.local 添加
sudo -u sonar source /home/sonar/.bash_profile && /usr/local/sonarqube/bin/linux-x86-64/sonar.sh start # 这⾥⽆法执⾏的.因为sodu默认是⽆法执⾏source指令的.sodu的Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin .⽽source是bash的内置正确⽅式
/etc/rc.local 添加
sudo -u sonar /home/sonar/sonar-start.sh
脚本如下(将source /home/sonar/.bash_profile ⾥的内容,直接放到脚本⽂件⾥)
cat /home/sonar/sonar-start.sh
#!/bin/bash
export JAVA_HOME=/usr/local/jvm12
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export SONAR_HOME=/usr/local/sonarqube
export PATH=/usr/local/nodejs/bin:/usr/local/sonarqube/bin/linux-x86-64:$PATH
/usr/local/sonarqube/bin/linux-x86-64/sonar.sh  start
插件说明
插件与更新中⼼
以管理员⽤户登录Sonar,进⼊配置->系统,选择更新中⼼
其中Available Plugins选项卡提供了可以选择安装的插件,System Updates可以在线更新Sonar。
下载插件需要注意其中有些插件是需要购买才能使⽤的,其License类型为Commercial。
插件介绍
登录Sonar并选择Administration中,选择MarketPlace,搜索插件并安装,会⾃动放到
${SONAR_HOME}extensions\plugins⽬录下,然后重新启动sonar即可.
sonar默认集成了Java Ecosystem插件,该插件是⼀组插件的合集
1)Java [sonar-java-plugin]:java源代码解析,计算指标等
2)Squid [sonar-squid-java-plugin]:检查违反Sonar定义规则的代码
3)Checkstyle [sonar-checkstyle-plugin]:使⽤CheckStyle检查违反统⼀代码编写风格的代码
4)FindBugs [sonar-findbugs-plugin]:使⽤FindBugs检查违反规则的缺陷代码⼿动安装
5)PMD [sonar-pmd-plugin]:使⽤pmd检查违反规则的代码⼿动安装
6)Surefire [sonar-surefire-plugin]:使⽤Surefire执⾏单元测试
7)Cobertura [sonar-cobertura-plugin]:使⽤Cobertura获取代码覆盖率
8)JaCoCo [sonar-jacoco-plugin]:使⽤JaCOCO获取代码覆盖率
下⾯列出了⼀些常⽤的插件:
1)JavaScript代码检查:
2)python代码检查: