CIS Kubernetes Benchmark ポリシーの制約を使用する
Policy Controller には、CIS Kubernetes Benchmark に対するクラスタのコンプライアンスを監査するために CIS バンドルで使用できる制約テンプレートのデフォルト ライブラリが付属しています。このベンチマークは、強固なセキュリティ体制がサポートされるように Kubernetes を構成するための一連の推奨事項です。
この制約のバンドルは、次のドメインに対応し、ポリシーを適用します。
- RBAC とサービス アカウント
- Pod のセキュリティ ポリシー
- ネットワーク ポリシーと CNI
- シークレット管理
- 一般ポリシー
これらはまだ CIS で認定されていません。
バンドルには、CIS ベンチマークの対応するコントロールを満たすために次の制約が含まれています。
制約 | コントロール ID | コントロールの説明 |
---|---|---|
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 | すべての名前空間にネットワーク ポリシーが定義されていることを確認する |
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 に適用する |
始める前に
- この手順で使用する
gcloud
コマンドとkubectl
コマンドを含む Google Cloud CLI をインストールして初期化します。Cloud Shell を使用する場合、Google Cloud CLI がプリインストールされています。 - kpt をインストールして設定します。これらの手順では、kpt を使用して Kubernetes リソースのカスタマイズとデプロイを行います。
- Anthos Config Management を初めて使用する場合は、Anthos Config Management を有効にします。
- Policy Controller がインストールされた 1.14.x 以降の Kubernetes バージョンを実行するクラスタを作成するか、このクラスタにアクセスできることを確認します。Policy Controller のインストールの詳細については、Policy Controller をインストールするを参照してください。
- 省略可: Config Sync をインストールして、クラスタを Google サンプル リポジトリに同期します。このリポジトリには、Policy Controller の CIS 制約が事前に設定されています。詳細については、Config Sync のインストールをご覧ください。
Policy Controller を使用して CIS ポリシーを監査する
Policy Controller を使用すると、Kubernetes クラスタにポリシーを適用できます。前の表にある CIS ポリシーに関するワークロードとそのコンプライアンスをテストする場合、これらの制約を監査モードでデプロイできます。これにより、違反がより明確になり、Kubernetes クラスタに適用する前に修正することが可能になります。
kpt または Config Sync を使用して spec.enforcementAction
を dryrun
に設定し、これらのポリシーを適用できます。
kpt
kpt を使用して GitHub から CIS ポリシー バンドルをダウンロードします。
kpt pkg get https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/bundles/cis-k8s-v1.5.1
set-enforcement-action
kpt 機能を実行して、ポリシーの適用アクションをdryrun
に設定します。kpt fn eval cis-k8s-v1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
kpt を使用して作業ディレクトリを初期化します。これにより、変更を追跡するためのリソースが作成されます。
cd cis-k8s-v1.5.1 kpt live init
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 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
ポリシーの制約がインストールされていることを確認し、クラスタ全体で違反の存在を確認します。
kpt live status --output table --poll-until current
ステータスが
CURRENT
の場合、制約が正常にインストールされています。
Config Sync
Config Sync を使用してクラスタにクラスタをデプロイするオペレータは、次の手順を使用できます。
Config Sync の同期ディレクトリに移動します。
cd SYNC_ROOT_DIR
kpt を使用して GitHub から CIS ポリシー バンドルをダウンロードします。
kpt pkg get git@github.com:GoogleCloudPlatform/acm-policy-controller-library.git/bundles/cis-k8s-v1.5.1 policy/cis
set-enforcement-action
kpt 機能を実行して、ポリシーの適用アクションをdryrun
に設定します。kpt fn eval policy/cis/cis-k8s-v1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
作成されるポリシー制約をプレビューします。
kpt live init policy/cis/cis-k8s-v1.5.1 kpt live apply --dry-run policy/cis/cis-k8s-v1.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)
変更を Config Sync リポジトリに push します。
git add SYNC_ROOT_DIR/policy/cis git commit -m 'Adding CIS policy audit enforcement' git push
インストールのステータスを確認します。
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
set-enforcement-action
kpt 関数を実行して、ポリシーの適用アクションをdeny
に設定します。kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
ポリシー制約を適用します。
kpt live apply
Config Sync
Config Sync を使用してクラスタにクラスタをデプロイするオペレータは、次の手順を使用できます。
Config Sync の同期ディレクトリに移動します。
cd SYNC_ROOT_DIR
set-enforcement-action
kpt 関数を実行して、ポリシーの適用アクションをdeny
に設定します。kpt fn eval policy/cis/cis-k8s-v1.5.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
変更を Config Sync リポジトリに push します。
git add SYNC_ROOT_DIR/policy/cis git commit -m 'Enforcing CIS policies for GKE' git push
インストールのステータスを確認します。
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
アドミッション コントローラにより、このリソースが違反しているポリシー違反のエラー一覧が生成されるはずです。