Infisical PAM 如何配置 PostgreSQL 账号密码自动轮换(含委派轮换角色授权)?
【免费下载链接】infisicalInfisical is the open-source platform for secrets, certificates, and privileged access management.项目地址: https://gitcode.com/GitHub_Trending/in/infisical
Infisical PAM(Privileged Access Management)可以把 PostgreSQL 数据库账号的密码按固定周期自动轮换,缩短泄露或共享密码的有效窗口。一次可用的自动轮换需要两部分配置配合:账号模板决定"是否轮换、多久一次、新密码的格式",账号决定"由哪个特权账号执行轮换"(即轮换账号)。只有模板开启了轮换、且账号选定了轮换账号,账号才会真正进入轮换计划。
这篇文章覆盖完整配置路径,重点讲委派轮换:即用一个权限更高的 PostgreSQL 角色代替目标账号修改其密码,以及在 PostgreSQL 16+ 上为这个委派角色补齐必要的ADMIN OPTION授权。
轮换的执行机制
轮换触发时,Infisical 使用轮换账号连接到目标数据库,执行:
ALTER USER "<target_role>" WITH PASSWORD '<generated_password>';连接使用账号在 PAM 中已保存的连接信息(包括 SSL 设置),因此 TLS 启用的数据库不需要额外配置。
整个流程分四步:
- 按模板的密码格式生成一个新密码;
- 用轮换账号连接目标资源并应用新密码;
- 用新密码打开一次全新连接做验证;
- 验证通过后将新密码提升为当前凭据。
任何一步失败,已有凭据保持不动,账号的轮换状态会记录错误。所以轮换本身自带"验证后生效"的语义,不会把目标数据库改成一个谁都登不上的状态。
准备:数据库侧的委派轮换角色
先确认你需要的操作角色:
- 模板级轮换设置(是否自动轮换、频率、密码格式)由Product Admin角色管理;
- 给账号选择轮换账号、手动触发轮换需要该账号所在文件夹或账号本身上有Admin角色。
如果目标账号自己改自己的密码(自轮换),任何角色都可以,无需额外授权。委派轮换则要求轮换账号能够ALTER目标角色:给它授予CREATEROLE,或者直接使用 superuser。
在目标 PostgreSQL 库中创建专用的委派轮换角色。下面的示例来自官方文档,temporary_password是示例值,请按你的密码策略替换为真实密码(infisical_rotator和app_user是文档中的示例角色名,同样可替换):
-- Infisical 执行轮换时连接的账号 CREATE ROLE infisical_rotator WITH LOGIN PASSWORD 'temporary_password' CREATEROLE; -- 密码会被轮换的目标账号 CREATE ROLE app_user WITH LOGIN PASSWORD 'temporary_password';PostgreSQL 16 及之后的版本有一条额外限制:CREATEROLE角色只能修改自己持有ADMIN OPTION的角色。如果你的库是 16+,需要补一条授权,或者干脆用 superuser 做轮换账号:
GRANT app_user TO infisical_rotator WITH ADMIN OPTION;第一步:在账号模板上启用轮换
以 Product Admin 身份进入Privileged Access Management → Account Templates,打开目标账号所用的模板(PostgreSQL 账号对应的模板,如默认的postgres或自建模板),在Credential settings区域:
- 打开Automatically rotate credentials,并设置轮换频率,可选:every 1 hour、12 hours、24 hours、7 days、30 days。该频率适用于所有由该模板创建的账号。如果暂时关闭,模板变为 on-demand only:账号仍可手动触发轮换,但不会按计划自动执行。
- 设置生成密码的长度和字符类别(大写字母、小写字母、数字、符号),确保满足目标数据库的密码策略。
一个硬限制:符号集合中不能包含'、"、`、\、;、?,因为这些字符会破坏针对目标执行的改密语句。
注意:修改模板的轮换设置会立即更新该模板下所有账号的轮换计划;尚未选定轮换账号的账号仍保持未排期,直到设置完成。
第二步:创建轮换账号和目标账号
在 PAM 中,轮换账号和目标账号必须是同一个资源上的两个独立 PostgreSQL 账号。委派轮换账号必须与被轮换账号连接同一资源——对数据库来说就是同一个 host 和 port(两者可以是不同用户,例如一个特权管理员轮换权限较低的账号)。
进入Privileged Access Management → Accounts → Add Account:
- 选择文件夹和 PostgreSQL 模板;
- 填写连接信息:Host(数据库主机名或 IP,也可以直接粘贴连接串自动填充)、Port(默认 5432)、Database、SSL Enabled(如启用 TLS 建议按实际情况勾选,并可设置Reject Unauthorized和自定义 CA 证书);
- 认证方式选Password(标准用户名/密码登录),填入对应角色(
infisical_rotator或app_user)的用户名和密码; - 选择Create。
按同样方式为第二个角色创建另一个账号。两个账号指向同一实例即可。
注意:使用AWS IAM认证方式的 PostgreSQL 账号(RDS/Aurora)不存储密码,没有可轮换的对象,不能设置轮换账号。本文路径只适用于密码认证的账号。
第三步:在 Rotation 页签选择轮换账号
打开被轮换的账号,进入Rotation页签。该页签会显示从模板继承的频率和密码格式。从同一资源的合格账号列表中选择轮换账号:
- 选另一个权限更高的账号(如
infisical_rotator):委派轮换,对应数据库侧已完成的CREATEROLE/ superuser 授权; - 选列表中的this account:自轮换,账号修改自己的密码,数据库侧无需额外授权;
- 保持None:轮换未配置,即使模板已开启,账号也不会轮换。
如果账号显示"配置前不会轮换",就是这里还没选轮换账号(或尚未配置自轮换所需的凭据),补上选择即可。
立即触发并验证结果
不想等下一个计划时间点时,在 Rotation 页签选择Rotate now立即执行一次。手动轮换计为一次正式轮换:计划周期会重置,下一次自动轮换在完整一个周期之后发生。
验证方式依据轮换机制本身:
- 成功:新密码经过全新连接验证后才提升为当前凭据,账号凭据即为新密码;
- 失败:已有凭据保持不动,账号的轮换状态中记录错误信息——此时应检查轮换账号是否具备改密权限(委派场景下重点核对
CREATEROLE,以及 PostgreSQL 16+ 的ADMIN OPTION是否已授予),以及两个账号是否指向同一 host/port。
限制与边界
- 委派轮换账号与被轮换账号必须同资源(同 host 和 port),跨实例无法委派。
- 密码格式中的符号不能包含
'、"、`、\、;、?,配置模板时就要避开。 - AWS IAM 认证的 PostgreSQL 账号没有存储密码,不适用凭据轮换。
- 模板改频率后,所有使用该模板的账号计划同步更新;个别账号需要不同频率时应放到另一个模板。
相关文档:凭据轮换总览、PostgreSQL 轮换说明、PostgreSQL 账号、账号模板。
【免费下载链接】infisicalInfisical is the open-source platform for secrets, certificates, and privileged access management.项目地址: https://gitcode.com/GitHub_Trending/in/infisical
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考