electric-postgres-security について
Electric v1.xをデプロイするチーム向けのPostgresセキュリティチェックリストです。本番導入前に、権限、テーブル設定、接続方式、論理レプリケーションの要件を確認できます。
主な機能
- 01REPLICATIONとテーブル権限の確認
- 02テーブルのレプリカアイデンティティ確認
- 03publicationへのテーブル登録確認
- 04直接接続とwal_levelの確認
- 05シークレットと導入要件の点検
活用シーン
- 01Electricの導入前にDB設定を監査
- 02同期テーブルの欠落や変更漏れの調査
- 03論理レプリケーションでのプーラー利用回避
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ electric-sql/ electric --skill electric-postgres-securityインストール後、Claude Code で/electric-postgres-securityを入力して読み込まれたか確認します。
詳細
このスキルは electric-proxy-auth を基にしています。プロキシのセキュリティパターンについて、先にそちらをお読みください。
Electric — Postgres セキュリティチェックリスト
Electric を本番環境にデプロイする前に、各セクションを確認してください。
ユーザー権限の確認
確認:Electric ユーザーに REPLICATION ロールがある
期待される結果:
SELECT rolreplication FROM pg_roles WHERE rolname = 'electric_user';
-- Should return: true
失敗条件:rolreplication = false、またはユーザーが存在しません。
修正方法:ALTER ROLE electric_user WITH REPLICATION;
確認:Electric ユーザーに同期対象テーブルの SELECT 権限がある
期待される結果:
SELECT has_table_privilege('electric_user', 'todos', 'SELECT');
-- Should return: true
失敗条件:false が返されます。
修正方法:GRANT SELECT ON todos TO electric_user; または GRANT SELECT ON ALL TABLES IN SCHEMA public TO electric_user;
確認:Electric ユーザーにデータベースの CREATE 権限がある
期待される結果:
SELECT has_database_privilege('electric_user', current_database(), 'CREATE');
-- Should return: true (unless using manual publishing mode)
失敗条件:false が返され、ELECTRIC_MANUAL_TABLE_PUBLISHING=true を使用していません。
修正方法:GRANT CREATE ON DATABASE mydb TO electric_user;
テーブル設定の確認
確認:すべての同期対象テーブルで REPLICA IDENTITY FULL が設定されている
期待される結果:
SELECT relname, relreplident
FROM pg_class
WHERE relname IN ('todos', 'users')
AND relreplident = 'f'; -- 'f' = FULL
失敗条件:relreplident が 'd'(デフォルト)または 'n'(なし)です。
修正方法:ALTER TABLE todos REPLICA IDENTITY FULL;
確認:テーブルが Electric パブリケーションに含まれている
期待される結果:
SELECT tablename FROM pg_publication_tables
WHERE pubname = 'electric_publication_default';
失敗条件:同期対象テーブルが一覧にありません。
修正方法(手動モード):ALTER PUBLICATION electric_publication_default ADD TABLE todos;
接続の確認
確認:DATABASE_URL が直接接続を使用している(プーラーではない)
期待される結果:
DATABASE_URL=postgres://user:pass@db-host:5432/mydb
失敗条件:URL が接続プーラー(例:ポート 6432 の PgBouncer、Supabase プーラー)を指しています。
修正方法:DATABASE_URL には Postgres への直接接続を使用してください。プールされたクエリには、別途 ELECTRIC_POOLED_DATABASE_URL を設定してください。
確認:wal_level が logical に設定されている
期待される結果:
SHOW wal_level;
-- Should return: logical
失敗条件:replica または minimal が返されます。
修正方法:postgresql.conf で wal_level = logical を設定し、Postgres を再起動してください。
よくあるセキュリティ上の誤り
重大:DATABASE_URL に接続プーラーを使用している
誤り:
DATABASE_URL=postgres://user:[email protected]:6432/mydb
正しい設定:
DATABASE_URL=postgres://user:[email protected]:5432/mydb
ELECTRIC_POOLED_DATABASE_URL=postgres://user:[email protected]:6432/mydb
接続プーラー(PgBouncer 1.23 以降を除く)は、論理レプリケーションをサポートしていません。Electric はレプリケーションスロットのため、Postgres に直接接続する必要があります。
出典:website/docs/guides/deployment.md:91
高:テーブルに REPLICA IDENTITY FULL が設定されていない
誤り:
CREATE TABLE todos (id UUID PRIMARY KEY, text TEXT);
-- Replica identity defaults to 'default' (PK only)
正しい設定:
CREATE TABLE todos (id UUID PRIMARY KEY, text TEXT);
ALTER TABLE todos REPLICA IDENTITY FULL;
REPLICA IDENTITY FULL がないと、Electric は更新や削除時に行全体をストリーミングできません。更新時に、主キー以外の列が欠落する可能性があります。
出典:website/docs/guides/troubleshooting.md:373
高:Electric ユーザーに REPLICATION ロールがない
誤り:
CREATE USER electric_user WITH PASSWORD 'secret';
正しい設定:
CREATE USER electric_user WITH PASSWORD 'secret' REPLICATION;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO electric_user;
Electric は論理レプリケーションを使用するため、データベースユーザーに REPLICATION ロールが必要です。
出典:website/docs/guides/postgres-permissions.md
デプロイ前のまとめ
- Electric ユーザーに
REPLICATIONロールがある - Electric ユーザーにすべての同期対象テーブルの
SELECT権限がある - Electric ユーザーにデータベースの
CREATE権限がある(または手動パブリッシュが設定されている) - すべての同期対象テーブルに
REPLICA IDENTITY FULLが設定されている - すべての同期対象テーブルが Electric パブリケーションに含まれている
-
DATABASE_URLが Postgres への直接接続を使用している(プーラーではない) - Postgres の設定で
wal_level = logicalになっている -
ELECTRIC_SECRETが設定されている(ELECTRIC_INSECURE=trueを使用していない) - シークレットはサーバー側でのみ注入されている(クライアントバンドルには決して含めない)
関連項目:electric-proxy-auth/SKILL.md — プロキシがシークレットを注入し、Postgres のセキュリティ機能がそれを適用します。 関連項目:electric-deployment/SKILL.md — デプロイには Postgres の適切な設定が必要です。
バージョン
Electric sync service v1.x が対象です。