在 Windows 上使用 SSPI 配置单点登录
PostgreSQL 支持使用 SSPI (其他数据库称为“Windows 集成身份验证”) 进行单点登录。但是,这只有在您位于 Windows 域环境中时才有可能,因为需要 Kerberos KDC。SSPI 也适用于对在独立 Windows 计算机上连接到 localhost 的用户的身份验证。
我假设您使用一键式安装程序在您的服务器上设置了 PostgreSQL。
配置服务
如果您在域上使用 PostgreSQL,则必须在运行 PostgreSQL 的帐户或计算机上设置服务主体名称。
如果您只是在独立计算机上使用 SSPI 进行 localhost 到 localhost 的身份验证,则不需要这样做;在这种情况下,直接跳过 pg_hba.conf 设置。
对于在域上的 PostgreSQL 9.2 及以上版本:设置计算机帐户的服务主体名称
在 9.2 及以上版本中,PostgreSQL 安装程序默认将 PostgreSQL 服务设置为在NETWORK SERVICE帐户下运行。您可以将 PostgreSQL 设置为在域帐户下运行,并按照以下“域帐户”部分中更安全但更复杂的操作说明进行操作,但是,还有一种简单(尽管不太安全)的替代方法适用于许多情况。
要使用它,请将服务主体名称添加到计算机帐户;无需进一步更改。如果您的服务器名为“dbserver”,您可以使用以下命令
setspn -S POSTGRES/fully.qualified.domain.name dbserver
请注意,在共享帐户下运行数据库允许所有其他使用相同帐户的服务直接读取和修改数据库文件。如果这在您的环境中不可接受,请按照上面的 9.1 版本的步骤操作,使用专用服务帐户。
对于在域上的所有 PostgreSQL 版本:“postgres”作为域帐户
安装后,PostgreSQL 9.1 或以下版本在名为“postgres”的本地帐户下运行。9.2 或以上版本默认情况下安装到NETWORKSERVICE下。
如果您想安全地使用 SSPI 访问域,则需要更改服务以在域帐户下运行,因为 SSPI 要求服务使用域帐户。
- 停止服务。
- 在您的域中创建一个用户帐户。
- 将数据目录及其中的所有内容的所有权更改为新帐户,并授予其完全控制权限。
- 更改服务登录凭据,以便服务使用您的域帐户。
- 启动服务以查看一切是否正常工作。尝试以之前的方式登录,创建数据库,删除一些表,调用 pg_switch_xlog()。如果您能够登录,那么以后发生的大多数问题都表示数据文件缺少权限。
现在,您必须告诉 Active Directory 您的服务帐户正在运行数据库。为此,您需要将服务主体名称 (SPN) 添加到您的服务帐户。有一个命令行工具用于此,称为 setspn.exe
setspn -S POSTGRES/fully.qualified.domain.name DOMAIN\service_account_name
或者,您可以直接使用任何可以修改目录的工具(包括“用户和计算机”MMC,或 Windows Server 的更高版本中的等效工具,或 ADSIedit)更改属性(servicePrincipalName)。
您还需要确保所有客户端都使用完整的主机名,否则它们可能无法获取服务票证。添加一个只有主机名而没有域的第二个 SPN(在上面的示例中为“fully”)可能有助于解决这个问题,但使用完整名称更安全。
在 pg_hba.conf 中添加 SSPI 条目
对于任何配置,您最终都必须在 pg_hba.conf 中要求 SSPI 登录到数据库。
为此,您需要创建一些与您的域用户同名的登录角色,并在 pg_hba.conf 中添加一个具有身份验证方法“sspi”的条目。
请记住,只使用 pg_hba.conf 中与数据库、客户端地址和声称的用户名称匹配的第一个条目。
可以使用 pg-ldap-sync 自动创建登录角色和组。
该pg_ident.conf文件可用于配置用户名映射,如果您的 PostgreSQL 用户名与您的 Windows 用户名不完全相同。