Policy-as-Code — Automatizovaný enforcement pravidiel
Policy-as-Code je prístup, kde bezpečnostné, compliance a operačné pravidlá definujete ako kód — verzionovaný, testovateľný a automaticky vynucovaný. Namiesto manuálnych auditov a checklist dokumentov máte politiky, ktoré sa vyhodnocujú pri každom deployi, pull requeste alebo zmene infraštruktúry.
Čo je Policy-as-Code a prečo ho potrebujeme
V tradičnom modeli bezpečnostný tím napíše dokument s pravidlami (žiadne kontajnery ako root, povinné labely, šifrovanie at rest) a dúfa, že ich vývojári dodržia. Realita je iná — pravidlá sa porušujú, audity odhaľujú problémy neskoro a náprava je drahá.
Policy-as-Code tento problém rieši:
- Deklaratívne pravidlá — politiky sú zapísané v štruktúrovanom jazyku (Rego, YAML, HCL)
- Automatický enforcement — porušenie sa zachytí v CI/CD pipeline alebo admission controlleri
- Verzionovanie — politiky žijú v Git repozitári s plnou históriou zmien
- Testovateľnosť — politiky sa dajú unit testovať rovnako ako aplikačný kód
- Audit trail — každá zmena politiky má autora, review a timestamp
Manuálny audit vs automatizovaný enforcement
| Aspekt | Manuálny audit | Policy-as-Code |
|---|---|---|
| Rýchlosť | Dni až týždne | Sekundy |
| Pokrytie | Vzorka | 100 % zdrojov |
| Konzistencia | Závisí od audítora | Deterministické |
| Frekvencia | Kvartálne/ročne | Pri každej zmene |
| Škálovateľnosť | Lineárna s tímom | Automatická |
Prehľad nástrojov
Open Policy Agent (OPA) / Rego
OPA je open-source, CNCF graduated policy engine. Politiky sa píšu v jazyku Rego — deklaratívnom query jazyku inšpirovanom Datalogom. OPA je univerzálny — funguje pre Kubernetes, API autorizáciu, Terraform, CI/CD aj mikroslužby.
# Zakázať kontajnery bežiace ako root
package kubernetes.admission
deny[msg] {
input.request.kind.kind == "Pod"
container := input.request.object.spec.containers[_]
container.securityContext.runAsUser == 0
msg := sprintf("Kontajner '%s' nesmie bežať ako root", [container.name])
}
Kedy použiť: Univerzálne nasadenie, multi-platform prostredia, pokročilé pravidlá vyžadujúce Rego.
Kyverno
Kubernetes-natívny policy engine. Politiky sú čisté Kubernetes YAML — žiadny nový jazyk. Podporuje validáciu, mutáciu aj generovanie zdrojov. Pre Kubernetes tímy je to najrýchlejší štart.
Kedy použiť: Čisto Kubernetes prostredia, tímy ktoré nechcú učiť Rego.
HashiCorp Sentinel
Komerčný policy framework od HashiCorp. Natívna integrácia s Terraform Cloud/Enterprise, Vault a Consul. Politiky sa píšu v jazyku Sentinel (Python-like syntax).
# Sentinel: Zakázať verejné S3 buckety
import "tfplan/v2" as tfplan
s3_buckets = filter tfplan.resource_changes as _, rc {
rc.type is "aws_s3_bucket" and
rc.change.actions contains "create"
}
main = rule {
all s3_buckets as _, bucket {
bucket.change.after.acl is not "public-read"
}
}
Kedy použiť: Terraform Cloud/Enterprise zákazníci, HashiCorp ekosystém.
Checkov
Open-source statický analyzátor pre IaC. Skenuje Terraform, CloudFormation, Kubernetes manifesty, Helm charty a Dockerfiles. Obsahuje 1000+ vstavaných pravidiel mapovaných na CIS benchmarky a compliance frameworky.
Kedy použiť: Rýchly štart pre IaC scanning, CI/CD integrácia, compliance reporting.
AWS Config Rules
AWS-natívna služba na vyhodnocovanie konfigurácie AWS zdrojov. Podporuje managed rules (predpripravené) aj custom rules (Lambda funkcie). Kontinuálne monitoruje compliance stav.
Kedy použiť: AWS-only prostredia, natívna integrácia s AWS ekosystémom.
Policy-as-Code v Kubernetes
Admission Controllers
Kubernetes admission controllers sú brána medzi API requestom a uložením objektu do etcd. Policy enginy sa pripájajú ako validating/mutating admission webhooky.
Tok requestu:
- Používateľ pošle
kubectl apply - API server prijme request
- Mutating webhooks — môžu zmeniť objekt (pridať labely, inject sidecar)
- Validating webhooks — schvália alebo zamietnu objekt
- Objekt sa uloží do etcd
Kyverno policies — praktické príklady
Povinné labely na každom Pode
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
spec:
validationFailureAction: Enforce
rules:
- name: require-team-label
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Label 'team' je povinný na každom Pode."
pattern:
metadata:
labels:
team: "?*"
Zakázať privilegované kontajnery
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-privileged
spec:
validationFailureAction: Enforce
rules:
- name: no-privileged-containers
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Privilegované kontajnery nie sú povolené."
pattern:
spec:
containers:
- securityContext:
privileged: "false"
Automatické pridanie resource limitov (mutácia)
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-default-resources
spec:
rules:
- name: add-memory-limit
match:
any:
- resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
spec:
containers:
- (name): "*"
resources:
limits:
memory: "512Mi"
requests:
memory: "128Mi"
OPA Gatekeeper
OPA Gatekeeper je Kubernetes-natívna integrácia OPA. Používa CRD — ConstraintTemplate definuje logiku a Constraint ju aplikuje.
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
spec:
crd:
spec:
names:
kind: K8sRequiredLabels
validation:
openAPIV3Schema:
type: object
properties:
labels:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredlabels
violation[{"msg": msg}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[_]}
missing := required - provided
count(missing) > 0
msg := sprintf("Chýbajúce povinné labely: %v", [missing])
}
---
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: pods-must-have-team
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
labels: ["team", "environment"]
Policy-as-Code v CI/CD pipeline
Integrácia politík do CI/CD pipeline posúva enforcement ešte skôr — shift-left. Problém sa zachytí v pull requeste, nie až pri deployi.
Conftest — OPA pre CI/CD
Conftest je CLI nástroj na vyhodnocovanie OPA politík voči štruktúrovaným dátam (YAML, JSON, HCL, Dockerfile).
# Inštalácia
brew install conftest
# Spustenie testov
conftest test deployment.yaml --policy policy/
# Výstup
FAIL - deployment.yaml - Kontajner 'app' nesmie bežať ako root
FAIL - deployment.yaml - Chýba label 'team'
2 test failures
GitHub Actions integrácia
name: Policy Check
on: [pull_request]
jobs:
policy:
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.50.0/conftest_0.50.0_Linux_x86_64.tar.gz
tar xzf conftest_*.tar.gz
sudo mv conftest /usr/local/bin/
- name: Run policy checks
run: conftest test k8s/ --policy policy/ --output json
- name: Checkov IaC scan
uses: bridgecrewio/checkov-action@v12
with:
directory: terraform/
framework: terraform
soft_fail: false
GitLab CI integrácia
policy-check:
stage: validate
image: openpolicyagent/conftest:latest
script:
- conftest test k8s/ --policy policy/ --all-namespaces
rules:
- changes:
- k8s/**/*
- policy/**/*
Policy-as-Code pre IaC
Sentinel pre Terraform
Sentinel sa vyhodnocuje v Terraform Cloud/Enterprise medzi plan a apply. Tri úrovne enforcement:
- advisory — upozornenie, apply pokračuje
- soft-mandatory — blokuje, ale override je možný
- hard-mandatory — blokuje bez výnimky
# Vyžadovať tagy na všetkých EC2 inštanciách
import "tfplan/v2" as tfplan
ec2_instances = filter tfplan.resource_changes as _, rc {
rc.type is "aws_instance"
}
required_tags = ["Environment", "Owner", "CostCenter"]
main = rule {
all ec2_instances as _, instance {
all required_tags as tag {
instance.change.after.tags contains tag
}
}
}
Checkov a tfsec
# Checkov — sken Terraform kódu
checkov -d terraform/ --framework terraform
# Výstup
Passed checks: 42, Failed checks: 3, Skipped checks: 0
Check: CKV_AWS_18: "Ensure the S3 bucket has access logging enabled"
FAILED for resource: aws_s3_bucket.data
File: /main.tf:15-25
# tfsec — alternatíva (teraz súčasť Trivy)
trivy config terraform/
OPA pre Terraform (bez Sentinel)
Pre tímy používajúce open-source Terraform existuje Conftest workflow:
# Vygeneruj JSON plan
terraform plan -out=tfplan
terraform show -json tfplan > tfplan.json
# Vyhodnoť politiky
conftest test tfplan.json --policy policy/terraform/
# policy/terraform/s3.rego
package terraform.s3
deny[msg] {
resource := input.resource_changes[_]
resource.type == "aws_s3_bucket"
resource.change.after.versioning[0].enabled != true
msg := sprintf("S3 bucket '%s' musí mať zapnuté versioning", [resource.name])
}
Compliance a legislatíva
Policy-as-Code nie je len o best practices — čoraz viac je aj o právnych požiadavkách.
NIS2 (Network and Information Security Directive)
NIS2 direktíva EÚ (účinná od októbra 2024) vyžaduje:
- Riadenie rizík — organizácie musia implementovať technické opatrenia na riadenie kybernetických rizík
- Incident reporting — povinné hlásenie incidentov do 24 hodín
- Supply chain security — kontrola bezpečnosti dodávateľského reťazca
- Pravidelné audity — preukázateľná compliance
Policy-as-Code pomáha:
- Automatizovaný audit infraštruktúry = preukázateľná compliance
- Git história politík = dôkaz o implementácii opatrení
- Kontinuálne vyhodnocovanie = nie len raz ročne
EU Cyber Resilience Act (CRA)
CRA zavádza povinné bezpečnostné požiadavky pre digitálne produkty:
- Secure by default — produkty musia byť bezpečné v predvolenom nastavení
- Vulnerability management — povinný proces na správu zraniteľností
- SBOM — povinný Software Bill of Materials
Policy-as-Code dokáže automaticky vynucovať:
- Žiadne known vulnerabilities v kontajner images (Trivy/Grype scan)
- Povinné security kontexty na všetkých workloadoch
- SBOM generovanie v CI/CD pipeline
- Šifrovanie at rest a in transit
Mapovanie politík na compliance frameworky
CIS Kubernetes Benchmark 5.2.1 → Kyverno: disallow-privileged
CIS Kubernetes Benchmark 5.2.6 → Kyverno: disallow-host-namespaces
NIS2 Article 21(2)(a) → OPA: require-encryption-at-rest
CRA Annex I, Section 1(3)(a) → Checkov: CKV_DOCKER_3 (no HEALTHCHECK)
Best Practices
1. Warn → Enforce rollout
Nikdy nezačínajte s Enforce na produkčnom klastri. Postup:
- Audit mode — politika loguje porušenia, ale neblokuje
- Warn — používatelia dostanú upozornenie, deploy prejde
- Enforce na dev/staging — blokuje na neprodukčných prostrediach
- Enforce na produkcii — až keď sú všetky existujúce porušenia vyriešené
# Kyverno: Začnite s Audit
spec:
validationFailureAction: Audit
# Neskôr zmeňte na:
# validationFailureAction: Enforce
2. Policy testing
Politiky sú kód — testujte ich:
# OPA unit testy
opa test policy/ -v
# Kyverno CLI testy
kyverno test tests/
# Kyverno test súbor
apiVersion: cli.kyverno.io/v1alpha1
kind: Test
metadata:
name: test-require-labels
policies:
- ../policies/require-labels.yaml
resources:
- resources.yaml
results:
- policy: require-labels
rule: require-team-label
resource: pod-with-label
result: pass
- policy: require-labels
rule: require-team-label
resource: pod-without-label
result: fail
3. GitOps pre policies
Uložte politiky do Git repozitára a nasadzujte ich cez ArgoCD/Flux:
- Verzionované politiky — každá zmena má PR review
- Automatická synchronizácia — GitOps agent aplikuje zmeny
- Rollback — revert commit = rollback politiky
- Multi-cluster konzistencia — rovnaké politiky na všetkých klastroch
4. Exceptions a escape hatches
Vždy majte mechanizmus na výnimky — niektoré workloady legitimne potrebujú privilegovaný prístup (monitoring agenty, CNI pluginy):
# Kyverno: exclude systémové namespacy
spec:
rules:
- name: no-privileged
exclude:
any:
- resources:
namespaces:
- kube-system
- monitoring
5. Dokumentácia a onboarding
- Ku každej politike napíšte zrozumiteľný
messages vysvetlením prečo a ako problém opraviť - Vytvorte katalóg politík s príkladmi
- Nastavte Slack/Teams notifikácie pre nové politiky
6. Metriky a reporting
Sledujte efektívnosť politík:
- Počet blokovaných deploymentov za deň/týždeň
- Top 5 najčastejšie porušovaných politík
- Čas na opravu porušenia
- Pomer warn vs enforce politík
Policy-as-Code je základný stavebný blok moderného DevSecOps. Začnite s jednoduchými politikami, postupne pridávajte komplexnejšie pravidlá a vždy testujte pred enforcement. Kombinácia s GitOps prístupom vám dá plnú auditovateľnosť a kontrolu nad celou infraštruktúrou.