更改密码时加密密码
使用 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。)
角色权限默认继承
在 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;
目标数据库对象包括模式、表、视图、序列、函数和类型。
不改变现有数据库对象的权限。