当前位置:早雪网网络学院编程文档数据库技术Postgresql → PostgreSQL7.0手册-管理员手册-28. 安全性

PostgreSQL7.0手册-管理员手册-28. 安全性

减小字体 增大字体 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-23 12:21:28
第二十八章. 安全性
内容 
用户认证 
用户名和组 
访问控制 
函数和规则 
安全 TCP/IP 联接 
数据库安全性分成几个级别: 
  
数据库文件保护。所有在数据库里存储的文件都受到保护,除了Postgres 超级用户帐户外其他用户是不能读取的。 
缺省的时候,客户端只能通过一个本地的 Unix 套接字联接到数据库服务器上来,而不是通过 TCP/IP 套接字。后端必须带 -i 选项启动才能允许非本地的客户端联接上来。 

可以通过在 PG_DATA 里的 pg_hba.conf 文件来限制可联接的客户端 IP 地址和/或用户名。 

客户端联接可以通过其他外部软件包来认证。 

Postgres 里的每个用户都赋予了一个用户名和一个(可选的)口令。缺省是,用户对不是他们创建的数据库没有写权限。 

用户可以赋予组,而且表的访问权限可以以组权限为基础设置。

用户认证
认证是后端服务器和 postmaster 认定正在请求访问数据的用户就是他/她自称的那个人的过程。所有激活Postgres 的用户都对照 pg_user 表的内容进行检查以确保他们有这么做的权限(激活数据库)。不过,对用户的实际身份的的核对是通过好几种方式进行的: 
从用户 shell 来的用户 
  
从用户 shell 启动的后端数据库服务器在进行一个 setuid 调用把用户标识转为用户 postgres 之前要检查用户的(有效的)用户标识。有效的用户标识被当作访问控制检查的基础。不进行其他的认证。 
从网络来的用户 
  
如果 Postgres 系统是为分布(处理)制作的,任何人都可以访问postmaster 进程的网际网的 TCP 端口。DBA 配置在 PGDATA 目录里的 pg_hba.conf 文件,根据访问从哪个主机来和要访问哪个数据库声明需要采用的认证方式。参阅 pg_hba.conf(5) 获取一份可以使用的认证系统的描述。当然,在 Unix 里,以主机为基础的认证也不是无懈可击的。有能力的入侵者也可能伪装源主机(地址)。那些安全性问题超越了Postgres 的范畴。 
以主机为基础的访问控制
以主机为基础的访问控制 是 PostgreSQL 决定哪些客户端可以访问数据库以及那些客户端上的用户如何认证他们自己的基本控制的名称。 
每个数据库系统都包含一个文件叫 pg_hba.conf,在其 PGDATA 目录里,该文件控制谁可以联接到各自的数据库。 

每个正在访问数据库的客户端必须被 pg_hba.conf 里的其中一条记录涵盖。否则所有从那个客户端发送上来的联接请求都将被拒绝,错误信息为 "User authentication failed" (用户认证失败)。 

文件 pg_hba.conf 的常用格式是一套记录,每行一条。空白行或者杂乱符号("#")开头的行被忽略。一条记录是由若干用空格和/或 tab 分隔的字段组成。 

从客户端来的联接可以使用 Unix 域套接字或者网际网域套接字(例如:TCP/IP)建立。用 Unix 域套接字进行的联接是用下面格式的记录进行控制的: 

local database authentication method
这里 
   
 database 声明记录所应用的数据库。值 all 表明该记录应用于所有数据库。 
authentication method 声明一个用户在用 Unix 域套接字与该数据库联接时用于认证他们自身的方法。不同的方法在下面描述。 

用网际网(IP)域套接字进行的联接是用下面格式的记录进行控制的: 

host database TCP/IP address TCP/IP mask authentication method
TCP/IP address 逻辑上与声明的 TCP/IP mask 和正在联接的客户端的 TCP/IP 地址分别相加。如果两个结果相等则该记录用于这次联接。如果一个联接匹配多于一条记录,那么使用文件里第一条匹配的记录。 TCP/IP address 和 TCP/IP mask 都是用点分十进制符号表示的。 
如果一个联接不能和任何记录相匹配,则应用拒绝认证方法(见下文)。 

认证方法
下面的认证方法可用于 Unix 和 TCP/IP 域套接字: 
trust 
无条件允许联接。 
reject 
无条件拒绝联接。 
crypt 
客户端被要求向用户请求一个口令。该口令被加密后(使用 crypt(3))发送,然后与放在 pg_shadow 表里的口令进行比较。如果口令匹配,则允许联接。 
password 
客户端被要求向用户请求一个口令。该口令以明文发送,然后与放在 pg_shadow 表里的口令进行比较。如果口令匹配,则允许联接。可以在 password 关键字后面声明一个可选的文件名,用于提供对应的口令而不是使用 pg_shadow 表里面的。参阅 pg_passwd。 
下面的认证方式只能用于 TCP/IP 域套接字: 
krb4 
Kerberos V4 用于认证用户。 
krb5 
Kerberos V5 用于认证用户。 
ident 
在客户端的 ident 服务器用于认证该用户(RFC 1413)。可以在 ident 关键字后面声明一个可选的映射名,这样允许 ident 用户名映射成Postgres 用户名。映射放在文件 $PGDATA/pg_ident.conf 里。 
例子
# Trust any connection via Unix domain sockets.
local   trust
# Trust any connection via TCP/IP from this machine.
host    all     127.0.0.1       255.255.255.255         trust
# We don't like this machine.
host    all     192.168.0.10    255.255.255.0           reject
# This machine can't encrypt so we ask for passwords in clear.
host    all     192.168.0.3     255.255.255.0           password
# The rest of this group of machines should provide encrypted passwords.
host    all     192.168.0.0     255.255.255.0           crypt

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

用户名和组
要定义一个新用户,运行工具程序 createuser。 
要把一个用户或者一套用户指派到一个新组,我们必须先定义该组,然后分派用户到该组中去。在Postgres 里,这些步骤目前还不被一条 create group 命令支持(译注:已经支持了)。代替的做法是,向 pg_group 系统表里插入一些合适的值,然后用

[1] [2]  下一页

[数据载入中...] [返回上一页] [打 印]