Passa al contenuto principale

ADR-0021 — Auth Kamailio↔Postgres: SCRAM password (mTLS rimandato)

Data: 2026-06-02 Stato: ACCETTATO Decisori: Massimo (architetto) Correlato: ADR-0020 (dynamic registration / usrloc db_mode=3), ADR-0008 (Kamailio HA), incident report 2026-06-01 (commissioning del tier signaling).

Contesto

Durante il commissioning del registrar SIP (ADR-0020, usrloc db_mode=3 su Postgres) è emerso che il tier kamailio↔DB non era mai stato cablato sui nodi reali:

  • Kamailio (usrloc, permissions) e akira-kam-sync si connettono come akira_kamailio, che è un ruolo NOLOGIN (gruppo). Il ruolo LOGIN è akira_kamailio_login (membro di akira_kamailio, eredita i grant) ma era stato creato senza password.
  • Il db_url usava schema postgresql:// (il modulo db_postgres di kamailio vuole postgres://) e sslmode=verify-full + cert client (mTLS), mentre db-01 ha SSL off e il pg_hba reale non aveva alcuna regola per l'utente kamailio (solo akira_app/ akira_ro, scram-sha-256).
  • Conseguenza: kamailio-htable-sync falliva (timeout DB) e usrloc db_mode=3 non poteva partire. Staging non ha mai portato traffico reale → è commissioning, non incidente.

Decisione

Per il commissioning, auth kamailio↔Postgres = SCRAM password, niente mTLS.

  • Utente di connessione: akira_kamailio_login (LOGIN, membro del gruppo akira_kamailio da cui eredita i grant: DML su location per db_mode=3, SELECT sulle sorgenti htable). Password SCRAM impostata dal ruolo timescaledb da vault_kamailio_db_password.
  • db_url (permissions, usrloc) e DATABASE_URL (kam-sync): schema postgres:// (libpq) / postgresql+asyncpg:// (kam-sync), sslmode=disable / DATABASE_TLS_ENABLED=false (coerente con DB SSL off su staging). Rimossi sslmode=verify-full/sslcert/sslkey.
  • pg_hba (db-01 + db-02): regole host ... akira_kamailio_login ... scram-sha-256 dai nodi sip (10.0.0.0/16 + 100.64.0.0/10). Già presenti nel ramo scram del template timescaledb (gated su postgres_tls_enabled=false); applicate in modo additivo sul live + reload SIGHUP (no restart), con backup del pg_hba.

Alternativa scartata (per ora)

mTLS (hostssl + clientcert + ident map akira_mtls): già modellato nel template timescaledb (ramo postgres_tls_enabled=true) e nei cert kam-sync.crt/key. Richiede SSL on sul DB (restart), cert client per kamailio db_postgres (supporto via URL incerto) e mapping ident. Rimandato a un hardening tier-wide (tutti i ruoli DB su mTLS insieme), non sul path critico del commissioning della registrazione.

Conseguenze

  • Sblocca usrloc db_mode=3 + ripara kamailio-htable-sync (stessa connessione).
  • Debito: passare a mTLS in un secondo momento (riabilitare postgres_tls_enabled=true + db_postgres con cert / o pgbouncer mTLS davanti). Tracciare come task hardening.
  • Versionato: db_url/env nel ruolo kamailio; password + pg_hba scram nel ruolo timescaledb; grant nelle migration (già presenti).