aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
412 lines (301 loc) • 8.9 kB
Markdown
# Task: RLS Audit
**Purpose**: Report tables with/without RLS and list all policies
**Elicit**: false
## Execution Modes
**Choose your execution mode:**
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
- Autonomous decision making with logging
- Minimal user interaction
- **Best for:** Simple, deterministic tasks
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
- Explicit decision checkpoints
- Educational explanations
- **Best for:** Learning, complex decisions
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
- Task analysis phase (identify all ambiguities)
- Zero ambiguity execution
- **Best for:** Ambiguous requirements, critical work
**Parameter:** `mode` (optional, default: `interactive`)
## Task Definition (AIOS Task Format V1.0)
```yaml
task: dbRlsAudit()
responsável: Dara (Sage)
responsavel_type: Agente
atomic_layer: Strategy
**Entrada:**
- campo: query
tipo: string
origem: User Input
obrigatório: true
validação: Valid SQL query
- campo: params
tipo: object
origem: User Input
obrigatório: false
validação: Query parameters
- campo: connection
tipo: object
origem: config
obrigatório: true
validação: Valid PostgreSQL connection via Supabase
**Saída:**
- campo: query_result
tipo: array
destino: Memory
persistido: false
- campo: records_affected
tipo: number
destino: Return value
persistido: false
- campo: execution_time
tipo: number
destino: Memory
persistido: false
```
## Pre-Conditions
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
**Checklist:**
```yaml
pre-conditions:
- [ ] Database connection established; query syntax valid
tipo: pre-condition
blocker: true
validação: |
Check database connection established; query syntax valid
error_message: "Pre-condition failed: Database connection established; query syntax valid"
```
## Post-Conditions
**Purpose:** Validate execution success AFTER task completes
**Checklist:**
```yaml
post-conditions:
- [ ] Query executed; results returned; transaction committed
tipo: post-condition
blocker: true
validação: |
Verify query executed; results returned; transaction committed
error_message: "Post-condition failed: Query executed; results returned; transaction committed"
```
## Acceptance Criteria
**Purpose:** Definitive pass/fail criteria for task completion
**Checklist:**
```yaml
acceptance-criteria:
- [ ] Data persisted correctly; constraints respected; no orphaned data
tipo: acceptance-criterion
blocker: true
validação: |
Assert data persisted correctly; constraints respected; no orphaned data
error_message: "Acceptance criterion not met: Data persisted correctly; constraints respected; no orphaned data"
```
## Tools
**External/shared resources used by this task:**
- **Tool:** neo4j-driver
- **Purpose:** Neo4j database connection and query execution
- **Source:** npm: neo4j-driver
- **Tool:** query-validator
- **Purpose:** Cypher query syntax validation
- **Source:** .aios-core/utils/db-query-validator.js
## Scripts
**Agent-specific code for this task:**
- **Script:** db-query.js
- **Purpose:** Execute Neo4j queries with error handling
- **Language:** JavaScript
- **Location:** .aios-core/scripts/db-query.js
## Error Handling
**Strategy:** retry
**Common Errors:**
1. **Error:** Connection Failed
- **Cause:** Unable to connect to Neo4j database
- **Resolution:** Check connection string, credentials, network
- **Recovery:** Retry with exponential backoff (max 3 attempts)
2. **Error:** Query Syntax Error
- **Cause:** Invalid Cypher query syntax
- **Resolution:** Validate query syntax before execution
- **Recovery:** Return detailed syntax error, suggest fix
3. **Error:** Transaction Rollback
- **Cause:** Query violates constraints or timeout
- **Resolution:** Review query logic and constraints
- **Recovery:** Automatic rollback, preserve data integrity
## Performance
**Expected Metrics:**
```yaml
duration_expected: 5-20 min (estimated)
cost_estimated: $0.003-0.015
token_usage: ~2,000-8,000 tokens
```
**Optimization Notes:**
- Iterative analysis with depth limits; cache intermediate results; batch similar operations
## Metadata
```yaml
story: N/A
version: 1.0.0
dependencies:
- N/A
tags:
- database
- infrastructure
updated_at: 2025-11-17
```
## Process
### Run Comprehensive RLS Audit
```bash
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
\echo '=== RLS Coverage Audit ==='
\echo ''
-- Tables with/without RLS
WITH t AS (
SELECT tablename, rowsecurity
FROM pg_tables WHERE schemaname='public'
)
SELECT
tablename,
CASE WHEN rowsecurity THEN '✓ ENABLED' ELSE '❌ DISABLED' END AS rls_status,
(SELECT json_agg(json_build_object(
'policy', policyname,
'cmd', cmd,
'roles', roles,
'qual', qual,
'with_check', with_check
))
FROM pg_policies p
WHERE p.tablename=t.tablename
AND p.schemaname='public') AS policies
FROM t
ORDER BY rowsecurity DESC, tablename;
\echo ''
\echo '=== Summary ==='
SELECT
COUNT(*) AS total_tables,
COUNT(*) FILTER (WHERE rowsecurity) AS rls_enabled,
COUNT(*) FILTER (WHERE NOT rowsecurity) AS rls_disabled
FROM pg_tables
WHERE schemaname='public';
\echo ''
\echo '=== Tables Without RLS (Security Risk) ==='
SELECT tablename
FROM pg_tables
WHERE schemaname='public'
AND rowsecurity = false
ORDER BY tablename;
\echo ''
\echo '=== Policy Coverage ==='
SELECT
t.tablename,
COUNT(p.policyname) AS policy_count,
ARRAY_AGG(p.cmd) AS commands_covered
FROM pg_tables t
LEFT JOIN pg_policies p ON p.tablename = t.tablename AND p.schemaname = 'public'
WHERE t.schemaname = 'public'
AND t.rowsecurity = true
GROUP BY t.tablename
ORDER BY policy_count, t.tablename;
SQL
```
## Output Interpretation
### RLS Status
**✓ ENABLED** - Table has RLS active (good)
**❌ DISABLED** - Table has no RLS (security risk)
### Policy Coverage
**Good coverage:**
- 1 policy with `FOR ALL` (KISS approach), OR
- 4 policies covering SELECT, INSERT, UPDATE, DELETE (granular)
**Incomplete coverage:**
- Enabled RLS but 0 policies = nobody can access
- 1-3 policies (granular) = some operations not covered
**No coverage:**
- RLS disabled = full access without restrictions
## Common Issues & Fixes
### Issue: Table has RLS but no policies
**Problem**: RLS enabled but no policies defined
**Impact**: Table is inaccessible to all users
**Fix**: Add policies or disable RLS
```sql
-- Add KISS policy
ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;
CREATE POLICY "table_name_all"
ON table_name FOR ALL
TO authenticated
USING (auth.uid() = user_id)
WITH CHECK (auth.uid() = user_id);
```
Or use: `*policy-apply table_name kiss`
### Issue: Table has no RLS
**Problem**: Table accessible without restrictions
**Impact**: Security vulnerability, data exposure
**Fix**: Enable RLS and add policies
```sql
ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;
-- Then add policies
```
### Issue: Incomplete policy coverage (granular)
**Problem**: RLS enabled with 1-3 policies (not covering all operations)
**Impact**: Some operations may be blocked unexpectedly
**Fix**: Either add missing policies or switch to KISS approach
## Recommended Actions
### For Public Data
Tables that should be publicly readable:
```sql
-- Public read, authenticated write
CREATE POLICY "public_read"
ON table_name FOR SELECT
TO anon, authenticated
USING (true);
CREATE POLICY "authenticated_write"
ON table_name FOR INSERT
TO authenticated
WITH CHECK (auth.uid() = user_id);
```
### For User-Owned Data
Use KISS policy:
```bash
*policy-apply table_name kiss
```
### For Multi-Tenant Data
Organization-scoped access:
```sql
CREATE POLICY "org_isolation"
ON table_name FOR ALL
TO authenticated
USING (org_id = (auth.jwt() ->> 'org_id')::uuid)
WITH CHECK (org_id = (auth.jwt() ->> 'org_id')::uuid);
```
## Testing RLS Policies
After fixing issues, test with:
```bash
*impersonate {user_id}
# Then run queries to verify access
```
## Best Practices
✅ **Enable RLS on all tables with sensitive data**
✅ **Use KISS policies for simple owner-based access**
✅ **Document why RLS is disabled if intentional**
✅ **Test policies with real user contexts**
✅ **Index columns used in RLS policies**
✅ **Run this audit after every migration**
❌ **Don't enable RLS without policies**
❌ **Don't use service role to bypass RLS in app code**
❌ **Don't forget to test negative cases**
## Integration with Workflow
Run RLS audit:
1. After migrations: `*smoke-test` → `*rls-audit`
2. Before production deploy: `*rls-audit`
3. Regular security reviews: `*rls-audit`
4. When adding new tables: `*rls-audit`