I. 教程
II. SQL 语言
III. 服务器管理
- 章14. 安装指导
- 章15. 在 Windows 上安装客户端
- 章16. 操作系统环境
- 章17. 服务器配置
- 章18. 数据库角色和权限
- 章19. 管理数据库
- 章21. 区域
- 章20. 用户认证
- 章22. 日常数据库维护工作
- 章23. 备份与恢复
- 章24. 高可用性与负载均衡
- 章25. 监控数据库的活动
- 章26. 监控磁盘使用情况
- 章27. 可靠性和预写式日志
- 章28. 回归测试
IV. 客户端接口
- Chapter 28. libpq - C 库
- 章29.
- Chapter 30. ecpg - 在 C 里嵌入 SQL
- Chapter 31. 信息模式
- 31.2. 数据类型
- 31.3. informationschemacatalog_name
- 31.4. applicable_roles
- 31.5. check_constraints
- 31.6. columndomainusage
- 31.7. column_privileges
- 31.8. columnudtusage
- 31.9. columns
- 31.10. constraintcolumnusage
- 31.11. constrainttableusage
- 31.12. datatypeprivileges
- 31.13. domain_constraints
- 31.14. domainudtusage
- 31.15. domains
- 31.16. element_types
- 31.17. enabled_roles
- 31.18. keycolumnusage
- 31.20. referential_constraints
- 31.21. rolecolumngrants
- 31.22. roleroutinegrants
- 31.23. roletablegrants
- 31.24. roleusagegrants
- 31.25. routine_privileges
- 31.26. routines
- 31.27. schemata
- 31.28. sql_features
- 31.29. sqlimplementationinfo
- 31.30. sql_languages
- 31.31. sql_packages
- 31.32. sql_sizing
- 31.33. sqlsizingprofiles
- 31.34. table_constraints
- 31.35. table_privileges
- 31.36. tables
- 31.37. triggers
- 31.38. usage_privileges
- 31.39. viewcolumnusage
- 31.40. viewtableusage
- 31.41. views
V. 服务器端编程
- 章33. 扩展 SQL
- 章34. 触发器
- 章35. 规则系统
- 章36. 过程语言
- 章37. PL/pgSQL - SQL 过程语言
- 章38. PL/Tcl - Tcl 过程语言
- 章39. PL/Perl - Perl 过程语言
- 章40. PL/Python - Python 过程语言
- 章41. 服务器编程接口
VI. 参考手册
- I. SQL 命令
- ABORT
- ALTER AGGREGATE
- ALTER CONVERSION
- ALTER DATABASE
- ALTER DOMAIN
- ALTER FUNCTION
- ALTER GROUP
- ALTER INDEX
- ALTER LANGUAGE
- ALTER OPERATOR
- ALTER OPERATOR CLASS
- ALTER ROLE
- ALTER SCHEMA
- ALTER SEQUENCE
- ALTER TABLE
- ALTER TABLESPACE
- ALTER TRIGGER
- ALTER TYPE
- ALTER USER
- ANALYZE
- BEGIN
- CHECKPOINT
- CLOSE
- CLUSTER
- COMMENT
- COMMIT PREPARED
- COMMIT
- COPY
- CREATE AGGREGATE
- CREATE CAST
- CREATE CONSTRAINT TRIGGER
- CREATE CONVERSION
- CREATE DATABASE
- CREATE DOMAIN
- CREATE FUNCTION
- CREATE GROUP
- CREATE INDEX
- CREATE LANGUAGE
- CREATE OPERATOR CLASS
- CREATE OPERATOR
- CREATE ROLE
- CREATE RULE
- CREATE SCHEMA
- CREATE SEQUENCE
- CREATE TABLE
- CREATE TABLE AS
- CREATE TABLESPACE
- CREATE TRIGGER
- CREATE TYPE
- CREATE USER
- CREATE VIEW
- DEALLOCATE
- DECLARE
- DELETE
- DROP OWNED
- DROP AGGREGATE
- DROP CAST
- DROP CONVERSION
- DROP DATABASE
- DROP DOMAIN
- DROP FUNCTION
- DROP GROUP
- DROP INDEX
- DROP LANGUAGE
- DROP OPERATOR CLASS
- DROP OPERATOR
- DROP ROLE
- DROP RULE
- DROP SCHEMA
- DROP SEQUENCE
- DROP TABLE
- DROP TABLESPACE
- DROP TRIGGER
- DROP TYPE
- DROP USER
- DROP VIEW
- END
- EXECUTE
- EXPLAIN
- FETCH
- GRANT
- INSERT
- LISTEN
- LOAD
- LOCK
- MOVE
- NOTIFY
- PREPARE TRANSACTION
- PREPARE
- REASSIGN OWNED
- REINDEX
- RELEASE SAVEPOINT
- RESET
- REVOKE
- ROLLBACK PREPARED
- ROLLBACK TO SAVEPOINT
- ROLLBACK
- SAVEPOINT
- SELECT
- SELECT INTO
- SET
- SET CONSTRAINTS
- SET ROLE
- SET SESSION AUTHORIZATION
- SET TRANSACTION
- SHOW
- START TRANSACTION
- TRUNCATE
- UNLISTEN
- UPDATE
- VACUUM
- II. PostgreSQL 客户端应用程序
- III. PostgreSQL 服务器应用程序
VII. 内部
- 章42. PostgreSQL 内部概貌
- 章43. 系统表
- 43.1. 概述
- 43.2. pg_aggregate
- 43.3. pg_am
- 43.4. pg_amop
- 43.5. pg_amproc
- 43.6. pg_attrdef
- 43.7. pg_attribute
- 43.8. pg_authid
- 43.9. pgauthmembers
- 43.10. pg_autovacuum
- 43.11. pg_cast
- 43.12. pg_class
- 43.13. pg_constraint
- 43.14. pg_conversion
- 43.15. pg_database
- 43.16. pg_depend
- 43.17. pg_description
- 43.18. pg_index
- 43.19. pg_inherits
- 43.20. pg_language
- 43.21. pg_largeobject
- 43.22. pg_listener
- 43.23. pg_namespace
- 43.24. pg_opclass
- 43.25. pg_operator
- 43.26. pg_pltemplate
- 43.27. pg_proc
- 43.28. pg_rewrite
- 43.29. pg_shdepend
- 43.30. pg_shdescription
- 43.31. pg_statistic
- 43.32. pg_tablespace
- 43.33. pg_trigger
- 43.34. pg_type
- 43.35. 系统视图
- 43.36. pg_cursors
- 43.37. pg_group
- 43.38. pg_indexes
- 43.39. pg_locks
- 43.40. pgpreparedstatements
- 43.41. pgpreparedxacts
- 43.42. pg_roles
- 43.43. pg_rules
- 43.44. pg_settings
- 43.45. pg_shadow
- 43.46. pg_stats
- 43.47. pg_tables
- 43.48. pgtimezoneabbrevs
- 43.49. pgtimezonenames
- 43.50. pg_user
- 43.51. pg_views
- 章44. 前/后端协议
- 章45. PostgreSQL 编码约定
- 章46. 本地语言支持
- 章47. 书写一个过程语言处理器
- 章48. 基因查询优化器
- 章49. 索引访问方法接口定义
- 章50. GiST 索引
- 章51. GIN 索引
- 章52. 数据库物理存储
- 章53. BKI 后端接口
- 章54. 规划器如何使用统计信息
VIII. 附录
20.1. pg_hba.conf 文件
客户端认证是由一个配置文件(通常名为 pg_hba.conf
)控制的,它存放在数据库集群的数据目录里。HBA 的意思是"host-based authentication",也就是基于主机的认证。在 initdb
初始化数据目录的时候,它会安装一个缺省的 pg_hba.conf
文件。不过我们也可以把认证配置文件放在其它地方;参阅 hba_file 配置参数。
pg_hba.conf
文件的常用格式是一组记录,每行一条。空白行将被忽略,井号 #
开头的注释也被忽略。一条记录是由若干用空格和/或制表符分隔的字段组成。如果字段用引号包围,那么它可以包含空白。记录不能跨行存在。
每条记录声明一种连接类型、一个客户端 IP 地址范围(如果和连接类型相关的话)、一个数据库名、一个用户名字、对匹配这些参数的连接使用的认证方法。第一条匹配连接类型、客户端地址、连接请求的数据库名和用户名的记录将用于执行认证。这个处理过程没有"跨越"或者"回头"的说法:如果选择了一条记录而且认证失败,那么将不再考虑后面的记录。如果没有匹配的记录,那么访问将被拒绝。
每条记录可以是下面七种格式之一:
localdatabase
user
auth-method
[auth-option
] hostdatabase
user
CIDR-address
auth-method
[auth-option
] hostssldatabase
user
CIDR-address
auth-method
[auth-option
] hostnossldatabase
user
CIDR-address
auth-method
[auth-option
] hostdatabase
user
IP-address
IP-mask
auth-method
[auth-option
] hostssldatabase
user
IP-address
IP-mask
auth-method
[auth-option
] hostnossldatabase
user
IP-address
IP-mask
auth-method
[auth-option
]
各个字段的含义如下:
local
这条记录匹配企图通过 Unix 域套接字进行的连接。没有这种类型的记录,就不允许 Unix 域套接字的连接。
host
这条记录匹配企图通过 TCP/IP 进行的连接。
host
记录匹配 SSL 和非 SSL 的连接请求。【注意】除非服务器带着合适的 listen_addresses 配置参数值启动,否则将不可能进行远程的 TCP/IP 连接,因为缺省的行为是只监听本地自环地址
localhost
的连接。hostssl
这条记录匹配企图使用 TCP/IP 的 SSL 连接。但必须是使用 SSL 加密的连接。
要使用这个选项,编译服务器的时候必须打开 SSL 支持。而且在服务器启动的时候必须打开 ssl 配置选项(参阅节16.7)。
hostnossl
这条记录与
hostssl
相反:它只匹配那些在 TCP/IP 上不使用 SSL 的连接请求。database
声明记录所匹配的数据库名称。值
all
表明该记录匹配所有数据库,值sameuser
表示如果被请求的数据库和请求的用户同名,则匹配。值samerole
表示请求的用户必须是一个与数据库同名的角色中的成员(samegroup
是一个已经废弃了,但目前仍然被接受的samerole
同义词)。在其它情况里,这就是一个特定的 PostgreSQL 数据库名字。可以通过用逗号分隔的方法声明多个数据库,也可以通过前缀@
来声明一个包含数据库名的文件。user
为这条记录声明所匹配的数据库用户。值
all
表明它匹配于所有用户。否则,它就是特定数据库用户的名字或者是一个前缀+
的组名称。请注意,在 PostgreSQL 里,用户和组没有真正的区别,+
实际上只是意味着"匹配任何直接或者间接属于这个角色的成员",而没有+
记号的名字只匹配指定的角色。多个用户名可以通过用逗号分隔的方法声明。一个包含用户名的文件可以通过在文件名前面前缀@
来声明。CIDR-address
声明这条记录匹配的客户端机器的 IP 地址范围。它包含一个标准的点分十进制的 IP 地址(只能用数值而不能用域或主机名)和一个 CIDR 掩码长度。掩码长度表示客户端 IP 地址必须匹配的高位二进制位数。在给出的 IP 地址里,这个长度的右边的二进制位必须为零。在 IP 地址、
/
、CIDR 掩码长度之间不能有空白。典型的
CIDR-address
举例:172.20.143.89/32
表示一个主机,172.20.143.0/24
表示一个小子网,10.6.0.0/16
表示一个大子网。要声明单个主机,给 IPv4 地址声明 CIDR 掩码 32 ,给 IPv6 地址声明 128 。不要在地址中省略结尾的 0 。以 IPv4 格式给出的 IP 地址会匹配那些拥有对应地址的 IPv6 连接,比如
127.0.0.1
将匹配 IPv6 地址::ffff:127.0.0.1
。一个以 IPv6 格式给出的记录将只匹配 IPv6 连接,即使对应的地址在 IPv4-in-IPv6 范围内。请注意如果系统的 C 库不支持 IPv6 地址,那么 IPv6 的格式将被拒绝。这个字段只适用于
host
,hostssl
,hostnossl
记录。IP-address
IP-mask
这些方法可以用于作为
CIDR-address
表示法的替补。它不是声明掩码的长度,而是在另外一个字段里声明实际的掩码。比如,255.0.0.0
表示 IPv4 CIDR 掩码长度 8 ,而255.255.255.255
表示 CIDR 掩码长度 32 。这些字段只适用于
host
,hostssl
,hostnossl
记录。auth-method
声明通过这条记录连接的时候使用的认证方法。可能的选择在下面简介,详细情况在节20.2中介绍。
trust
无条件地允许连接。这个方法允许任何可以与 PostgreSQL 数据库服务器连接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行连接,而不需要口令。参阅节20.2.1获取细节。
reject
无条件地拒绝连接。常用于从一个组中"过滤"某些主机。
md5
要求客户端提供一个 MD5 加密的口令进行认证。参阅节20.2.2获取细节。
crypt
-
【注意】这个选项只有在与 7.2 以前的客户端进行通讯的时候才建议使用。
crypt
要求客户端提供一个crypt()
加密的口令用于认证。现在我们建议使用md5
。参阅节20.2.2。 password
要求客户端提供一个未加密的口令进行认证。因为口令是以明文形式在网络上传递的,所以我们不应该在不安全的网络上使用这个方式。并且它通常还不能和线程化的客户端应用一起使用。参阅节20.2.2获取细节。
krb5
用 Kerberos V5 认证用户。只有在进行 TCP/IP 连接的时候才能用。参阅节20.2.3获取细节。
ident
获取客户的操作系统名然后检查该用户是否允许以要求的数据库用户进行连接,方法是参照在
ident
关键字后面声明的映射。对于 TCP/IP 连接,用户的身份是通过与运行在客户端上的ident
服务器连接进行判断的,对于本地连接,它是从操作系统获取的。参阅节20.2.4获取细节。ldap
使用 LDAP 进行认证。参阅节20.2.5获取细节。
pam
使用操作系统提供的可插入认证模块服务(PAM)来认证。参阅节20.2.6获取细节。
auth-option
这个可选字段的含义取决于选择的认证方法。细节在下面。
用 @
构造包含的文件是当作一列名字读取的,这些名字可以用空白或者逗号分隔。注释用 #
引入,就像在 pg_hba.conf
里那样,允许嵌套 @
构造。除非跟在 @
后面的文件名是一个绝对路径,否则被当作与该文件所在目录相对的路径。
因为认证时系统是为每个连接请求顺序检查 pg_hba.conf
里的记录的,所以这些记录的顺序是非常关键的。通常,靠前的记录有比较严的连接匹配参数和比较弱的认证方法,而靠后的记录有比较松的匹配参数和比较严的认证方法。比如,我们一般都希望对本地 TCP/IP 连接使用 trust
认证,而对远端的 TCP/IP 连接要求口令。在这种情况下我们将 trust
认证方法用于来自 127.0.0.1 的连接,这条记录将出现在允许更广泛的客户端 IP 地址的使用口令认证的记录前面。
在启动和主服务器进程收到 SIGHUP 信号的时候,系统都会重新装载 pg_hba.conf
文件。如果你在活跃的系统上编辑了该文件,就必须通知服务器(使用 pg_ctl reload
或 kill -HUP
)重新加载该文件。
【提示】一个用户要想成功连接到特定的数据库,不仅需要通过
pg_hba.conf
的检查,还必须要有该数据库上的CONNECT
权限。如果希望限制哪些用户能够连接到哪些数据库,赋予/撤销CONNECT
权限通常比在pg_hba.conf
中设置规则简单。
例20-1里是 pg_hba.conf
记录的一些例子。阅读下文理解不同认证方法的细节。
例20-1. pg_hba.conf
记录的例子
# Allow any user on the local system to connect to any database under # 允许在本机上的任何用户使用 Unix 域套接字(本地连接的缺省)以任何数据库用户身份连接任何数据库 # TYPE DATABASE USER CIDR-ADDRESS METHOD local all all trust # 和上面相同,但是使用的是回环的(loopback)TCP/IP 连接 # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 127.0.0.1/32 trust # 和上面一行相同,但是用的是独立的掩码字段 # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 127.0.0.1 255.255.255.255 trust # 允许 IP 地址为 192.168.93.x 的任何主机与 "postgres" 数据库相连, # 用与他们在自己的主机上相同 ident 的用户名标识他自己(通常是他的 Unix 用户名) # TYPE DATABASE USER CIDR-ADDRESS METHOD host postgres all 192.168.93.0/24 ident sameuser # 允许来自主机 192.168.12.10 的用户提供了正确的口令之后与 "postgres" 数据库连接。 # TYPE DATABASE USER CIDR-ADDRESS METHOD host postgres all 192.168.12.10/32 md5 # 如果前面没有其它 "host" 行,那么下面两行将拒绝所有来自 192.168.54.1 的连接请求(因为前面的记录先匹配)。 # 但是允许来自互联网上其它任何地方的有效的 Kerberos 5 认证的连接。 # 零掩码表示不考虑主机 IP 的任何位。因此它匹配任何主机。 # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.54.1/32 reject host all all 0.0.0.0/0 krb5 # 允许来自 192.168.x.x 的任何用户与任意数据库连接,只要他们通过 ident 检查。 # 但如果 ident 说该用户是 "bryanh" 且他要求以 PostgreSQL 用户 "guest1" 连接, # 那么只有在 pg_ident.conf 里有 "omicron" 的映射说 "bryanh" 允许以 "guest1" 进行连接时才真正可以进行连接。 # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.0.0/16 ident omicron # 如果下面是用于本地连接的仅有的三行,那么它们将允许本地用户只和同名数据库连接。 # 只有管理员和 "support" 角色里的成员例外,他们可以连接到任何数据库。 # $PGDATA/admins 文件列出了那些允许与所有数据库连接的用户名。 # 在所有情况下都需要口令。 # TYPE DATABASE USER CIDR-ADDRESS METHOD local sameuser all md5 local all @admins md5 local all +support md5 # 上面最后两行可以合起来写成一行 local all @admins,+support md5 # 数据库字段也可以使用列表和文件名: local db1,db2,@demodbs all md5
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论