-
Notifications
You must be signed in to change notification settings - Fork 44
ROX-35289: add post-upgrade script to skip init container evaluation #123
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
52dd31f
4c67286
6cc34fb
38b4e47
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,44 @@ | ||
| # Skip Init Container Evaluation | ||
|
|
||
| Starting in ACS 5.0, policies evaluate init containers by default. This script is a **one-time post-upgrade tool** that adds `skipContainerTypes: ["INIT"]` to all existing policies that don't already have an evaluation filter, preserving the pre-5.0 behavior where init containers were not evaluated. | ||
|
|
||
| This script is not intended to be run repeatedly or as a long-term maintenance tool. | ||
|
|
||
| ## Usage | ||
|
|
||
| ```bash | ||
| export ROX_ENDPOINT="central.example.com:443" | ||
| export ROX_API_TOKEN="your-api-token" | ||
|
|
||
| ./skip-init-container-evaluation.sh | ||
| ``` | ||
|
|
||
| Each policy is presented for confirmation with options: `yes` (update this policy), `no` (skip this policy), or `all` (update this and all remaining policies without further prompts). | ||
|
|
||
| ## Requirements | ||
|
|
||
| - ACS 5.0 or later | ||
| - `curl` and `jq` installed | ||
| - An API token with policy read/write permissions | ||
|
|
||
| ## What it does | ||
|
|
||
| 1. Checks that Central is running ACS 5.0+ | ||
| 2. Lists all policies and prompts for confirmation before making changes | ||
| 3. For each applicable policy without an existing evaluation filter, adds `skipContainerTypes: ["INIT"]` | ||
| 4. Skips policies that already have an evaluation filter | ||
| 5. Skips build-only policies (container type filters are not applicable at build time) | ||
| 6. Skips declarative (CRD-managed) policies | ||
| 7. Skips audit log and node event policies (they don't evaluate containers) | ||
|
|
||
| ## Policy-as-Code users | ||
|
|
||
| If you manage policies via SecurityPolicy CRDs and a GitOps workflow, update your policy manifests directly instead of running this script. Add the following to each policy spec: | ||
|
|
||
| ```yaml | ||
| spec: | ||
| # ... existing policy fields ... | ||
| evaluationFilter: | ||
| skipContainerTypes: | ||
| - INIT | ||
| ``` | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,114 @@ | ||
| #!/bin/bash | ||
| # Adds skipContainerTypes: ["INIT"] to all existing policies that don't already have it. | ||
| # This is intended for customers upgrading to 5.0+ who want to preserve the pre-5.0 behavior | ||
| # where init containers were not evaluated by policies. | ||
|
|
||
| set -euo pipefail | ||
|
|
||
| CONFIRM_EACH=true | ||
|
|
||
| if [[ -z "${ROX_ENDPOINT:-}" ]]; then | ||
| echo >&2 "ROX_ENDPOINT must be set" | ||
| exit 1 | ||
| fi | ||
|
|
||
| if [[ -z "${ROX_API_TOKEN:-}" ]]; then | ||
| echo >&2 "ROX_API_TOKEN must be set" | ||
| exit 1 | ||
| fi | ||
|
|
||
| API="https://${ROX_ENDPOINT}" | ||
| AUTH="Authorization: Bearer ${ROX_API_TOKEN}" | ||
|
|
||
| # Version check — require 5.0+ | ||
| version=$(curl -sk -H "$AUTH" "$API/v1/metadata" | jq -r '.version') | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
| major=$(echo "$version" | cut -d. -f1) | ||
|
|
||
| if [[ "$major" -lt 5 ]]; then | ||
| echo >&2 "This script requires ACS 5.0 or later (detected: $version)" | ||
| exit 1 | ||
| fi | ||
|
|
||
| echo "ACS version: $version" | ||
|
|
||
| # List all policies | ||
| policies=$(curl -sk -H "$AUTH" "$API/v1/policies" | jq -r '.policies[].id') | ||
| total=$(echo "$policies" | wc -l | tr -d ' ') | ||
| updated=0 | ||
| skipped=0 | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
| failed=0 | ||
|
|
||
| echo "Found $total policies" | ||
| echo "" | ||
|
|
||
| for id in $policies; do | ||
| policy=$(curl -sk -H "$AUTH" "$API/v1/policies/$id") | ||
| name=$(echo "$policy" | jq -r '.name') | ||
|
|
||
| # Skip if any evaluation filter is already configured | ||
| existing_filter=$(echo "$policy" | jq '.evaluationFilter // empty' 2>/dev/null) | ||
| if [[ -n "$existing_filter" && "$existing_filter" != "{}" && "$existing_filter" != "null" ]]; then | ||
| echo " SKIP: \"$name\" — already has evaluation filter" | ||
| skipped=$((skipped + 1)) | ||
| continue | ||
| fi | ||
|
|
||
| # Skip build-only policies — container type filters don't apply at build time | ||
| lifecycle_stages=$(echo "$policy" | jq -r '.lifecycleStages[]') | ||
| if [[ "$lifecycle_stages" == "BUILD" ]]; then | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am afraid there are more to skip.
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a great catch - I've added "AUDIT_LOG_EVENT" and "NODE_EVENT" checks here as well. |
||
| echo " SKIP: \"$name\" — build-only policy" | ||
| skipped=$((skipped + 1)) | ||
| continue | ||
| fi | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In readme, you mentioned that the customer needs to change the PAC policies themselves. So do we want to skip declarative policies here?
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice catch - I've added a check here to skip Declarative sourced policies. |
||
|
|
||
| # Skip declarative (CRD-managed) policies — customers should update their CRD manifests directly | ||
| source=$(echo "$policy" | jq -r '.source') | ||
| if [[ "$source" == "DECLARATIVE" ]]; then | ||
| echo " SKIP: \"$name\" — declarative policy (update CRD directly)" | ||
| skipped=$((skipped + 1)) | ||
| continue | ||
| fi | ||
|
|
||
| # Skip audit log and node event policies — they don't evaluate containers | ||
| event_source=$(echo "$policy" | jq -r '.eventSource') | ||
| if [[ "$event_source" == "AUDIT_LOG_EVENT" ]]; then | ||
| echo " SKIP: \"$name\" — audit log event policy" | ||
| skipped=$((skipped + 1)) | ||
| continue | ||
| fi | ||
| if [[ "$event_source" == "NODE_EVENT" ]]; then | ||
| echo " SKIP: \"$name\" — node event policy" | ||
| skipped=$((skipped + 1)) | ||
| continue | ||
| fi | ||
|
|
||
| if [[ "$CONFIRM_EACH" == "true" ]]; then | ||
| read -rp " Update \"$name\"? (yes/no/all): " answer | ||
| case "$answer" in | ||
| all) CONFIRM_EACH=false ;; | ||
| yes) ;; | ||
| *) echo " SKIP: \"$name\" — skipped by user"; skipped=$((skipped + 1)); continue ;; | ||
| esac | ||
| fi | ||
|
|
||
| # Add skipContainerTypes: ["INIT"] to the evaluation filter | ||
| updated_policy=$(echo "$policy" | jq '.evaluationFilter = {"skipContainerTypes": ["INIT"]}') | ||
|
|
||
| result=$(curl -sk -o /dev/null -w "%{http_code}" -XPUT -H "$AUTH" -H "Content-Type: application/json" \ | ||
| "$API/v1/policies/$id" --data "$updated_policy") | ||
|
|
||
| if [[ "$result" == "200" ]]; then | ||
| echo " UPDATED: \"$name\"" | ||
| updated=$((updated + 1)) | ||
| else | ||
| echo >&2 " ERROR: \"$name\" — HTTP $result" | ||
| failed=$((failed + 1)) | ||
| fi | ||
| done | ||
|
|
||
| echo "" | ||
| echo "Done. Updated: $updated, Skipped: $skipped, Failed: $failed, Total: $total" | ||
|
|
||
| if [[ "$failed" -gt 0 ]]; then | ||
| exit 1 | ||
| fi | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would you suggest a version especially for "jq"? It behaves quite different for different versions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think we need anything special here - we're using very basic jq features that I believe are standard across versions (
.evaluationFilter,-r,-e)