Some checks failed
		
		
	
	Build Test Deploy / authority-container (push) Has been cancelled
				
			Build Test Deploy / docs (push) Has been cancelled
				
			Build Test Deploy / deploy (push) Has been cancelled
				
			Build Test Deploy / build-test (push) Has been cancelled
				
			Docs CI / lint-and-preview (push) Has been cancelled
				
			
		
			
				
	
	
		
			102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
		
			Executable File
		
	
	
	
	
| # Policy Templates — YAML & Rego Examples
 | ||
| 
 | ||
| Stella Ops lets you enforce *pass / fail* rules in two ways:
 | ||
| 
 | ||
| 1. **YAML “quick policies”** — simple equality / inequality checks.  
 | ||
| 2. **OPA Rego modules** — full‑power logic for complex organisations.
 | ||
| 
 | ||
| > **Precedence:** If the same image is subject to both a YAML rule *and* a Rego
 | ||
| > module, the **Rego result wins**.  That is, `deny` in Rego overrides any
 | ||
| > `allow` in YAML.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 1 · YAML quick policy
 | ||
| 
 | ||
| ```yaml
 | ||
| # file: policies/root_user.yaml
 | ||
| version: 1
 | ||
| id: root-user
 | ||
| description: Disallow images that run as root
 | ||
| severity: high
 | ||
| 
 | ||
| rules:
 | ||
|   - field: ".config.user"
 | ||
|     operator: "equals"
 | ||
|     value: "root"
 | ||
|     deny_message: "Image runs as root — block."
 | ||
| ````
 | ||
| 
 | ||
| Place the file under `/opt/stella/plugins/policies/`.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 2 · Rego example (deny on critical CVE)
 | ||
| 
 | ||
| ```rego
 | ||
| # file: policies/deny_critical.rego
 | ||
| package stella.policy
 | ||
| 
 | ||
| default deny = []
 | ||
| 
 | ||
| deny[msg] {
 | ||
|   some f
 | ||
|   input.findings[f].severity == "critical"
 | ||
|   msg := sprintf("Critical CVE %s – build blocked", [input.findings[f].id])
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| *Input schema* — the Rego `input` document matches the public
 | ||
| `ScanResult` POCO (see SDK).  Use the bundled JSON schema in
 | ||
| `share/schemas/scanresult.schema.json` for IDE autocompletion.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 3 · Pass‑through warnings (Rego)
 | ||
| 
 | ||
| Return a `warn` array to surface non‑blocking messages in the UI:
 | ||
| 
 | ||
| ```rego
 | ||
| package stella.policy
 | ||
| 
 | ||
| warn[msg] {
 | ||
|   input.image.base == "ubuntu:16.04"
 | ||
|   msg := "Image uses EOL Ubuntu 16.04 — please upgrade."
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| Warnings decrement the **quality score** but do *not* affect the CLI exit
 | ||
| code.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 4 · Testing policies locally
 | ||
| 
 | ||
| ```bash
 | ||
| # run policy evaluation without pushing to DB
 | ||
| stella scan alpine:3.20 --policy-only \
 | ||
|   --policies ./policies/
 | ||
| ```
 | ||
| 
 | ||
| The CLI prints `PASS`, `WARN` or `DENY` plus structured JSON.
 | ||
| 
 | ||
| Unit‑test your Rego modules with the OPA binary:
 | ||
| 
 | ||
| ```bash
 | ||
| opa test policies/
 | ||
| ```
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 5 · Developer quick‑start (plug‑ins)
 | ||
| 
 | ||
| Need logic beyond Rego?  Implement a plug‑in via **C#/.NET {{ dotnet }}** and
 | ||
| the `StellaOps.SDK` NuGet:
 | ||
| 
 | ||
| * Tutorial: [`dev/30_PLUGIN_DEV_GUIDE.md`](dev/30_PLUGIN_DEV_GUIDE.md)
 | ||
| * Quick reference: `/plugins/`
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| *Last updated {{ "now" | date: "%Y‑%m‑%d" }} — constants auto‑injected.*
 |