Quantcast
Channel: Jimmy He – OracleBlog
Viewing all articles
Browse latest Browse all 129

pg_hba.conf文件的策略顺序

$
0
0

原来一直以为这个文件中,每一行的顺序是没有区别的,但是最近的一个需求,研究时发现,原来这个文件对登录的会话,是从上往下依次判断的:

具体的规则是:

1. 登录的会话,会顺着pg_hba.conf的策略一条一条往下走。
2. 如果遇到匹配到的规则,那么做成判断,是信任,还是拒绝,还是验证密码。后续就不往下走继续判断规则了。
3. 如果某一条规则不符合,没匹配成功,就继续往下走,继续做判断,直到所有的规则都判断完毕。

因此,如果我有一个用于备份的用户,叫anybackup(爱数备份软件),由于权限设置的比较大,需要保证只能在数据库本机登录(利用爱数在数据库本机的agent,登录数据库),且要禁止该用户,从别的主机登录。
我们可以这样写我们的pg_hba.conf文件:

# TYPE  DATABASE      USER           ADDRESS        METHOD
local   all           all                           trust
host    all           anybackup      10.0.0.0/8     reject
host    all           anybackup      127.0.0.1/32   trust
host    replication   repuser        10.0.0.0/8     md5
host    all           all            10.0.0.0/8     md5

这表示:
(1)如果是以本地socket方式连接数据库,则全部信任,无需密码。
(2)如果是通过tcpip(不管是ssl还是非ssl)登录,且是非爱数的anybackup用户,比如正常的业务用户,那么第一行,不是socket登录,不符合,继续往下走;第二行,不是anyback用户,不符合,继续往下走;第三行,也不是anybackup用户,不符合,继续往下走;第四行,不是repuser主从复制用户,不符合,继续往下走;第五行,符合,可以用密码登录。
(3)如果是通过tcpip(不管是ssl还是非ssl)登录,且数据库用户是anybackup,在数据库本机登录,那么第一行,不符合,继续往下走;第二行,匹配到了用户,但是ip地址不符合,继续往下走;第三行,全部符合,登录成功,完成,不往下继续判断了。
(4)如果是通过tcpip(不管是ssl还是非ssl)登录,且数据库用户是anybackup,在远程登录,那么第一行不符合,往下走,第二行符合,直接拒绝连接,已经匹配到规则,所以不往下继续判断。

注意我们这边reject的策略,不能放到最后一行。如果我们配置成这样:

# TYPE  DATABASE      USER           ADDRESS        METHOD
local   all           all                           trust
host    all           anybackup      127.0.0.1/32   trust
host    replication   repuser        10.0.0.0/8     md5
host    all           all            10.0.0.0/8     md5
host    all           anybackup      10.0.0.0/8     reject

那么,我们远程登录的anybackup用户,就会符合第四行的策略,不再进行第五行的判断。


Viewing all articles
Browse latest Browse all 129