プロファイル適用性: レベル1
サービスアカウントトークンは、ポッド内で実行されるワークロードがAPIサーバと明示的に通信する必要がある場合を除き、ポッドにマウントされるべきではありません
Pod内にサービスアカウントトークンをマウントすることは、攻撃者がクラスター内の単一のPodを侵害できる特権昇格攻撃の手段を提供する可能性があります。これらのトークンのマウントを避けることで、この攻撃手段を排除できます。
注意デフォルトでは、すべてのポッドにサービスアカウントトークンがマウントされます。
|
影響
サービスアカウントトークンなしでマウントされたポッドは、認証されていないプリンシパルにリソースが利用可能な場合を除き、APIサーバと通信することができません。
監査
クラスター内のポッドおよびサービスアカウントオブジェクトを確認し、リソースが明示的にこのアクセスを必要としない限り、以下のオプションが設定されていることを確認してください。
automountServiceAccountToken: false
echo "=== ServiceAccounts with automountServiceAccountToken=false ==="
kubectl get sa -A -o jsonpath='{range .items[?(@.automountServiceAccountToken==false)]}{.metadata.namespace}{"\t"}{.metadata.name}{"\n"}{end}' \
| sort | awk -F'\t' '{printf "%-25s %-40s\n", $1, $2}'
echo "=== Pods with automountServiceAccountToken=false ==="
kubectl get pods -A -o jsonpath='{range .items[?(@.spec.automountServiceAccountToken==false)]}{.metadata.namespace}{"\t"}{.metadata.name}{"\n"}{end}' \
| sort | awk -F'\t' '{printf "%-25s %-40s\n", $1, $2}'
kubectl get ... -Aはすべてのネームスペースをスキャンします。-
jsonpathフィルター
automountServiceAccountToken == false。 - awkは出力を整列した列にフォーマットします。
- セクションが空の場合、
automountServiceAccountToken: falseが明示的に設定されていないことを意味し、デフォルトでトークンが自動マウントされるため、修正が必要になる可能性があります。
サンプル出力:
=== ServiceAccounts with automountServiceAccountToken=false === NAMESPACE SERVICEACCOUNT ------------------------- ---------------------------------------- default default kube-system metrics-reader === Pods with automountServiceAccountToken=false === NAMESPACE POD ------------------------- ---------------------------------------- dev api-service prod nginx-test
修復
サービスアカウントトークンをマウントする必要がないポッドとサービスアカウントの定義を変更して無効にします。
