隨著開源協作的普及,Git 儲存函式庫安全的重要性日益凸顯。程式碼中不慎提交的敏感資訊,例如 API 金鑰、資料函式庫密碼等,可能成為攻擊者的目標。因此,開發者需要採取積極的措施來保護儲存函式庫安全。本文將介紹 Gitleaks 和 GitRob 兩款工具,它們可以幫助開發者自動化檢測和防範儲存函式庫中的安全風險,並進一步探討如何強化 Linux 主機安全,包含 EBS 磁碟區加密和 Ansible 自動化組態等實務做法,以建立更安全的開發環境。
保護你的 Git 儲存函式庫安全
在現代軟體開發中,Git 儲存函式庫的安全性至關重要。隨著開源軟體的盛行,開發者們往往同時管理著多個私有和公開的儲存函式庫。如何有效地分類別和管理這些儲存函式庫,避免潛在的安全風險,是每位開發者都需要關注的問題。
資訊洩漏的風險
公開儲存函式庫中不小心洩漏敏感資訊,可能會導致嚴重的後果。攻擊者可以利用這些資訊進行針對性的網路釣魚攻擊。因此,開發者必須小心處理公開儲存函式庫中的資訊,避免洩漏開發者的真實姓名、使用者名稱、公司、部門和電子郵件地址等敏感資訊。
GitHub 提供了一個頁面,介紹如何安全地在程式碼儲存函式庫中儲存和加密敏感資訊。開發者可以參考這個頁面來學習如何正確地管理敏感資訊。
自動化工具的安裝與組態
為了更好地保護 Git 儲存函式庫的安全,我們可以使用一些自動化工具來輔助檢查和防範潛在的安全風險。以下是兩款流行的工具:Gitleaks 和 GitRob。
Gitleaks 的安裝與使用
Gitleaks 是一款用於檢測 Git 儲存函式庫中硬編碼敏感資訊(如密碼、API 金鑰和令牌)的 SAST 工具。我們可以使用 Docker 來執行 Gitleaks,以避免安裝複雜性。
安裝 Gitleaks
首先,從 Docker Hub 下載 Gitleaks 的映像檔:
$ docker pull zricethezav/gitleaks
下載完成後,可以使用以下命令執行 Gitleaks:
$ docker run zricethezav/gitleaks --repourl=https://github.com/chrisbinnie/CloudNativeSecurity --redact
組態 Gitleaks
Gitleaks 提供了一個預設的組態檔案,其中包含了許多有用的規則。開發者可以根據需要對這些規則進行微調。例如,其中一條規則用於檢測 AWS 的秘密金鑰:
[[rules]]
description = "AWS Secret Key"
regex = '''(?i)aws(.{0,20})?(?-i)['\"][0–9a-zA-Z\/+]{40}['\"]'''
tags = ["key", "AWS"]
這條規則使用正規表示式來比對典型的 AWS 秘密金鑰格式。
使用 Gitleaks 掃描儲存函式庫
我們可以使用 Gitleaks 來掃描一個包含假的 AWS 憑證的檔案 secret_key.txt:
$ docker run zricethezav/gitleaks --repourl=https://github.com/chrisbinnie/CloudNativeSecurity -v
掃描結果顯示,在該儲存函式庫中發現了兩個洩漏。
程式碼解析
以下是上述命令的詳細解析:
docker run zricethezav/gitleaks:執行 Gitleaks 的 Docker 容器。--repourl=https://github.com/chrisbinnie/CloudNativeSecurity:指定要掃描的 GitHub 儲存函式庫 URL。-v:啟用詳細輸出模式,以便更清楚地瞭解掃描結果。
詳細輸出
透過啟用詳細輸出模式,我們可以獲得更詳細的掃描結果,如 Listing 10.1 所示。這有助於開發者更好地瞭解 Gitleaks 檢測到的問題。
使用Gitleaks保護Git儲存函式庫的安全
在DevSecOps的實踐中,確保Git儲存函式庫的安全至關重要。開發人員經常無意中將敏感資訊,如AWS存取金鑰,提交到程式碼函式庫中。Gitleaks是一種流行的開源工具,用於掃描Git儲存函式庫中的敏感資料洩露。本章將探討如何使用Gitleaks來增強Git儲存函式庫的安全性。
Gitleaks的基本使用
Gitleaks可以透過Docker容器輕鬆執行。只需執行以下命令,即可對指定的GitHub儲存函式庫進行掃描:
docker run zricethezav/gitleaks --repourl=https://github.com/chrisbinnie/CloudNativeSecurity
該命令將掃描https://github.com/chrisbinnie/CloudNativeSecurity儲存函式庫中的敏感資訊,並輸出發現的洩露資訊。
內容解密:
docker run zricethezav/gitleaks:執行Gitleaks的Docker容器。--repourl=https://github.com/chrisbinnie/CloudNativeSecurity:指定要掃描的GitHub儲存函式庫URL。
自定義Gitleaks的輸出
Gitleaks提供了多個選項來自定義輸出。例如,使用--redact選項可以隱藏敏感資訊,使日誌不會被洩露的憑據汙染:
docker run zricethezav/gitleaks --repourl=https://github.com/chrisbinnie/CloudNativeSecurity --redact
內容解密:
--redact:隱藏輸出中的敏感資訊,以REDACTED代替。
以JSON格式輸出結果
使用-pretty選項,Gitleaks可以以格式化的JSON輸出發現的洩露資訊,便於在CI/CDPipeline中解析:
{
"line": "aws_access_key_id = AKIAYEKNPWXOCW4YDEWX",
"offender": "AKIAYEKNPWXOCW4YDEWX",
"commit": "3c7c6639b9b7c34d5c192ef017e3047d2ac671d0",
"repo": "CloudNativeSecurity",
"rule": "AWS Manager ID",
"commitMessage": "Add bad creds\n",
"author": "Chris Binnie",
"email": "chris@chrisbinnie.tld",
"file": "secret_key.txt",
"date": "2020–07–19T14:33:57+01:00",
"tags": "key, AWS"
}
內容解密:
-pretty:以格式化的JSON輸出結果。- JSON輸出包含洩露資訊的詳細資訊,如行號、提交雜湊、檔案路徑等。
將Gitleaks整合到CI/CD流程
Gitleaks可以整合到單元測試、整合測試或作為預提交鉤子執行。此外,還可以定期掃描所有儲存函式庫,以發現潛在的安全問題。
Plantuml圖示:Gitleaks整合到CI/CD流程
此圖示展示了Gitleaks如何整合到CI/CD流程中,以自動掃描程式碼中的敏感資訊。
探索Gitleaks的其他功能
Gitleaks還支援許多其他選項,如掃描特定的提交或檔案。鼓勵使用者根據自己的需求調整Gitleaks的組態。
強化 Git 儲存函式庫的安全性:GitRob 的安裝與使用
在開發過程中,開發者不小心將敏感資訊(如金鑰、憑證、存取金鑰和密碼)推播到程式碼儲存函式庫的風險極高。因此,監控儲存函式庫以避免不必要的風險至關重要。本章將介紹 GitRob 這一開源工具,並探討其與 Gitleaks 在掃描能力上的差異。
安裝 GitRob
GitRob 可在 GitHub 上取得(github.com/michenriksen/gitrob)。使用者可選擇從原始碼編譯或使用預編譯的二進位制檔案。以下示範如何下載並驗證 Linux 版本的 GitRob:
下載 GitRob 二進位制檔案和校驗檔案
$ wget https://github.com/michenriksen/gitrob/releases/download/v2.0.0-beta/gitrob_linux_amd64_2.0.0-beta.zip $ wget https://github.com/michenriksen/gitrob/releases/download/v2.0.0-beta/checksums.txt驗證下載檔案的完整性
$ cat checksums.txt $ sha256sum gitrob_linux_amd64_2.0.0-beta.zip確保
sha256sum命令的輸出與checksums.txt中的對應值一致,以確認檔案未被篡改。解壓縮 GitRob
$ unzip gitrob_linux_amd64_2.0.0-beta.zip解壓後,目錄中將包含
gitrob可執行檔和README.md說明檔案。
使用 GitRob 掃描儲存函式庫
在使用 GitRob 之前,需設定一個 GitHub 存取權杖(access token)作為環境變數:
$ export GITROB_ACCESS_TOKEN=9e3b27d7c382XXXXXXXXXXXXX96b1a45ea351c24
接著,執行 GitRob 掃描特定 GitHub 使用者的所有儲存函式庫:
$ ./gitrob chrisbinnie
程式碼解析:
$ ./gitrob chrisbinnie
此命令會初始化 GitRob,並開始掃描 chrisbinnie 在 GitHub 上的所有儲存函式庫。
內容解密:
./gitrob:執行當前目錄下的 GitRob 可執行檔。chrisbinnie:指定要掃描的 GitHub 使用者名稱。- 掃描邏輯:GitRob 會克隆該使用者的所有儲存函式庫,並根據預設規則搜尋敏感資訊。
結果分析
GitRob 成功掃描儲存函式庫並發現了一個包含 AWS CLI 憑證的檔案 .aws/credentials,而非預期的 secret_key.txt。這顯示了其預設規則可能側重於特定路徑和檔案名稱,而非內容比對。
GitRob 掃描流程
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Git 儲存函式庫安全防護實踐
package "安全架構" {
package "網路安全" {
component [防火牆] as firewall
component [WAF] as waf
component [DDoS 防護] as ddos
}
package "身份認證" {
component [OAuth 2.0] as oauth
component [JWT Token] as jwt
component [MFA] as mfa
}
package "資料安全" {
component [加密傳輸 TLS] as tls
component [資料加密] as encrypt
component [金鑰管理] as kms
}
package "監控審計" {
component [日誌收集] as log
component [威脅偵測] as threat
component [合規審計] as audit
}
}
firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成
@enduml此圖示說明瞭 GitRob 的基本掃描流程,包括驗證存取權杖、克隆儲存函式庫及搜尋敏感資訊。
最佳實踐
- 定期掃描:將儲存函式庫掃描納入 CI/CD 流程,定期檢查程式碼中的敏感資訊。
- 強化存取控制:限制對敏感儲存函式庫的存取許可權,並使用權杖而非密碼進行身分驗證。
- 多層防護:結合不同工具和策略,形成多層防護機制,以最大程度降低風險。
本章介紹了 GitRob 的安裝和使用方法,並分析了其與 Gitleaks 的差異。透過結合多種工具和方法,可以有效提升程式碼儲存函式庫的安全性,避免敏感資訊外洩。
自動化主機安全強化
在現代DevSecOps的世界中,一個經常被忽視的領域是底層主機的作業系統(OS)。對於企業級雲原生應用程式來說,僅僅關注主機上的套件更新是不夠的。在保護Linux伺服器時,有許多導向可以改進,相對於預設安裝。
為何主機安全至關重要
即使有多層網路保護(從Web應用防火牆到內容傳遞網路(CDN)),最終為應用程式提供服務的是容器本身。由於容器只是底層主機OS的延伸,因此如果沒有健全的主機安全態勢,容器和應用程式就會面臨風險。
使用CIS Benchmark進行安全強化
一個流行的自定義Linux安全性的方法是根據所選的Linux發行版,從CIS網站(www.cisecurity.org/cis-benchmarks)選擇正確的CIS Benchmark版本。遵循這些基準測試的建議無疑有助於實作更好的安全態勢。然而,需要注意的是,其中許多建議的更改可能會導致根據主機的服務中斷,甚至可能對整個主機造成問題,如果在未完全瞭解其影響的情況下實施。
CIS Benchmark的等級
CIS Benchmark提供不同的等級,例如Level 1和Level 2。Level 1被認為是「實用和謹慎」的,而Level 2則提供了更深入的防禦,但可能會對技術的效用或效能產生負面影響。因此,務必只套用您感到舒適且預期能改善安全性的規則。
自動化安全強化
在本章中,我們將探討在強化機器映像時可能關注的一些安全細節。我們將使用Ansible playbook自動執行這些任務,並將其縮小為稍後可以構建playbook的任務,以確保我們的伺服器得到強化。我們還將探討一次性強化練習,使用稱為冪等性的概念,即伺服器能夠傳回到精確的前一個或原始狀態。
Ansible任務結構
如何構建Ansible任務內容以及遵循CIS Benchmark的程度,在很大程度上取決於三個因素:
- 您對線上服務的重視程度
- 您有多少時間可以專注於改善Linux伺服器的安全態勢
- 您對風險的承受能力
機器映像
透過收集多個任務,可以建立一個「playbook」,這是Ansible程式碼更常見的稱呼。包含多少任務、針對哪些主機執行以及任務內容將完全取決於您的需求。以AWS為例,我們可以使用Ansible playbook來執行Amazon Machine Image(AMI),以建立在整個estate中使用的機器映像。
加密EBS磁碟區
加密附加到AWS EC2例項的Elastic Block Storage(EBS)磁碟區是有好處的。這提供了「靜態資料」加密,這意味著被攔截的映像無法在沒有您的KMS金鑰的情況下被讀取。從2019年5月開始,AWS允許您選擇為所有EBS磁碟區啟用加密。
- name: 加密EBS磁碟區
ec2_eni:
state: present
region: "{{ region }}"
zone: "{{ zone }}"
subnet_id: "{{ subnet_id }}"
device_index: 0
delete_on_termination: true
security_groups: "{{ security_groups }}"
register: nic
- name: 建立加密EBS磁碟區
ec2_vol:
state: present
region: "{{ region }}"
zone: "{{ zone }}"
encrypted: yes
volume_size: "{{ volume_size }}"
register: ebs_volume
#### 內容解密:
1. 第一個任務使用`ec2_eni`模組建立一個網路介面,並將其註冊到`nic`變數中。
2. 第二個任務使用`ec2_vol`模組建立一個加密的EBS磁碟區,並將其註冊到`ebs_volume`變數中。
3. `encrypted: yes`引數確保EBS磁碟區被加密。
4. `volume_size: "{{ volume_size }}"`引數設定EBS磁碟區的大小。
自動化主機安全:使用Ansible強化Linux伺服器安全性
在現代的DevSecOps實踐中,自動化主機安全是確保基礎設施安全性的關鍵環節。AWS EBS磁碟區加密是保護資料安全的重要措施,而Ansible則是用於自動化組態管理的強大工具。本章將探討如何使用Ansible來強化Linux伺服器的安全性。
EBS磁碟區加密的演變
在AWS引入EBS加密功能之前,加密EBS磁碟區需要經過多個步驟:
- 選擇可靠的Amazon Marketplace AMI並建立EC2例項。
- 更新Linux套件,重啟並建立執行中的例項快照,以建立新的AMI。
- 複製快照並使用KMS金鑰進行加密。
- 從加密的快照建立新的EBS磁碟區。
AWS官方檔案(docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIEncryption.html)提供了更多關於EBS磁碟區加密的詳細資訊。
冪等性(Idempotency)的重要性
與其一次組態機器映像然後在整個Amazon EC2中分發,不如重複執行Ansible playbook來組態執行中的伺服器。這就涉及到了冪等性的概念。簡單來說,冪等性意味著無論執行多少次相同的操作,結果始終保持一致。在Ansible playbook的上下文中,這意味著組態伺服器以滿足組織需求,然後定期重新執行playbook,以復原任何對伺服器所做的更改,無論是CI/CD流程還是攻擊者造成的。
內容解密:
- 重複執行playbook:定時重新執行Ansible playbook,以確保伺服器組態的一致性。
- 復原更改:透過冪等性操作,復原任何未經授權的更改,保持伺服器的預期狀態。
- 提高安全性:定期重置伺服器組態,可以減少攻擊者持久控制伺服器的機會。
使用Ansible進行主機安全組態
Ansible是一種強大的組態管理工具,可以用於自動化主機安全組態。以下是使用Ansible進行主機安全組態的一些關鍵步驟:
Ansible目錄結構
### Ansible目錄結構範例
使用`tree`命令可以清晰地展示Ansible目錄結構,如圖11.1所示。
組態檔案和任務
在tasks/目錄下,可以定義多個任務來強化伺服器的安全性。例如,在network.yml檔案中,可以包含一系列任務來強化網路堆積疊的安全性。
### network.yml範例
---
- name: 強化網路堆積疊安全性
tasks:
- name: 組態防火牆規則
template:
src: templates/iptables.j2
dest: /etc/iptables/rules.v4
notify: 重啟防火牆服務
內容解密:
tasks/目錄:用於存放各種任務定義檔案,如network.yml。- 範本變數:使用Jinja語言的變數,使組態檔案更加靈活。
- CIS Benchmark參考:參考CIS Benchmark來選擇需要強化的安全組態專案。
強化SSH守護程式
SSH守護程式是伺服器的一個常見入口點,因此強化其安全性至關重要。以下是一些強化OpenSSH守護程式的措施:
ssh.yaml範例
---
- name: 強化SSH守護程式
tasks:
- name: 設定閒置登出時間
lineinfile:
dest: /etc/ssh/sshd_config
regexp: "^ClientAliveInterval"
line: "ClientAliveInterval 300"
state: present
notify: 重啟SSH服務
- name: 禁止空密碼登入
lineinfile:
dest: /etc/pam.d/common-auth
regexp: "^auth required pam_unix.so"
line: "auth required pam_unix.so nullok_secure"
state: present
- name: 設定法律警告橫幅
copy:
content: "未經授權存取本系統將被起訴!"
dest: /etc/issue.net
notify: 重啟SSH服務
內容解密:
- 設定閒置登出時間:透過設定
ClientAliveInterval,可以在使用者閒置一段時間後自動登出。 - 禁止空密碼登入:透過PAM組態,禁止使用空密碼進行身份驗證。
- 法律警告橫幅:設定警告橫幅,以符合合規要求,警告未經授權的存取者。