劉 濤 伍少成 馬 越 趙 杰 姜和芳
(深圳供電局有限公司 廣東深圳 518001)(1513629216@qq.com)
隨著電力市場化交易的出現,電能計量系統正從傳統的離線方式向在線方式轉換,系統新功能的不斷推送,使得系統的安全隱患和風險加大,一旦系統任何節點的源代碼存在安全漏洞或缺陷,導致電能現貨交易意外中斷,就會給政府和電力企業帶來不可估量的社會影響和重大經濟損失.為了及時查找軟件代碼可能存在的安全缺陷,通常采用靜態代碼分析和動態代碼分析[1].前者是用來發現程序代碼本身的安全漏洞,測試工具簡單易用;而后者需要更專業的測試工具和人員配置,才可發現靜態代碼如何與其他組件交互時的錯誤.
研究人員馬均飛和鄭文強[2]對代碼靜態測試評審的原則和類型進行了較準確詳細的描述,給出實際分析案例,并通過基于代碼和基于架構的分析方法,進一步加深對代碼安全性靜態分析的論述;賀江敏和相里朋[3]在馬均飛等人[2]研究的基礎上,開展了代碼安全性人工走查和靜態工具分析相結合的研究,針對目前常見的軟件安全漏洞,比如SQL注入、緩沖區溢出、資源未釋放等進行人工走查的方式查找安全漏洞,然后,通過代碼安全性靜態分析工具對數據流、控制流和程序結構等方面的自動化掃描分析,再結合人工分析方法加以完善.
不過,人工排查源代碼安全漏洞的方法需要對代碼編程有較高技術才可完成,費用高、時間長.隨著靜態代碼自動檢測工具的快速發展,為了達到軟件運維人員無需具備對軟件編程和安全測試等專業知識的深入了解,就可輕松地使用專業化的自動檢測工具,來完成軟件代碼安全漏洞的自動、高效、準確的測試,生成可視化的代碼質量等級測試報告[4],在這方面有大量的自動測試工具可供選擇[5-6],其中SonarQube是一種國內外同行公認的、最普遍采用的靜態代碼安全漏洞自動掃描測試工具.
SonarQube可以從7個維度制定代碼規則,對軟件源代碼進行持續化安全漏洞檢測,從而提前捕獲和提示代碼中的錯誤[7-8].許多學者和用戶在其代碼規則的基礎上已不斷擴展了更加智能化[9-10]、可視化[11]和高精度的規則或功能,以澄清某些對SonarQube在代碼規則有效性和準確性方面的質疑[12-13],從而在源代碼庫的質量或安全受到威脅之前,確保消除代碼安漏洞或缺陷,避免如緩沖區溢出、空指針引用、資源泄露和SQL注入等安全漏洞或缺陷,從多個方面提高代碼的安全性和可靠性.
當計量系統版本更新升級時,系統運維人員依靠基于SonarQube的智能安全測試平臺,從版本控制數據倉庫中獲取由軟件開發團隊提交的代碼,自動編譯后,通過SonarQube開源接口的2次開發,將代碼傳遞到該工具進行安全漏洞自動掃描,動態生成Web可視化的代碼安全等級分析報告.因此,計量系統運維人員依托智能安全測試平臺就可以實現對軟件代碼的安全漏洞測試及質量控制.
智能安全測試平臺在邏輯上分為管理端和智能測試服務2個部分.管理端主要負責協調各服務間的數據交流及管理;服務端主要包括版本控制、漏洞掃描和系統管理,其中版本控制是對軟件源代碼、遠程設備、設備固件、配置文件等的版本管理,漏洞掃描負責對源代碼的各種安全漏洞進行智能自動掃描、測試并給出安全漏洞的等級,系統管理是根據用戶的職責賦予相應的角色、權限以及對重要操作的審計(圖1所示).

圖1 智能安全測試平臺邏輯架構圖
智能安全測試平臺的設計是以GitLab為安全漏洞檢測入口,以SonarQube為檢測的主要工具和測試報告生成出口,智能安全測試平臺作為一個協調機制將GitLab和SonarQube關聯起來.當軟件開發團隊通過平臺向GitLab數據倉庫提交代碼后,由Maven對代碼進行編譯,然后將代碼和編譯的輸出信息送給SonarQube進行代碼安全漏洞自動檢測.
智能安全測試平臺將SonarQube代碼審計融入到軟件項目持續的版本更新升級的過程中,可以自動生成高質量、可視化Web頁面的安全檢測報告.
為了開展計量系統軟件源代碼的自動測試任務,根據軟件開發團隊、計量系統維護人員、平臺系統管理員等用戶職責的不同,賦予不同權限,并對所有用戶使用平臺的主要行為進行監管.功能主要包括:
1) 權限管理.包括角色和用戶管理.角色管理是根據用戶職責的不同,通過角色來承載不同的權限,如該角色可以操作哪些菜單或同一個界面只允許操作哪些按鈕等.用戶管理是對系統的操作進行管理.
2) 數據權限管理.通過角色向用戶分配數據權限的最小單元,如同一個界面中只能看到允許的數據.
3) 系統日志.記錄用戶登錄平臺、刪除、添加等關鍵操作信息.為避免日志過于龐大,影響系統性能,允許系統管理員通過日志固定周期的配置,將數據庫中記錄的日志定期分割到文件中作為備份.
安全漏洞掃描工具SonarQube、版本控制系統GitLab、數據庫PostgreSQL等安裝在不同的服務器或虛擬機上,此模塊將對這些服務器的創建、修改、查詢和刪除進行管理.
在版本控制系統GitLab[14]數據倉庫中創建軟件測試項目、分支等目錄,并在GitLab開源接口的基礎上進行Java 2次開發,以滿足智能安全測試平臺與GitLab之間的信息連接,再由系統管理員為軟件開發團隊創建1組用戶,通過此模塊將開發調試完成的源代碼上傳到GitLab指定目錄中.也可根據情況查詢、添加、修改或刪除代碼和文件.
為了便于計量系統軟件對整個項目或重點分支、功能模塊的源代碼進行漏洞掃描測試,通過此模塊在PostgreSQL數據庫NK_SONAR中建立與GitLab完全一致的項目及項目分支.具體做法是用戶只需在詳情頁面輸入項目名稱、項目唯一標識符等必填項,點擊添加按鈕后,新增的項目信息展示在頁面下方項目列表中(如圖2所示).項目管理默認展示所有已錄入的項目信息.

圖2 項目管理頁面
計量系統運維人員通過此模塊可以從數據庫中獲取,并上傳軟件的全部或部分代碼,并由測試平臺對其代碼進行自動掃描,產生掃描結果,直接供系統運維人員和軟件開發工程師們查看.
首先,在項目管理模塊的項目名稱一欄的下拉菜單中選擇相應的項目或者項目分支名稱,再點擊“待掃描文件”一欄的“選擇文件”標識符,則從GitLab版本控制系統獲取要掃描的軟件并上傳,然后點擊“開始掃描”按鈕(如圖3所示),系統將要掃描文件包發送給SonarQube進行安全漏洞掃描、測試、動態生成漏洞等級報告等.

圖3 漏洞掃描頁面
智能安全測試平臺是基于Java,SonarQube,GitLab,Maven,PostgreSQL等技術集成搭建而成的、并在Tomcat上運行的自動測試系統,主要實現軟件編碼等文件的版本控制與智能化代碼安全漏洞掃描及測試.
智能安全測試平臺在開源工具SonarQube 8.6.1基礎上2次開發,集成了數千種智能化自動檢測掃描和分析規則,具有自學習和自動識別新型安全漏洞的AppSec功能,對計量系統靜態代碼從7個維度進行持續化安全漏洞檢測,能夠提前捕獲和提示代碼中的錯誤,在代碼庫的質量或安全受到威脅之前確保消除代碼漏洞或缺陷,從多個方面提高了代碼的安全性和可靠性.以下是SonarQube的配置文件sonar.property中與數據庫相關的配置:
sonar.jdbc.username=postgres #數據庫用戶名
sonar.jdbc.password=*******#數據庫密碼
sonar.jdbc.url=jdbc:PostgreSQL://ip_addr:5432/NX_SONAR# 數據庫連接URL
sonar.web.host=*.*.*.*#IP地址
sonar.web.port=****#端口號
GitLab是一個開放源代碼的版本控制系統,用于多個人共同開發同一個項目,以共用資源為目的,經過在其開源接口程序基礎上的Java 2次開發,直接通過智能安全測試平臺就可將計量系統的源代碼、配置文件等上傳到GitLab的數據倉庫中.PostgreSQL13.0數據庫是用于存儲與安全漏洞掃描、版本控制以及智能安全測試平臺相關的數據表和記錄.
Maven 3.6是1個軟件項目管理工具,在Maven插件中擁有1組源代碼分析器.該分析器使用數據庫中存儲的配置來完成統一開發規范以及管理jar包.通常SonarQube依賴Maven來運行分析,也能夠分析非Maven項目.
以下是智能安全測試平臺配置文件主要部分:
#*-----------------------------數據庫連接配置-
db.url=jdbc:PostgreSQL://ip_addr:5432/NK_TEST
db.username=postgres
db.password=******
#*-----------------------------系統配置--------
app.config=classpath:/system/system-config.xml
#----GitLab配置-------------------------------
#登錄GitLab的token,該token在GitLab上去生成
GitLab.token=*****************
#GitLab服務器地址
GitLab.url=http://ip_addr:port
#--------SonarQube配置----------------------
#SonarQube的登錄用戶
sonar.login=admin
#SonarQube的登錄密碼
sonar.password=******
#SonarQube的服務器地址
sonar.url=http://ip_addr:port
#-------Maven配置-------------------------------
#Maven的運行目錄
Maven.home=/opt/Maven/
根據計量系統各功能模塊的具體情況(新功能、關鍵應用程序、技術庫等),在SonarQube中設置多個不同代碼質量預警指標的閾值或配置文件,只有滿足這些質量閾值檢測條件才能進入下一個流程,例如,質量閾值可以強制要求所有新代碼必須包含至少80%的測試覆蓋率,或者不應該存在安全漏洞或缺陷等,質量閾值也可以自定義.SonarQube中針對每個項目或分支會通過Web頁面展示詳細的信息,給出整個項目或某分支當前的健康狀態、不同級別漏洞的分類、明細等多維度的統計信息,便于進行問題的追蹤和修復[15-16].
在預先為編程語言設定的標準或規則之上,可以自定義附加的規則或賦值標準,如可以給某些Java代碼規則賦予特殊的權重值,以便提高代碼安全質量;或通過啟用或停用某些代碼規則,以調整代碼質量等級.也可以事先定義項目/配置文件的關聯度等,以提高代碼的安全系數.
SonarQube以插件形式集成了眾多缺陷檢測工具,伴隨著檢測工具的不斷更新升級,測試平臺對代碼安全漏洞檢測的質量將不斷提高,并且工具的更新升級不會影響到平臺代碼安全檢測的進程.
為了驗證智能安全測試平臺的功效,對計量系統的主要功能進行代碼安全漏洞測試.被測對象主要包括智能計量主站系統中的遠程抄表、電量統計、負載管理、線損統計、用電稽查、配電應用、電壓合格率統計、客戶停電時間統計以及計量裝置遠程巡檢等業務.
首先,計量系統開發團隊完成軟件集成后,通過測試平臺賦予的用戶權限,登錄智能安全測試平臺的文件管理模塊,將源代碼和相關的配置文件上傳到GitLab代碼數據倉庫中.
在計量系統版本更新升級前,為了確保新版本編碼無安全漏洞,系統運維人員只需通過測試平臺的漏洞掃描模塊選擇事先創建的項目或項目分支,再從Gitlab獲取要進行安全漏洞掃描的代碼,點擊開始掃描,則通過測試工具SonarQube的開源接口,執行自動掃描測試任務的操作,具體步驟如下:
1) 基于漏洞掃描測試工具SonarQube的開源接口程序的Java技術2次開發,實現智能安全測試平臺與SonarQube之間的通信,將漏洞掃描所需的程序代碼等傳遞到測試服務器上;
2) 此時,智能安全測試平臺的漏洞掃描頁面的下方自動顯示1條漏洞掃描記錄,并且,其掃描狀態為“正在掃描”;
3) 通過Java程序調取SonarQube的可運行指令,執行軟件代碼掃描測試命令,系統由事先定義的令牌代替用戶名密碼,自動登錄SonarQube軟件,實施代碼安全漏洞全自動掃描測試任務;
4) 掃描測試成功后,漏洞掃描頁面的下方漏洞掃描記錄的狀態改為“掃描完成”,同時,自動生成本次任務的代碼安全漏洞等級測試報告;
5) 點擊該記錄的掃描狀態,則彈出“掃描日志”標簽;
6) 為查看安全漏洞掃描結果詳情,點擊漏洞掃描日志內容左上角的“查看掃描分析”,系統將自動連接并登錄SonarQube軟件,顯示安全漏洞掃描的詳細測試報告(如圖4所示);

圖4 自動測試報告顯示
7) 系統運維人員根據測試報告給出的結果,判斷軟件是否需要進一步的改進:如果顯示存在安全漏洞或缺陷,將通過電子郵件等方式告知軟件開發團隊,進行修改后提交到GitLab編碼庫中,系統運維人員只需重復上述步驟,進行回歸測試,直到軟件所有代碼的安全測試都滿足測試規則要求為止.
這樣,當計量系統版本更新升級時,系統運維人員只需具備對測試工具的使用和操作的基本了解,就可隨時登錄智能安全測試平臺,選擇項目或項目分支,上傳相應的源代碼,就可完成對計量系統代碼高效、全自動的安全漏洞掃描測試,從而有效地控制計量系統代碼的安全漏洞和質量.
基于智能安全測試平臺,計量系統運維人員無需具備專業軟件測試技能,就可通過由GitLab開源接口的Java 2次開發程序,直接從其數據倉庫中調取軟件開發團隊提交的代碼,采用“一鍵式”方式,通過SonarQube開源接口的2次開發程序,將代碼傳遞到SonarQube上,動態地生成測試指令,完成代碼的自動漏洞掃描、測試,生成可視化的安全漏洞測試報告.基于測試報告分析,系統運維人員可以判斷計量系統是否存在致命安全漏洞或缺陷,以決定是否允許計量系統進行版本的更新升級.這樣既提高了計量系統代碼安全漏洞及缺陷的質量控制,又減少人力測試和設備資源的開支,大大提高了電力企業管理水平和工作效率.