Helper Scripts vs. Direct Commands
This document explains how to use both our helper scripts and the equivalent direct commands for container scanning operations.
Understanding the Two Approaches
Our container scanning solution can be used in two ways:
Helper Scripts : Easy-to-use wrapper scripts that handle the complexity
Direct Commands : Using the underlying tools directly for more control
Container Scanning with Helper Scripts vs. Direct Commands
Setup Minikube for Testing
Creating Scanning Infrastructure
With Helper Scripts
# Install all components with a single script
./helm-charts/install-all.sh --namespace inspec-test
With Direct Commands
# Install each component separately
kubectl create namespace inspec-test
# Create the service account
kubectl -n inspec-test create serviceaccount inspec-scanner
# Create the role
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: inspec-container-role
namespace: inspec-test
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get"]
EOF
# Create the role binding
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: inspec-container-rolebinding
namespace: inspec-test
subjects:
- kind: ServiceAccount
name: inspec-scanner
namespace: inspec-test
roleRef:
kind: Role
name: inspec-container-role
apiGroup: rbac.authorization.k8s.io
EOF
# Create a test pod
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: inspec-target
namespace: inspec-test
labels:
app: inspec-target
scan-target: "true"
spec:
containers:
- name: busybox
image: busybox:latest
command: ["sleep", "infinity"]
EOF
Creating Authentication
With Helper Scripts
# Generate kubeconfig automatically
./kubernetes-scripts/generate-kubeconfig.sh inspec-test inspec-scanner ./kubeconfig.yaml
With Direct Commands
# Generate token
TOKEN = $( kubectl create token inspec-scanner -n inspec-test --duration= 60m)
SERVER = $( kubectl config view --minify --output= jsonpath = '{.clusters[0].cluster.server}' )
CA_DATA = $( kubectl config view --raw --minify --flatten -o jsonpath = '{.clusters[].cluster.certificate-authority-data}' )
# Create kubeconfig manually
cat > ./kubeconfig.yaml << EOF
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
server: ${SERVER}
certificate-authority-data: ${CA_DATA}
name: scanner-cluster
contexts:
- context:
cluster: scanner-cluster
namespace: inspec-test
user: inspec-scanner
name: scanner-context
current-context: scanner-context
users:
- name: inspec-scanner
user:
token: ${TOKEN}
EOF
chmod 600 ./kubeconfig.yaml
Running a Standard Container Scan
With Helper Scripts
# One-line scan with automatic RBAC, token, and threshold validation
./kubernetes-scripts/scan-container.sh inspec-test inspec-target busybox ../../examples/cinc-profiles/container-baseline
With Direct Commands
# Run CINC Auditor directly
cinc-auditor exec ../../examples/cinc-profiles/container-baseline \
-t k8s-container://inspec-test/inspec-target/busybox \
--reporter cli json:scan-results.json
# Process results with SAF CLI
saf summary --input scan-results.json --output-md scan-summary.md
saf threshold -i scan-results.json -t threshold.yml
Scanning Distroless Containers
With Helper Scripts
# One-line scan of distroless container with ephemeral debug container
./kubernetes-scripts/scan-distroless-container.sh inspec-test distroless-target app ../../examples/cinc-profiles/container-baseline
With Direct Commands
# Create debug container manually
kubectl debug -n inspec-test distroless-target \
--image= docker.io/cincproject/auditor:latest \
--target= distroless \
--container= debug-container \
-- sleep 300 &
# Wait for debug container to be ready
sleep 10
# Run scan against debug container
cinc-auditor exec ../../examples/cinc-profiles/container-baseline \
-t k8s-container://inspec-test/distroless-target/debug-container \
--reporter cli json:scan-results.json
# Process results with SAF CLI
saf summary --input scan-results.json --output-md scan-summary.md
saf threshold -i scan-results.json -t threshold.yml
Using Helm for Deployment
With Helper Scripts
# Install everything with a single command
./helm-charts/install-all.sh --namespace inspec-test
With Direct Commands
# Install each chart separately
helm install scanner-infrastructure ./helm-charts/scanner-infrastructure \
--set targetNamespace = inspec-test
helm install common-scanner ./helm-charts/common-scanner \
--set scanner-infrastructure.targetNamespace= inspec-test
helm install standard-scanner ./helm-charts/standard-scanner \
--set common-scanner.scanner-infrastructure.targetNamespace= inspec-test
helm install distroless-scanner ./helm-charts/distroless-scanner \
--set common-scanner.scanner-infrastructure.targetNamespace= inspec-test
SAF CLI Integration
With Helper Scripts
# Threshold validation is built into the scan scripts
./kubernetes-scripts/scan-container.sh inspec-test inspec-target busybox ../../examples/cinc-profiles/container-baseline ./threshold.yml
With Direct Commands
# Run scan and get results
cinc-auditor exec ../../examples/cinc-profiles/container-baseline \
-t k8s-container://inspec-test/inspec-target/busybox \
--reporter cli json:scan-results.json
# Generate summary
saf summary --input scan-results.json --output-md scan-summary.md
# Apply threshold validation
saf threshold -i scan-results.json -t threshold.yml
THRESHOLD_RESULT = $?
if [ $THRESHOLD_RESULT -eq 0 ] ; then
echo "✅ Security scan passed threshold requirements"
else
echo "❌ Security scan failed to meet threshold requirements"
exit $THRESHOLD_RESULT
fi
CI/CD Integration
GitHub Actions
- name : Run container scan
run : |
# Helper script method
./kubernetes-scripts/scan-container.sh $NAMESPACE $POD_NAME $CONTAINER_NAME ./profile ./threshold.yml
# OR direct method
KUBECONFIG=./kubeconfig.yaml cinc-auditor exec ./profile \
-t k8s-container://$NAMESPACE/$POD_NAME/$CONTAINER_NAME \
--reporter cli json:scan-results.json
saf threshold -i scan-results.json -t threshold.yml
GitLab CI
run_scan :
stage : scan
script :
# Helper script method
./kubernetes-scripts/scan-container.sh $NAMESPACE $POD_NAME $CONTAINER_NAME ./profile ./threshold.yml
# OR direct method
KUBECONFIG=./kubeconfig.yaml cinc-auditor exec ./profile \
-t k8s-container://$NAMESPACE/$POD_NAME/$CONTAINER_NAME \
--reporter cli json:scan-results.json
saf threshold -i scan-results.json -t threshold.yml
Which Method to Choose?
Use Helper Scripts When
You want a simpler, more streamlined experience
You're new to Kubernetes or CINC Auditor
You need to quickly implement scanning in CI/CD
You want automatic cleanup of temporary resources
Use Direct Commands When
You need more control over the process
You're integrating with existing automation
You want to understand what's happening "under the hood"
You need to customize the scanning process
Known Limitations
Helper Scripts
Less flexibility for advanced use cases
Dependencies between scripts might not be immediately obvious
Limited customization of RBAC without modifying the scripts
Direct Commands
More complex to implement
Requires deeper understanding of Kubernetes and CINC Auditor
Manual cleanup of resources required