mcpField
E
electric-postgres-security

electric-postgres-security

github.com/electric-sql安全10.4k38 次安装3 周前更新
代码仓库

关于 electric-postgres-security

面向 Electric v1.x 部署者的 Postgres 安全检查清单,涵盖权限、表配置、连接方式和逻辑复制设置。可用于生产部署前核对关键要求。

主要功能

  1. 01核对 REPLICATION 与表权限
  2. 02检查表的 REPLICA IDENTITY
  3. 03确认表已加入 publication
  4. 04检查直连配置与 wal_level
  5. 05核对密钥和部署前事项

适用场景

  1. 01部署 Electric 前检查数据库设置
  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 同步服务 v1.x。

评论

支持 Markdown