# instinct: pg_hba.conf の 127.0.0.1 trust を scram-sha-256 化する前に、各ロールのPW設定とTCP接続依存を確認する。peer(local)接続のアプリは無影響

`pg_hba.conf` の `host all all 127.0.0.1/32 trust`(無認証TCP)を `scram-sha-256` に変えるのは、手順を踏めば安全。本番DB全接続に関わる不可逆操作なので検証付きで。

## 実施前の必須確認(これで安全性が決まる)
1. **各ログインロールにPWがあるか**: `SELECT rolname, CASE WHEN rolpassword LIKE 'SCRAM-SHA-256%' THEN 'OK' WHEN rolpassword IS NULL THEN 'PWなし(壊れる)' END FROM pg_authid WHERE rolcanlogin`
- PWなしロール(例: ubuntu)が **127.0.0.1 TCPで接続している箇所**があるとscram化で壊れる
2. **TCP接続依存の洗い出し**: `grep -rn '@127.0.0.1:5432\|@localhost:5432' ~/workspace` で接続文字列を探す。移行スクリプト(cron無し・実行済み)の残骸なら無害
3. **本番アプリの接続方式**: `.env` が `host=/var/run/postgresql`(ソケットpeer)なら **local行のpeer認証**を使い、scram化(host行のみ変更)と**無関係=無影響**
4. **現在のTCP接続数**: `ss -tnp | grep 127.0.0.1:5432` が0なら今この瞬間trust依存の接続は無い

## 実施手順(vvv shadow #248 PG-01 実証)
```bash
PGHBA=$(sudo -u postgres psql -tA -c "SHOW hba_file;")
sudo cp "$PGHBA" "${PGHBA}.bak.YYYYMMDD" # 1.バックアップ必須
sudo sed -i -E 's|^(host[[:space:]]+all[[:space:]]+all[[:space:]]+127\.0\.0\.1/32[[:space:]]+)trust|\1scram-sha-256|' "$PGHBA"
# vvv_prod/postgres等の個別trust行も同様にscram化・死文(shadow 0.0.0.0/0 md5等)は削除
sudo grep -nE "^local" "$PGHBA" # 2.local peer行が無傷か確認(本番アプリ保護)
sudo systemctl reload postgresql # 3.reload(構文エラーなら失敗)
# 4.即検証(一つでも壊れたら即 cp bak 戻し→reload)
sudo -u postgres psql -d vvv_prod -c "SELECT count(*) FROM videos" # 本番peer接続
PGPASSWORD=$pw psql -h 127.0.0.1 -U claude_readonly -d vvv_prod -c "SELECT 1" # MCP TCP+PW
curl -s -o /dev/null -w '%{http_code}' https://本番/ # サイト200
psql -h 127.0.0.1 -U ubuntu -d vvv_prod -c "SELECT 1" # → Password要求=scram化成功
```

## 関連
- [[instinct-postgres-pw-rotation-socket-safe]] — アプリはpeer接続でPW未使用(scram化と無関係の裏付け)
- [[instinct-config-file-not-served-drift]] — 設定変更後は実機で「実際に効いてるか」確認
- 当初「弱PW平文」等の指摘は実機で覆ることがある(9router shadow2026はbcryptハッシュ化済みだった)。鵜呑みにせず検証

---
(migrated from local memory/instinct_pg_hba_trust_to_scram_safe.md)