密码存储的安全注意事项
CREATE ROLE name [ [ WITH ] option [ … ] ]
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD ‘password’
ENCRYPTED 存储为MD5
UNENCRYPTED 存储为明文
示例:
alter role rep encrypted password ‘123’;
ALTER ROLE
select usename,passwd,md5(‘123rep’) from pg_shadow where usename=’rep’;
usename | passwd | md5
———+————————————-+———————————-
rep | md5a6f8e01c46849ed88d55e3c347ec318a | a6f8e01c46849ed88d55e3c347ec318a
(1 row)
明文
alter role rep unencrypted password ‘123’;
ALTER ROLE
select usename,passwd,md5(‘123rep’) from pg_shadow where usename=’rep’;
usename | passwd | md5
———+——–+———————————-
rep | 123 | a6f8e01c46849ed88d55e3c347ec318a
(1 row)
密码复杂度注意事项
确保已编译passwordcheck, 未编译的话到源码的contrib目录中编译一下
ll $PGHOME/lib/passwordcheck*
-rwxr-xr-x 1 root root 14K Oct 13 09:00 /home/pg93/pgsql/lib/passwordcheck.so
修改数据库配置文件
vi $PGDATA/postgresql.conf
shared_preload_libraries = ‘passwordcheck,pg_stat_statements,auto_explain’
重启数据库
pg_ctl restart -m fast
再次修改密码时, 如果密码太简单会报错
alter role rep unencrypted password ‘123’;
ERROR: password is too short
alter role rep unencrypted password ‘rep1234567RER’;
ERROR: password must not contain user name
alter role rep unencrypted password ‘re1234567RER’;
ALTER ROLE
密码更换周期注意事项
alter role rep VALID UNTIL ‘2013-12-18 00:09:07.549152’;
digoal=> \du+ rep
List of roles
Role name | Attributes | Member of | Description
———–+—————————————————-+———–+————-
rep | Replication +| {} |
| 32 connections +| |
| Password valid until 2013-12-18 00:09:07.549152+08 | |
密码到期后, 将无法认证通过
pg93@db-172-16-3-150-> psql -h 172.16.3.150 -U rep digoal
Password for user rep:
psql: FATAL: password authentication failed for user “rep”
文件pg_hba.conf详解可参考以下链接:
https://www.postgresql.org/docs/9.5/static/auth-pg-hba-conf.html
TYPE DATABASE USER ADDRESS METHOD
认证类型(pg_hba.conf - TYPE)
local 本地unix socket, host, hostssl, hostnossl ; (host支持hostssl和hostnossl两种模式), ssl表示网络传输的数据使用加密方式传输,
包括认证过程也加密.
认证方法(pg_hba.conf - METHOD) 逐条匹配, 如果匹配到了则不需要往下匹配了.
trust – 无需密码
reject – 拒绝认证
md5 – 校验过程密码加密传输, 但是其他数据是否加密传输要看配置的认证类型是否为SSL.
password – 校验过度密码明文传输, 如果认证类型为SSL, 则同样会被加密.
gss – 使用GSSAPI认证方法, 仅支持TCP/IP连接
sspi – 使用SSPI认证方法, 仅支持windows
krb5 – 使用Kerberos V5 认证方法,仅支持TCP/IP连接
ident – 客户端操作系统用户和数据库用户映射关系认证, 仅支持tcp/ip连接
peer – 客户端操作系统用户和数据库用户映射关系认证, 仅支持unix socket连接
ldap – 使用LDAP服务认证
radius – 使用radius服务认证
cert – 使用客户端的ssl身份认证.
pam –使用操作系统的PAM认证模块进行认证.
密码方式认证过程的安全注意事项
在没有使用ssl连接类型的情况下, 不要使用password认证方法, 因为这种方法会传输明文密码, 可能被截获.
密码认证的方式请使用md5
密码方式认证如何防范暴力破解和类DDOS攻击
对于输错密码的情况, 延迟反馈给用户密码错误的消息. 这样可以防止暴力破解和类DDoS攻击.
Auth_delay详解可参考链接:
https://www.postgresql.org/docs/9.3/static/auth-delay.html
shared_preload_libraries = ‘auth_delay’
auth_delay.milliseconds = ‘500’
postgresql的鉴权.
使用最小权限范围鉴权, 尽量避免使用all, 0.0.0.0/0这种大范围授权
by 波罗