mcpField
E
electric-postgres-security

electric-postgres-security

github.com/electric-sqlセキュリティ10.4k38 回インストール3 週間前に更新
リポジトリ

electric-postgres-security について

Electric v1.xをデプロイするチーム向けのPostgresセキュリティチェックリストです。本番導入前に、権限、テーブル設定、接続方式、論理レプリケーションの要件を確認できます。

主な機能

  1. 01REPLICATIONとテーブル権限の確認
  2. 02テーブルのレプリカアイデンティティ確認
  3. 03publicationへのテーブル登録確認
  4. 04直接接続とwal_levelの確認
  5. 05シークレットと導入要件の点検

活用シーン

  1. 01Electricの導入前にDB設定を監査
  2. 02同期テーブルの欠落や変更漏れの調査
  3. 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 が対象です。

コメント