claude-flow-novice
Version:
Claude Flow Novice - Advanced orchestration platform for multi-agent AI workflows with CFN Loop architecture Includes Local RuVector Accelerator and all CFN skills for complete functionality.
118 lines (88 loc) • 3.82 kB
Markdown
# Security Fix: Redis Password Environment Variable Mismatch
**Date:** 2025-11-17
**Severity:** CVSS 9.1/10 (Critical)
**Agent:** docker-specialist
**Iteration:** 2
## Problem
Two docker-compose files used DIFFERENT environment variable names for Redis authentication:
**Root `docker-compose.yml`:**
```yaml
redis:
command: redis-server --requirepass ${REDIS_PASSWORD}
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
```
**Coordinator `docker/docker-compose.yml`:**
```yaml
cfn-redis:
command: redis-server --requirepass ${CFN_REDIS_PASSWORD} # ❌ NOT DEFINED
cfn-coordinator:
environment:
- CFN_REDIS_PASSWORD=${CFN_REDIS_PASSWORD:-} # ❌ EMPTY
```
## Impact
**Production coordinator deployment had NO Redis authentication:**
- `.env` defines `REDIS_PASSWORD=<secure-value>`
- Coordinator compose referenced `CFN_REDIS_PASSWORD` (not defined)
- Result: `CFN_REDIS_PASSWORD` was empty → Redis had no password
- CVSS Score: 9.1/10 (unauthenticated network access to coordination layer)
## Root Cause
Environment variable naming inconsistency between:
1. **Legacy standard:** `REDIS_PASSWORD` (defined in `.env`)
2. **New standard:** `CFN_REDIS_PASSWORD` (runtime contract preference)
3. **Actual deployment:** Used new standard without updating `.env`
## Fix
Standardized to `REDIS_PASSWORD` (the variable actually defined in `.env`):
### File: `docker/docker-compose.yml`
**Changed 3 occurrences:**
1. **Redis command line:**
```diff
- command: redis-server --save 60 1 --loglevel warning --requirepass ${CFN_REDIS_PASSWORD}
+ command: redis-server --save 60 1 --loglevel warning --requirepass ${REDIS_PASSWORD}
```
2. **Redis healthcheck:**
```diff
- test: ["CMD", "redis-cli", "-a", "${CFN_REDIS_PASSWORD}", "ping"]
+ test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
```
3. **Coordinator environment:**
```diff
- - CFN_REDIS_PASSWORD=${CFN_REDIS_PASSWORD:-}
+ - CFN_REDIS_PASSWORD=${REDIS_PASSWORD:-}
```
**Why this works:**
- Redis container now reads password from `${REDIS_PASSWORD}` (defined in `.env`)
- Coordinator receives password as `CFN_REDIS_PASSWORD` environment variable (what code expects)
- Value flows: `.env REDIS_PASSWORD` → compose substitution → container `CFN_REDIS_PASSWORD`
## Validation
**Test:** `tests/security/test-redis-password-consistency.sh`
```bash
✅ Test 1: Both Redis containers use ${REDIS_PASSWORD}
✅ Test 2: .env defines REDIS_PASSWORD
✅ Test 3: Coordinator maps REDIS_PASSWORD to CFN_REDIS_PASSWORD
```
**Manual verification:**
```bash
# Both files now use same variable source
grep 'requirepass.*REDIS_PASSWORD' docker-compose.yml
grep 'requirepass.*REDIS_PASSWORD' docker/docker-compose.yml
# Coordinator receives password correctly
grep 'CFN_REDIS_PASSWORD=\${REDIS_PASSWORD' docker/docker-compose.yml
```
## Prevention
**Pre-deployment checklist:**
1. Verify all environment variables in compose files are defined in `.env`
2. Run `docker-compose config` to validate variable substitution
3. Check coordinator logs for Redis connection errors
4. Execute `tests/security/test-redis-password-consistency.sh` before deployment
**Runtime contract note:**
The environment variable contract (`docker/runtime/cfn-runtime.contract.yml`) shows:
- Standard: `CFN_REDIS_PASSWORD`
- Legacy aliases: `REDIS_PASSWORD`, `MCP_REDIS_PASSWORD`
For production, we use `REDIS_PASSWORD` in `.env` and map it to `CFN_REDIS_PASSWORD` inside containers. This maintains compatibility while using the defined variable.
## Security Impact Resolved
- ✅ Redis authentication enabled in production coordinator deployments
- ✅ Consistent variable usage across all Docker Compose files
- ✅ Automated test coverage prevents regression
- ✅ CVSS 9.1/10 vulnerability eliminated
**Confidence:** 0.95