`

postgresql访问认证设置

阅读更多
安装postgresql是一件很简单的事,但是当我第一次安装了postgresql以后,它的安全设置曾经让我困扰过一阵,现在我将以我的经历为线索来讲述如何配置postgresql的访问认证,postgresql的版本是7.3.1,老一点的版本在配置文件上会有稍许不同,请自己注意区别。另外,在阅读中,请注意区分数据库用户和系统用户的区别,以免混淆。
  
  postgresql的访问认证配置主要涉及到两个主要的配置文件:postgresql.conf和pg_hba.conf。
  
  postgresql.conf包含了许多的选项,这些选项控制了postgresql.conf的方方面面,中间影响访问认证的选项是:
  
  unix_socket_group
  
  设置 Unix 域套接字的组所有人,(套接字的所有权用户总是启动 postmaster 的用户)与 UNIX_SOCKET_PERMISSIONS 选项一起使用可以给这种套接字类型增加额外的访问控制机制,缺省时是一个空字串,也就是使用当前用户的缺省的组, 这个选项只能在服务器启动时设置。
  
  unix_socket_permissions
  
  给 Unix 域套接字设置访问权限,Unix 域套接字使用通常的 Unix 文件系统权限集。可选的值可以是一个 chmod 和 umask 系统调用可以接受的数字模式。(要使用客户化的八进制格式,该数字必须以 0 (零)开头)
  
  缺省权限是 0777,意即任何人都可以联接,合理的选则可能是0770 (只有用户和组, 参阅UNIX_SOCKET_GROUP)和 0700 (只有用户)。(请注意对于 Unix 套接字而言,实际上只有写权限有意义,而且 也没有办法设置或者取消读或执行权限)
  
  这个选项只能在服务器启动时设置。
  
  pg_hba.conf是设置访问认证的主要文件,格式为每条记录一行,每行指定一条访问认证。设定一条访问认证包含了7个部分:连接方式(type)、数据库(database)、用户名(user)、ip地址(ip-address)、子网掩码(ip-mask)、认证方法(authentication method)、认证配置(authentication-option),以下是这7个部分的详细说明:
  
  连接方式(type)
  
  连接方式共有三种:local、host、hostssl
  
  local
  
  这条记录匹配通过 Unix 域套接字进行的联接企图, 没有这种类型的记录,就不允许 Unix 域套接字的联接。
  
  host
  
  这条记录匹配通过 TCP/IP 网络进行的联接尝试,请注意,除非服务器是 带着 -i 选项或者打开了 postgresql.conf 里面的 tcpip_socket 配置参数集启动的,否则 TCP/IP 联接是被禁止掉的。
  
  hostssl
  
  这条记录匹配通过在 TCP/IP 上进行的 SSL 联接企图, host 记录可以匹配 SSL 和非 SSL 的联接企图, 但 hostssl 记录需要 SSL 联接。
  
  数据库(database)
  
  声明记录所匹配的数据库。值 all 表明该记录匹配所有数据库, 值 sameuser表示如果被请求的数据库和请求的用户同名,则匹配。 samegroup 表示请求的用户必须是一个与数据库同名的组中的成员。 在其他情况里,这就是一个特定的 PostgreSQL 的名字。我们可以通过用逗号分隔的方法声明多个数据库。 一个包含数据库名的文件可以 通过对该文件前缀 @ 来声明.该文件必需和 pg_hba.conf 在同一个目录。
  
  用户名(user)
  
  为这条记录声明所匹配的 PostgreSQL 用户,值 all 表明它匹配 于所有用户。否则,它就是特定 PostgreSQL 用户的名字,多个用户名可以通过用逗号分隔的方法声明,组名字 可以通过用 + 做组名字前缀来声明。一个包含用户名的文件可以 通过在文件名前面前缀 @ 来声明,该文件必需和 pg_hba.conf 在同一个目录。
  
  ip地址(ip-address)
  
  子网掩码(ip-mask)
  
  这两个字段包含标准的点分十进制表示的 IP地址/掩码值。 (IP地址只能用数字的方式声明,而不能用域名或者主机名)它们俩放在一起,声明了这条记录匹配的客户机的 IP 地址。 准确的逻辑是:
  
  (actual-IP-address xor IP-address-field) and IP-mask-field
  
  对于要匹配的记录必需为零。
  
  如果连接方式是host或者hostssl的话,这两项必须指定,否则可以不填。
  
  认证方法(authentication method)
  
  trust
  
  无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。
  
  reject
  
  联接无条件拒绝,常用于从一个组中"过滤"某些主机。
  
  md5
  
  要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。
  
  crypt
  
  类似 md5 方法,只是用的是老式的 crypt 加密认证, 用于 7.2 以前的客户端,对于 7.2 以及以后的客户端,我们建议使用 md5。
  
  password
  
  和"md5"一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。
  
  krb4
  
  用 Kerberos V4 认证用户,只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos,"克尔波洛斯",故希腊神话冥王哈得斯的多头看门狗。Kerberos 是 MIT 开发出来的基与对称加密算法的认证协议和/或密钥 交换方法,其特点是需要两个不同用途的服务器,一个用于认证身份,一个用于通道两端用户的密钥交换。同时 Kerberos 对网络时间同步 要求比较高,以防止回放攻击,因此通常伴随 NTP 服务。)
  
  krb5
  
  用 Kerberos V5 认证用户.只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos V5 是上面 V4 的改良,主要是不再依赖 DES 算法, 同时增加了一些新特性。)
  
  ident
  
  获取客户的操作系统名(对于 TCP/IP 联接,用户的身份是通过与运行在客户端上的 ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。) 然后检查一下,看看用户是否允许以要求的数据库用户进行联接, 方法是参照在 ident 关键字后面声明的映射。
  
  如果你使用了 sameuser 映射,那么假设用户名 是相等的。如果没有声明这个关键字,则在 $PGDATA/pg_ident.conf 文件中找出映射名。如果这个文件里包含一条记录标识着ident提供的用户名 和请求的 PostgreSQL 用户名的映射, 那么联接被接受。
  
  对于本地联接,只有在系统支持Unix域套接字信任证的情况下 才能使用(目前是 Linux, FreeBSD, NetBSD, 和 BSD/OS)。
  
  pam
  
  使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules) (PAM)来认证。
  
  认证配置(authentication-option)
  
  这个可选的字段的含义取决与选择的认证方法。
  
  了解了以上的内容以后,我们可以开始设置自己的访问认证。和mysql一样,postgresql默认安装的访问认证是不安全的,当我第一次安装好我的postgresql以后,我发现只要输入`psql -U pgsql -d template1`就可以不需要任何密码的进入我的数据库,并且使用的是pgsql用户(数据库的最高权限),即使在我使用ALTER USER为我的数据库用户添加了密码以后情况也没有得到改善,经过一番查找,我发现我的pg_hba.conf内容如下:
  
  local all all trust
  host all all 0.0.0.0 0.0.0.0 trust
  
  这说明无论在本地还是通过tcp/ip,任何人都可以不加任何限制的使用任何他想用的身份访问我的数据库,于是我为所有的访问都使用了md5认证方法,我的pg_hba.conf变为:
  
  local all all md5
  host all all 0.0.0.0 0.0.0.0 md5
  
  事情似乎得到了解决,任何人想访问我的数据库都需要通过密码这一关,我的数据库安全了。但是当我有一天重新启动计算机的以后发现我的 postgresql并没有被正常的启动,在终端前我发现启动到postgresql服务启动脚本时,提示需要输入密码,原来在设置了md5认证方式以后我的pgsql需要密码才能够启动服务,为了不每次启动都跑到终端前去输入一次密码,我的pgsql用户的认证方法必须为trust:
  
  local pgsql all trust
  local all all md5
  host all all 0.0.0.0 0.0.0.0 md5
  
  在随后的检测中我发现,虽然通过网络得到了保护,但是如果在本地通过Unix域套接字进行连接的话,任何人都还是可以使用`psql -U pgsql -d template1`的方式轻松的进入我的数据库,这样做显而易见不是我想要的结果,现在我需要unix_socket_permissions的协助,当我把这个项设置为0700以后,就只有套接字的所有人,即系统用户pgsql可以使用套接字进行连接,另外如果我的数据库有几个管理员需要最高权限的话,0770也是一个选择,不过暂时只有我一个管理员,所以我选择了0700,现在我的pg_hba.conf改变为:
  
  local pgsql all trust
  host all all 0.0.0.0 0.0.0.0 md5
  
  结合了unix_socket_permissions以后,现在只有系统用户pgsql可以无任何限制的连接(当然,伟大的root例外),并且我也不用每次启动的时候都跑到终端前去输入一次密码了,而其他人只能通过网络连接,即使登录到了本地计算机上,其他用户也只能使用`psql -U xx -d template1 -h 127.0.0.1`的方式连接,这种连接是受到密码认证的保护的,这一切正是我想要的。
  
  以上就是我的设置过程,我们还可以使用pam等认证方法实现更加复杂的访问认证,不过那些内容已经不在本文的讨论范围以内了。
分享到:
评论

相关推荐

    PostgreSQL DBA认证 PGCE-E-092-中级SQL题目

    "PostgreSQL DBA认证 PGCE-E-092-中级SQL题目" PostgreSQL DBA认证 PGCE-E-092-中级SQL题目 PostgreSQL DBA认证PGCE-E-092-中级SQL题目是一个测试SQL掌握程度的题目,涵盖了PostgreSQL数据库管理系统的各种知识点...

    postgrest和postgresql权限认证,jwt插件

    权限认证是数据库系统中至关重要的部分,确保只有授权的用户才能访问和操作数据。在PostgreSQL中,权限系统非常灵活,可以通过角色、用户、表级权限、函数权限等方式进行管理。PostgREST进一步扩展了这一功能,它...

    Postgresql开启远程访问的步骤全纪录

    这条规则表示允许所有用户从 192.168.1.0 到 192.168.1.255 的 IP 地址进行访问,并且使用 MD5 加密的密码认证。 请注意,`pg_hba.conf` 的具体位置可能因操作系统和 PostgreSQL 版本不同而异。在某些情况下,如...

    CentOS安装Postgresql数据库

    要在PostgreSQL中启用MD5认证,需要编辑`pg_hba.conf`文件,通常位于`/var/lib/pgsql/9.3/data/`目录下。找到与本地连接相关的行,将认证方式改为`md5`,例如: ```conf local all all md5 ``` 完成修改后,重启...

    ubuntu12.04 配置postgresql

    7. **设定访问权限**:修改`/etc/postgresql/9.2/main/pg_hba.conf`文件,添加允许访问的IP段,使用MD5认证方法,确保数据库安全。 8. **启动服务**:使用`sudo`权限启动或停止PostgreSQL服务,命令为`sudo /etc/...

    PostGreSQL安装部署系列:Centos 7.9 安装指定PostGreSQL-15版本数据库

    安装完成后,还需要对PostgreSQL进行一些基本的配置,例如修改`postgresql.conf`和`pg_hba.conf`文件来调整性能参数、设置访问控制等。此外,还可以通过`psql`命令行工具登录数据库进行进一步的管理和操作。 ##### ...

    PostgreSQL从入门到精通视频教程(全).zip

    1. **安装与配置**:了解如何在不同的操作系统(如Windows、Linux、macOS)上安装PostgreSQL,以及如何进行基本的系统配置和设置。 2. **SQL语言基础**:学习SQL语句的基本结构,包括数据类型、表的创建、数据插入...

    PostgreSQL与MySQL比较

    然而,PostgreSQL支持更多的认证方法,包括信任认证、口令认证、基于Ident的认证和LDAP加密等。PostgreSQL还支持表级和列级的加密。 存储引擎 PostgreSQL和MySQL都支持多种存储引擎,包括MyISAM、InnoDB、Memory和...

    MySQL和PostgreSQL的比较

    不过,PostgreSQL提供了更为丰富的身份验证方法,包括信任、口令、Kerberos、基于Ident、LDAP和PAM认证等。 #### 五、数据加密与安全 MySQL和PostgreSQL均支持数据加密,前者可在表级别指定密码进行加密,并利用`...

    PostgreSQL Hook编程介绍

    在PostgreSQL初始化时,它会检查全局函数指针ClientAuthentication_hook是否被设置,如果已经设置,则在客户端认证过程中执行它。 此外,还有一些钩子是专门为了优化查询性能而设计的。例如,explain_get_index_...

    PostgreSQL 8.4

    - 添加访问规则:在 `pg_hba.conf` 中添加允许的主机或用户,例如 `host all all 0.0.0.0/0 md5`,允许所有 IP 访问并使用 MD5 加密认证。 ### 六、启动与管理服务 根据你的操作系统,启动 PostgreSQL 服务: - ...

    postgresql12文档.zip

    文档会讲解如何配置数据库服务器,包括设置端口、数据目录、初始化数据库集群以及安全设置,如设置用户权限和认证方法。 **2. SQL语言支持** PostgreSQL 支持标准 SQL,并且扩展了许多额外的功能。文档中详述了 SQL...

    postgresql官方手册的中文版

    4. **安全性**:手册会介绍如何设置认证机制、防火墙规则以及SSL连接,以保护数据库免受未经授权的访问。 5. **性能优化**:讲解如何调整系统参数、使用索引、查询优化以及规划良好的数据库设计来提高查询性能。...

    PostgreSQL 8.2.3 中文文档

    索引访问方法接口定义 50. GiST 索引 51. GIN 索引 52. 数据库物理存储 53. BKI 后端接口 54. 规划器如何使用统计信息 VIII. 附录 A. PostgreSQL 错误代码 B. 日期/时间支持 C. SQL 关键字 D. SQL 兼容...

    postgresql内核分析 完整带目录版本

    6. **安全性与权限管理**:PostgreSQL的安全机制,包括用户认证、角色权限、对象权限和访问控制列表,确保数据安全。这部分内容将指导读者如何设置和管理数据库权限。 7. **性能调优**:书中将涵盖如何通过参数调整...

    postgresql-10.1

    PostgreSQL 10.1 提供了更强的安全性和权限控制,如改进的认证方式、更细粒度的访问控制以及更严格的默认权限设置,确保数据的安全性。 8. **自动VACUUM优化**: 自动VACUUM过程在10.1版本中得到了优化,能够更好...

    PostgreSQL-9.5.5解压后将内容上传到linux服务器.zip

    PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),...记住,安全始终是首要考虑,确保对数据库的访问有适当的限制和认证机制。在生产环境中,还应考虑备份策略、性能优化以及定期更新以保持数据库的安全性。

    PostgreSQL环境搭建及部署文档手册.docx

    - **配置防火墙**:允许外部客户端通过TCP协议访问PostgreSQL默认端口5432。 ```shell firewall-cmd --add-port=5432/tcp firewall-cmd --add-port=5432/tcp --zone=public --permanent ``` **2.8 其他工具安装...

    postgresql-9.6.18.tar.gz

    3. **更好的安全性**:9.6版增强了权限管理和认证机制,支持更细粒度的访问控制,比如行级别的安全性,以及更多的加密选项,确保数据安全。 4. **JSON支持增强**:PostgreSQL 9.6加强了对JSON数据类型的支持,提供...

    postgresql 基本命令

    例如,为允许外部访问,需要将`listen_addresses`参数设置为`'*'`,并调整`pg_hba.conf`中的认证策略,以便允许特定IP范围内的主机连接。 对于字符集和编码的配置,可以在`postgresql.conf`中设置`client_encoding`...

Global site tag (gtag.js) - Google Analytics