Familiar CEL authoring
Write policies in the same expression language Kubernetes standardized on, without forcing platform teams into Rego.
Norn evaluates policies locally against plan JSON, with no server, no Rego, and honest handling for values known only after apply.
apiVersion: norn.idunn.cloud/v1alpha1
kind: PolicySet
policies:
- id: az-nsg-no-public-admin-ports
severity: high
enforcement: mandatory
match:
types: [azurerm_network_security_rule]
expression: >
!(after.access == "Allow" && after.direction == "Inbound"
&& after.destination_port_range == "22"
&& after.source_address_prefix in ["*", "0.0.0.0/0", "Internet"])
message: SSH must not be open to the internet Current release
Status
Usable for early adopters. Policy surface and helpers may still change before `v1.0.0`.
Current focus
Azure-first today. Terraform and OpenTofu plan JSON supported.
Why Norn
Norn is built for teams who want strong plan-time policy checks without sending engineers down a rabbit hole of opaque plan parsing and a second full policy language.
Write policies in the same expression language Kubernetes standardized on, without forcing platform teams into Rego.
Map Terraform after_unknown values into CEL partial evaluation so Norn can report pass, fail, or genuinely undecidable.
Evaluate terraform show -json or tofu show -json output locally in CI/CD with no server dependency.
Use advisory, overridable, and mandatory policies so teams can roll out guardrails without all-or-nothing blocking.
Who it’s for
Norn is intentionally opinionated in its current alpha shape. It is a strong fit for some teams today, and not yet the right choice for every policy workflow.
Quickstart
Today Norn is distributed as source plus tagged releases. Install with Go, generate plan JSON, then run your policies directly against it.
go install github.com/idunn-cloud/norn/cmd/norn@latest
terraform plan -out tfplan
terraform show -json tfplan > plan.json
norn check --plan plan.json --policies ./policies
norn check --plan plan.json --policies ./policies --format sarif > results.sarif FAIL az-nsg-no-public-admin-ports [high/mandatory]
azurerm_network_security_rule.ssh_open (create)
SSH/RDP must not be reachable from the internet; use Bastion or a restricted source range.
UNKNOWN az-nsg-no-public-admin-ports [high/mandatory]
azurerm_network_security_rule.from_lb (create)
SSH/RDP must not be reachable from the internet; use Bastion or a restricted source range. (depends on values known only after apply) Current status
Norn is usable today for early adopters, especially Azure-focused teams, but the policy surface and surrounding ecosystem are still maturing.
Feedback wanted
Early users are the fastest way to improve the product. If something made adoption harder than expected, or if you have a policy edge case to test, open an issue and share it.
Official project links