流水線的安全與合規 - 構建可信的交付鏈
“安全左移 (Shift-Left Security)”的理念
“安全左移”是 DevSecOps 的核心理念,指的是將安全測試和考量,從軟件開發生命周期 (SDLC) 的末端(發布前),盡可能地向左移動到更早的階段(如編碼、構建、測試階段)。
為何對 SRE 至關重要?
- 成本與效率: 在開發早期發現并修復一個安全漏洞的成本,遠低于當它已經部署到生產環境后再去修復的成本。
- 主動防御: “左移”能幫助我們在漏洞進入生產環境之前就將其攔截,極大地減少了 SRE 需要處理的生產安全事件數量。
- 文化契合: 這完全符合 SRE “通過工程手段解決運維問題”和“主動預防而非被動救火”的核心思想。
CI/CD 流水線正是實踐“安全左移”的最佳平臺。
保護流水線自身
在集成安全掃描之前,我們首先要確保流水線本身是安全的。
1. 分支保護規則 (Branch Protection Rules)
在 GitHub 中,我們可以為關鍵分支(如 main
)設置保護規則,這是防止不合格或未授權代碼合入的第一道防線。
- SRE 應倡導的關鍵規則:
- 要求合并前進行代碼審查 (Require pull request reviews before merging):強制要求至少有一位(或多位)其他團隊成員審查代碼。
- 要求狀態檢查通過后方可合并 (Require status checks to pass before merging):這是核心!我們可以將 CI 任務(如
build-and-test
和后續的安全掃描任務)設置為必須通過的狀態檢查。這意味著任何導致測試或掃描失敗的代碼變更都無法被合并。 - 使用
CODEOWNERS
文件: 可以定義代碼庫中特定文件或目錄的所有者,當這些文件被修改時,必須得到相應所有者的批準。 - 禁止強制推送 (Do not allow force pushes):防止重寫
main
分支的歷史記錄。
2. 密鑰管理與訪問控制 (Secrets Management & Access Control)
我們在第四篇中使用了 GitHub Secrets 來存儲 KUBE_CONFIG
。這是基礎,但對于訪問云平臺等更復雜的場景,有更現代、更安全的方式。
- OpenID Connect (OIDC):這是一種無需存儲長期靜態憑證(如云平臺的 Access Key/Secret Key)即可讓 GitHub Actions 與云服務商(如 AWS, GCP, Azure)進行安全認證的先進機制。
- 工作原理 (高層次):流水線啟動時,GitHub Actions 會向云服務商出示一個臨時的、包含了倉庫和工作流信息的 OIDC 令牌。云服務商驗證該令牌的真實性后,會頒發一個有時效性的、短期的云訪問憑證給流水線。
- SRE 優勢: 徹底消除了在 GitHub Secrets 中管理和輪換云平臺長期密鑰的需要,極大提升了安全性。
在流水線中集成自動化安全掃描
現在,讓我們開始將各種自動化安全掃描作為“門禁”集成到我們的 .github/workflows/ci.yml
文件中。
A. 依賴項漏洞掃描 (SCA - Software Composition Analysis)
我們的應用依賴了大量的第三方開源庫 (npm
包),這些庫可能存在已知的安全漏洞。
- 目標: 掃描
package.json
中的依賴項,發現已知的 CVE 漏洞。 - 工具: 使用 GitHub 原生的
dependency-review-action
。 - 實施: 在
build-and-test
任務中增加一個步驟。
# 在 jobs.build-and-test.steps 中增加
# ...
- name: