在开发验证器插件之前,请务必完整研读本节的所有安全准则。一个存在安全漏洞的验证器在危害程度上往往远甚于完全不开启认证,不仅因为它会提供虚假的安全感,而且极可能成为突破整套企业级 OAuth 生态的跳板。
虽然不同模块在校验方案上各有不同,但标准实现通常必须严密执行以下三项独立动作:
验证器必须首先确保客户端出示的凭据确实是由受信机构签发的有效 Bearer 令牌。主要支持在线与离线两种模式: 在线内省验证(Online Introspection,基于 RFC 7662)通过向远端 IdP 发起网络请求核验,支持即时撤销被盗令牌,但会引入网络时延(每次握手耗时受限于 authentication_timeout); 离线密码学校验(Offline Validation)则在本地维护受信公钥证书链并核验数字签名,同时严格核对签发者(Issuer)、受众(Audience)以及有效期(Expiration),其优势在于零网络开销。
验证器必须校验令牌中声明的权限范围(Scopes),确保终端用户确实明确授权了该客户端代其访问数据库资源,防范第三方客户端在用户不知情的情况下以用户身份越权窃取数据。
从令牌声明(Claims)中提取出最终用户的权威身份标识(如企业统一员工号、邮箱或 UUID),并将其安全传递给数据库服务端(会话内部可通过系统函数 system_user 查阅)。
严禁将客户端出示的原始 Token 或其敏感片段打印输出至系统运行日志中,即便被判定为非法令牌也严禁落盘泄露。
在认证阶段遇到校验异常时,模块应优先使用 COMMERROR 级别记录错误,避免向未经验证的匿名网络连接泄露过多内部架构细节。
在执行阻塞式网络 I/O 时,必须支持响应操作系统信号(如使用 WaitLatchOrSocket()),确保系统能够平滑处理认证超时与服务重启信号。
验证模块的标准交付物是用户标识符,随后服务器会将其与已配置的 pg_ident.conf 映射 进行比对,以确定最终用户是否被允许连接。然而,OAuth 本身就是一个授权框架,令牌中可能已携带用户权限信息(例如用户所属的组织组或所允许扮演的角色),在每台数据库服务器上重复维护本地用户映射并不理想。
为了完全绕过用户名映射,由验证模块直接承担授权用户连接的额外职责,可在 HBA 中配置 delegate_ident_mapping。模块随后可利用令牌的作用域(Scope)或等价方法直接判定用户是否有权以期望角色建立连接。
通过这种机制,认证本身甚至可以是可选的。只要模块判定连接已获授权,即便完全未记录任何用户标识符,登录也能顺利完成。这使得实现数据库的匿名或假名访问成为可能,第三方提供商负责全部认证,而无需向数据库服务端暴露个人身份细节。
用户映射委派带来了极高的架构灵活性,但它也使验证模块成为连接授权的单一依赖点,生产部署时应审慎评估。