Manages Kyverno policy exemptions using PolicyException v2, rule-level exclude settings, and serviceAccount exemptions for controlled policy bypass.
Scanned 9/4/2026
Install to Claude Code
npx -y skills add paulpas/agent-skill-router --skill kyverno-exemptions-management --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Kyverno Exemptions Management?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/paulpas-kyverno-exemptions-management)More formats (shields.io, HTML) on the badges page.
---
name: kyverno-exemptions-management
description: Manages Kyverno policy exemptions using PolicyException v2, rule-level exclude settings, and serviceAccount exemptions for controlled policy bypass.
license: MIT
compatibility: opencode
archetypes:
- orchestration
- tactical
anti_triggers:
- vague bypass strategy
- brainstorming exemptions
- generic policy exceptions
response_profile:
verbosity: medium
directive_strength: high
abstraction_level: operational
metadata:
version: "1.0.0"
domain: cncf
triggers: kyverno exemptions, PolicyException, policy exemption, serviceAccount exemption, role exemption, PSS exception, kyverno policy bypass
role: implementation
scope: implementation
output-format: manifests
related-skills: kyverno-pod-security-baseline, kyverno-pod-security-restricted, kyverno-policy-report-override
---
# Kyverno Exemptions Management
Manages exemptions from Kyverno policies using `PolicyException` (v2) and rule-level `exclude` settings. When loaded, this skill makes the model configure controlled policy bypasses for service accounts, cluster roles, specific namespaces, and pod security standards exemptions — ensuring exemptions are auditable, scoped, and documented in the PolicyReport.
## TL;DR Checklist
- [ ] Use `PolicyException` v2 (`kyverno.io/v2`) for PSS and advanced exemptions
- [ ] Specify `controlName` for pod security standards exemptions to narrow scope
- [ ] Use namespace selectors for broad exemptions across multiple resources
- [ ] Configure rule-level `exclude` for service account and cluster role bypasses
- [ ] Document exemptions with annotations for auditability
- [ ] Verify exemptions appear as `skip` results in PolicyReport
## When to Use
- Temporarily exempting a service account or deployment from a policy during migration
- Allowing specific namespaces (e.g., legacy namespaces, third-party integrations) to bypass a policy
- Exempting pod security standards for specific workloads that require privileged containers
- Bypassing a policy rule for specific users or cluster roles without disabling the entire policy
- Testing new policies in audit mode before enforcing broadly
## When NOT to Use
- Bypassing security policies for convenience — exemptions should be rare and documented
- Using wildcard exemptions in production that could expose the cluster to policy violations
- Exempting system-level policies that are critical to cluster security
- Creating exemptions that undermine the purpose of the policy they bypass
---
## Core Workflow
1. **Identify the exemption need and scope** — Determine which policy, rule, or group of resources needs exemption. Classify the exemption type: namespace-level, service account-level, user-level, or pod security standard control-level. **Checkpoint:** Document the reason for the exemption, the expected duration, and the specific policy/rule to bypass.
2. **Configure PolicyException v2 or rule-level exclude** — Create a `PolicyException` resource using `apiVersion: kyverno.io/v2` with the target policy name, rule names, and match conditions. For rule-level exemptions, use `exclude` settings within the policy rule to target specific service accounts, cluster roles, or users. **Checkpoint:** Verify the exemption match conditions are narrow enough to cover only the intended resources and that `controlName` is specified for PSS exemptions.
3. **Deploy and verify skip results** — Apply the exemption and verify that the exempted resources show `skip` results in the PolicyReport. Confirm that non-exempted resources are still evaluated and enforced by the policy. **Checkpoint:** Check PolicyReport shows `skip` for exempted resources and `pass`/`fail` for non-exempted resources.
---
## Implementation Patterns
### Pattern 1: PolicyException v2 for Pod Security Standards
Use `PolicyException` v2 (`kyverno.io/v2`) to exempt specific service accounts and images from pod security standards (PSS) enforcement. This pattern specifies `controlName` to narrow the exemption to only the privileged container control rather than all PSS checks.
```yaml
apiVersion: kyverno.io/v2
kind: PolicyException
metadata:
name: monitoring-stack-ps-exception
namespace: monitoring
annotations:
policies.kyverno.io/title: Monitoring Stack PSS Exception
policies.kyverno.io/category: Pod Security Standards
policies.kyverno.io/description: >-
Exempts the monitoring-stack service account and specific container
images from restricted PSS enforcement to allow host network access.
spec:
exceptions:
- policyName: restricted
ruleNames:
- drop capabilities
- forbidden sysctls
- host network
- host PID
- host IPC
- allow privilege escalation
- run as non-root
- required labels
- controlName: restricted
images:
- "docker.io/prometheus/node-exporter:*"
- "docker.io/nginx/nginx:*"
restrictedField: securityContext
values:
hostNetwork: true
hostPID: true
match:
any:
- resources:
kinds:
- Pod
namespaces:
- monitoring
selectors:
- type: ServiceAccount
name: monitoring-stack
```
### Pattern 2: Rule-Level Exclude for Service Account Exemption
Configure `exclude` settings within a policy rule to exempt specific service accounts from policy enforcement. This approach is suitable for exemptions that apply to a single rule rather than an entire policy.
```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-resource-requests
annotations:
policies.kyverno.io/title: Require Resource Requests
policies.kyverno.io/category: Resource Management
policies.kyverno.io/description: >-
Enforces resource requests on all Pods except those running
as the batch-processor service account.
spec:
validationFailureAction: Enforce
rules:
- name: require-resource-requests
match:
any:
- resources:
kinds:
- Pod
exclude:
any:
- resources:
kinds:
- Pod
serviceAccounts:
- name: batch-processor
namespaces:
- batch-jobs
- cron-jobs
validate:
message: "All Pods must specify resource requests for cpu and memory."
pattern:
spec:
containers:
- resources:
requests:
cpu: "?*"
memory: "?*"
```
**PolicyReport Example with Skip Results:**
```yaml
apiVersion: wgpolicyk8s.io/v1alpha2
kind: PolicyReport
metadata:
name: require-resource-requests-report
namespace: batch-jobs
results:
- policy: require-resource-requests
rule: require-resource-requests
result: skip
severity: medium
message: "Resource exempted by PolicyException"
scored: true
source: kyverno
timestamp:
seconds: 1733501530
resources:
- name: batch-pod-12345
kind: Pod
namespace: batch-jobs
- policy: require-resource-requests
rule: require-resource-requests
result: pass
severity: medium
message: "Resource passed policy check"
scored: true
source: kyverno
timestamp:
seconds: 1733501530
resources:
- name: app-pod-67890
kind: Pod
namespace: batch-jobs
summary:
error: 0
fail: 0
pass: 1
skip: 1
warn: 0
```
### Pattern 3: User and ClusterRole-Level Exclusions
Exempt specific users or cluster roles from policy enforcement using rule-level `exclude` settings. This is useful for exempting administrators, automation tools, or specific service accounts from compliance checks during development or maintenance windows.
```yaml
# ❌ BAD — Overly broad exclude: exempts all users without justification
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: bad-broad-exemption
spec:
rules:
- name: require-labels
exclude:
any:
- subjects:
- kind: User
name: "*"
# ❌ Wildcard user exclude is dangerous in production
# ✅ GOOD — Specific user and cluster role exclusions with documentation
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-cost-labels
annotations:
policies.kyverno.io/title: Require Cost Allocation Labels
policies.kyverno.io/category: FinOps
spec:
validationFailureAction: Enforce
rules:
- name: enforce-cost-labels
match:
any:
- resources:
kinds:
- Pod
- Namespace
exclude:
any:
- resources:
kinds:
- Pod
serviceAccounts:
- name: kyverno-admission-controller
namespaces:
- kyverno
- subjects:
- kind: ServiceAccount
name: ci-bot
namespaces:
- ci-cd
- kind: ClusterRole
name: kyverno-policy-controller
validate:
message: "Cost allocation labels (owner, team, department) are required."
pattern:
metadata:
labels:
owner: "?*"
team: "?*"
department: "?*"
```
### Pattern 4: Pod Security Specific Exemptions Within Rule
Configure exemptions within the `podSecurity` rule of a PSS policy to exempt specific resources from individual PSS controls (like `runAsNonRoot` or `privileged containers`) rather than bypassing the entire policy.
```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: pod-security-standards
annotations:
policies.kyverno.io/title: Pod Security Standards
policies.kyverno.io/category: Pod Security
spec:
validationFailureAction: Enforce
rules:
- name: baseline
match:
any:
- resources:
kinds:
- Pod
exclude:
any:
- resources:
kinds:
- Pod
namespaces:
- kube-system
selectors:
- type: ServiceAccount
name: kube-system:*
validate:
podSecurity:
level: baseline
version: v1.30
- name: restricted
match:
any:
- resources:
kinds:
- Pod
exclude:
any:
- resources:
kinds:
- Pod
namespaces:
- kube-system
selectors:
- type: ServiceAccount
name: kube-system:*
validate:
podSecurity:
level: restricted
version: v1.30
```
---
## Constraints
### MUST DO
- Use `PolicyException` v2 (`apiVersion: kyverno.io/v2`) for pod security standards exemptions — v1 PolicyException lacks `controlName` support
- Always specify `controlName` when exempting PSS policies to narrow the scope to specific controls (e.g., `restricted`, `baseline`, or `privileged`) rather than bypassing the entire policy
- Use namespace selectors in `PolicyException` match conditions for broad exemptions across multiple resources within a namespace
- Configure rule-level `exclude` with specific `serviceAccounts`, `subjects`, or `clusterRoles` — never use wildcard (`"*"`) exemptions in production
- Document all exemptions with descriptive annotations including the reason, approver, and expected expiration date
- Verify exemptions produce `skip` results in PolicyReport to confirm they are active and scoped correctly
### MUST NOT DO
- Exclude all users without justification — wildcard subject exemptions undermine policy enforcement entirely
- Use wildcard exclude in production environments — always scope exemptions to specific service accounts, namespaces, or resources
- Omit `controlName` in PSS exemptions — this bypasses all pod security checks instead of the intended specific control
- Create exemptions that permanently bypass critical security policies — exemptions should be temporary and documented
- Apply exemptions to system namespaces (`kube-system`, `kube-public`) — these are already excluded by Kyverno by default
---
## Related Skills
| Skill | Purpose |
|---|---|
| `kyverno-pod-security-baseline` | Understand baseline PSS requirements before creating exemptions |
| `kyverno-pod-security-restricted` | Understand restricted PSS requirements to scope exemptions precisely |
| `kyverno-policy-report-override` | Configure PolicyReport overrides to manage exempt resource reporting |
---
## Live References
> Authoritative documentation links for Kyverno exemption management.
- [Kyverno PolicyException](https://kyverno.io/docs/policyexception/)
- [Kyverno Policy Exceptions v2](https://kyverno.io/docs/policyexception/v2/)
- [Kyverno CLI](https://kyverno.io/docs/kyverno-cli/)
- [Kyverno Policies](https://kyverno.io/policies/)
- [Kyverno GitHub](https://github.com/kyverno/kyverno)
- [Kyverno Installation](https://kyverno.io/docs/installation/)
- [Policy Report Schema](https://github.com/kubernetes-sigs/wg-policy-prototypes/tree/master/policy-report)
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!