
Kubernetesクラスターの危険な権限をスキャンするツール
KubernetesクラスターのRole-Based Access Control(RBAC)認可モデルにおける危険なパーミッションをスキャンするツール。
本ツールは、「Securing Kubernetes Clusters by Eliminating Risky Permissions」調査の一部として公開されました。https://www.cyberark.com/threat-research-blog/securing-kubernetes-clusters-by-eliminating-risky-permissions/
KubiScanは、攻撃者がクラスターを侵害するために悪用する可能性のあるパーミッションをクラスター管理者が特定するのに役立ちます。これは、追跡が困難な多くのパーミッションが存在する大規模な環境で特に役立ちます。
KubiScanは、危険なRole/ClusterRole、RoleBinding/ClusterRoleBinding、ユーザー、Podに関する情報を収集し、従来の手動プロセスを自動化して、管理者がリスクを低減するために必要な可視性を提供します。
次のように実行できます:
./docker_run.sh <kube_config_file>
# 例: ./docker_run.sh ~/.kube/config
これにより、設定ファイル内のすべてのファイルがコンテナにコピーされ、コンテナ内でシェルが起動します。 Dockerイメージをビルドするには、次のコマンドを実行します:
docker build -t kubiscan .
apt-get update
apt-get install -y python3 python3-pip
pip3 install -r requirements.txt
alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py' を実行して kubiscan を使用できるようにします。
上記のすべての要件をインストールしたら、次の2つの方法で実行できます:
~/.kube/config ファイルと関連するすべての証明書にアクセスできることを確認し、次のコマンドを実行します:
kubiscan <command>
例: kubiscan -rs は、すべての危険なSubject(ユーザー、サービスアカウント、グループ)を表示します。
一部の機能には、次の権限を持つ特権サービスアカウントが必要です:
["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods", "secrets"]
verbs: ["get", "list"]["pods/exec"]
verbs: ["create", "get"]ただし、ほとんどの機能はこれらを必要としないため、制限付きサービスアカウントには次の設定を使用できます: 次のコマンドで作成できます:
kubectl apply -f - << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: kubiscan-sa
namespace: default
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: kubiscan-sa-secret
annotations:
kubernetes.io/service-account.name: kubiscan-sa
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: kubiscan-clusterrolebinding
subjects:
- kind: ServiceAccount
name: kubiscan-sa
namespace: default
apiGroup: ""
roleRef:
kind: ClusterRole
name: kubiscan-clusterrole
apiGroup: ""
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: kubiscan-clusterrole
rules:
- apiGroups: ["*"]
resources: ["roles", "clusterroles", "rolebindings", "clusterrolebindings", "pods"]
verbs: ["get", "list"]
EOF
Kubernetes 1.24以降では、サービスアカウントの作成時にシークレットが作成されないことに注意してください。そのため、シークレットを手動で作成する必要があります。
1.24より前では、上記のコマンドからSecretオブジェクトを削除し、サービスアカウントのトークンをファイルに保存できます:
kubectl get secrets $(kubectl get sa kubiscan-sa -o=jsonpath='{.secrets[0].name}') -o=jsonpath='{.data.token}' | base64 -d > token
1.24以降では、何も変更せずに次のようにトークンを保存します:
kubectl get secrets kubiscan-sa-secret -o=jsonpath='{.data.token}' | base64 -d > token
トークンをファイルに保存したら、次のように使用できます:
python3 ./KubiScan.py -ho <master_ip:master_port> -t /token <command>
例:
alias kubiscan='python3 /<KubiScan_folder>/KubiScan.py
kubiscan -ho 192.168.21.129:8443 -t /token -rs
証明書認証局(ca.crt)を使用してSSL接続を検証することもできます:
kubiscan -ho <master_ip:master_port> -t /token -c /ca.crt <command>
特権サービスアカウントを削除するには、次のコマンドを実行します:
kubectl delete clusterroles kubiscan-clusterrole
kubectl delete clusterrolebindings kubiscan-clusterrolebinding
kubectl delete sa kubiscan-sa
kubectl delete secrets kubiscan-sa-secret
すべての例を表示するには、python3 KubiScan.py -e またはコンテナ内で kubiscan -e を実行します。
KubiScanの使用例の小さなデモ:
risky_roles.yaml というファイルがあります。このファイルには、優先度付きの危険なロールのテンプレートが含まれています。
各ロールのkindはRoleですが、これらのテンプレートはクラスター内のすべてのRole/ClusterRoleと比較されます。
各テンプレートがクラスター内のロールと照合されるとき、そのロールに危険なロールのルールが含まれているかどうかがチェックされます。含まれている場合、そのロールは危険としてマークされます。
私たちは危険と判断したすべてのロールを追加しましたが、「危険」の定義は人それぞれ異なるため、このファイルを変更して、より危険だと考えるロールを追加したり、安全だと考えるロールを削除したりできます。
Copyright (c) 2020 CyberArk Software Ltd. All rights reserved
このリポジトリはGPL-3.0ライセンスの下で提供されています。詳細はLICENSEを参照してください。
コメント、提案、質問がある場合は、Eviatar Gerzi(@g3rzi)およびCyberArk Labsまでご連絡ください。