S3Scanner 能有效協助開發者找出 AWS S3 儲存桶設定錯誤導致的公開存取漏洞,並提供列出及下載公開檔案的功能,方便進行安全審查和補救。文章也提供 Docker 建置方式,簡化佈署流程。Kubernetes 的安全性則需多方面考量,除了 API 伺服器、kubelet 和 etcd 等重要元件的設定外,RBAC 和網路策略等機制也能有效提升叢集安全性。瞭解外部攻擊者的常見手法,例如針對 API 伺服器和 etcd 的攻擊,有助於提前佈署防禦措施,降低潛在風險。
AWS 雲端儲存安全性掃描工具 S3Scanner 使用
AWS S3 是目前廣泛使用的雲端儲存服務,但其設定複雜,容易導致儲存桶(bucket)許可權設定錯誤,從而引發資安問題。本篇文章將介紹一款名為 S3Scanner 的開源工具,用於掃描和檢測公開可存取的 S3 儲存桶。
S3Scanner 安裝與使用
S3Scanner 是使用 Python 編寫的工具,可以輕鬆安裝。首先,克隆儲存函式庫並進入目錄,然後執行以下命令安裝必要的套件:
$ pip install -r requirements.txt
安裝完成後,您需要在一個檔案中列出要掃描的 S3 儲存桶名稱。可以使用多種格式列出儲存桶,如下表所示。
| 格式 | 範例 |
|---|---|
| 儲存桶名稱 | bucketname |
| 網域名稱 | something.tld 或 subdomain.something.tld |
| 完整 S3 儲存桶名稱 | bucketname.s3-us-west-1.amazonaws.com |
| 儲存桶:AWS 區域 | bucketname:region |
為了簡化操作,可以使用 bucketname:region 的格式,例如:
bucket:s3-eu-west-1
anotherbucket:s3-eu-west-1
將儲存桶名稱加入檔案 names.txt 後,可以執行 S3Scanner 進行掃描:
$ python s3scanner.py --out-file results.txt names.txt
掃描結果將儲存在 results.txt 中。如果儲存桶是公開可存取的,結果將顯示類別似以下內容:
[found]: bucket | 27169172 bytes | ACLs: {'authUsers': [], 'allUsers': ['READ', 'READ_ACP']}
[found]: anotherbucket | 852221073 bytes | ACLs: {'authUsers': [], 'allUsers': []}
內容解密:
python s3scanner.py --out-file results.txt names.txt:執行 S3Scanner 並將結果輸出到results.txt。--out-file results.txt:指定輸出檔案名稱。names.txt:包含要掃描的 S3 儲存桶名稱的檔案。
使用 S3Scanner 列出公開儲存桶內容
S3Scanner 不僅可以檢測公開儲存桶,還可以列出其內容。只需新增 --list 引數即可:
$ python s3scanner.py --list --out-file results.txt names.txt
執行後,您可以在 list-buckets/ 目錄中找到以儲存桶名稱命名的 .txt 檔案,內容如下所示:
2011-06-30 10:17:27 423 blog10.png
2011-06-30 10:29:38 245 blog11.png
2011-06-30 08:10:30 423 blog9.png
2011-06-28 15:27:24 473 bofh.png
內容解密:
--list:指示 S3Scanner 列出公開儲存桶的內容。list-buckets/:存放列出內容的目錄。- 每行輸出代表一個檔案,包括其最後修改時間、大小和檔案名稱。
下載公開儲存桶內容
S3Scanner 也允許您下載公開儲存桶的內容。只需使用 --dump 引數:
$ python s3scanner.py --dump --out-file results.txt names.txt
執行後,您可以在 buckets/ 目錄中找到以儲存桶名稱命名的子目錄,其中包含下載的檔案。
內容解密:
--dump:指示 S3Scanner 下載公開儲存桶的內容。buckets/:存放下載內容的目錄。- 下載過程中,S3Scanner 將顯示進度訊息。
使用 Docker 建置 S3Scanner
S3Scanner 也提供了 Dockerfile,可以用於建置 Docker 映像檔。以下是建置和執行 S3Scanner 的 Docker 命令:
$ docker build -t s3scanner https://github.com/sa7mon/S3Scanner.git
$ docker run -e AWS_ACCESS_KEY_ID="AKIAYXXXXXXWE" \
-e AWS_SECRET_ACCESS_KEY="wi30XXXXXXXnjYOLr8yQAL" \
-v $(pwd):/data s3scanner --out-file /data/results.txt /data/names.txt
內容解密:
docker build:根據 Dockerfile 建置 Docker 映像檔。-e:設定環境變數,如 AWS 存取金鑰。-v:掛載本機目錄到容器中,以便存取輸入檔案和輸出結果。
GrayhatWarfare:一個搜尋公開儲存桶的網站
除了使用 S3Scanner 外,還有一個名為 GrayhatWarfare 的網站提供了搜尋公開 S3 儲存桶的功能。該網站索引了網際網路上公開可存取的 S3 儲存桶,並提供了搜尋功能。
GrayhatWarfare 的建立者參考了一個名為 s3-leaks 的 GitHub 儲存函式庫,其中列出了過去因 S3 儲存桶組態錯誤而導致的資料外洩事件。這些事件涉及敏感資訊,如護照掃描件、稅務資訊、社會保險號碼等。
未來趨勢與建議
未來,隨著雲端運算的普及,S3 等雲端儲存服務的安全性將變得更加重要。建議開發人員和安全研究人員持續關注相關的安全工具和最佳實踐,以確保雲端資源的安全性。同時,也應加強對開發人員的安全意識培訓,避免因設定錯誤而導致的安全事故。
圖表說明
此圖示呈現了 S3Scanner 的工作流程:
此圖示說明瞭使用 S3Scanner 的基本步驟,包括安裝、準備輸入檔案、執行掃描和分析結果等。
Kubernetes外部攻擊:深入瞭解與防禦策略
在評估任何系統的安全性時,首先要考慮的是「威脅模型」。不同的攻擊者群體具有不同的能力和動機,因此在思考需要哪些控制措施時,必須考慮他們可以存取的資源。最基本的常見威脅模型之一是外部攻擊者。這些攻擊者通常會尋找可遠端存取的起點,例如正在監聽的網路服務,並且對他們試圖破壞的系統沒有現有的存取許可權。
Kubernetes叢集的外部攻擊面
當我們思考如何保護Kubernetes系統時,首先要檢視外部攻擊者可利用的攻擊面,然後再考慮更先進的威脅模型。Kubernetes叢集可能有多個正在監聽的網路埠,其中幾個埠如果組態不當,就容易受到攻擊。本章將從攻擊者的角度依次檢視Kubernetes叢集使用的主要埠,展示透過這些服務可能發動的攻擊型別。瞭解攻擊者的手法是安全性的重要一環,因為這些技術可以用來測試已建置的系統,並改進安全偵測和回應技術。
Kubernetes主要埠的安全性分析
Kubernetes叢集使用多個網路埠進行通訊,每個埠都可能成為攻擊者的目標。以下是一些主要埠及其相關的安全性問題:
1. API Server(通常是443或6443埠)
API Server是Kubernetes叢集的核心元件,負責處理所有對叢集的請求。如果API Server的組態不當,例如未正確設定身份驗證或授權,就可能允許未經授權的存取。
# 檢查API Server的組態
kubectl config view --minify --output 'jsonpath={.clusters[].cluster.certificate-authority-data}'
內容解密:
kubectl config view:顯示目前的Kubernetes組態。--minify:簡化輸出,只顯示與目前上下文相關的資訊。--output 'jsonpath={.clusters[].cluster.certificate-authority-data}':使用JSONPath表示式提取特定的組態資訊,在這裡是提取叢集的CA憑證資料。
2. kubelet(通常是10250埠)
kubelet是在每個節點上執行的代理程式,負責管理容器。如果kubelet未正確組態,例如未啟用身份驗證或授權,就可能允許未經授權的存取。
# 檢查kubelet的組態
kubectl get --raw /api/v1/nodes/<node-name>/proxy/stats/summary
內容解密:
kubectl get --raw:直接取得指定的URL內容。/api/v1/nodes/<node-name>/proxy/stats/summary:取得指定節點的統計摘要資訊,需要正確的身份驗證和授權。
3. etcd(通常是2379埠)
etcd是Kubernetes用來儲存所有叢集資料的分散式鍵值儲存。如果etcd未正確組態,例如未啟用身份驗證或加密,就可能導致資料外洩。
# 檢查etcd的組態
etcdctl --endpoints=https://<etcd-endpoint>:2379 --cert=<client-cert> --key=<client-key> --cacert=<ca-cert> get / --prefix --keys-only
內容解密:
etcdctl:etcd的命令列工具。--endpoints:指定etcd端點。--cert、--key、--cacert:分別指定客戶端憑證、客戶端金鑰和CA憑證,用於身份驗證和加密。get / --prefix --keys-only:取得指定字首的所有鍵,只顯示鍵名。
防禦策略
正確組態身份驗證和授權:確保所有元件都啟用了正確的身份驗證和授權機制,例如使用RBAC(根據角色的存取控制)來限制存取許可權。
@startuml skinparam backgroundColor #FEFEFE skinparam componentStyle rectangle
title S3Scanner 與 Kubernetes 外部攻擊防護
package “Kubernetes Cluster” { package “Control Plane” { component [API Server] as api component [Controller Manager] as cm component [Scheduler] as sched database [etcd] as etcd }
package "Worker Nodes" {
component [Kubelet] as kubelet
component [Kube-proxy] as proxy
package "Pods" {
component [Container 1] as c1
component [Container 2] as c2
}
}
}
api –> etcd : 儲存狀態 api –> cm : 控制迴圈 api –> sched : 調度決策 api –> kubelet : 指令下達 kubelet –> c1 kubelet –> c2 proxy –> c1 : 網路代理 proxy –> c2
note right of api 核心 API 入口 所有操作經由此處 end note
@enduml
此圖示說明瞭RBAC在處理使用者請求時的作用流程。
2. **使用網路策略**:透過定義網路策略來限制Pod之間的通訊,減少潛在的攻擊面。
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-traffic
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress: []
egress: []
內容解密:
apiVersion和kind:指定資源的API版本和型別。metadata:包含資源的中繼資料,如名稱。spec:定義網路策略的規格,這裡定義了一個拒絕所有輸入和輸出流量的策略。
- 定期更新和修補:保持Kubernetes叢集及其元件的最新狀態,及時應用安全修補程式。
Kubernetes外部攻擊的風險評估與防護
Kubernetes叢集的網路攻擊面評估是一項重要的安全措施,透過使用像nmap這樣的埠掃描工具,可以檢測叢集開放的埠。對於一個使用kubeadm建立的1.18版本的叢集,掃描結果可能顯示如下開放的埠:
- 22/tcp:SSH服務
- 179/tcp:BGP服務
- 2379/tcp:etcd客戶端服務
- 2380/tcp:etcd伺服器服務
- 5473/tcp:apsolab-tags服務
- 6443/tcp:Kubernetes API伺服器服務(通常使用HTTPS)
- 10250/tcp:kubelet服務
- 10256/tcp:未知服務
重點埠及其安全風險
6443/TCP:API伺服器埠
- Kubernetes叢集的核心,負責處理REST API請求以及叢集內部元件之間的通訊。
- 不同發行版可能使用不同的埠,如443/TCP、6443/TCP或8443/TCP。
- 由於API伺服器是標準的HTTP API,可以使用任何適用於Web服務的工具進行評估和攻擊。
2379/TCP與2380/TCP:etcd埠
- etcd是Kubernetes叢集的主要鍵值資料儲存。
- 較早版本使用標準HTTP API,較新版本則使用gRPC進行通訊。
- 2379/TCP用於客戶端與伺服器之間的通訊,2380/TCP用於伺服器之間的通訊。
10250/TCP:kubelet埠
- kubelet負責管理節點上的容器執行環境(如Docker)。
- 不一定執行在主節點上,但總是執行在工作節點上。
攻擊API伺服器
攻擊者通常將API伺服器視為主要目標,因為控制該服務將允許對整個叢集進行完全控制。預設情況下,Kubernetes只允許有限的未經身份驗證的存取,但API伺服器可能被錯誤組態以允許攻擊者獲得額外的存取許可權。
API伺服器資訊發現
攻擊者首先會對開放的埠進行指紋識別,以確認正在執行的服務。這可以透過檢索TLS憑證資訊和使用nmap等工具來完成,例如:
nmap -v -n -sTC -p 6443 --script +ssl-cert [IP]
輸出的結果將包含CN和SAN欄位,用於確認該埠上執行的是否為Kubernetes API伺服器,如下所示:
PORT STATE SERVICE
6443/tcp open sun-sr-https
| ssl-cert: Subject: commonName=kube-apiserver
| Subject Alternative Name: DNS:k8smaster, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.96.0.1, IP Address:192.168.41.100
| Issuer: commonName=kubernetes
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2020-08-24T16:25:17
| Not valid after: 2021-08-24T16:25:17
| MD5: 6798 802d ee67 d020 1b94 54de 9e97 4f01
| SHA-1: 518d f120 ecf7 fd88 b687 42e4 3eb0 1d6a cf97 42f2
此外,還有一些路徑是未經身份驗證即可存取的,例如/version端點,可以提供有關正在使用的Kubernetes版本和平台架構的資訊,如下所示:
curl -k https://192.168.41.100:6443/version
{
"major": "1",
"minor": "18",
"gitVersion": "v1.18.8",
"gitCommit": "9f2892aab98fe339f3bd70e3c470144299398ace",
"gitTreeState": "clean",
"buildDate": "2020-08-13T16:04:18Z",
"goVersion": "go1.13.15",
"compiler": "gc",
"platform": "linux/amd64"
}
防範API伺服器資訊洩露
減少攻擊者透過API伺服器指紋識別叢集的最佳方法是限制對該埠的網路層級存取。避免將Kubernetes叢集直接暴露在網際網路上,對於內部佈署,應考慮將對API伺服器的存取限制在特定的白名單源IP地址範圍內。
Kubernetes外部攻擊防範與安全策略
Kubernetes叢集的安全性取決於多個層面的保護,包括API伺服器的存取控制、etcd資料函式庫的安全性等。本篇文章將探討Kubernetes外部攻擊的各種途徑,以及如何採取有效的安全措施來防範這些攻擊。
API伺服器安全防護
API伺服器是Kubernetes叢集的核心元件,負責處理所有對叢集的請求。因此,確保API伺服器的安全性至關重要。
限制API伺服器存取
為了防止未經授權的存取,應限制哪些系統可以存取API伺服器。如果佈署是透過CI/CD系統(如Jenkins)進行管理,則可以將API伺服器的存取許可權限制在這些主機和系統管理員使用的跳板機上。
停用匿名存取
預設情況下,Kubernetes允許匿名存取某些API端點。透過在API伺服器的靜態組態檔案(/etc/kubernetes/manifests/kube-apiserver.yaml)中將--anonymous-auth旗標設為false,可以停用匿名存取。然而,這可能會影響某些依賴匿名存取的監控工具。
利用組態錯誤的API伺服器
如果API伺服器被組態為允許對敏感路徑的匿名存取,則可以利用此漏洞進行攻擊。攻擊者可以使用kubectl工具,透過指定以下選項來存取特定的API伺服器:
--insecure-skip-tls-verify:允許使用未經驗證的憑證。--username=system:unauthenticated:指定使用者名稱為未經驗證的使用者群組。-s:指定要連線的主機和埠。
範例如下:
kubectl --insecure-skip-tls-verify --username=system:unauthenticated -s https://[IP]:6443 get po -n kube-system
預防未經授權的API伺服器存取
除了限制網路層級的存取外,防止未經授權的API伺服器存取的主要方法是確保未授予system:anonymous使用者或system:unauthenticated群組過多的許可權,並且確保API伺服器上組態的授權模式不包含AlwaysAllow。
攻擊etcd
etcd是Kubernetes用於儲存叢集所有狀態資訊的資料函式庫,包括Kubernetes的秘密(secrets)。因此,etcd是攻擊者的寶貴目標。
etcd資訊探索
預設情況下,etcd不會提供任何未經驗證的遠端端點。攻擊者可以嘗試請求/version端點來指紋識別etcd:
curl -k https://[IP]:2379/version
這將傳回一個JSON陣列,包含etcd伺服器和叢集的版本資訊。
利用組態錯誤的etcd伺服器
一旦客戶端能夠存取etcd服務,就可以利用此存取許可權來傾印儲存在etcd中的所有資訊。最簡單的方法是使用etcdctl工具。在使用etcdctl之前,需要設定環境變數ETCDCTL_API=3以指定etcd版本。
提取etcd中的資訊
設定好ETCDCTL_API=3後,可以開始從目標etcd服務中提取資訊。首先,列出資料函式庫中儲存的所有鍵:
etcdctl --insecure-skip-tls-verify --insecure-transport=false --endpoints=https://[IP]:2379 get / --prefix --keys-only
這將列出資料函式庫中可用的所有鍵。其中最有趣的資訊可能是Kubernetes的秘密(secrets)。
提取特定秘密
例如,要取得daemonset-controller服務帳戶的秘密,可以使用以下命令:
etcdctl --insecure-skip-tls-verify --insecure-transport=false --endpoints=https://[IP]:2379 get /registry/secrets/kube-system/daemon-set-controller-token-[RAND]
這將傳回服務帳戶令牌資訊,其中包含一個JWT令牌,可以用於與kubectl通訊。
預防未經授權的etcd存取
etcd可以組態為限制對客戶端的存取,要求客戶端提供由特定憑證授權單位簽署的憑證。應始終在etcd上組態--trusted-ca-file和--client-cert-auth旗標,以確保此限制到位。
在標準的Kubeadm叢集中,這些選項應如下所示:
--client-cert-auth=true
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
此外,重要的是要注意,etcd將信任由指定的CA簽署的任何憑證,因此必須確保此CA僅用於etcd身份驗證,而不是用於其他目的。