|
4.2. 认证方法下面更详细地描述认证方法. 4.2.1. 信任认证如果声明了 trust (信任)认证模式, PostgreSQL 就假设任何可以联接到 postmaster 的人都可以以任何他声明的数据库用户(包括数据库超级用户) 这个方法应该用于那些在联接到 postmaster 端口已经有足够系统层次保护 的环境里. trust 认证对于单用户工作站的本地联接是非常合适和方便的. 通常它本身并 不 适用于多用户环境的机器. 不过,即使在多用户的机器上,你也可以使用 trust , 只要你利用文件系统权限限制了对 postmaster 的套接字文件的访问. 要做这些限制,你可以设置 postgresql.conf 里面的 参数 unix_socket_permissions (以及可能还有 unix_socket_group ),就象 Section 3.4.3 里描述的那样.或者你可以 设置 unix_socket_directory ,把套接字文件放在 一个经过恰当限制的目录里. 设置文件系统权限只能帮助 Unix 套接字联接.它不会限制本地 TCP 联接; 因此,如果你想利用权限来控制本地安全,那么删除 pg_hba.conf 里的 host ... 127.0.0.1 ... 行,或者把它改为一个 非 trust 的认证方法. trust 认证模式只有在你信任那些在 pg_hba.conf 里声明为 trust ,允许联接到 postmaster 的行上的所有机器 上面的所有用户的时候才是合适的.很少有理由使用 trust 作为任何除来自 localhost (127.0.0.1) 以外的 TCP 联接的认证方式. 4.2.2. 口令认证以口令为基础的认证方法包括 md5 , crypt , 和 password .这些方法操作上非常类似,只不过口令通过 联接传送的方法不同.如果你担心口令被窃听( "sniffing" ), 那么 md5 比较合适,如果你必需支持老的客户端, 那么然后是 crypt .如果我们在开放的互联网上使用, 应该尽可能避免使用 password (除非你在联接上使用了 SSL, SSH,或者其他通讯安全封装.) PostgreSQL 数据库口令与任何操作系统用户口令无关. 通常,各个数据库用户的口令是存储在pg_shadown系统表里面的. 口令可以用查询语言命令 CREATE USER 和 ALTER USER 管理,也就是说, CREATE USER foo WITH PASSWORD 'secret'; .缺省时,如果没有显式地设置口令,存储的口令是 "NULL" 并且该用户的口令认证总会失败. 要限制允许访问某数据库的用户集,在与 pg_hba.conf 同一目录的 一个独立的文件里列出用户(每用户 一行),然后在 pg_hba.conf 的 password , md5 ,或 crypt 关键字后面 写下此文件的文件名(不用路径). 如果你不用这个特性,那么数据库系统识别的任何用户都可以与任意数据库 联接(当然,他得提供正确的口令). 这些文件还可以用于对特定数据库或数据库集应用不同的口令集. 这时候,这个文件具有类似 Unix 口令文件 /etc/passwd 那样的格式,也就是下面这样, username : password 任何跟在 password(口令)后面的冒号分隔的域都将被忽略. password(口令)被认为是用系统的 crypt() 函数加密的.和 PostgreSQL 一起安装的 工具程序 pg_passwd 可以用于管理 这些口令文件. 带和不带口令的行可以在从属口令文件里面混合使用.不带口令的行 表明使用由 CREATE USER 和 ALTER USER 管理的,存放在 pg_shadow 里的主口令. 带口令的行将导致此行的口令的应用.一条口令记录为 "+" 时 也表示使用 pg_shadow 的口令. 当使用 md5 ,或 crypt 方法时不能使用可选口令. 该文件还是 会象平常一样计算,但是口令域会被忽略并且使用 pg_shadow 口令. 请注意象这样的可选口令意味着你不能再用 ALTER USER 命令来修改用户的口令.这条命令看上去仍然有用,但是你用这条命令修改 的口令不是系统最后要用的那个. 4.2.3. Kerberos 认证Kerberos 是一种适用于在公共网络上进行分布计算的工业标准的安全 认证系统. 对 Kerberos 系统的叙述远远的超出了本文档的范围; 概括说来它是相当复杂(同样也相当强大)的系统. Kerberos FAQ 或 MIT 雅典娜计划 是个开始探索 的好地方.现存在好几种 Kerberos 发布的源代码. 要使用 Kerberos ,对它的支持必须在制作的时候打开. Kerberos 4 和 5 都被支持,(分别是 ./configure --with-krb4 或 ./configure --with-krb5 ). 不过我们在一次制作中只能支持一个版本. PostgreSQL 运行时象一个普通的 Kerberos 服务. 服务主的名字是 servicename/hostname@realm , 这里的 servicename 是 postgres (除非在配置时用 ./configure --with-krb-srvnam=whatever 选择了一个不同的 hostname ). hostname 是服务器及其全长的域名字. 服务器的域是服务器机器的优先域. 客户主自给必须用它们自己的 PostgreSQL 用户名作为 第一个部件,比如 pgusername/otherstuff@realm . 目前 PostgreSQL 没有检查客户的域;因此如果你打开了 跨域的认证,那么在任意域里任何可以和你通讯的主都会被接受. 确认你的服务器的密钥文件是可以被 PostgreSQL 服务器帐户读取(最好就是只读的)(参阅 Section 3.1 ).密钥文件( keytab)的位置是 用运行时配置参数 krb_server_keyfile 声明的. (又见 Section 3.4 .) 缺省时在 Kerberos 4 里是 /etc/srvtab , Kerberos 5里是 FILE:/usr/local/pgsql/etc/krb5.keytab (或者任何在制作的时候声明为 sysconfdir 的目录.) 要生成密钥文件(keytab),可以用下面例子(对版本5) kadmin% ank -randkey postgres/server.my.domain.org kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org 阅读 Kerberos 的文档获取详细信息. 在和数据库联接的时候,请确保自己对每个主都拥有一张匹配所请求的数据库 用户名的门票.例子∶对于数据库用户 fred , 主 fred@EXAMPLE.COM 和 fred/users.example.com@EXAMPLE.COM 都可以用于与数据库服务器认证. 如果你在你的 Apache web 服务器上使用了 mod_auth_krb 和 mod_perl , 你可以用一个 mod_perl 脚本进行 AuthType KerberosV5SaveCredentials . 这样就有了一个通过 web 的安全数据库访问,不需要额外的口令. 4.2.4. 基于 Ident 的认证"Identification Protocol(标识协议)" 在 RFC 1413 里面描述.实际上每个类Unix的操作系统 都带着一个缺省时侦听113端口的身份服务器. 身份服务器的基本功能是回答类似这样的问题: "是什么用户从你的端口 X 初始化出来 联接到我的端口 Y 上来了?" . 因为在建立起物理联接后, PostgreSQL 既知道 X 也知道 Y ,因此它可以询问 运行尝试联接的客户端的主机,并且理论上可以用这个方法判断 发起联接的操作系统用户. 这样做的缺点是它取决于客户端的完整性:如果客户端不可信 或者被攻击者攻破,而且它们可以在113端口上运行任何程序并且 返回他们选择的任何用户的话,就无法认证了. 因此这个认证方法只适用于封闭的网络,这样的网络里的每台客户机 都处于严密的控制下并且数据库和操作系统管理员可以比较方便地 联系上.换句话说,你必须信任运行身份(ident)服务的机器.下面是警告:
在支持用于 Unix 域套接字的 SO_PEERCRED 请求的系统上, 身份认证也可以用于局部联接.这个时候,使用身份认证不会增加 安全风险;实际上这也是在这种系统上使用本地联接时的优选方法. 当使用以身份为基础的认证时,在判断了初始化联接的操作系统用户 的名字后, PostgreSQL 判断他是否可以以 他所请求的数据库用户的身份联接. 这个判断是由跟在 pg_hba.conf 文件里的 ident 关键字后面的身份映射控制的. 有一个预定义的身份映射是 sameuser ,表示任何 操作系统用户都可以以同名数据库用户进行联接(如果后者存在的 话).其他映射必须手工创建. 非 sameuser 的身份映射存放在数据目录的文件 里.每行的格式通常是: map-name ident-username database-username 注释和空白和普通情况一样处理. map-name 是将用于 在 pg_hba.conf 里引用这个映射的任意名称. 另外两个域声明某个操作系统用户被允许以哪个数据库用户的身份 进行联接.同一个 map-name 可以重复用于在一个映射里声明 更多的用户映射.对一个操作系统用户可以映射为多少个数据库用户没有 限制,反之亦然. 在系统启动和 postmaster 收到一个 SIGHUP 信号的时候会读取 pg_ident.conf 文件.如果你在一台活跃的系统上 编辑该文件,那么你需要给 postmaster 发信号 (用 pg_ctl reload 或者 kill -HUP ) 令其重新读取该文件.) Example 4-2 里是 一个可以和在 Example 4-1 里面演示的 pg_hba.conf 文件 配合使用的 pg_ident.conf 文件. 在这个例子的设置里,任何 登录到 192.168 网络里的机器的用户,如果用户名不是 bryanh , ann ,或 robert 就不能获准访问. Unix 用户 robert 只有在试图以 PostgreSQL 用户 bob 身份 联接时才允许访问,而不能是 robert 或其他什么身份. ann 将只允许以 ann 的 身份联接. 用户 bryanh 允许以他自己的 bryanh 身份 或者做为 guest1 进行联接. |