3.4. 安全性

3.4.1. 认证
3.4.2. 授权

3.4.1. 认证

更改密码时加密密码

  • 使用 CREATE/ROLE ... PASSWORD 'some_password' 会直接发送并记录指定的密码。因此,指定未加密的密码是危险的。

  • 这些语句接受加密后的密码(使用 MD5 或 SCRAM 进行哈希)。

  • ltsql 的 \password 命令非常方便

    • ltsql 执行 "SHOW password_encryption" 来确定密码哈希方案(MD5 或 SCRAM),对提供的密码进行哈希处理,然后发出 ALTER 命令。

    • 哈希后的密码仍然可能出现在服务器日志中。暂时将 log_min_error_statement 设置为 'PANIC' 可防止这种情况。

数据库内的认证配置文件功能非常有限

  • Lightdb 仅提供使用 CREATE/ROLE VALID UNTIL 'some_timestamp' 进行密码过期的功能。

  • 不提供以下功能:

    • 强制密码复杂度

    • 当在一定时间内失败登录尝试次数超过阈值时锁定用户账户

    • 在一定天数内限制重复使用相同的密码

实现密码复杂度:可以使用以下任一方法:

  • 外部身份服务如 LDAP 或 Kerberos

  • 证书认证

    • 使用 SSL 客户端证书进行认证。不需要密码。

跟踪失败的登录尝试:可以执行以下任一操作:

  • 在服务器日志中搜索包含 “password authentication failed” 或 SQLSTATE 28P01 (invalid_password) 的消息

    • 使用 SQLSTATE 比使用消息文本更好,因为消息可能会根据服务器版本和 lc_message 设置而变化。(在 log_line_prefix 中添加 %e 以输出 SQLSTATE。)

3.4.2. 授权

角色权限默认继承

  • 在 SQL 标准和其他 DBMS 中,使用 SET ROLE 来获取另一个角色的权限。

  • 在 Lightdb 中,一个角色自动继承其所属的其他角色的权限。这可能会令人惊讶。

  • 为了接近 SQL 标准,对于用户和角色使用 NOINHERIT。

预定义的角色

  • 提供了一些角色来赋予非超级用户部分管理权限。

  • 可以通过 GRANT 授予。

  • 代表性角色包括:

    • pg_monitor:可以读取各种有用的配置设置、统计信息和其他系统信息。

    • pg_signal_backend:可以向其他后端发送信号来取消查询或终止会话。

    • pg_read_server_files、pg_write_server_files 和 pg_execute_server_program:作为数据库运行的用户访问服务器上的文件和运行程序。例如,这允许 COPY 数据到/从服务器上的文件或其他程序如 gzip 和 curl。

默认权限

  • ALTER DEFAULT PRIVILEGES 可以设置将在未来创建的数据库对象上自动授予的默认权限。

    • 例如, ALTER DEFAULT PRIVILEGES IN SCHEMA app_schema GRANT INSERT, UPDATE, DELETE, SELECT ON TABLES TO app_user;

  • 目标数据库对象包括模式、表、视图、序列、函数和类型。

  • 不改变现有数据库对象的权限。