关于 electric-postgres-security
面向 Electric v1.x 部署者的 Postgres 安全检查清单,涵盖权限、表配置、连接方式和逻辑复制设置。可用于生产部署前核对关键要求。
主要功能
- 01核对 REPLICATION 与表权限
- 02检查表的 REPLICA IDENTITY
- 03确认表已加入 publication
- 04检查直连配置与 wal_level
- 05核对密钥和部署前事项
适用场景
- 01部署 Electric 前检查数据库设置
- 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 同步服务 v1.x。