3. 认证机制与连接安全

数据库访问控制的第一道闸门是“证明你是谁”。如果认证环节被绕过或弱化,后续的授权、审计、脱敏都失去意义。本节围绕数据库认证与连接安全,从密码策略、多因素认证、证书认证、Kerberos/LDAP 集成到连接加密,梳理一条从“身份证明”到“通道保护”的完整链路。

一、密码策略:不是设个密码就完事

数据库密码策略的核心目标,是提高暴力破解和撞库的成本。以 MySQL 8.0 为例,可以通过 validate_password 组件强制密码复杂度:

INSTALL COMPONENT 'file://component_validate_password';
SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;

这样设置后,密码必须至少 12 位,且同时包含大小写字母、数字和特殊字符。策略之外,还需关注三件事:一是密码有效期,通过 default_password_lifetime 控制,例如设为 90 天;二是失败锁定,MySQL 8.0 提供 FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME,连续失败 5 次锁定 1 天;三是历史密码不可复用,避免用户改回旧密码。PostgreSQL 则通过 password_encryption = scram-sha-256 强制使用 SCRAM 认证,替代已不安全的 md5。

密码策略要区分“服务账号”和“人员账号”。服务账号通常使用长随机密钥并定期轮换,人员账号才适合复杂度加有效期的组合策略。

二、多因素认证:密码之外的第二个证据

多因素认证(MFA)要求用户提供两类以上证据:知识(密码)、持有(令牌、手机)、生物特征。数据库本身对 MFA 的原生支持有限,常见做法是借助外部认证代理。例如 PostgreSQL 可结合 pam 认证,把 MFA 交给系统的 PAM 模块;MySQL 企业版支持 LDAP 和 Kerberos 插件,可在此基础上叠加一次性口令。

一个典型的 MFA 登录流程是:用户输入密码通过第一因素验证,系统向绑定的 TOTP 应用发送动态码,用户输入 6 位动态码完成第二因素。动态码基于时间窗口生成,通常 30 秒刷新一次,服务端允许前后一个窗口的容差。MFA 的价值在于:即使密码泄露,攻击者没有第二因素也无法登录。

三、证书认证:用密钥对替代密码

证书认证基于 TLS 双向认证,客户端持有由 CA 签发的证书和私钥,数据库服务端验证证书链和 CN/SAN 字段。MySQL 中可创建要求 SSL 的用户:

CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass!2024'
  REQUIRE X509;
-- 或更严格:REQUIRE SUBJECT '/CN=app_user/O=Example'

PostgreSQL 则在 pg_hba.conf 中配置 hostssl all all 0.0.0.0/0 cert clientcert=verify-full,要求客户端证书的 CN 与数据库用户名一致。证书认证适合服务间通信和自动化任务,因为无需人工输入密码,且私钥可存放在受保护的密钥库中。

四、Kerberos 与 LDAP 集成:集中身份管理

当企业已有统一身份目录时,数据库不应维护独立账号体系。Kerberos 提供票据式认证,用户先向 KDC 申请 TGT,再用 TGT 申请数据库服务票据,数据库验证票据后建立连接。MySQL 企业版和 PostgreSQL 都支持 GSSAPI/Kerberos 认证。LDAP 集成则更常见:数据库将用户名和密码转发给 LDAP 服务器验证,或直接查询目录中的用户属性。MySQL 的 authentication_ldap_simple 插件即属此类。

集成时要注意:LDAP 绑定密码应使用专用只读账号,避免明文传输,配合 LDAPS 或 StartTLS;Kerberos 需确保时钟同步,否则票据会因时间偏差失效。

五、连接加密:保护传输中的凭据与数据

即使认证通过,如果连接是明文的,密码和数据仍可能被嗅探。因此必须启用 TLS。MySQL 中通过 require_secure_transport = ON 强制所有连接使用 SSL/TLS;PostgreSQL 设置 ssl = on 并配置证书路径。TLS 版本应不低于 1.2,推荐 1.3,并禁用弱加密套件。

下图展示了从客户端到数据库的认证与连接安全链路,涵盖密码、MFA、证书、Kerberos/LDAP 以及 TLS 加密通道的关系。

客户端 应用 / 用户 密码策略 复杂度 / 有效期 / 锁定 多因素认证 MFA 密码 + TOTP / 令牌 证书认证 X.509 / 双向 TLS Kerberos / LDAP 集中身份目录 认证决策 验证身份 TLS 加密通道 TLS 1.2+ / 证书 数据库 实例 / 集群 认证方式可组合使用:密码 + MFA 用于人员账号,证书用于服务账号,Kerberos/LDAP 用于统一身份。 无论采用哪种认证,连接层都应启用 TLS,防止凭据和数据在传输中被窃听或篡改。

六、组合策略与落地建议

实际环境中,认证方式往往组合使用。人员账号采用“密码 + MFA”,服务账号采用“证书 + 固定 IP 白名单”,内部系统间调用采用 Kerberos 票据。连接层统一强制 TLS,并定期轮换证书和密钥。建议按以下顺序落地:先启用 TLS 和强密码策略,再对高权限账号开启 MFA,最后将服务账号迁移到证书或 Kerberos 认证。

认证方式 适用对象 关键配置 注意事项
密码策略 人员账号 复杂度、有效期、失败锁定 避免服务账号使用固定密码
MFA 高权限人员 TOTP / PAM 集成 动态码时间窗口容差
证书认证 服务账号 REQUIRE X509 / clientcert 私钥保护与证书轮换
Kerberos/LDAP 企业统一身份 GSSAPI / LDAPS 时钟同步、只读绑定账号
TLS 加密 所有连接 require_secure_transport / ssl=on 禁用弱套件,版本≥1.2
认证配置变更后,务必在测试环境验证连接是否正常,并检查审计日志中是否出现认证失败或降级连接。生产环境直接修改可能导致应用中断。

认证与连接安全不是一次性配置,而是持续运营的过程。密码策略需要定期审查,证书需要提前轮换,MFA 需要覆盖新增的高权限账号,TLS 版本需要跟随安全公告升级。只有把认证链路中的每一环都守住,数据库的访问控制才真正有根基。