mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-09-10 22:41:14 +00:00
- Add SecurityMiddleware class with YAML-based configuration support - Implement three-tier configuration hierarchy (Enterprise → Global → Project → Custom) - Add ASK action support for prompting users instead of just blocking - Create EnhancedRooIgnoreController that integrates with SecurityMiddleware - Support both gitignore-style and regex patterns for file matching - Add comprehensive type definitions for security configuration - Include example YAML configurations for different use cases - Add documentation for the new security middleware features - Implement tests for core functionality Fixes #7912
345 lines
9.8 KiB
Markdown
345 lines
9.8 KiB
Markdown
# RooCode Security Middleware
|
|
|
|
## Overview
|
|
|
|
The RooCode Security Middleware provides enhanced, granular file access control beyond the traditional `.rooignore` functionality. It introduces a flexible YAML-based configuration system with support for ASK actions (prompting users for approval), regex patterns, and a three-tier configuration hierarchy.
|
|
|
|
## Key Features
|
|
|
|
### 1. **ASK Action Support**
|
|
|
|
Instead of just blocking file access, the middleware can prompt users for approval before allowing access to sensitive files.
|
|
|
|
### 2. **YAML Configuration**
|
|
|
|
More flexible and readable configuration format compared to gitignore-style patterns.
|
|
|
|
### 3. **Three-Tier Configuration Hierarchy**
|
|
|
|
- **Enterprise**: Organization-wide policies (cannot be overridden)
|
|
- **Global**: User-level defaults (~/.roo-security.yaml)
|
|
- **Project**: Project-specific rules (.roo-security.yaml)
|
|
- **Custom**: Personal overrides (.roo-security-custom.yaml)
|
|
|
|
### 4. **Regex Pattern Support**
|
|
|
|
In addition to gitignore-style patterns, supports regular expressions for complex matching.
|
|
|
|
### 5. **Rule Priority System**
|
|
|
|
Fine-grained control over which rules take precedence when multiple patterns match.
|
|
|
|
## Configuration File Format
|
|
|
|
### Basic Structure
|
|
|
|
```yaml
|
|
version: "1.0"
|
|
security:
|
|
enabled: true
|
|
inheritRules: true # Whether to inherit rules from higher levels
|
|
defaultAction: ALLOW # Default when no rules match (ALLOW, BLOCK, or ASK)
|
|
askMessagePrefix: "Security check" # Prefix for ASK prompts
|
|
|
|
rules:
|
|
- pattern: "**/.env*" # Gitignore-style pattern
|
|
action: ASK # ALLOW, BLOCK, or ASK
|
|
priority: 90 # Higher numbers = higher priority
|
|
description: "Environment files may contain secrets"
|
|
askMessage: "Access to ${file} requires approval" # Custom prompt
|
|
applyToCommands: true # Also check terminal commands
|
|
```
|
|
|
|
### Pattern Types
|
|
|
|
1. **Gitignore-style patterns**:
|
|
|
|
- `*.log` - Match all log files
|
|
- `**/.env*` - Match .env files in any directory
|
|
- `src/**/*.test.js` - Match test files in src
|
|
|
|
2. **Regular expressions** (enclosed in forward slashes):
|
|
- `/.*\.secret\..*/` - Match files with .secret. in the name
|
|
- `/.*[Ss][Ss][Nn].*\d{3}-\d{2}-\d{4}.*/` - Match potential SSN patterns
|
|
|
|
## Configuration Hierarchy
|
|
|
|
### 1. Enterprise Configuration
|
|
|
|
- Managed by organization administrators
|
|
- Cannot be overridden by lower levels
|
|
- Typically enforces compliance requirements (GDPR, HIPAA, PCI-DSS)
|
|
|
|
### 2. Global Configuration
|
|
|
|
- Located at `~/.roo-security.yaml`
|
|
- User's personal default security settings
|
|
- Applies to all projects unless overridden
|
|
|
|
### 3. Project Configuration
|
|
|
|
- Located at `project-root/.roo-security.yaml`
|
|
- Project-specific security rules
|
|
- Can inherit or override global rules
|
|
|
|
### 4. Custom Configuration
|
|
|
|
- Located at `project-root/.roo-security-custom.yaml`
|
|
- Personal overrides for the current project
|
|
- Highest priority (except for enterprise rules with `inheritRules: false`)
|
|
|
|
## Rule Evaluation Order
|
|
|
|
1. Rules are evaluated from **Custom → Project → Global → Enterprise**
|
|
2. Within each level, rules are sorted by priority (highest first)
|
|
3. First matching rule determines the action
|
|
4. If no rules match, the `defaultAction` is applied
|
|
|
|
## Actions
|
|
|
|
### BLOCK
|
|
|
|
Completely prevents access to the file. The operation fails with an error message.
|
|
|
|
```yaml
|
|
- pattern: "**/.ssh/**"
|
|
action: BLOCK
|
|
description: "SSH keys must not be accessed"
|
|
```
|
|
|
|
### ASK
|
|
|
|
Prompts the user for approval before allowing access. If approved, access is granted; if denied, access is blocked.
|
|
|
|
```yaml
|
|
- pattern: "**/*.key"
|
|
action: ASK
|
|
askMessage: "File ${file} appears to be a private key. Allow access?"
|
|
```
|
|
|
|
### ALLOW
|
|
|
|
Explicitly allows access to the file. Useful for overriding inherited rules.
|
|
|
|
```yaml
|
|
- pattern: "test/fixtures/**"
|
|
action: ALLOW
|
|
description: "Test fixtures are safe to access"
|
|
```
|
|
|
|
## Integration with .rooignore
|
|
|
|
The Enhanced Security Middleware maintains full backward compatibility with `.rooignore`:
|
|
|
|
1. `.rooignore` patterns are always evaluated first
|
|
2. Files blocked by `.rooignore` cannot be allowed by security rules
|
|
3. Security middleware adds additional layers of protection
|
|
|
|
## Usage Examples
|
|
|
|
### Example 1: Protecting Sensitive Files
|
|
|
|
```yaml
|
|
# .roo-security.yaml
|
|
version: "1.0"
|
|
security:
|
|
enabled: true
|
|
rules:
|
|
- pattern: "**/production.yml"
|
|
action: BLOCK
|
|
priority: 100
|
|
description: "Production configuration"
|
|
|
|
- pattern: "**/*.pem"
|
|
action: ASK
|
|
priority: 90
|
|
askMessage: "Certificate file ${file} - approve access?"
|
|
```
|
|
|
|
### Example 2: Development Overrides
|
|
|
|
```yaml
|
|
# .roo-security-custom.yaml
|
|
version: "1.0"
|
|
security:
|
|
enabled: true
|
|
inheritRules: true
|
|
rules:
|
|
# Override project rule for local development
|
|
- pattern: ".env.local"
|
|
action: ALLOW
|
|
priority: 200
|
|
description: "Local development environment"
|
|
```
|
|
|
|
### Example 3: Enterprise Compliance
|
|
|
|
```yaml
|
|
# Enterprise configuration (managed centrally)
|
|
version: '1.0'
|
|
security:
|
|
enabled: true
|
|
inheritRules: false # Cannot be overridden
|
|
rules:
|
|
- pattern: "**/pii/**"
|
|
action: BLOCK
|
|
priority: 1000
|
|
description: "GDPR compliance - PII protection"
|
|
|
|
- pattern: "/.*credit.*card.*\d{4}.*/"
|
|
action: BLOCK
|
|
priority: 1000
|
|
description: "PCI-DSS compliance"
|
|
```
|
|
|
|
## Command-Line Access Control
|
|
|
|
The middleware also validates terminal commands that attempt to read files:
|
|
|
|
```yaml
|
|
rules:
|
|
- pattern: "**/.env*"
|
|
action: BLOCK
|
|
applyToCommands: true # Also blocks: cat .env, type .env, etc.
|
|
```
|
|
|
|
Supported commands:
|
|
|
|
- Unix: `cat`, `less`, `more`, `head`, `tail`, `grep`, `awk`, `sed`
|
|
- PowerShell: `Get-Content`, `gc`, `type`, `Select-String`, `sls`
|
|
|
|
## API Usage
|
|
|
|
### TypeScript Integration
|
|
|
|
```typescript
|
|
import { EnhancedRooIgnoreController } from "./core/ignore/EnhancedRooIgnoreController"
|
|
import { SecurityEvaluation } from "./core/security/types"
|
|
|
|
// Initialize with security middleware
|
|
const controller = new EnhancedRooIgnoreController(projectPath, {
|
|
enableSecurityMiddleware: true,
|
|
askHandler: async (evaluation: SecurityEvaluation) => {
|
|
// Show prompt to user
|
|
const approved = await vscode.window.showWarningMessage(evaluation.message, "Allow", "Deny")
|
|
return approved === "Allow"
|
|
},
|
|
securityOptions: {
|
|
debug: true,
|
|
globalConfigPath: "~/.roo-security.yaml",
|
|
},
|
|
})
|
|
|
|
// Initialize (loads configurations)
|
|
await controller.initialize()
|
|
|
|
// Check file access (async for proper ASK handling)
|
|
const result = await controller.validateAccessAsync("config/secrets.yml")
|
|
if (!result.allowed) {
|
|
if (result.requiresApproval) {
|
|
console.log("File requires approval:", result.evaluation?.message)
|
|
} else {
|
|
console.log("File access blocked:", result.evaluation?.message)
|
|
}
|
|
}
|
|
|
|
// Check command execution
|
|
const cmdResult = await controller.validateCommandAsync("cat .env")
|
|
if (!cmdResult.allowed) {
|
|
console.log("Command blocked:", cmdResult.evaluation?.message)
|
|
}
|
|
```
|
|
|
|
### Statistics and Monitoring
|
|
|
|
```typescript
|
|
// Get security statistics
|
|
const stats = controller.getSecurityStats()
|
|
console.log(`Total evaluations: ${stats.totalEvaluations}`)
|
|
console.log(`Blocked: ${stats.blockedCount}`)
|
|
console.log(`Asked: ${stats.askedCount}`)
|
|
console.log(`Allowed: ${stats.allowedCount}`)
|
|
|
|
// Export configuration
|
|
const yamlConfig = await controller.exportSecurityConfig("project")
|
|
console.log("Current project config:", yamlConfig)
|
|
|
|
// Import new configuration
|
|
await controller.importSecurityConfig(newYamlContent, "custom")
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
### 1. Start with Defaults
|
|
|
|
Begin with sensible defaults at the global level, then add project-specific rules as needed.
|
|
|
|
### 2. Use Priority Wisely
|
|
|
|
- 1000: Critical security rules (enterprise/compliance)
|
|
- 100-999: Important project rules
|
|
- 50-99: Standard rules
|
|
- 1-49: Low-priority suggestions
|
|
|
|
### 3. Provide Clear Messages
|
|
|
|
Always include descriptive `askMessage` and `description` fields to help users understand why access is being controlled.
|
|
|
|
### 4. Test Your Rules
|
|
|
|
Use the custom configuration file to test new rules before adding them to project or global configs.
|
|
|
|
### 5. Regular Expressions
|
|
|
|
Use regex patterns sparingly and test thoroughly. They're powerful but can have performance implications.
|
|
|
|
### 6. Command Protection
|
|
|
|
Enable `applyToCommands: true` for truly sensitive files to prevent command-line access.
|
|
|
|
## Migration from .rooignore
|
|
|
|
The security middleware is fully backward compatible. To migrate:
|
|
|
|
1. Keep your `.rooignore` file as-is
|
|
2. Create `.roo-security.yaml` for new rules
|
|
3. Gradually move patterns from `.rooignore` to YAML configs
|
|
4. Use ASK action for files that need conditional access
|
|
|
|
## Troubleshooting
|
|
|
|
### Rules Not Being Applied
|
|
|
|
1. Check that `enabled: true` is set
|
|
2. Verify file paths are relative to project root
|
|
3. Check rule priority - higher priority rules match first
|
|
4. Enable debug mode to see evaluation details
|
|
|
|
### ASK Prompts Not Showing
|
|
|
|
1. Ensure `askHandler` is configured in the controller
|
|
2. Check that the UI component is properly connected
|
|
3. Verify the pattern matches the file path
|
|
|
|
### Performance Issues
|
|
|
|
1. Avoid overly complex regex patterns
|
|
2. Limit the number of rules per configuration level
|
|
3. Use gitignore-style patterns when possible
|
|
|
|
## Security Considerations
|
|
|
|
1. **Enterprise rules** should be immutable and audited
|
|
2. **Sensitive patterns** should use BLOCK, not ASK
|
|
3. **Regular expressions** should be carefully reviewed for ReDoS vulnerabilities
|
|
4. **Custom configurations** should be excluded from version control if they contain sensitive patterns
|
|
|
|
## Future Enhancements
|
|
|
|
- [ ] Cloud-based enterprise configuration management
|
|
- [ ] Audit logging for all security decisions
|
|
- [ ] Machine learning-based sensitive data detection
|
|
- [ ] Integration with secret scanning tools
|
|
- [ ] Role-based access control (RBAC)
|
|
- [ ] Time-based access rules
|
|
- [ ] Contextual rules based on git branch or environment
|