
dr-rule-builder
by tekgrunt
LimaCharlie SecOps boot screen for Claude Code
SKILL.md
name: dr-rule-builder description: Use this skill when the user needs help creating, testing, validating, or troubleshooting Detection & Response (D&R) rules in LimaCharlie.
LimaCharlie D&R Rule Builder
This skill helps you create, test, and validate Detection & Response (D&R) rules in LimaCharlie. Use this when users ask for help with rule creation, rule debugging, or understanding D&R rule syntax.
What are D&R Rules?
Detection & Response (D&R) rules are serverless functions that run in the LimaCharlie cloud, applied in real-time to sensor data. They allow you to detect behaviors, automatically respond, create alerts, trigger remediation, and chain detections.
Rules are evaluated per-event. When a rule's detection component matches, the response component executes.
Quick Start: Your First Rule
detect:
event: NEW_PROCESS
op: ends with
path: event/FILE_PATH
value: calc.exe
case sensitive: false
respond:
- action: report
name: Calculator Launched
Key Components:
detect: What to look forrespond: What to do when matched
Rule Structure
detect:
event: EVENT_TYPE # Event to monitor
op: OPERATOR # Matching logic
# ... criteria
respond:
- action: ACTION_TYPE
# ... parameters
Required:
detect: Must haveevent(ortarget) andoprespond: Array of actions (minimum one)
Core Operators
Basic Comparison
is - Exact equality
op: is
path: event/PROCESS_ID
value: 9999
exists - Element presence (optional truthy: true for non-null/non-empty)
op: exists
path: event/PARENT
contains - Substring match (optional count: N)
op: contains
path: event/COMMAND_LINE
value: powershell
starts with / ends with - Prefix/suffix match
op: ends with
path: event/FILE_PATH
value: .exe
case sensitive: false
matches - Regular expression (Go syntax)
op: matches
path: event/FILE_PATH
re: .*\\system32\\.*\.scr
case sensitive: false
is greater than / is lower than - Numeric comparison (optional length of: true)
op: is greater than
path: event/NETWORK_ACTIVITY/BYTES_SENT
value: 1048576
Boolean Logic
and / or - Combine rules
op: and
rules:
- op: ends with
path: event/FILE_PATH
value: /sshd
- op: is public address
path: event/NETWORK_ACTIVITY/SOURCE/IP_ADDRESS
not - Invert result (add not: true to any operator)
op: is
not: true
path: event/PROCESS_ID
value: 9999
Platform Checks
is platform - Platform detection
op: is platform
name: windows # windows, linux, macos, ios, android, chrome, etc.
is windows / is 32 bit / is 64 bit / is arm - Architecture shortcuts
op: is windows
is tagged - Tag presence
op: is tagged
tag: vip
Network
is public address / is private address - RFC 1918 checks
op: is public address
path: event/NETWORK_ACTIVITY/SOURCE/IP_ADDRESS
cidr - Network mask matching
op: cidr
path: event/NETWORK_ACTIVITY/SOURCE/IP_ADDRESS
cidr: 10.16.1.0/24
Advanced
lookup - Threat feed/resource lookup
op: lookup
path: event/DOMAIN_NAME
resource: hive://lookup/malwaredomains
case sensitive: false
scope - Limit to sub-path (crucial for arrays)
op: scope
path: event/NETWORK_ACTIVITY/
rule:
op: and
rules:
- op: starts with
path: event/SOURCE/IP_ADDRESS
value: '10.'
- op: is
path: event/DESTINATION/PORT
value: 445
string distance - Levenshtein distance for typosquatting
op: string distance
path: event/DOMAIN_NAME
value: example.com
max: 2
For complete operator reference, see REFERENCE.md.
Event Paths
Event Data (use event/ prefix):
path: event/FILE_PATH
path: event/COMMAND_LINE
path: event/PROCESS_ID
path: event/DOMAIN_NAME
Routing Metadata (use routing/ prefix):
path: routing/sid # Sensor ID
path: routing/hostname # Host name
path: routing/event_type # Event type
path: routing/event_time # Timestamp
Array Navigation (use ? wildcard):
path: event/NETWORK_ACTIVITY/?/IP_ADDRESS # any element
path: event/NETWORK_ACTIVITY/0/IP_ADDRESS # first element
Response Actions
report - Create detection/alert
- action: report
name: my-detection-name
priority: 3 # 1-5 severity
metadata: # optional context
author: security-team
mitre: T1059.001
detect_data: # optional structured extraction
domain: "{{ .event.DOMAIN_NAME }}"
Template support: "{{ .event.FILE_PATH }}"
Internal only (D&R chaining): prefix name with __
task - Send sensor command
- action: task
command: history_dump
investigation: inv-id
Common commands: history_dump, deny_tree <<routing/this>>, segregate_network, yara_scan hive://yara/rule --pid "{{ .event.PROCESS_ID }}"
add tag / remove tag - Tag management
- action: add tag
tag: vip
ttl: 30 # optional expiration
isolate network / rejoin network - Network isolation (persists across reboots)
- action: isolate network
For complete action reference, see REFERENCE.md.
Stateful Rules
Track relationships between events over time.
with child - Direct children only
event: NEW_PROCESS
op: ends with
path: event/FILE_PATH
value: cmd.exe
with child:
op: ends with
event: NEW_PROCESS
path: event/FILE_PATH
value: calc.exe
Detects: cmd.exe -> calc.exe (NOT cmd.exe -> firefox.exe -> calc.exe)
with descendant - Any descendant
with descendant:
# same syntax as with child
Detects: cmd.exe -> calc.exe AND cmd.exe -> firefox.exe -> calc.exe
with events - Event repetition
event: WEL
op: is windows
with events:
event: WEL
op: is
path: event/EVENT/System/EventID
value: '4625' # failed login
count: 5 # occurrences
within: 60 # seconds
Counting: Add count and within parameters to stateful rules
Report Control: Add report latest event: true to report child instead of parent
Stateless Mode: Add is stateless: true inside stateful context to require all conditions match same event
Common Patterns
Example Patterns:
- Suspicious Location - Detect execution from Downloads folder
- Threat Intelligence - DNS lookup against malware domain feed
- Failed Logins - Multiple failed logins (brute force detection)
- Office + PowerShell - Office apps spawning encoded PowerShell
- Network Beaconing - Repeated connections to same external IP
For 25+ complete rule examples with full code, see EXAMPLES.md.
Suppression
Control action execution frequency.
Limit Frequency
- action: report
name: my-detection
suppression:
max_count: 1 # execute max once
period: 1h # per hour
is_global: true # across org (false = per sensor)
keys:
- '{{ .event.FILE_PATH }}'
Threshold Activation
suppression:
min_count: 3 # must match 3 times
max_count: 3 # then execute once
period: 24h
Practical: Prevent Duplicate Sensor Commands
- action: task
command: yara_scan hive://yara/rule --pid "{{ .event.PROCESS_ID }}"
suppression:
is_global: false
keys:
- '{{ .event.PROCESS_ID }}'
max_count: 1
period: 1m
Time formats: ns, us, ms, s, m, h
Testing Rules
# Validate syntax
limacharlie replay --validate --rule-content my-rule.yaml
# Test with events
limacharlie replay --rule-content my-rule.yaml --events test-event.json
# Test historical (single sensor)
limacharlie replay --sid SENSOR_ID --last-seconds 3600 --rule-content my-rule.yaml
# Test historical (org-wide)
limacharlie replay --entire-org --last-seconds 604800 --rule-content my-rule.yaml
Add unit tests in rule file under tests: section with match: and non_match: arrays.
For complete testing guide including trace mode and debugging, see TROUBLESHOOTING.md.
Best Practices
Performance
- Filter by event type at top level
- Put most restrictive conditions first
- Use simple operators over regex when possible
- Always suppress sensor commands
False Positive Management
- Set
case sensitive: falsefor paths/domains - Use
not: trueto exclude known good paths - Create FP rules for organization-specific exclusions
Rule Organization
- Use descriptive, actionable detection names
- Add metadata: MITRE ATT&CK, severity, author
- Use
detect_datato extract key fields
Quick Reference
Common Event Types: NEW_PROCESS, NETWORK_CONNECTIONS, DNS_REQUEST, FILE_TYPE_ACCESSED, CODE_IDENTITY, WEL
Operator Categories:
- Comparison:
is,exists,contains,starts with,ends with,matches - Logic:
and,or,not - Numeric:
is greater than,is lower than - Network:
is public address,is private address,cidr - Platform:
is platform,is windows,is tagged - Stateful:
with child,with descendant,with events
Action Types: report, task, add tag, remove tag, isolate network, rejoin network, output
Template Variables: {{ .event.* }}, {{ .routing.* }}, {{ .detect.* }} (in reports)
CLI Commands
limacharlie dr list # List rules
limacharlie dr add --rule-name NAME --rule-file FILE # Add rule
limacharlie dr delete --rule-name NAME # Delete rule
limacharlie replay --validate --rule-content FILE # Validate
limacharlie replay --rule-content FILE --events FILE # Test
Development Workflow
- Draft - Write YAML rule
- Validate - Check syntax
- Test - Create test events
- Replay - Test against historical data
- Deploy - Add to test environment
- Monitor - Watch for issues
- Iterate - Refine based on feedback
Navigation
- REFERENCE.md - Complete operator/action reference, transforms, event paths, templates
- EXAMPLES.md - 25+ complete rule examples across all use cases
- TROUBLESHOOTING.md - Testing, debugging, performance tuning, validation
Key Reminders
- Always test rules before production deployment
- Use suppression with sensor commands
- Add unit tests to catch regressions
- Include metadata for SOC context
- Use case-insensitive matching for paths/domains
- Put restrictive conditions first for performance
- Use stateful rules for behavior-based detections
- Create FP rules for organization exclusions
- Monitor rule performance with replay metrics
- Document rules with clear names and metadata
This skill provides comprehensive guidance for creating effective D&R rules. Always encourage testing and validation before production deployment.
Score
Total Score
Based on repository quality metrics
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
3ヶ月以内に更新がある
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
Reviews
Reviews coming soon