Skip to main content

test-rule

Run Automatus tests for a security rule

소스 정보

저장소
openshift/cac-content-fork
최근 소스 활동
2026년 3월 26일 15:33
감지된 SKILL.md 언어
영어
스타
6
포크
6

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
test-rule
description
Run Automatus tests for a security rule
# Test Rule Run Automatus tests for a ComplianceAsCode security rule. **Rule ID**: $ARGUMENTS ## Tool Strategy This skill uses `mcp__content-mcp__*` tools when available (preferred — deterministic, structured results). When the MCP server is not configured, fall back to filesystem-based alternatives noted as **Fallback** in each step. See `.claude/skills/shared/mcp_fallbacks.md` for detailed fallback procedures. The skill must complete successfully either way. ## Phase 1: Validate Rule Exists 1. **Find the rule** using `mcp__content-mcp__get_rule_details` with `rule_id=$ARGUMENTS`: - This returns the full rule metadata including template info, CCE identifiers, remediation types, and file location. - If the rule is not found, also use `mcp__content-mcp__search_rules` with `query=$ARGUMENTS` to check for similar rule IDs. - **Fallback**: Use `Glob` to find `**/$ARGUMENTS/rule.yml`, then read the file to extract metadata. For similar rule search, use `Grep` to search for `$ARGUMENTS` across rule.yml files. 2. **If rule not found**: - Use `mcp__content-mcp__list_templates` to check if it's a template name instead. **Fallback**: Run `ls shared/templates/` to check for template names. - Inform user and exit if not found 3. **From the rule details**, determine: - Is it templated? (has `template:` key) - What products have CCE identifiers? (determines applicable products) - What remediation types are available? ## Phase 2: Determine Test Scope 1. **Identify testable products** from CCE identifiers: - Only `rhel8`, `rhel9`, `rhel10` are supported by Automatus - Extract from rule.yml identifiers: `cce@rhel8`, `cce@rhel9`, `cce@rhel10` 2. **Ask user for testing scope** using AskUserQuestion: **Question**: "Which products do you want to test?" **Options** (show only products with CCE identifiers): - rhel10 (if CCE exists) - rhel9 (if CCE exists) - rhel8 (if CCE exists) - All applicable products Enable multi-select. 3. **Ask for remediation types** using AskUserQuestion: **Question**: "Which remediation types do you want to test?" **Options**: - **Bash only** - Test Bash remediation (faster) - **Ansible only** - Test Ansible remediation - **Both Bash and Ansible (Recommended)** - Test both remediation types ## Important: Sandbox Requirements All `virsh` and `automatus.py` commands require `dangerouslyDisableSandbox: true` on the Bash tool. These commands use libvirt unix sockets and SSH connections to VMs, which are blocked by the default sandbox. Set this flag on **every** Bash call that runs `virsh` or `automatus.py`. ## Phase 3: Determine Libvirt Connection and VM Names ### 3.1 Detect Libvirt Connection URI The libvirt connection URI depends on the user's VM setup. **Ask the user** using AskUserQuestion: **Question**: "Which libvirt connection URI does your VM setup use?" **Options**: - **qemu:///session (Recommended)** - User session VMs, no root required - **qemu:///system** - System-wide VMs, may require root/sudo Store the selected URI as `<libvirt_uri>` for all subsequent commands. ### 3.2 Discover VM Names VM names often differ from product names (e.g., `rhel9-test`, `ssg-rhel9`, `rhel-9.4`). Discover available VMs: ```bash virsh -c <libvirt_uri> list --all 2>/dev/null ``` For each selected product, ask the user to confirm the VM name: **Question**: "Which VM should be used for testing `<product>`? Available VMs are listed above." **Options** (populated from `virsh list --all` output, filtered to relevant entries): - Matching VMs from the list - Allow user to type a custom name Store the mapping of product → VM name for Phase 5. **Note on sudo**: When using `qemu:///system`, some operations (starting VMs, creating snapshots) may require `sudo`. When using `qemu:///session`, `sudo` is not needed. Adjust commands accordingly. ## Phase 4: Verify Prerequisites 1. **Check for existing datastreams**: Use `mcp__content-mcp__list_built_products` to see which products have been built. **Fallback**: Run `ls build/ssg-*-ds.xml 2>/dev/null` to list built datastreams. 2. **For each selected product**, check if datastream exists and get details: Use `mcp__content-mcp__get_datastream_info` with `product=<product>` to verify the datastream exists and get its details. **Fallback**: Run `ls -la build/ssg-<product>-ds.xml` to check if the datastream exists. 3. **Build datastreams if needed**: - If datastream doesn't exist or is older than rule.yml modifications - Ask user: "Datastream for <product> is missing/outdated. Build it now?" ```bash ./build_product --rule-id $ARGUMENTS <product> ``` 4. **Verify VMs are available and running** (CRITICAL — Automatus requires the VM to be running): ```bash virsh -c <libvirt_uri> list --all 2>/dev/null | grep -E "rhel[0-9]+" ``` - Inform user of available VMs - If required VM not found, provide guidance on VM setup - **Check that the required VM is in "running" state**. If the VM exists but is shut off, **start it before proceeding**: ```bash # For qemu:///system, prefix with sudo if needed virsh -c <libvirt_uri> start <vm_name> ``` - Wait a moment after starting the VM and verify it is running: ```bash virsh -c <libvirt_uri> list --all 2>/dev/null | grep <vm_name> ``` - **Do NOT proceed to Phase 5 until the VM is confirmed running.** Automatus will fail if the VM is not started. 5. **Verify VM has a snapshot** (CRITICAL — Automatus reverts to a snapshot between test scenarios): ```bash virsh -c <libvirt_uri> snapshot-list <vm_name> ``` - Automatus needs at least one snapshot to restore clean state between test scenarios. - If no snapshots exist, inform the user and suggest creating one: ```bash # For qemu:///system, prefix with sudo if needed virsh -c <libvirt_uri> snapshot-create-as <vm_name> clean ``` - **Do NOT proceed to Phase 5 if no snapshot exists.** Automatus will fail or leave the VM in a dirty state. ## Phase 5: Run Automatus Tests ### For Rule Testing Run tests for each selected product and remediation type, using the `<libvirt_uri>` and `<vm_name>` determined in Phase 3: **Bash remediation**: ```bash cd tests ./automatus.py rule --libvirt <libvirt_uri> <vm_name> \ --datastream ../build/ssg-<product>-ds.xml \ $ARGUMENTS ``` **Ansible remediation**: ```bash cd tests ./automatus.py rule --libvirt <libvirt_uri> <vm_name> \ --datastream ../build/ssg-<product>-ds.xml \ --remediate-using ansible \ $ARGUMENTS ``` ### For Template Testing If testing a template instead of a rule: ```bash cd tests ./automatus.py template --libvirt <libvirt_uri> <vm_name> \ --datastream ../build/ssg-<product>-ds.xml \ $ARGUMENTS ``` ## Phase 6: Monitor Test Execution 1. **Tests run in foreground** - output is streamed 2. **Test phases to expect**: - Initial scan (check if rule is evaluated) - Remediation application - Final scan (verify remediation worked) 3. **For each test scenario** (e.g., `correct.pass.sh`, `wrong.fail.sh`): - `.pass.sh` scenarios: Should pass on initial scan - `.fail.sh` scenarios: Should fail initially, then pass after remediation ## Phase 7: Analyze Results 1. **Find results directory**: ```bash ls -td tests/logs/rule-custom-* 2>/dev/null | head -1 ``` 2. **Read results.json**: ```bash cat tests/logs/rule-custom-*/results.json ``` 3. **Parse and summarize results**: | Scenario | Initial Scan | Remediation | Final Scan | Status | |----------|--------------|-------------|------------|--------| | wrong.fail | FAIL | APPLIED | PASS | OK | | correct.pass | PASS | SKIPPED | N/A | OK | 4. **Check for common issues**: - **Initial scan passed on .fail scenario**: Test scenario didn't properly set up non-compliant state - **Remediation failed**: Bash/Ansible script has errors - **Final scan failed after remediation**: Remediation incomplete or incorrect - **Not applicable**: Platform check excluded the rule ## Phase 8: Report Results ### Success Report ``` Test Results for $ARGUMENTS ============================== Product: rhel9 Remediation: Bash Scenarios: - wrong.fail.sh: PASSED (fail -> remediate -> pass) - correct.pass.sh: PASSED (already compliant) Overall: ALL TESTS PASSED --- Product: rhel9 Remediation: Ansible Scenarios: - wrong.fail.sh: PASSED (fail -> remediate -> pass) - correct.pass.sh: PASSED (already compliant) Overall: ALL TESTS PASSED ============================== Summary: 4/4 tests passed across all products and remediation types ``` ### Failure Report ``` Test Results for $ARGUMENTS ============================== Product: rhel9 Remediation: Bash Scenarios: - wrong.fail.sh: FAILED - Initial scan: FAIL (expected) - Remediation: APPLIED - Final scan: FAIL (unexpected!) - Issue: Remediation did not properly configure the setting - correct.pass.sh: PASSED Log files: tests/logs/rule-custom-2024-01-15-1423/ Suggested debugging: 1. Check remediation script: find linux_os/guide -path "*/$ARGUMENTS/bash/*" 2. Review test scenario: find linux_os/guide -path "*/$ARGUMENTS/tests/*" 3. SSH into VM to inspect: virsh console rhel9 ============================== Summary: 1/2 tests failed ``` ## Phase 9: Provide Next Steps Based on results: **If all tests passed**: - "Rule is ready. Use `/build-product <product>` to build and `/run-tests` to validate." - "Consider testing on additional products if applicable." **If tests failed**: - Provide specific debugging guidance based on failure type - Suggest files to check/modify - Offer to help fix the issues **If no tests exist** (non-templated rule without tests): - "This rule has no test scenarios. Create tests in `<rule_dir>/tests/`" - "Required: At least one `.pass.sh` and one `.fail.sh` scenario" ## Troubleshooting ### Common Issues 1. **VM not found**: ``` Error: VM '<vm_name>' not found ``` - Ensure VM exists: `virsh -c <libvirt_uri> list --all` - Check connection URI — re-run Phase 3 if needed 2. **Datastream not found**: ``` Error: build/ssg-<product>-ds.xml not found ``` - Build with: `./build_product --rule-id $ARGUMENTS <product>` 3. **Permission denied**: - If using `qemu:///system`, may need sudo - Switch to `qemu:///session` for user VMs 4. **Rule not in datastream**: - Verify rule is in at least one profile - Rebuild datastream after adding to profile 5. **Test scenario errors**: - Check bash syntax in test files - Verify required packages are specified: `# packages = <pkg>` 6. **No snapshot available**: ``` Error: No snapshot found for domain ``` - Automatus needs a snapshot to revert between test scenarios - Create one: `virsh -c <libvirt_uri> snapshot-create-as <vm_name> clean` (prefix with `sudo` for `qemu:///system`) ### Debug Mode (Manual Only) **Note**: Debug mode requires interactive input and must be run manually by the user, not through this skill. When tests fail, suggest the user run with `--debug` in their own terminal: ```bash cd tests ./automatus.py rule --libvirt <libvirt_uri> <vm_name> \ --datastream ../build/ssg-<product>-ds.xml \ --debug \ $ARGUMENTS ``` How `--debug` works: 1. When an error occurs (e.g., remediation applied but rule still fails), Automatus **pauses** and keeps the VM running 2. User can SSH into the VM to inspect system state: ```bash ssh root@<vm-ip> # No password required on test VMs ``` 3. Press **Enter** in the Automatus terminal to continue to the next test, or **Ctrl+C** to abort
GitHub에서 보기