暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Postgresql访问控制

在PostgreSQL中, 允许哪些IP地址的机器访问数据库服务器是由pg_hba.conf文件来控制的。
HBA是“Host-Based Authentication”的缩写, 也就是基于主机的认证。

pg_hba.conf文件

initdb初始化数据目录时会生成一个默认的pg_hba.conf文件。

pg_hba.conf文件由很多记录组成, 每条记录占一行。
以#开头的注释及空白行会被忽略。
一条记录由若干个空格或制表符分隔的字段组成, 如果字段用引号引起来, 那么它可以包含空白。

每条记录声明一种连接类型、 一个客户端IP地址范围(如果和连接类型相关) 、 一个数据库名、 一个用户名字, 以及对匹配这些参数的连接使用的认证方法。
第一条匹配连接类型、 客户端地址、 连接请求的数据库名和用户名的记录将用于执行认证。
这个处理过程没有“fall-through”或“backup”的说法: 如果选择了一条记录而且认证失败, 那么将不再考虑后面的记录。
如果没有匹配的记录, 访问将被拒绝。

每条记录可以是下面7种格式之一:

local <dbname> <user> <auth-method> [auth-options]
host <dbname> <user> <ip/masklen> <auth-method> [auth-options]
hostssl <dbname> <user> <ip/masklen> <auth-method> [auth-options]
hostnossl <dbname> <user> <ip/masklen> <auth-method>[auth-options]
host <dbname> <user> <ip> <mask> <auth-method> [auth-options]
hostssl <dbname> <user> <ip> <mask> <auth-method> [auth-options]
hostnossl <dbname> <user> <ip> <mask> <auth-method> [auth-options]
复制

也就是说, 记录中第一个字段只能取下面的值:

  • local: 这条记录匹配通过UNIX域套接字的连接认证。
    没有这种类型的记录就不允许UNIX域套接字的连接。
    当psql后面不指定主机名或IP地址时, 即用UNIX域套接字的方式连接数据库。

  • host: 这条记录匹配通过TCP/IP进行的连接, 包括SSL和非SS的连接。

  • hostssl: 这条记录匹配使用TCP/IP的SSL连接, 且必须是使用SSL加密的连接。
    要使用该选项, 编译服务器时必须打开SSL支持, 而且启动服务器时必须打开SSL配置选项。

  • hostnossl: 这条记录与hostssl相反, 只匹配那些在TCP/IP上不使用SSL的连接请求。

记录中第二个字段设置一个数据库名称, 如果设置为“all”, 表示可以匹配任何数据库。
如果设置为“replication”, 表示允许流复制连接, 而不是允许连接到一个名为“replication”的数据库上。
记录中第三个字段设置一个用户的名称, 如果设置为“all”, 表示可以匹配任何用户。

<ip/masklen>表示允许哪些IP地址来访问此服务器, 如192.168.1.10/32表示只允许192.168.1.10这台主机访问该数据库(因为掩码为32, 完全匹配此IP) , 192.168.1.0/24表示IP地址前缀为192.168.1.X的主机都允许访问数据库服务器。

表示验证方法, PostgreSQL支持的认证方式很多, 但常用的只有trust、reject、 md5和ident方法。
平时只需要了解这几种方式的配置方法就可以了, 其他认证方法在使用时查询相关的资料即可。

记录中最后一项[auth-options]表示认证选项。

认证方法

PostgreSQL中支持以下几种验证方法:

  • trust: 无条件地允许连接。
    此方法允许任何可以与PostgreSQL数据库服务器连接的用户以任意PostgreSQL数据库用户身份进行连接, 不需要口令或任何其他认证。

  • reject: 无条件地拒绝连接。
    reject行可以阻止一个特定的主机连接, 而允许其他主机连接数据库。
    这相当于设置了一个黑名单。

  • md5: 要求客户端提供一个MD5加密的口令进行认证。

  • password: 要求客户端提供一个未加密的口令进行认证。
    因为口令是以明文形式在网络上传递的, 所以不应该在不安全的网络上使用此方式。
    一般这种方法使用得很少。

  • gss: 用GSSAPI认证用户。
    只有在进行TCP/IP连接时才能用。

  • sspi: 用SSPI来认证用户。
    仅在Windows系统上使用。

  • krb5: 用Kerberos V5认证用户。
    只有在进行TCP/IP连接时才能用。

  • ident: 通过联系客户端的ident服务器获取客户端操作系统的用户名, 并且检查它是否匹配被请求的数据库用户名。
    ident认证只能在TCP/IP连接上使用。
    当为本地连接指定这
    种认证方式时, 将用peer认证来替代。
    服务器为了确定接收到的连接请求确实是客户端机器上的osdba用户发起的, 而不是这台机器上其他用户发起的假冒请求, 会向客户端机器上的ident服务发起请求, 让ident服务查看此TCP连接是否是osdba用户发起的, 如果不是, 则认证失败。
    如果客户端通过本地连接连接到服务器, 因为客户端与服务器在一台机器上, 数据库服务器可以直接检查客户端用户的操作系统用户身份, 就不需要向ident服务发送请求进行判断了。

  • peer: 数据库端允许客户端上的特定操作系统用户连接到数据库。
    这种认证方式的使用场景如下:客户端是主机上某个操作系统用户, 已经通过了操作系统的身份认证, 是
    数据库服务器可以信任的用户, 不需要在数据库层面再次检测其身份。
    例如, 如果配置了这种认证方式(配置中允许的用户名为“osdba”) , 这时在操作系统用户“osdba”下, 就能以数据库用户osdba的身份连接到数据库。
    这种认证方式与Oracle数据库的操作系统用户认证类似, 在Oracle数据库中, 进入操作系统oracle用户后, 不需要密码就能以“sysdba”的身份连接到本机的Oracle数据库上。

  • ldap: 用LDAP服务器认证。

  • radius: 用RADIUS服务器认证。

  • cert: 用SSL客户端证书认证。

  • pam: 用操作系统提供的可插入认证模块服务(PAM) 来认证。

trust认证方法一般与UNIX域套接字的连接认证组合使用, 对于单用户工作站的本地连接是非常合适和方便的, 因为这台机器只有用户使用, 不存在安全性问题。
如果在多用户的机器上使用trust认证方式, 默认情况下, 这台机器上的任何操作系统用户都可以使用
数据库超级用户连接到数据库, 这会导致安全问题。
为了防止一般的操作系统用户连接到数据库, 需要设置PostgreSQL的UNIX域套接字文件(默认为/tmp/.s.PGSQL.5432) 的访问权限。
要做这些限制, 可以设置unix_socket_permissions参数和unix_socket_group参数, 也可以设置unix_socket_directory, 把UNIX域套接字文件放在一个其他用户无法访问的目录中。

对于TCP/IP的连接认证, 也可以使用trust认证方法, 但TCP/IP方式会导致远程机器上的任何操作用户都可以连接到数据库, 从而带来安全问题。
以密码为基础的认证方法包括md5和password。
这两种方法在操作上非常类似, 但在password方式中, 密码是明文在网络上传输的, 在不安全的网络上密码可能会被截取, 所以通常都用md5方式。

ident认证方法也是用得较多的认证方式, 这种方式通常与UNIX域套接字的连接认证方式组合使用, 这样就可以以操作系统用户认证的方式连接到数据库中。
例如, 在操作系统下创建了一个用户“postgres”, 数据库中也有一个用户“postgres”, 设定ident认证方式后, 在操作系统用户“postgres”下, 可以直接连接到数据库中, 而不需要密码。

认证方法实战

如果一台机器只给数据库使用, 而没有其他用途, 则可以在pg_hba.conf中进行如下配置:

local all all trust
复制

该命令行表示在这台机器上, 任何操作系统的用户都可以以任何数据库用户身份(包括数据库超级用户) 连接到数据库上而不需要密码。
因为这台主机只供数据库使用, 可以把不用的操作系统用户都禁止, 以保证安全性。

如果想在数据库主机上使用密码验证, 可以使用如下配置:

local all all md5
复制

如果想让其他主机的连接都使用md5密码验证, 则使用如下配置:

host all all 0.0.0.0/0 md5
复制

如果数据库中有一个用户“osdba”, 操作系统中也有一个用户“osdba”, 在操作系统“osdba”用户下连接数据库不需要密码验证的设置方法如下:

local all osdba ident
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论