コードとしてのポリシー: セキュリティ ルールの自動化
コードとしてのポリシー (PaC) セキュリティとコンプライアンスのルールを定義する実践 バージョン管理され、テスト可能で自動的に適用可能なコードとして。文書化する代わりに、 誰も読まない PDF のポリシーを、PaC が適用される実行可能コードに変換します。 パイプラインとインフラストラクチャで自動的に実行されます。
PaC では、「すべてのコンテナは非ルートとして実行する必要がある」または「S3 バケットは実行しないでください」などのルールが適用されます。 be public」は、非準拠の展開をブロックする自動制御になります。これ 人的エラーを排除し、継続的なコンプライアンスを確保します。
何を学ぶか
- Policy as Code の原則と従来のポリシーと比較した利点
- OPA (Open Policy Agent) と Rego 言語
- Kubernetes ポリシー適用のための Kyverno
- HashiCorp の Terraform 用センチネル
- 構成を検証するためのコンテスト
- ポリシーのテストと展開
OPA: オープン ポリシー エージェント
OPA (オープン ポリシー エージェント) エコシステム内で最も普及しているポリシー エンジン クラウドネイティブ。 CNCF によって開発された OPA は宣言型言語を使用します レゴ あらゆるタイプの構造化データに適用できるポリシーを定義するには: リクエスト API、Kubernetes 構成、Terraform 構成、CI/CD パイプライン。
Rego でのポリシーの書き込み
# policy/kubernetes/pod-security.rego
package kubernetes.admission
# Nega i container che girano come root
deny[msg] {
input.request.kind.kind == "Pod"
container := input.request.object.spec.containers[_]
not container.securityContext.runAsNonRoot
msg := sprintf(
"Container '%s' deve avere runAsNonRoot: true",
[container.name]
)
}
# Nega immagini con tag :latest
deny[msg] {
input.request.kind.kind == "Pod"
container := input.request.object.spec.containers[_]
endswith(container.image, ":latest")
msg := sprintf(
"Container '%s' usa :latest. Specificare un tag esplicito.",
[container.name]
)
}
# Richiedi resource limits
deny[msg] {
input.request.kind.kind == "Pod"
container := input.request.object.spec.containers[_]
not container.resources.limits
msg := sprintf(
"Container '%s' deve definire resource limits (CPU e memory)",
[container.name]
)
}
OPA ポリシーのテスト
# policy/kubernetes/pod-security_test.rego
package kubernetes.admission
test_deny_root_container {
count(deny) > 0 with input as {
"request": {
"kind": {"kind": "Pod"},
"object": {
"spec": {
"containers": [{
"name": "app",
"image": "myapp:v1",
"securityContext": {}
}]
}
}
}
}
}
test_allow_nonroot_container {
count(deny) == 0 with input as {
"request": {
"kind": {"kind": "Pod"},
"object": {
"spec": {
"containers": [{
"name": "app",
"image": "myapp:v1",
"securityContext": {"runAsNonRoot": true},
"resources": {"limits": {"cpu": "500m", "memory": "256Mi"}}
}]
}
}
}
}
}
Kyverno: ネイティブ Kubernetes ポリシー
カイベルノ そして、Kubernetes 専用に設計されたポリシー エンジンです。とは異なります Rego を使用した OPA の場合、Kyverno はポリシーを YAML のネイティブ Kubernetes リソースとして定義します。 すでに Kubernetes に慣れているチームにとって、導入が容易になります。
# kyverno-policies/require-nonroot.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-run-as-nonroot
annotations:
policies.kyverno.io/title: Require runAsNonRoot
policies.kyverno.io/category: Pod Security
policies.kyverno.io/severity: high
spec:
validationFailureAction: Enforce
background: true
rules:
- name: check-containers
match:
any:
- resources:
kinds:
- Pod
validate:
message: >-
Container deve girare come non-root.
Impostare securityContext.runAsNonRoot a true.
pattern:
spec:
containers:
- securityContext:
runAsNonRoot: true
---
# Richiedi registry approvati
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: restrict-image-registries
spec:
validationFailureAction: Enforce
rules:
- name: validate-registries
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Immagini devono provenire da registry approvati."
pattern:
spec:
containers:
- image: "ghcr.io/myorg/* | registry.internal.company.com/*"
コンテスト: 構成の検証
コンテスト OPA/Rego を使用して、あらゆるタイプの構成ファイルを検証します。 Dockerfile、Kubernetes マニフェスト、Terraform ファイル、CI/CD パイプライン。そして特に役立つのが 導入前に構成を検証するための CI パイプラインのステップとして。
# Installare Conftest
brew install conftest
# Validare un Dockerfile
conftest test Dockerfile --policy policy/docker/
# Validare manifest Kubernetes
conftest test k8s/ --policy policy/kubernetes/
# Validare con output strutturato
conftest test --output json terraform/ --policy policy/terraform/
# policy/docker/dockerfile.rego
package docker
# Nega Dockerfile senza USER
deny[msg] {
input[i].Cmd == "from"
not any_user_after(i)
msg := "Dockerfile deve includere l'istruzione USER per evitare l'esecuzione come root"
}
any_user_after(from_idx) {
input[j].Cmd == "user"
j > from_idx
}
# Nega immagini base :latest
deny[msg] {
input[i].Cmd == "from"
val := input[i].Value[0]
endswith(val, ":latest")
msg := sprintf("Evitare :latest nell'istruzione FROM. Usare un tag specifico: %s", [val])
}
Sentinel: Terraform のポリシー
センチネル と HashiCorp のポリシー フレームワークがネイティブに統合されています。 Terraform クラウドとエンタープライズ。 Terraform プランを検証するポリシーを定義できます。 適用前に、非準拠リソースの作成を防ぎます。
ポリシー エンジンの比較
| 特性 | OPA/登録 | カイベルノ | センチネル |
|---|---|---|---|
| 範囲 | ユニバーサル | Kubernetes | HashiCorp エコシステム |
| 言語 | Rego (宣言的) | K8s ネイティブ YAML | センチネル (必須) |
| 学習曲線 | 中~高 | 低い | 平均 |
| ライセンス | オープンソース (Apache 2.0) | オープンソース (Apache 2.0) | 商用 (Terraform クラウド) |
CI/CD パイプラインのポリシー
# .github/workflows/policy-check.yml
name: Policy Validation
on:
pull_request:
jobs:
validate-policies:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Conftest
run: |
wget -q https://github.com/open-policy-agent/conftest/releases/download/v0.46.0/conftest_0.46.0_Linux_x86_64.tar.gz
tar xzf conftest_0.46.0_Linux_x86_64.tar.gz
sudo mv conftest /usr/local/bin/
- name: Test OPA policies
run: opa test policy/ -v
- name: Validate Dockerfiles
run: conftest test Dockerfile --policy policy/docker/
- name: Validate K8s manifests
run: conftest test k8s/ --policy policy/kubernetes/
- name: Validate Terraform
run: conftest test terraform/ --policy policy/terraform/
コードとしてのポリシーのベスト プラクティス
- ポリシーのバージョンを設定する: ポリシーをコードとして扱い、レビュー、テスト、リリースを行います。
- テストポリシー: リグレッションを回避するために、各ポリシーの単体テストを作成します。
- 漸進性: 強制 (ブロック) に切り替える前に、監査モード (警告) で開始します。
- 書類: すべてのポリシーには、そのポリシーが存在する理由を明確に説明する必要があります。
- 素早いフィードバック: 検証を PR に統合して即時フィードバックを実現
- 処理された例外: 有効期限が切れた一時的な例外に対するプロセスを提供します。
結論
コードとしてのポリシーは、セキュリティ ルールを静的ドキュメントから実行可能コードに変換します。 そして自動化されています。 OPA、Kyverno、Conftest を使用すると、組織はコンプライアンスを確保できます 開発プロセスを遅らせることなく継続します。
次の記事では、詳しく見ていきます CI/CD セキュリティ パイプライン、どのように分析するか ビルドおよびデプロイメントプロセス自体を保護: パイプライン強化、OIDC、最小権限 そして署名されたコミット。







