免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12772 | 回复: 10

postgresql访问认证设置 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2003-01-26 13:52 |显示全部楼层
安装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等认证方法实现更加复杂的访问认证,不过那些内容已经不在本文的讨论范围以内了。

本文引用了来自http://laser.zhengmai.com.cn/翻译的postgresql中文手册中的内容,在此声明并表示感谢。

论坛徽章:
0
发表于 2003-02-22 11:39 |显示全部楼层

postgresql访问认证设置

好东西,正在消化...

论坛徽章:
0
发表于 2003-11-18 21:22 |显示全部楼层

postgresql访问认证设置

研究中。

论坛徽章:
0
发表于 2006-08-15 15:05 |显示全部楼层

救命,呵呵!

我想在WIN下通过PGADMIN3访问虚拟机下的POSTGRESQL,系统为RH LINUX9.0
我的虚拟机的IP地址为:192.168.12.188
WIN的IP为192.168.12.83

论坛徽章:
0
发表于 2006-08-15 15:09 |显示全部楼层

我的附件怎么不见了,痛苦

我的pg_hba.conf文件:
local  all  all   trust
host  all  all   127.0.0.1/32  trust
host  all  all   192.168.12.81/100 trust
host  all  all   ::1/128           trust

论坛徽章:
0
发表于 2007-01-17 11:36 |显示全部楼层
#listen_addresses = 'localhost'                # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost', '*' = all
#port = 5432
#max_connections = 100
# note: increasing max_connections costs ~400 bytes of shared memory per
# connection slot, plus lock space (see max_locks_per_transaction).  You
# might also need to raise shared_buffers to support more connections.
#superuser_reserved_connections = 2
#unix_socket_directory = ''
#unix_socket_group = ''
#unix_socket_permissions = 0777                # octal

我的posrgresql.conf 文件中   选项前面都带有# 符号,要启用的话是不是要把# 删除啊?

论坛徽章:
0
发表于 2007-01-17 18:36 |显示全部楼层
这些内容 postgresql 中文官方手册都有,为什么不去看?

8.1 的用户认证部分。
http://www.pgsqldb.org/pgsqldoc-8.1c/client-authentication.html

其他版本的postgresql 中文官方手册:
http://www.pgsqldb.org/bin/view/PgSQL/PgDocList

论坛徽章:
0
发表于 2007-02-03 02:42 |显示全部楼层
我从另一台机器通过ssh (putty) 执行以下命令:
su postgres -c"/usr/local/pgsql_15/bin/psql ABC -U SCI --port 5446"

访问"ABC" 数据库. 进入ABC=>
后输入SELECT * FROM "TABLE1"  (TABLE1为一个已经有数据的表)
提示出ERROR: permission denied for relation TABLE1

从phppgAdmin 的Web 界面以SCI角色(不是超级用户)登陆后试图察看表中数据也是提示同样的错误(表结构可以看到)

是不是因为SCI 在/etc/passwd中没有记录所以不能通过ssh 啊? 但是超级用户dbadmin 也在/etc/passwd中没有记录,却能察看数据.


http://www.pgsqldb.org/pgsqldoc-8.1c/client-authentication.html

根据以上的文章介绍,我在pg_hba.conf里增加了最后一行 hostssl 的设置,重新启动pg ABC以后,还是permission denied
-----------------------------------------------------------------------------------------------
"pg_hba.conf" 56L, 2639C                                      56,1          Bot


# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD

local   all         all                                             trust
host    all         all         127.0.0.1         255.255.255.255   trust

# Local Network
host    all         all         192.168.0.80       255.255.255.0     password

hostssl   all        all         192.168.0.80       255.255.255.0      password #新增的一行,最后改为md5也不行

192.168.0.80 为用户CLIENT的机器

论坛徽章:
0
发表于 2007-02-03 13:03 |显示全部楼层
1、putty的ssh链接不是针对postgresql的ssh链接
2、
访问"ABC" 数据库. 进入ABC=>
后输入SELECT * FROM "TABLE1"  (TABLE1为一个已经有数据的表)
提示出ERROR: permission denied for relation TABLE1

提示来看,用户对ABC数据库有访问权限,但对table1数据表没有访问权限,你需要用postgres权限进去,然后赋权给SCI
#>GRANT select ON TABLE table1 to SCI
再用SCI执行SELECT * FROM "TABLE1"就可以了。

论坛徽章:
0
发表于 2007-02-08 04:57 |显示全部楼层

许多表需要一个一个GRANT select ON TABLE tables啊?

谢谢! 但是如果有许多表要一个一个GRANT select ON TABLE tables 啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP