Postgresql 远程连接以及用户管理

460 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21 天,点击查看活动详情

墨菲定律(Murphy's Law)

Anything that can go wrong will go wrong.
如果事情可能出错就总会出错。

—— Nevil Maskelyne

Postgresql 开启远程连接

上一篇 Postgresql 文章已经在虚拟机里安装将数据库装完了,并且能够在本地连接上数据库。然而,如果这时尝试在虚拟机外用客户端连接已经启动的服务,你会发现连接被拒绝了。

这是因为 Postgresql 默认只允许本地连接,这点和 MySQL 是一致的。如果需要在本机之外进行访问,那么就需要进行配置。

这个配置文件是 /usr/local/pgsql/data/postgresql.conf。没错,就是上一篇文章我们初始化数据的文件夹目录中,这里有 Postgresql 提供的许多配置文件。比如 pg_hba.conf 是管理客户端授权配置的,以及 pg_ident.conf 当使用外部的授权系统时用于用户名映射。

首先,我们需要修改 postgresql.conf,在这里需要找到 listen_addresses 配置项,将其配置改为 '*'

image.png

然后重启下 Postgresql 服务,就能接受外部过来的请求了。这个时候我们尝试连接下,emmmmm,发现并不行。

image.png

这是因为即使能够监听外部连接,但是还需要对用户进行授权,接下来看看 Postgresql 中的用户,角色 以及授权的方法。

Postgresql 中的用户

在PostgreSQL中,角色可以被认为是一个数据库用户,也可以被认为是一组数据库用户,这取决于角色是如何设置的。角色可以拥有数据库对象(例如,表和函数),并可以将这些对象上的特权分配给其他角色,以控制谁可以访问哪些对象。此外,还可以将角色中的成员资格授予另一个角色,从而允许成员角色使用分配给另一个角色的特权。

来看下怎么创建一个角色,以下命令是在 psql 中使用。

CREATE ROLE name; # 创建一个名字为 name 的角色
DROP ROLE name; # 删除名字为 name 的角色

用户管理的命令也是一样需要在 psql 中执行。

createuser name; # 创建一个名字为 name 的用户
dropuser name;  # 删除名字为 name 的用户

如果需要配置密码,可用下面的命令。

# 创建一个名称为 name 的角色,密码为 string
CREATE ROLE name PASSWORD 'string'

想修改现有用户密码,用 alter role 语句。来看下示例。

ALTER ROLE name password '123456'; # 将名称为 name 的角色密码设置为 123456

对用户进行授权

建立用户之后,其实还不能进行连接,需要在文件 pg_hba.conf 对用户进行授权。本地 localhost 是默认允许连接的。我们来看看它的结构。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

各个字段解释如下。

  • type:代表授权的连接类型,可选的值有
    • local:使用 unix 文件进行连接
    • host:使用 TCP/IP socket 进行连接
    • hostnossl:不采用双向加密的 TCP/IP socket 进行连接
    • hostssl:采用双向加密的 TCP/IP socket 进行连接
    • hostgssenc:采用 GSSAPI-encrypted 对 TCP/IP socket 进行加密
    • hostnogssenc:不采用 GSSAPI-encrypted 对 TCP/IP socket 进行加密
  • database:授权的操作的数据库
  • user:授权的用户
  • ADDRESS:授权连接的地址
  • METHOD:代表授权方法,可选项有 trustrejectmd5password scram-sha-256gsssspiidentpeerpamldapradiuscert。其中 trust 代表绝对信任,只要其它字段能命中就可以连接,而 password 则需要填写用户名和密码,能够匹配才能连接成功。

来看个示例。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             192.168.56.0/24         password

上面的配置代表连接类型为 tcp 连接,对所有用户以及数据库,在连接地址为 192.168.56.0/24 时,需要用密码进行连接。

这样,Postgresql 就可以使用用户进行远程登录了。