CIS Kubernetes Benchmark ポリシーの制約を使用する

Policy Controller には、CIS Kubernetes Benchmark に対するクラスタのコンプライアンスを監査するために CIS バンドルで使用できる制約テンプレートのデフォルト ライブラリが付属しています。このベンチマークは、強固なセキュリティ体制がサポートされるように Kubernetes を構成するための一連の推奨事項です。

この制約のバンドルは、次のドメインに対応し、ポリシーを適用します。

  • RBAC とサービス アカウント
  • Pod のセキュリティ ポリシー
  • ネットワーク ポリシーと CNI
  • シークレット管理
  • 一般ポリシー

これらはまだ CIS で認定されていません。

バンドルには、CIS ベンチマークの対応するコントロールを満たすために次の制約が含まれています。

制約 コントロール ID コントロールの説明
restrict-clusteradmin-rolebindings 5.1.1 cluster-admin ロールが必要な場合にのみ使用されていることを確認する
prohibit-role-wildcard-access 5.1.3 Roles と ClusterRoles でのワイルドカードの使用を最小限に抑える
psp-privileged-container 5.2.1 特権付きコンテナの使用を最小限に抑える
psp-host-namespace 5.2.2 ホストプロセス ID の Namespace を共有するコンテナの許可を最小限に抑える
5.2.3 ホスト IPC の Namespace を共有するコンテナの許可を最小限に抑える
psp-host-network-ports 5.2.4 ホスト ネットワークの Namespace を共有するコンテナの許可を最小限に抑える
psp-allow-privilege-escalation-container 5.2.5 allowPrivilegeEscalation を使用してコンテナの許可を最小限に抑える
psp-pods-must-run-as-nonroot 5.2.6 ルートコンテナの許可を最小限に抑える
psp-capabilities 5.2.7 NET_RAW 機能を使用してコンテナの許可を最小限に抑える
5.2.8 追加された機能を使用してコンテナの許可を最小限に抑える
5.2.9 割り当てられた機能を使用してコンテナの許可を最小限に抑える
require-namespace-network-policies 5.3.2 すべての Namespace にネットワーク ポリシーが定義されていることを確認する
no-secrets-as-env-vars 5.4.1 Secret を環境変数としてではなくファイルとして使用する
psp-seccomp-docker-default 5.7.2 Pod の定義で seccomp プロファイルが docker/default に設定されていることを確認する
pods-require-security-context 5.7.3 セキュリティ コンテキストを Pod と Container に適用する
restrict-default-namespace 5.7.4 デフォルトの Namespace を使用しない

始める前に

  1. この手順で使用する gcloud コマンドと kubectl コマンドを含む Cloud SDK をインストールして初期化します。Cloud Shell を使用する場合、Cloud SDK がプリインストールされています。
  2. kpt をインストールして設定します。これらの手順では、kpt を使用して Kubernetes リソースのカスタマイズとデプロイを行います。
  3. Anthos Config Management を初めて使用する場合は、Anthos Config Management を有効にします。
  4. Policy Controller がインストールされた 1.14.x 以降の Kubernetes バージョンを実行するクラスタを作成するか、このクラスタにアクセスできることを確認します。Policy Controller のインストールの詳細については、Policy Controller をインストールするを参照してください。
  5. 省略可: Config Sync を使用してクラスタにリソースを適用する場合は、Config Sync がインストールされていることを確認します。

Policy Controller を使用して CIS ポリシーを監査する

Policy Controller を使用すると、Kubernetes クラスタにポリシーを適用できます。前の表にある CIS ポリシーに関するワークロードとそのコンプライアンスをテストする場合、これらの制約を監査モードでデプロイできます。これにより、違反がより明確になり、Kubernetes クラスタに適用する前に修正することが可能になります。

kpt または Config Sync を使用して spec.enforcementActiondryrun に設定し、これらのポリシーを適用できます。

kpt

  1. kpt を使用して GitHub から CIS ポリシー バンドルをダウンロードします。

    kpt pkg get https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/cis-k8s-1.5.1
    
  2. set-enforcement-action kpt 機能を実行して、ポリシーの適用アクションを dryrun に設定します。

    kpt fn eval cis-k8s-1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  3. kpt を使用して作業ディレクトリを初期化します。これにより、変更を追跡するためのリソースが作成されます。

    cd cis-k8s-1.5.1
    kpt live init
    
  4. kpt を使用してポリシーの制約を適用します。

    kpt live apply
    

    次のような出力が表示されます。

    k8spspseccomp.constraints.gatekeeper.sh/psp-seccomp-docker-default created
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/pods-require-security-context created
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/prohibit-role-wildcard-access created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/require-namespace-network-policies created
    k8snoenvvarsecrets.constraints.gatekeeper.sh/no-secrets-as-env-vars created
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-allow-privilege-escalation-container created
    k8spspallowedusers.constraints.gatekeeper.sh/psp-pods-must-run-as-nonroot created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-host-network-ports created
    k8srestrictnamespaces.constraints.gatekeeper.sh/restrict-default-namespace created
    k8srestrictrolebindings.constraints.gatekeeper.sh/restrict-clusteradmin-rolebindings created
    k8spspcapabilities.constraints.gatekeeper.sh/psp-capabilities created
    k8spsphostnamespace.constraints.gatekeeper.sh/psp-host-namespace created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-privileged-container created
    13 resource(s) applied. 13 created, 0 unchanged, 0 configured, 0 failed
    
  5. ポリシーの制約がインストールされていることを確認し、クラスタ全体で違反の存在を確認します。

    kpt live status --output table --poll-until current
    

    ステータスが CURRENT の場合、制約が正常にインストールされています。

Config Sync

Config Sync を使用してクラスタにクラスタをデプロイするオペレータは、次の手順を使用できます。

  1. Config Sync の同期ディレクトリに移動します。

    cd SYNC_ROOT_DIR
    
  2. kpt を使用して GitHub から CIS ポリシー バンドルをダウンロードします。

    kpt pkg get git@github.com:GoogleCloudPlatform/acm-policy-controller-library.git/bundles/cis-k8s-1.5.1 policy/cis
    
  3. set-enforcement-action kpt 機能を実行して、ポリシーの適用アクションを dryrun に設定します。

    kpt fn eval policy/cis/cis-k8s-1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  4. 作成されるポリシー制約をプレビューします。

    kpt live init policy/cis/cis-k8s-1.5.1
    kpt live apply --dry-run policy/cis/cis-k8s-1.5.1
    

    次のような出力が表示されます。

    k8spsphostnamespace.constraints.gatekeeper.sh/psp-host-namespace created (dry-run)
    k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/pods-require-security-context created (dry-run)
    k8srestrictnamespaces.constraints.gatekeeper.sh/restrict-default-namespace created (dry-run)
    k8srestrictrolebindings.constraints.gatekeeper.sh/restrict-clusteradmin-rolebindings created (dry-run)
    k8snoenvvarsecrets.constraints.gatekeeper.sh/no-secrets-as-env-vars created (dry-run)
    k8spspallowedusers.constraints.gatekeeper.sh/psp-pods-must-run-as-nonroot created (dry-run)
    k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-host-network-ports created (dry-run)
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-privileged-container created (dry-run)
    k8spspseccomp.constraints.gatekeeper.sh/psp-seccomp-docker-default created (dry-run)
    k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/prohibit-role-wildcard-access created (dry-run)
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/require-namespace-network-policies created (dry-run)
    k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-allow-privilege-escalation-container created (dry-run)
    k8spspcapabilities.constraints.gatekeeper.sh/psp-capabilities created (dry-run)
    13 resource(s) applied. 13 created, 0 unchanged, 0 configured, 0 failed (dry-run)
    
  5. 変更を Config Sync リポジトリに push します。

    git add SYNC_ROOT_DIR/policy/cis
    git commit -m 'Adding CIS policy audit enforcement'
    git push
    
  6. インストールのステータスを確認します。

    watch gcloud beta container hub config-management status --project PROJECT_ID
    

    ステータスが SYNCED の場合、ポリシーがインストールされています。

ポリシー違反を確認する

ポリシーの制約が監査モードでインストールされると、次のコマンドを使用してクラスタ上の違反を確認できます。

kubectl get constraint -o json | jq -cC '.items[]| [.kind,.status.totalViolations]

Cloud Logging で違反を表示するには、ログ エクスプローラのページに移動します。

[ログ エクスプローラ] に移動

クエリエディタの以下のフィルタを使用して、違反ログを確認します。

resource.type="k8s_container"
resource.labels.location=CLUSTER_LOCATION
resource.labels.namespace_name="gatekeeper-system"
resource.labels.pod_name:"gatekeeper-audit-"
jsonPayload.process: "audit"
jsonPayload.event_type: "violation_audited"
jsonPayload.constraint_name:*
jsonPayload.constraint_namespace:*

CIS ポリシーを適用する

クラスタのポリシー違反を確認したら、これらのポリシーを適用して、非遵守のリソースがクラスタに適用されないようにします。

kpt

  1. set-enforcement-action kpt 機能を実行して、ポリシーの適用アクションを deny に設定します。

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
    
  2. ポリシー制約を適用します。

    kpt live apply
    

Config Sync

Config Sync を使用してクラスタにクラスタをデプロイするオペレータは、次の手順を使用できます。

  1. Config Sync の同期ディレクトリに移動します。

    cd SYNC_ROOT_DIR
    
  2. set-enforcement-action kpt 機能を実行して、ポリシーの適用アクションを deny に設定します。

    kpt fn eval policy/cis/cis-k8s-1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
    
  3. 変更を Config Sync リポジトリに push します。

    git add SYNC_ROOT_DIR/policy/cis
    git commit -m 'Enforcing CIS policies for GKE'
    git push
    
  4. インストールのステータスを確認します。

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    SYNCED 列に表示されたリポジトリには、ポリシーがインストールされています。

ポリシーの適用をテストする

クイックテストを実行して、クラスタ上の非遵守リソースに対するポリシーの適用とブロックを確認します。

次のコマンドを使用して、クラスタに非遵守のリソースを作成します。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: wp
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        name: wordpress
EOF

アドミッション コントローラにより、このリソースが違反しているポリシー違反のエラー一覧が生成されるはずです。