ビュー:
プロファイル適用性: レベル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

修復

サービスアカウントトークンをマウントする必要がないポッドとサービスアカウントの定義を変更して無効にします。