ポッドのセキュリティポリシー - Amazon EKS

ポッドのセキュリティポリシー

Kubernetes Pod のセキュリティポリシーのアドミッションコントローラーは、一連のルールに対して Pod の作成を検証し、リクエストを更新します。デフォルトでは、Amazon EKS クラスターには、制限のない、完全な許容度のセキュリティポリシーが設定されています。詳細については、「Kubernetes のドキュメント」の「ポッドセキュリティポリシー」を参照してください。

注記

PodSecurityPolicy (PSP) は Kubernetes バージョン 1.21 で非推奨となり、Kubernetes 1.25 で削除されました。PSPs は「ポッドセキュリティ標準 (PSS)」で概説されているセキュリティ制御を実装する組み込みアドミッションコントローラーである「ポッドセキュリティアドミッション (PSA)」に置き換えられています。PSA および PSS はどちらもベータ機能状態に達しており、Amazon EKS ではデフォルトで有効になっています。1.25 から PSP の削除に対処するには、Amazon EKS に PSS を実装することをお勧めします。詳細については、「AWS ブログ」の「Implementing Pod Security Standards in Amazon EKS」(Amazon EKS でのポッドセキュリティ標準の実装) を参照してください。

Amazon EKS での デフォルトの Pod セキュリティポリシー

Kubernetes バージョン 1.13 以降の Amazon EKS クラスターには、eks.privileged という名前のデフォルト Pod のセキュリティポリシーがあります。このポリシーには、システムに受け入れ可能な種類の Pod について制限がありません。これは、PodSecurityPolicy コントローラーを無効にして Kubernetes を実行するのと同じです。

注記

このポリシーは、PodSecurityPolicy コントローラーが有効になっていないクラスターとの下位互換性を維持するために作成されたものです。クラスターと個別名前空間およびサービスアカウントに対してより制限の高いポリシーを作成してから、デフォルトポリシーを削除し、より制限の高いポリシーを有効にすることができます。

次のコマンドを使用してデフォルトのポリシーを表示できます。

kubectl get psp eks.privileged

出力例は次のとおりです。

NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES eks.privileged true * RunAsAny RunAsAny RunAsAny RunAsAny false *

詳細については、次のコマンドを使用してポリシーについて説明できます。

kubectl describe psp eks.privileged

出力例は次のとおりです。

Name:  eks.privileged

Settings:
  Allow Privileged:                       true
  Allow Privilege Escalation:             0xc0004ce5f8
  Default Add Capabilities:               <none>
  Required Drop Capabilities:             <none>
  Allowed Capabilities:                   *
  Allowed Volume Types:                   *
  Allow Host Network:                     true
  Allow Host Ports:                       0-65535
  Allow Host PID:                         true
  Allow Host IPC:                         true
  Read Only Root Filesystem:              false
  SELinux Context Strategy: RunAsAny
    User:                                 <none>
    Role:                                 <none>
    Type:                                 <none>
    Level:                                <none>
  Run As User Strategy: RunAsAny
    Ranges:                               <none>
  FSGroup Strategy: RunAsAny
    Ranges:                               <none>
  Supplemental Groups Strategy: RunAsAny
    Ranges:                               <none>

eks.privileged Pod セキュリティポリシー、そのクラスターロール、およびクラスターロールバインドに対する完全な YAML ファイルを デフォルトの Pod セキュリティポリシーをインストールまたは復元する で確認できます。

デフォルトの Amazon EKS Pod セキュリティポリシーを削除する

Pods に対してより制限の厳しいポリシーを作成する場合は、作成後にデフォルトの Amazon EKS eks.privileged Pod セキュリティポリシーを削除して、カスタムポリシーを有効にできます。

重要

CNI プラグインのバージョン 1.7.0 以降を使用していて、Daemonset によってデプロイされた aws-node Pods に使用した aws-node Kubernetes サービスアカウントにカスタム Pod セキュリティポリシーを割り当てる場合、ポリシーの allowedCapabilities セクションには NET_ADMIN が、またポリシーの spec には hostNetwork: trueprivileged: true があることが必要です。

デフォルトの Pod セキュリティポリシーを削除するには
  1. デフォルトの Pod セキュリティポリシーをインストールまたは復元する のサンプルファイルの内容を使用して、privileged-podsecuritypolicy.yaml という名前のファイルを作成します。

  2. 次のコマンドを使用して YAML を削除します。これにより、デフォルトの Pod セキュリティポリシー、ClusterRole、およびそれに関連付けられた ClusterRoleBinding が削除されます。

    kubectl delete -f privileged-podsecuritypolicy.yaml

デフォルトの Pod セキュリティポリシーをインストールまたは復元する

Kubernetes の以前のバージョンからアップグレードする場合、またはデフォルトの Amazon EKS eks.privileged Pod セキュリティポリシーを変更または削除した場合は、次のステップで復元できます。

デフォルトの Pod セキュリティポリシーをインストールまたは復元するには
  1. privileged-podsecuritypolicy.yaml というファイルを次の内容で作成します。

    apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: eks.privileged annotations: kubernetes.io/description: 'privileged allows full unrestricted access to Pod features, as if the PodSecurityPolicy controller was not enabled.' seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' labels: kubernetes.io/cluster-service: "true" eks.amazonaws.com/component: pod-security-policy spec: privileged: true allowPrivilegeEscalation: true allowedCapabilities: - '*' volumes: - '*' hostNetwork: true hostPorts: - min: 0 max: 65535 hostIPC: true hostPID: true runAsUser: rule: 'RunAsAny' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'RunAsAny' fsGroup: rule: 'RunAsAny' readOnlyRootFilesystem: false --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: eks:podsecuritypolicy:privileged labels: kubernetes.io/cluster-service: "true" eks.amazonaws.com/component: pod-security-policy rules: - apiGroups: - policy resourceNames: - eks.privileged resources: - podsecuritypolicies verbs: - use --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks:podsecuritypolicy:authenticated annotations: kubernetes.io/description: 'Allow all authenticated users to create privileged Pods.' labels: kubernetes.io/cluster-service: "true" eks.amazonaws.com/component: pod-security-policy roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: eks:podsecuritypolicy:privileged subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: system:authenticated
  2. 次のコマンドを使用して YAML を適用します。

    kubectl apply -f privileged-podsecuritypolicy.yaml