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

[译文] PostgreSQL 数据库安全性:操作系统 – 身份验证

原创 Ibrar Ahmed 2021-09-01
2491

谈到数据和信息时,安全是每个人都关心的问题,因此它成为每个数据库的主要基础。安全意味着保护您的数据免受未经授权的访问。这意味着只有经过授权的用户才能登录称为身份验证的系统;用户只能做他们被授权做的事情(授权)并记录用户活动(会计)。我在我的主要安全文章PostgreSQL 数据库安全性:你需要知道的内容中解释了这些。

当我们谈论安全时,身份验证是第一道防线。PostgreSQL 提供了多种认证方式,分为三类。

在大多数情况下,PostgreSQL 配置为与内部身份验证一起使用。因此,我在上面提到的上一篇博文中讨论了所有内部身份验证。在这篇博客中,我们将讨论基于操作系统的 PostgreSQL 身份验证方法。有三种方法可以进行基于操作系统的身份验证。

身份

身份验证仅支持 TCP/IP 连接。它的身份服务器提供了一种机制来将客户端的操作系统用户名映射到数据库用户名上。它还具有用户名映射选项。

# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 ident # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the
$ psql postgres -h 127.0.0.1 -U postgres psql: error: connection to server at "127.0.0.1", port 5432 failed: FATAL: Ident authentication failed for user "postgres"

如果没有安装ident服务,则需要安装ident2上你的Ubuntu箱或oidentd在CentOS 7.一旦你已经下载并配置ident服务,现在是时候配置的PostgreSQL。它首先在“pg_ident.conf”文件中创建用户映射。

# Put your actual configuration here # ---------------------------------- # MAPNAME SYSTEM-USERNAME PG-USERNAME PG_USER vagrant postgres

在这里,我们将系统用户“vagrant”用户映射到 PostgreSQL 的“postgres”。是时候使用用户 vagrant 登录了。

$ psql postgres -h 127.0.0.1 -U postgres psql (15devel) Type "help" for help. postgres=#

注意:标识协议并非旨在作为授权或访问控制协议

PAM(可插拔认证模块)

PAM(可插拔身份验证模块)身份验证的工作原理类似于“密码”。您必须创建一个 PAM 服务文件来启用基于 PAM 的身份验证。服务名称应设置为“PostgreSQL”。

创建服务后,PAM现在可以验证用户名/密码对以及连接的远程主机名或 IP 地址(可选)。该用户必须已存在于数据库中,PAM 身份验证才能工作。

$ psql postgres -h 127.0.0.1 -U postgres Password for user postgres: 2021-08-11 13:16:38.332 UTC [13828] LOG: pam_authenticate failed: Authentication failure 2021-08-11 13:16:38.332 UTC [13828] FATAL: PAM authentication failed for user "postgres" 2021-08-11 13:16:38.332 UTC [13828] DETAIL: Connection matched pg_hba.conf line 91: "host all all 127.0.0.1/32 pam" psql: error: connection to server at "127.0.0.1", port 5432 failed: FATAL: PAM authentication failed for user "postgres"

确保 PostgreSQL 服务器支持 PAM 身份验证。这是一个编译时选项,必须在构建服务器二进制文件时设置。您可以使用以下命令检查您的 PostgreSQL 服务器是否支持 PAM 身份验证。

$ pg_config | grep with-pam CONFIGURE = '--enable-tap-tests' '--enable-cassert' '--prefix=/usr/local/pgsql/' '--with-pam'

如果 /etc/pam.d 下没有 PostgreSQL 的 PAM 服务器文件,您必须手动创建它。您可以为文件选择任何名称;但是,我更愿意将其命名为“postgresql”。

$ /etc/pam.d/PostgreSQL @include common-auth @include common-account @include common-session @include common-password

由于 PostgreSQL 用户无法读取密码文件,请安装 sssd ( SSSD – System Security Services Daemon ) 以绕过此限制。

sudo apt-get install sssd

将 postgresql 添加到“ad_gpo_map_remote_interactive”到“/etc/sssd/sssd.conf”

$ cat /etc/sssd/sssd.conf ad_gpo_map_remote_interactive = +postgresql

启动sssd服务,查看是否正常启动。

$ sudo systemctl start sssd $ sudo systemctl status sssd sssd.service - System Security Services Daemon Loaded: loaded (/lib/systemd/system/sssd.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-08-11 16:18:41 UTC; 12min ago Main PID: 1393 (sssd) Tasks: 2 (limit: 1071) Memory: 5.7M CGroup: /system.slice/sssd.service ├─1393 /usr/sbin/sssd -i --logger=files └─1394 /usr/libexec/sssd/sssd_be --domain shadowutils --uid 0 --gid 0 --logger=files

现在是配置 pg_hba.conf 以使用 PAM 身份验证的时候了。我们需要指定 PAM 服务名称 (pamservice) 作为身份验证选项的一部分。这应该与您在 /etc/pam.d 文件夹中创建的文件相同,在我的例子中是 postgresql。

# "local" is for Unix domain socket connections only local   all             all                                     trust # IPv4 local connections: host    all             all             127.0.0.1/32            pam pamservice=postgresql # IPv6 local connections: host    all             all             ::1/128                 trust # Allow replication connections from localhost, by a user with the

我们现在必须重新加载(或重新启动)PostgreSQL 服务器。之后,您可以尝试登录 PostgreSQL 服务器。

vagrant@ubuntu-focal:~$ psql postgres -h 127.0.0.1 -U postgres psql (15devel) Type "help" for help. postgres=>

笔记

如果 PAM 设置为读取/etc/shadow ,身份验证将失败,因为 PostgreSQL 服务器是由非 root 用户启动的。但是,当 PAM 配置为使用 LDAP 或其他身份验证方法时,这不是问题。

同行

对等身份验证是“ IDENT ”的iCal; 即,非常像身份验证!唯一的细微差别是没有身份服务器,并且此方法适用于本地连接而不是 TCP/IP。

对等身份验证提供了一种将客户端的操作系统用户名映射到数据库用户名的机制。它还具有用户名映射选项。 除了身份验证方法指定为“peer”而不是“ident”之外,该配置与我们为 ident 身份验证配置的方式非常相似。

$ cat $PGDATA/pg_hba.conf

# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer map=PG_USER # IPv4 local connections: host all all 127.0.0.1/32 trust
$ psql postgres -U postgres 2021-08-12 10:51:11.855 UTC [1976] LOG: no match in usermap "PG_USER" for user "postgres" authenticated as "vagrant" 2021-08-12 10:51:11.855 UTC [1976] FATAL: Peer authentication failed for user "postgres" 2021-08-12 10:51:11.855 UTC [1976] DETAIL: Connection matched pg_hba.conf line 89: "local all all peer map=PG_USER" psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres"

$PGDATA/pg_hba.conf 配置看起来像这样:

$ cat $PGDATA/pg_hba.conf # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer map=PG_USER # IPv4 local connections:

$PGDATA/pg_ident.conf

# Put your actual configuration here # ---------------------------------- # MAPNAME SYSTEM-USERNAME PG-USERNAME PG_USER vagrant postgres
vagrant@ubuntu-focal:~$ psql postgres -U postgres psql (15devel) Type "help" for help. postgres=>

结论

我们在本博客中介绍了几种不同的身份验证方法。这些基本的认证方式涉及到PostgreSQL服务器、内核、ident服务器;选项在本机可用,没有任何主要的外部依赖项。但是,正确保护数据库以防止对数据的未授权访问非常重要。

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

评论