Pod Security Standardsの強制
Pod Security Standards (PSS)セクションの導入で説明したように、事前定義されたポリシーレベルにはPrivileged、Baseline、Restrictedの3つがあります。Restricted PSSの実装が推奨されますが、適切に構成されていないとアプリケーションレベルで意図しない動作を引き起こす可能性があります。まずは、コンテナがHostProcess、HostPath、HostPortsへのアクセスや、トラフィックスヌーピングの許可など、既知の特権昇格を防ぐBaselineポリシーを設定することをお勧めします。その後、これらの特権アクセスを制限または禁止するための個別のポリシーを設定できます。
Kyverno Baselineポリシーは、単一のポリシーの下で既知の特権昇格をすべて制限するのに役立ちます。また、最新の脆弱性を発見した場合に、ポリシーに組み込むための定期的なメンテナンスと更新も可能です。
特権コンテナはホストが実行できるほとんどすべてのアクションを実行でき、コンテナイメージのビルドと公開を可能にするためにCI/CDパイプラインでよく使用されます。現在は修正されているCVE-2022-23648では、悪意のある攻撃者がControl Groupsのrelease_agent機能を悪用してコンテナホスト上で任意のコマンドを実行することにより、特権コンテナから脱出する可能性がありました。
このラボでは、EKSクラスタ上で特権コンテナを持つDeploymentを作成し ます。ポリシーが設定されていない場合、Deploymentは自由に作成でき、そのPodテンプレートにパッチを適用して特権アクセスを追加できます:
deployment.apps/privileged-deploy created
deployment.apps/privileged-deploy patched
deployment.apps "privileged-deploy" deleted
kubectl patchコマンドはJSONパッチを使用して、Podテンプレートの最初のコンテナにsecurityContextを追加し、privileged: trueを設定します。これにより、コンテナにはホストへのほぼ無制限のアクセスが許可されます。このような昇格された特権機能を防ぎ、これらの権限の不正使用を避けるために、KyvernoでBaselineポリシーを設定することをお勧めします。
Pod Security Standardsのbaselineプロファイルは、Podを保護するための最も基本的かつ重要なステップの集合です。Kyverno 1.8以降、単一のルールを通じてプロファイル全体をクラスタに割り当てることができます。Baselineプロファイルによってブロックされる特権の詳細については、Kyvernoドキュメントを参照してください。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: baseline-policy
spec:
background: true
validationFailureAction: Enforce
rules:
- name: baseline
match:
any:
- resources:
kinds:
- Deployment
validate:
allowExistingViolations: false
podSecurity:
level: baseline
version: latest
background: trueは、新規リソースだけでなく既存のリソースにもポリシーを適用します
validationFailureAction: Enforceは、ポリシーに準拠していないDeploymentの作成または更新をブロックします
match.any.resources.kinds: [Deployment]は、クラスタ全体のすべてのDeploymentリソースにポリシーを適用します
allowExistingViolations: falseは、既に違反しているDeploymentへの更新もブロックされることを保証します
validate.podSecurityは、latest標準バージョンのbaselineレベルで、DeploymentのPodテンプレートに対してKubernetes Pod Security Standardsを強制します
それでは、Baselineポリシーを適用しましょう:
clusterpolicy.kyverno.io/baseline-policy created
次に、特権コンテナを持つDeploymentを作成してみましょう。まずDeploymentを作成し、次にPodテンプレートにprivileged: trueを追加するためにパッチを適用します:
deployment.apps/privileged-deploy created
次に、特権セキュリティコンテキストを追加するためにパッチを適用してみましょう:
Error from server: admission webhook "validate.kyverno.svc-fail" denied the request:
resource Deployment/default/privileged-deploy was blocked due to the following policies
baseline-policy:
baseline: 'Validation rule ''baseline'' failed. It violates PodSecurity "baseline:latest":
(Forbidden reason: privileged, field error list: [spec.template.spec.containers[0].securityContext.privileged
is forbidden, forbidden values found: true])'
ご覧の通り、Podテンプレートにprivileged: trueを追加するパッチは、クラスタに設定したBaselineポリシーに準拠していないため、ブロックされました。
Deploymentをクリーンアップします:
deployment.apps "privileged-deploy" deleted