Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deploy and configure Rapid7 InsightVM Security Console and Scan Engines for authenticated and unauthenticated vulnerability scanning across enterprise environments.
.claude/skills/implementing-rapid7-insightvm-for-scanning/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 41 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✗→✓ | ▲ Improved | — | — |
| case-08 | ✗→✓ | ▲ Improved | — | — |
| case-07 | ✗→✓ | ▲ Improved | — | — |
Rapid7 InsightVM (formerly Nexpose) is an enterprise vulnerability management platform that combines on-premises scanning via Security Console and Scan Engines with cloud-based analytics through the Insight Platform. InsightVM leverages Rapid7's vulnerability research library, Metasploit exploit knowledge, global attacker behavior data, internet-wide scanning telemetry, and real-time reporting to provide comprehensive vulnerability visibility. This skill covers deploying the Security Console, configuring Scan Engines, setting up scan templates, credentialed scanning, and integrating with the Insight Agent for continuous assessment.
The central management server that:
Note: Security Console is NOT supported in containerized environments.
Distributed scanning components that:
Lightweight endpoint agent providing:
| Template | Use Case | Depth | |----------|----------|-------| | Discovery Scan | Asset inventory, host enumeration | Low | | Full Audit without Web Spider | Standard vulnerability assessment | Medium | | Full Audit Enhanced Logging | Deep assessment with verbose logging | High | | HIPAA Compliance | Healthcare regulatory compliance | High | | PCI ASV Audit | PCI DSS external scanning requirement | High | | CIS Policy Compliance | Configuration benchmarking | Medium | | Web Spider | Web application discovery and assessment | Medium |
bash# Download InsightVM installer (Linux) chmod +x Rapid7Setup-Linux64.bin ./Rapid7Setup-Linux64.bin -c # Verify service is running systemctl status nexposeconsole.service # Access web interface # https://<console-ip>:3780
Initial configuration:
bash# Install Scan Engine on remote server ./Rapid7Setup-Linux64.bin -c # During installation, select "Scan Engine only" # Pair with Security Console using shared secret # Docker-based Scan Engine deployment docker pull rapid7/insightvm-scan-engine docker run -d \ --name scan-engine \ -p 40814:40814 \ -e CONSOLE_HOST=<console-ip> \ -e CONSOLE_PORT=3780 \ -e ENGINE_NAME=DMZ-Scanner \ -e SHARED_SECRET=<pairing-secret> \ rapid7/insightvm-scan-engine
Pair engines in Security Console:
Site Configuration:
Name: Production-Network
Scan Engine: Primary-Engine-01
Scan Template: Full Audit without Web Spider
Included Assets:
- 10.0.0.0/8 (Internal network)
- 172.16.0.0/12 (DMZ network)
Excluded Assets:
- 10.0.0.1 (Core router - fragile)
- 10.0.100.0/24 (ICS/SCADA segment)
Schedule:
Frequency: Weekly
Day: Sunday
Time: 02:00 AM
Max Duration: 8 hoursCredential Type: Microsoft Windows/Samba (SMB/CIFS)
Domain: CORP.EXAMPLE.COM
Username: svc_insightvm_scan
Password: <service-account-password>
Authentication: NTLM
Privilege Elevation:
Type: None (use domain admin or local admin)Credential Type: Secure Shell (SSH)
Username: insightvm_scan
Authentication: SSH Key (preferred) or Password
SSH Private Key: /opt/rapid7/.ssh/scan_key
Port: 22
Privilege Elevation:
Type: sudo
sudo User: root
sudo Password: <sudo-password>Credential Type: Microsoft SQL Server
Instance: MSSQLSERVER
Domain: CORP
Username: insightvm_db_scan
Authentication: Windows Authentication
Credential Type: Oracle
Port: 1521
SID: ORCL
Username: insightvm_scanCustom scan template for balanced scanning:
Template Name: Enterprise-Standard-Scan
Service Discovery:
TCP Ports: Well-known (1-1024) + common services
UDP Ports: DNS(53), SNMP(161), NTP(123), TFTP(69)
Method: SYN scan (stealth)
Vulnerability Checks:
Safe checks only: Enabled
Skip potential: Disabled
Web spidering: Disabled (separate template)
Policy checks: Enabled (CIS benchmarks)
Performance:
Max parallel assets: 10
Max requests per second: 100
Timeout per asset: 30 minutes
Retries: 2powershell# Windows Agent Installation (via GPO or SCCM) msiexec /i agentInstaller-x86_64.msi /quiet /norestart ` CUSTOMTOKEN=<platform-token> ` CUSTOMCONFIG=<agent-config> # Linux Agent Installation chmod +x agent_installer.sh ./agent_installer.sh install_start \ --token <platform-token> # Verify agent connectivity # Check InsightVM console: Assets > Agent Management
Remediation Project:
Name: Q1-2025-Critical-Remediation
Scope:
Severity: Critical + High
CVSS Score: >= 7.0
Assets: Production-Network site
Assignment:
Team: Infrastructure-Ops
Due Date: 2025-03-31
Tracking:
Auto-verify: Enabled (re-scan on next scheduled scan)
Notification: Email on overdue items
Escalation: Manager notification at 75% SLApythonimport requests import json class InsightVMClient: """Rapid7 InsightVM API v3 client for automation.""" def __init__(self, console_url, api_key): self.base_url = f"{console_url}/api/3" self.session = requests.Session() self.session.headers.update({ "Content-Type": "application/json", "Authorization": f"Bearer {api_key}" }) self.session.verify = not os.environ.get("SKIP_TLS_VERIFY", "").lower() == "true" # Set SKIP_TLS_VERIFY=true for self-signed certs in lab environments def get_sites(self): """List all configured scan sites.""" response = self.session.get(f"{self.base_url}/sites") response.raise_for_status() return response.json().get("resources", []) def start_scan(self, site_id, engine_id=None, template_id=None): """Trigger an ad-hoc scan for a site.""" payload = {} if engine_id: payload["engineId"] = engine_id if template_id: payload["templateId"] = template_id response = self.session.post( f"{self.base_url}/sites/{site_id}/scans", json=payload ) response.raise_for_status() return response.json() def get_asset_vulnerabilities(self, asset_id): """Retrieve vulnerabilities for a specific asset.""" response = self.session.get( f"{self.base_url}/assets/{asset_id}/vulnerabilities" ) response.raise_for_status() return response.json().get("resources", []) def get_scan_status(self, scan_id): """Check the status of a running scan.""" response = self.session.get(f"{self.base_url}/scans/{scan_id}") response.raise_for_status() return response.json() def create_remediation_project(self, name, description, assets, vulns): """Create a remediation tracking project.""" payload = { "name": name, "description": description, "assets": {"includedTargets": {"addresses": assets}}, "vulnerabilities": {"includedVulnerabilities": vulns} } response = self.session.post( f"{self.base_url}/remediations", json=payload ) response.raise_for_status() return response.json() # Usage client = InsightVMClient("https://insightvm-console:3780", "api-key-here") sites = client.get_sites() for site in sites: print(f"Site: {site['name']} - Assets: {site.get('assets', 0)}")
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.