ServiceAccountによるSecretへのアクセス

ServiceAccountにSecretの読み取り権限があると、そのワークロードは機密の認証情報にアクセスできます。

説明

RoleやClusterRoleがsecretsへのget、watch、listなどの権限を持ち、ServiceAccountにバインドされると、そのアカウントを使うPodはSecretの値を読み取れます。Secretにはトークン、パスワード、鍵が含まれる場合があります。

これらの権限は、必要なワークロードだけに付与してください。通常のサービスアカウントにSecretの読み取り権限を一律に与えないでください。

想定される影響

  • Podが機密のパスワード、トークン、鍵を読み取れます。
  • 侵害されたワークロードが、その認証情報を使って他のシステムにアクセスするおそれがあります。
  • Secretにアクセスできる主体が増えると、インシデントの調査が難しくなる場合があります。

対処方法

  • バインドされたRoleやClusterRoleから、不要なSecretの読み取り権限を削除してください。
  • Secretへのアクセスが必要なワークロードには専用のServiceAccountを使用してください。
  • RBACの確認では、resources: ["secrets"]と読み取り動詞を機密性の高い権限として扱ってください。

例

例のServiceAccount testsaは、assembly-prod名前空間に別途作成してください。Secretのupdate権限も認証情報の改ざんに使われる可能性があり、読み取り権限の安全な代替にはなりません。

変更前

yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: assembly-prod
  name: testRoleVulnerable
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get", "watch", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: assembly-prod
  name: testRoleBinding
subjects:
  - kind: ServiceAccount
    name: testsa
    namespace: assembly-prod
roleRef:
  kind: Role
  name: testRoleVulnerable
  apiGroup: rbac.authorization.k8s.io

変更後

yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: assembly-prod
  name: testRoleWithBindingSafe
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: assembly-prod
  name: bindingtestRoleWithBindingSafe
subjects:
  - kind: ServiceAccount
    name: testsa
    namespace: assembly-prod
roleRef:
  kind: Role
  name: testRoleWithBindingSafe
  apiGroup: rbac.authorization.k8s.io

説明:

  • 変更前: バインドによってServiceAccountにSecretの値へのアクセスを許可しています。
  • 変更後: このロールは、代わりにPodの読み取り権限だけを付与します。他のバインドにSecretの権限が残っていないかも確認してください。

参考資料