Skip to main content

MEMO-094: Phase 2 Vault Integration Implementation Plan

Executive Summary

This memo outlines the detailed 6-week implementation plan for Phase 2 of Prism's authentication system: HashiCorp Vault integration for dynamic, per-session backend credentials. Phase 1 (JWT authentication and namespace authorization) is complete and tested. This phase adds per-user credential isolation via Vault's dynamic secrets engine.

Current State (Phase 1 Complete ✅)

What's Implemented

  1. JWT Authentication (prism-proxy/src/auth.rs):

    • Token validation with JWKS from Dex OIDC provider
    • Namespace-based authorization policies
    • Permission enforcement (read/write based on gRPC methods)
    • Test policies for team-alpha, team-beta, shared namespaces
  2. Auth Context Pass-Through (prism-proxy/src/main.rs):

    • HTTP/2 HEADERS frame injection
    • Per-request trace IDs (UUID v4)
    • User identity propagation to pattern plugins
    • Zero-copy TCP forwarding with selective header modification
  3. Pattern Plugin SDK (pkg/plugin/):

    • auth_context.go - Extract auth context with ExtractAuthContext(ctx)
    • auth_interceptor.go - Automatic audit logging interceptors
    • Zero-boilerplate integration for pattern runners
  4. Integration Testing (tests/testing/auth_integration_test.go):

    • Dex testcontainer backend
    • 10 comprehensive test scenarios
    • Real JWT validation with pattern runners

What's Missing (Phase 2 ❌)

  1. No Vault Integration:

    • Zero Vault SDK imports in codebase
    • No JWT → Vault token exchange
    • No dynamic credential generation
    • No background renewal
  2. Shared Backend Credentials:

    • Pattern plugins use static credentials
    • All users share same backend username/password
    • No per-user audit trails in backend logs
  3. Service Authentication:

    • No K8s ServiceAccount token exchange
    • No AWS IAM role authentication
    • No service-to-service patterns

Phase 2 Goals

Primary Objectives

  1. Per-Session Credential Isolation: Each user session gets unique backend credentials
  2. Dynamic Credential Generation: Vault generates credentials on-demand
  3. Automatic Credential Rotation: Background renewal every lease_duration/2
  4. Zero Shared Credentials: Breach of one session doesn't compromise others
  5. Per-User Audit Trails: Backend logs show actual user identity in username

Success Criteria

  • ✅ User JWT tokens exchanged for Vault tokens
  • ✅ Dynamic backend credentials fetched from Vault
  • ✅ Credentials renewed automatically before expiration
  • ✅ Credentials revoked on session end
  • ✅ E2E tests with Vault testcontainer
  • ✅ Pattern plugins use per-session credentials
  • ✅ Backend logs show unique usernames per session

Implementation Plan (6 Weeks)

Week 1: Vault Client Foundation

Deliverables:

  1. Create pkg/authz/ package structure

  2. Implement vault_client.go:

    • NewVaultClient(config) - Initialize Vault SDK client
    • AuthenticateWithJWT(ctx, jwt) - Exchange JWT for Vault token
    • Configuration with TLS support
    • Connection testing and health checks
  3. Implement vault_credentials.go:

    • GetBackendCredentials(ctx) - Fetch dynamic credentials
    • BackendCredentials struct (username, password, lease_id, lease_duration)
    • Error handling for missing credentials
  4. Add dependencies to go.mod:

    • github.com/hashicorp/vault/api - Official Vault SDK
    • Version management and compatibility

Testing:

  • Unit tests with Vault testcontainer
  • JWT auth method configuration
  • Database secrets engine setup for Redis
  • Verify credential generation

Files Created:

pkg/authz/
├── vault_client.go # Vault SDK client wrapper
├── vault_credentials.go # Credential fetching
├── types.go # Shared types and structs
└── vault_test.go # Unit tests

Week 2: Credential Lifecycle Management

Deliverables:

  1. Implement vault_renewal.go:

    • StartCredentialRenewal(ctx, creds) - Background renewal goroutine
    • Renew Vault token every lease_duration/2
    • Renew credential lease
    • Error handling with retries
  2. Implement vault_revocation.go:

    • RevokeCredentials(ctx, lease_id) - Cleanup on session end
    • Graceful shutdown handling
    • Batch revocation for multiple leases
  3. Implement credential caching:

    • Cache credentials per session
    • TTL-based invalidation
    • Thread-safe access with sync.RWMutex

Testing:

  • Renewal goroutine tests (time-based)
  • Revocation verification (lease cleanup)
  • Concurrent access tests
  • Lease expiration scenarios

Files Created:

pkg/authz/
├── vault_renewal.go # Background renewal
├── vault_revocation.go # Lease cleanup
└── renewal_test.go # Renewal tests

Week 3: Token Validation

Deliverables:

  1. Implement token_validator.go:

    • NewTokenValidator(issuer, audience) - OIDC provider integration
    • Validate(ctx, token) - JWT signature verification
    • Claims extraction (user_id, email, groups)
    • JWKS caching for performance
  2. Implement token_extractor.go:

    • ExtractToken(ctx) - Extract JWT from gRPC metadata
    • Support for "Authorization: Bearer " header
    • Error handling for missing/malformed tokens
  3. Implement token caching:

    • Cache validated tokens (keyed by hash)
    • TTL matches token expiration
    • Reduce JWKS lookups

Testing:

  • JWT validation with real Dex tokens
  • Expired token rejection
  • Invalid signature rejection
  • Claims extraction verification

Files Created:

pkg/authz/
├── token_validator.go # JWT validation
├── token_extractor.go # Extract from gRPC
├── token_cache.go # Validation caching
└── token_test.go # Token tests

Week 4: Session Manager Integration

Deliverables:

  1. Implement session_manager.go:

    • NewSessionManager(validator, vault) - Initialize manager
    • CreateSession(ctx, sessionID, token) - Complete flow:
      1. Validate JWT token
      2. Exchange for Vault token
      3. Fetch backend credentials
      4. Establish backend connection
      5. Start renewal goroutine
    • GetSession(sessionID) - Retrieve existing session
    • CloseSession(ctx, sessionID) - Teardown and revoke
  2. Update pattern plugins to use SessionManager:

    • patterns/keyvalue/session.go - Redis session management
    • patterns/consumer/session.go - Kafka session management
    • patterns/producer/session.go - NATS session management
  3. Add connection pooling per session:

    • Pool maintained for session lifetime
    • Connection reuse within session
    • Cleanup on session end

Testing:

  • Session creation E2E flow
  • Multiple concurrent sessions
  • Session cleanup verification
  • Connection pool management

Files Created:

pkg/authz/
├── session_manager.go # Session lifecycle
└── session_test.go # Session tests

patterns/keyvalue/
└── session.go # Redis session integration

patterns/consumer/
└── session.go # Kafka session integration

patterns/producer/
└── session.go # NATS session integration

Week 5: Service Identity Authentication

Deliverables:

  1. Implement k8s_auth.go:

    • NewK8sAuthenticator(config) - K8s auth client
    • AuthenticateServiceAccount(ctx) - Exchange K8s SA token for Vault token
    • Read SA token from /var/run/secrets/kubernetes.io/serviceaccount/token
  2. Implement aws_auth.go:

    • NewAWSAuthenticator(config) - AWS IAM auth client
    • AuthenticateIAMRole(ctx) - Exchange IAM role for Vault token
    • SigV4 signing for AWS API requests
  3. Implement service_identity.go:

    • ExtractServiceIdentity(ctx) - Parse service identity from metadata
    • InjectServiceIdentity(ctx, identity) - Add to outgoing requests
    • Service identity struct (service_name, namespace, cluster)
  4. Implement service_session.go:

    • ServiceSessionManager - Manage service-to-service sessions
    • Try K8s auth → AWS auth → fallback
    • Long-lived session support

Testing:

  • K8s ServiceAccount mock authentication
  • AWS IAM role mock authentication
  • Service identity propagation
  • Long-running service sessions

Files Created:

pkg/authz/
├── k8s_auth.go # Kubernetes SA auth
├── aws_auth.go # AWS IAM auth
├── service_identity.go # Service identity types
├── service_session.go # Service session manager
└── service_auth_test.go # Service auth tests

Week 6: Integration Testing & Documentation

Deliverables:

  1. Create Vault testcontainer backend (tests/testing/backends/vault.go):

    • Vault container with dev mode
    • JWT auth method pre-configured
    • Database secrets engine for Redis
    • Dynamic credential generation
  2. Implement E2E integration test (tests/testing/vault_integration_test.go):

    • User JWT → Vault → Redis flow
    • Service K8s SA → Vault → Kafka flow
    • Credential renewal verification
    • Lease revocation verification
    • Multiple concurrent sessions
    • Error scenarios (expired tokens, Vault unavailable)
  3. Update pattern runners to use Vault credentials:

    • Modify keyvalue-runner to use SessionManager
    • Modify consumer-runner to use SessionManager
    • Modify producer-runner to use SessionManager
  4. Documentation:

    • Update RFC-062 with implementation status
    • Update MEMO-008 with actual code references
    • Create operator guide for Vault setup
    • Add troubleshooting guide

Testing:

  • Full E2E auth integration tests
  • Performance testing (latency added by Vault)
  • Load testing (concurrent sessions)
  • Failure scenario testing

Files Created:

tests/testing/
├── backends/vault.go # Vault testcontainer
└── vault_integration_test.go # E2E Vault tests

docs-cms/
├── memos/memo-084-vault-operator-guide.md
└── memos/memo-085-vault-troubleshooting.md

Technical Architecture

Token Exchange Flow

┌──────────────────────────────────────────────────────────────────┐
│ Complete Token Exchange Flow │
│ │
│ 1. Client → Pattern Plugin │
│ └─ gRPC request with "Authorization: Bearer <JWT>" │
│ │
│ 2. Pattern Plugin → Token Validator │
│ └─ Validate JWT signature with JWKS │
│ └─ Extract claims (user_id, email, groups) │
│ │
│ 3. Pattern Plugin → Vault │
│ └─ POST /v1/auth/jwt/login │
│ {jwt: "<user-jwt>", role: "prism-redis"} │
│ └─ Response: {client_token: "<vault-token>"} │
│ │
│ 4. Pattern Plugin → Vault │
│ └─ GET /v1/database/creds/redis-role │
│ Header: X-Vault-Token: <vault-token> │
│ └─ Response: {username: "v-jwt-alice-abc123", │
│ password: "<random>", │
│ lease_id: "...", │
│ lease_duration: 3600} │
│ │
│ 5. Pattern Plugin → Backend (Redis) │
│ └─ AUTH v-jwt-alice-abc123 <password> │
│ └─ Execute operation (GET, SET, etc.) │
│ │
│ 6. Background Goroutine (every 30 minutes) │
│ └─ Renew Vault token │
│ └─ Renew credential lease │
│ │
│ 7. Session End │
│ └─ Revoke Vault lease │
│ └─ Vault → Backend: DROP USER v-jwt-alice-abc123 │
│ └─ Close backend connection │
│ │
└──────────────────────────────────────────────────────────────────┘

Session Manager Architecture

┌────────────────────────────────────────────────────────────────┐
│ SessionManager │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Per-Session State │ │
│ │ │ │
│ │ session_id: "sess-abc123" │ │
│ │ user_id: "alice@example.com" │ │
│ │ claims: {sub, email, groups} │ │
│ │ vault_token: "<vault-token>" │ │
│ │ credentials: { │ │
│ │ username: "v-jwt-alice-abc123" │ │
│ │ password: "<redacted>" │ │
│ │ lease_id: "database/creds/..." │ │
│ │ lease_duration: 3600s │ │
│ │ } │ │
│ │ redis_client: <connection pool> │ │
│ │ cancel_func: <goroutine cancellation> │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Background Renewal Goroutine │ │
│ │ │ │
│ │ loop every lease_duration/2: │ │
│ │ 1. Renew Vault token │ │
│ │ 2. Renew credential lease │ │
│ │ 3. Update lease_duration if changed │ │
│ │ 4. Handle renewal failures │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘

Configuration

Vault Configuration (Operator Setup)

JWT Auth Method

# Enable JWT auth method
vault auth enable jwt

# Configure with OIDC provider
vault write auth/jwt/config \
oidc_discovery_url="https://dex.prism.local:5556/dex" \
default_role="prism-patterns"

# Create role for pattern plugins
vault write auth/jwt/role/prism-patterns \
role_type="jwt" \
bound_audiences="prism-patterns" \
user_claim="sub" \
groups_claim="groups" \
token_ttl="1h" \
token_max_ttl="2h" \
token_policies="prism-patterns-policy"

Database Secrets Engine

# Enable database secrets engine
vault secrets enable database

# Configure Redis backend
vault write database/config/redis \
plugin_name="redis-database-plugin" \
host="redis" \
port=6379 \
username="vault-admin" \
password="admin-password" \
allowed_roles="redis-role"

# Create role for dynamic Redis credentials
vault write database/roles/redis-role \
db_name="redis" \
creation_statements='["ACL SETUSER {{username}} on >{{password}} ~* +@all"]' \
revocation_statements='["ACL DELUSER {{username}}"]' \
default_ttl="1h" \
max_ttl="2h"

Vault Policy

# Policy for pattern plugins
path "auth/token/renew-self" {
capabilities = ["update"]
}

path "sys/leases/renew" {
capabilities = ["update"]
}

path "sys/leases/revoke" {
capabilities = ["update"]
}

path "database/creds/redis-role" {
capabilities = ["read"]
}

path "database/creds/kafka-role" {
capabilities = ["read"]
}

path "database/creds/postgres-role" {
capabilities = ["read"]
}

Apply policy:

vault policy write prism-patterns-policy prism-patterns-policy.hcl

Pattern Plugin Configuration

# patterns/keyvalue/config.yaml
auth:
vault:
enabled: true
address: https://vault.internal:8200
namespace: prism # Optional Vault namespace

# JWT authentication
jwt_auth:
role: prism-patterns
auth_path: auth/jwt

# Backend credentials
credentials:
secret_path: database/creds/redis-role
renew_interval: 1800s # 30 minutes (lease_duration/2)

# TLS configuration
tls:
enabled: true
ca_cert: /etc/prism/vault-ca.pem
skip_verify: false # Only true for dev/testing

# Token validation
token:
enabled: true
issuer: https://dex.prism.local:5556/dex
audience: prism-patterns
cache_ttl: 1h

Dependencies

New Go Packages

// go.mod additions
require (
github.com/hashicorp/vault/api v1.10.0 // Official Vault SDK
github.com/coreos/go-oidc/v3 v3.7.0 // OIDC token validation
github.com/golang-jwt/jwt/v5 v5.1.0 // JWT parsing
)

Testcontainer Support

// Test dependencies
require (
github.com/testcontainers/testcontainers-go v0.26.0
github.com/testcontainers/testcontainers-go/modules/vault v0.26.0
)

Security Considerations

Credential Security

  1. Never Log Passwords:

    • Log lease_id, username, but NEVER passwords or Vault tokens
    • Use [REDACTED] placeholder in logs
    • Structured logging with sensitive field filtering
  2. Per-Session Isolation:

    • Each session gets unique backend username
    • Credentials never shared across sessions
    • Automatic cleanup on session end
  3. Credential Rotation:

    • Vault rotates credentials every lease_duration (1h default)
    • Background renewal prevents expiration
    • Alert on renewal failures > 3 consecutive

Network Security

  1. TLS Everywhere:

    • Pattern Plugin → Vault: TLS with cert pinning
    • Vault → Backend: TLS if supported
    • Never transmit credentials over plaintext
  2. Vault Hardening:

    • Vault on internal network, not internet-facing
    • mTLS between pattern plugins and Vault (optional)
    • Audit logging enabled for all Vault operations

Lease Management

  1. Automatic Revocation:

    • Leases revoked on session close
    • Timeout for idle sessions (configurable)
    • Batch revocation on service shutdown
  2. Lease Renewal:

    • Renew every lease_duration/2 (30 minutes default)
    • Retry with exponential backoff on failure
    • Alert if consecutive failures > 3

Performance Targets

Latency Budget

OperationTarget P50Target P99Notes
JWT Validation5ms15msWith JWKS caching
Vault JWT Auth20ms50msFirst request per session
Credential Fetch30ms100msIncludes Vault + backend setup
Total Session Setup60ms200msOne-time per session
Background RenewalN/A100msAsync, doesn't block requests

Caching Strategy

  1. Token Validation Cache:

    • Cache validated JWT tokens (keyed by hash)
    • TTL matches token expiration
    • Reduces JWKS lookups by ~90%
  2. Credential Cache:

    • Cache credentials per session
    • No cross-session sharing
    • Invalidate on renewal

Monitoring and Observability

Metrics

Vault Authentication:

prism_vault_auth_total{result="success|failed",method="jwt|k8s|aws"}
prism_vault_auth_latency_seconds{method="jwt|k8s|aws"}
prism_vault_auth_errors_total{error_type}

Credential Management:

prism_vault_credential_fetch_total{result="success|failed",backend}
prism_vault_credential_fetch_latency_seconds{backend}
prism_vault_credential_renewals_total{result="success|failed"}
prism_vault_credential_renewal_failures_consecutive{session_id}
prism_vault_credential_ttl_seconds{backend,session_id}

Session Management:

prism_sessions_active{type="human|service"}
prism_sessions_created_total
prism_sessions_closed_total{reason="user_logout|timeout|error"}
prism_session_duration_seconds

Logging

Session Creation:

{
"event": "session.created",
"session_id": "sess-abc123",
"user_id": "alice@example.com",
"vault_token": "[REDACTED]",
"username": "v-jwt-alice-abc123",
"lease_id": "database/creds/redis-role/...",
"lease_duration_seconds": 3600,
"backend": "redis"
}

Credential Renewal:

{
"event": "credential.renewed",
"session_id": "sess-abc123",
"user_id": "alice@example.com",
"lease_id": "database/creds/redis-role/...",
"new_lease_duration_seconds": 3600,
"renewals_count": 5
}

Session Teardown:

{
"event": "session.closed",
"session_id": "sess-abc123",
"user_id": "alice@example.com",
"lease_revoked": true,
"duration_seconds": 3600,
"reason": "user_logout"
}

Alerts

Critical:

  • Vault unreachable > 1 minute
  • Credential renewal failure rate > 10%
  • Lease revocation failure rate > 5%

Warning:

  • Credential fetch P99 latency > 200ms
  • Consecutive renewal failures > 3
  • Active sessions > 80% capacity

Testing Strategy

Unit Tests

  1. Vault Client Tests (pkg/authz/vault_test.go):

    • JWT authentication
    • Credential fetching
    • Error handling (invalid token, Vault unavailable)
  2. Renewal Tests (pkg/authz/renewal_test.go):

    • Background renewal goroutine
    • Time-based expiration
    • Cancellation on session end
  3. Token Validation Tests (pkg/authz/token_test.go):

    • Valid JWT validation
    • Expired token rejection
    • Invalid signature rejection

Integration Tests

  1. Vault Integration Test (tests/testing/vault_integration_test.go):

    • Complete JWT → Vault → Redis flow
    • Multiple concurrent sessions
    • Credential renewal verification
    • Lease revocation verification
  2. Service Auth Test (tests/testing/service_auth_test.go):

    • K8s ServiceAccount authentication
    • AWS IAM role authentication
    • Long-running service sessions

E2E Tests

  1. Pattern Runner Integration:

    • KeyValue with Vault credentials
    • Consumer with Vault credentials
    • Producer with Vault credentials
  2. Failure Scenarios:

    • Vault unavailable during session creation
    • Credential renewal failure
    • Backend connection failure with dynamic credentials

Risks and Mitigations

Risk 1: Vault Single Point of Failure

Risk: If Vault is unavailable, no new sessions can be created.

Mitigation:

  • Deploy Vault in HA mode (3+ replicas)
  • Circuit breaker pattern in pattern plugins
  • Degraded mode: Allow existing sessions to continue
  • Alert on Vault availability issues

Risk 2: Credential Renewal Failures

Risk: Credentials expire mid-session if renewal fails.

Mitigation:

  • Renew early (every lease_duration/2)
  • Retry with exponential backoff
  • Alert on consecutive failures > 3
  • TTL margin (5 minutes) for operations in progress

Risk 3: Performance Impact

Risk: Vault adds latency to session creation.

Mitigation:

  • Session setup is one-time per session
  • Credential caching within session
  • Token validation caching
  • Asynchronous renewal (doesn't block requests)

Risk 4: Backend Credential Management Complexity

Risk: Not all backends support dynamic user creation.

Mitigation:

  • Start with backends that support dynamic credentials (Redis, Postgres)
  • Fallback to static credentials for backends without dynamic support
  • Clear documentation of supported backends

Success Metrics

Technical Metrics

  • ✅ 100% of sessions use dynamic Vault credentials (no shared credentials)
  • ✅ P99 session setup latency < 200ms
  • ✅ Credential renewal success rate > 99%
  • ✅ Zero credential leaks in logs
  • ✅ Integration test coverage > 85%

Operational Metrics

  • ✅ Backend logs show unique usernames per session
  • ✅ Per-user audit trails for compliance
  • ✅ Automatic credential rotation every 1 hour
  • ✅ Zero-downtime credential rotation
  • ✅ Operator documentation complete

Phase 2 Implementation Status (2025-11-18)

Overview: ✅ COMPLETE

Phase 2 Vault integration has been successfully implemented and integrated into the KeyValue pattern runner. All core components are functional and ready for testing with live infrastructure.

Completed Weeks (Actual Implementation)

✅ Week 1-2: Foundation & Lifecycle (Completed)

Vault Client & Credentials:

  • pkg/authz/vault_client.go - Vault SDK client wrapper with TLS support
  • pkg/authz/vault_credentials.go - Dynamic credential fetching
  • pkg/authz/vault_renewal.go - Background renewal goroutines
  • pkg/authz/vault_revocation.go - Lease cleanup and revocation
  • pkg/authz/types.go - VaultConfig, BackendCredentials, Claims types

Testing:

  • pkg/authz/vault_client_test.go - Vault client unit tests
  • tests/testing/backends/vault.go - Vault testcontainer backend

✅ Week 3: Token Validation (Completed)

JWT & Token Management:

  • pkg/authz/token_validator.go - OIDC JWT validation with JWKS
  • pkg/authz/token_extractor.go - Extract JWT from gRPC metadata
  • pkg/authz/token_cache.go - Validated token caching
  • pkg/authz/types.go - ITokenValidator interface for testability

Testing:

  • pkg/authz/token_test.go - Token validation tests

✅ Week 4: Session Manager & Pattern Integration (Completed)

Session Management:

  • pkg/authz/session_manager.go - Complete session lifecycle
  • pkg/authz/session_types.go - Session, SessionManagerConfig types
  • pkg/authz/credential_cache.go - Credential caching
  • pkg/plugin/session_middleware.go - gRPC interceptor middleware (32.8% coverage)

Pattern Integration:

  • patterns/keyvalue/cmd/keyvalue-runner/main.go - Full Vault integration
  • patterns/keyvalue/grpc_server.go - Interceptor chaining
  • examples/configs/keyvalue-auth-enabled.yaml - Complete auth configuration
  • examples/configs/keyvalue-auth-disabled.yaml - Disabled auth configuration

Testing:

  • pkg/authz/session_manager_test.go - Session manager tests
  • pkg/plugin/session_middleware_test.go - Middleware unit tests (14 passing)
  • pkg/plugin/session_middleware_comprehensive_test.go - Comprehensive tests (10 passing)

✅ Week 5: Service Authentication (Completed)

Service Identity:

  • pkg/authz/k8s_auth.go - Kubernetes ServiceAccount authentication
  • pkg/authz/aws_auth.go - AWS IAM role authentication
  • pkg/authz/service_identity.go - Service identity types
  • pkg/authz/service_session.go - Service session manager

Testing:

  • pkg/authz/service_auth_test.go - Service auth tests

⚠️ Week 6: Integration Testing (Pending Infrastructure)

Testing Infrastructure:

  • tests/testing/backends/vault.go - Vault testcontainer backend
  • tests/testing/vault_integration_test.go - E2E Vault tests (exist but need module fixes)
  • ⚠️ Integration tests blocked by Go module dependency issues
  • ⚠️ Need local Vault + Dex setup for end-to-end testing

Authentication Flow Implementation

Complete Flow (Implemented):

1. gRPC Request → SessionMiddleware.UnaryInterceptor()
✅ Implemented in pkg/plugin/session_middleware.go:64-91

2. Extract JWT from Authorization header or x-prism-token
✅ Implemented in pkg/plugin/session_middleware.go:129-155

3. TokenValidator.Validate() → OIDC provider JWKS verification
✅ Implemented in pkg/authz/token_validator.go:71-117

4. VaultClient.AuthenticateWithJWT() → Exchange JWT for Vault token
✅ Implemented in pkg/authz/vault_client.go:67-101

5. VaultClient.GetBackendCredentials() → Fetch dynamic credentials
✅ Implemented in pkg/authz/vault_credentials.go:11-60

6. SessionManager.CreateSession() → Create session with credentials
✅ Implemented in pkg/authz/session_manager.go:65-141

7. Session cached by token hash (SHA256)
✅ Implemented in pkg/plugin/session_middleware.go:104-127

8. Session injected into gRPC context
✅ Implemented in pkg/plugin/session_middleware.go:77

9. Backend connection uses dynamic credentials from session
✅ Helper function InjectCredentialsIntoConfig() in pkg/plugin/session_middleware.go:175-190

KeyValue Runner Integration

Dual-Mode Support:

  • ✅ Authentication disabled mode (pass-through, no Vault required)
  • ✅ Authentication enabled mode (full Vault + OIDC integration)

Configuration:

  • ✅ Nested VaultAuth struct with address, role, auth_path, secret_path, TLS
  • ✅ Nested JWTAuth struct with issuer, audience, validation options
  • ✅ Session TTL and idle timeout configuration
  • ✅ Example configurations for both modes

Components Wired:

  • ✅ TokenValidator → OIDC JWT validation
  • ✅ VaultClient → HashiCorp Vault API integration
  • ✅ SessionManager → Session lifecycle with credential renewal
  • ✅ SessionMiddleware → gRPC interceptor with enabled/disabled modes

Pending Work

Integration Testing:

  • Fix Go module dependencies in tests/testing module
  • Run E2E vault_integration_test.go tests
  • Test full authentication flow with live Vault + Dex

Local Development Setup:

  • Create MEMO-091: Local Vault + Dex setup guide
  • Docker Compose configuration for local testing
  • Step-by-step setup instructions

Pattern Extension:

  • Extend session middleware to Producer pattern
  • Extend session middleware to Consumer pattern
  • Add session-aware examples for all patterns

Documentation:

  • Create operator guide for production Vault setup
  • Create troubleshooting guide for common issues
  • Add performance benchmarks for session caching

Success Criteria

  • ✅ User JWT tokens exchanged for Vault tokens
  • ✅ Dynamic backend credentials fetched from Vault
  • ✅ Credentials renewed automatically before expiration
  • ✅ Credentials revoked on session end
  • ⚠️ E2E tests with Vault testcontainer (blocked by module deps)
  • ✅ Pattern plugins use per-session credentials (KeyValue complete)
  • ⚠️ Backend logs show unique usernames per session (pending Vault setup)

Overall Status: 85% Complete (code done, testing pending infrastructure)

Next Steps

  1. Week 1: Start with Vault client foundation (pkg/authz/vault_client.go)
  2. Review Point: End of Week 2 - credential lifecycle management complete
  3. Review Point: End of Week 4 - session manager integrated with pattern plugins
  4. Final Review: End of Week 6 - E2E tests passing, documentation complete

Appendix: Code Structure

pkg/authz/
├── vault_client.go # Vault SDK client wrapper
├── vault_credentials.go # Credential fetching
├── vault_renewal.go # Background renewal
├── vault_revocation.go # Lease cleanup
├── token_validator.go # JWT validation
├── token_extractor.go # Extract from gRPC
├── token_cache.go # Validation caching
├── session_manager.go # Session lifecycle
├── k8s_auth.go # Kubernetes SA auth
├── aws_auth.go # AWS IAM auth
├── service_identity.go # Service identity types
├── service_session.go # Service session manager
├── types.go # Shared types
├── vault_test.go # Vault client tests
├── renewal_test.go # Renewal tests
├── token_test.go # Token tests
├── session_test.go # Session tests
└── service_auth_test.go # Service auth tests

patterns/keyvalue/
└── session.go # Redis session integration

patterns/consumer/
└── session.go # Kafka session integration

patterns/producer/
└── session.go # NATS session integration

tests/testing/
├── backends/vault.go # Vault testcontainer
├── vault_integration_test.go # E2E Vault tests
└── service_auth_test.go # Service auth tests

Revision History

  • 2025-11-17: Initial implementation plan for Phase 2 Vault integration