日志:启动处理期间连接失败:用户 = 数据库 = 致命:用户 "postgres" 的 GSSAPI 身份验证失败
LOG: connection failed during start up processing: user= database= FATAL: GSSAPI authentication failed for user "postgres"
我正在尝试为 GSSAPI 配置 Kerberos 目前我有两个节点
一个是 KDC 服务器(windows 服务器 2016),另一个是 Postgres 服务器(Ubuntu)。
我在 kdc-server 上创建了 Active Directory 并创建了名为
postgres 并选择了“密码永不过期”选项。
那我安装了MIT的kerbrose客户端。
这是 kdc 服务器上的 krb5.ini。
[libdefaults]
default_realm = HIGHGO.CA
# The following krb5.conf variables are only for MIT Kerberos.
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
# The following encryption type specification will be used by MIT Kerberos
# if uncommented. In general, the defaults in the MIT Kerberos code are
# correct and overriding these specifications only serves to disable new
# encryption types as they are added, creating interoperability problems.
#
# The only time when you might need to uncomment these lines and change
# the enctypes is if you have local software that will break on ticket
# caches containing ticket encryption types it doesn't know about (such as
# old versions of Sun Java).
# default_tgs_enctypes = des3-hmac-sha1
# default_tkt_enctypes = des3-hmac-sha1
# permitted_enctypes = des3-hmac-sha1
# The following libdefaults parameters are only for Heimdal Kerberos.
fcc-mit-ticketflags = true
[realms]
HIGHGO.CA = {
kdc = kdc.highgo.ca
admin_server = kdc.highgo.ca
}
ATHENA.MIT.EDU = {
kdc = kerberos.mit.edu
kdc = kerberos-1.mit.edu
kdc = kerberos-2.mit.edu:88
admin_server = kerberos.mit.edu
default_domain = mit.edu
}
ZONE.MIT.EDU = {
kdc = casio.mit.edu
kdc = seiko.mit.edu
admin_server = casio.mit.edu
}
CSAIL.MIT.EDU = {
admin_server = kerberos.csail.mit.edu
default_domain = csail.mit.edu
}
IHTFP.ORG = {
kdc = kerberos.ihtfp.org
admin_server = kerberos.ihtfp.org
}
1TS.ORG = {
kdc = kerberos.1ts.org
admin_server = kerberos.1ts.org
}
ANDREW.CMU.EDU = {
admin_server = kerberos.andrew.cmu.edu
default_domain = andrew.cmu.edu
}
CS.CMU.EDU = {
kdc = kerberos-1.srv.cs.cmu.edu
kdc = kerberos-2.srv.cs.cmu.edu
kdc = kerberos-3.srv.cs.cmu.edu
admin_server = kerberos.cs.cmu.edu
}
DEMENTIA.ORG = {
kdc = kerberos.dementix.org
kdc = kerberos2.dementix.org
admin_server = kerberos.dementix.org
}
stanford.edu = {
kdc = krb5auth1.stanford.edu
kdc = krb5auth2.stanford.edu
kdc = krb5auth3.stanford.edu
master_kdc = krb5auth1.stanford.edu
admin_server = krb5-admin.stanford.edu
default_domain = stanford.edu
}
UTORONTO.CA = {
kdc = kerberos1.utoronto.ca
kdc = kerberos2.utoronto.ca
kdc = kerberos3.utoronto.ca
admin_server = kerberos1.utoronto.ca
default_domain = utoronto.ca
}
[domain_realm]
.mit.edu = ATHENA.MIT.EDU
mit.edu = ATHENA.MIT.EDU
.media.mit.edu = MEDIA-LAB.MIT.EDU
media.mit.edu = MEDIA-LAB.MIT.EDU
.csail.mit.edu = CSAIL.MIT.EDU
csail.mit.edu = CSAIL.MIT.EDU
.whoi.edu = ATHENA.MIT.EDU
whoi.edu = ATHENA.MIT.EDU
.stanford.edu = stanford.edu
.slac.stanford.edu = SLAC.STANFORD.EDU
.toronto.edu = UTORONTO.CA
.utoronto.ca = UTORONTO.CA
创建原则
setspn -A postgres/pg.highgo.ca@HIGHGO.CA postgres
创建原理后,我用以下命令对其进行了测试
c:\Users\administrator\Desktop>kinit postgres
Password for postgres@HIGHGO.CA:
工作正常。
这就是我创建密钥选项卡的方式
ktpass -out pgkt.keytab -princ postgres/pg.highgo.ca@HIGHGI.CA
-mapUser enterprisedb -pass Casper@12 -crypto all -ptype KRB5_NT_PRINCIPAL
并在 postgres 服务器中复制此文件
并将其替换为具有以下权限的文件 /etc/krb5.keytab。
chmod 600 /etc/krb5.keytab
这是我在 linux 和 windows 上的 /etc/host 条目。
192.168.100.112 pg.highgo.ca
192.168.100.114 kdc.highgo.ca
并且我已经在 postgress.conf 中输入了一个条目。
krb_server_keyfile = '/etc/krb5.keytab'
这是 pg_hba.conf 个条目。
host all all 0.0.0.0/0 gss include_realm=0
之后我尝试使用以下命令访问 postgress 服务器。
psql -U postgres -d postgress -h 192.168.100.114
作为回应,我在 windows 上收到以下错误。
psql: error: could not connect to server: SSPI continuation error: The specified target is unknown or unreachable
(80090303)
并查看了 posgtes 上的日志。
2020-08-18 05:49:36.534 PDT [5086] [unknown]@[unknown] LOG: connection failed during start up processing: user= database=
2020-08-18 05:49:36.541 PDT [5087] postgres@postgres FATAL: GSSAPI authentication failed for user "postgress"
2020-08-18 05:49:36.541 PDT [5087] postgres@postgres DETAIL: Connection matched pg_hba.conf line 97: "host all all 0.0.0.0/0 gss include_realm=0 "
查了很多教程都没有机会解决。
(Note : same commands works fine with MD5 authentication )
提前致谢。
这是早期版本的 Postgres 和 EDB Postgres v.12 中遇到的常见问题,因为已添加 GSSAPI 加密,但存在错误。该错误已在提交 79e594cf04754d55196d2ce54fc869ccad5fa9c3
中修复,在 v.12.3 中发布。如果您可以升级到 v. 12.3,则可能可以解决此问题。
如果您出于某种原因需要使用较旧的客户端,请务必在您的连接字符串中设置 gssencmode=disable
或在您的环境中设置 PGGSSAPIENCMODE=disable
。
我在同事的帮助下解决了这个问题,这是在新环境中完成的。
步骤:
(Note : there no need of kerbrose client on the PG-Server machien (mine is Ubuntu 18.xx))
- Active Directory 设置于 Windows 2016 MYDOMAIN.CA 并且
两台机器上都安装了 EPAS Server 11 或 12。
Active Directory Setup Link
- 确保两台机器上的时区和时间相同。
/etc/hosts
Windows机器IP为192.168.100.19,Linux机器IP为
192.168.100.17.
同时假设 Windows 机器名称是“client”所以它的全名
是“client.mydomain.ca”。
在linux上的/etc/hosts中输入以下内容(注释掉其他
条目)
192.168.100.19 client.mydomain.ca client
192.168.100.17 pg.mydomain.ca pg
- 在c:\Windows\System32\Drivers\etc\hosts上输入以下内容
Windows
192.168.100.19 client.mydomain.ca
192.168.100.17 pg.mydomain.ca
验证主机是否正在通过 ping 进行通信。
在 Active Directory 中创建用户(Windows 计算机)
假设您以管理员身份登录,在“服务器管理器”中
单击“工具”和 select“Active Directory 用户和计算机”
你的域下“MYDOMAIN.CA” select 用户 显示所有用户
右键单击管理员并select“复制”
在“名字”和“用户登录名”字段中输入“pguser”。
点击下一步。域“MYDOMAIN.CA”应显示在组合框中
“用户登录名”
输入用户密码并取消选中“密码永不过期”
复选框。 -> 单击下一步 -> 单击完成。已创建用户帐户。
在用户列表中双击该用户或右键单击该用户并
select 属性。
在“帐户”选项卡中,在“帐户选项”下勾选“此帐户支持
kerberos AES 256 位加密”复选框并单击确定。
注销 Windows 并使用“pguser”用户登录。
创建密钥表
- Windows 机器:以管理员身份打开命令提示符并输入
以下命令创建密钥表。
ktpass -out krb5.keytab -mapUser pguser@MYDOMAIN.CA +rndPass -mapOp set +DumpSalt -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -princ POSTGRES/pg.mydomain.ca@MYDOMAIN.CA
请注意,此命令不应给出任何错误或警告。如果你
看到错误或警告并生成密钥表,此密钥表将
不工作。
如果keytab创建成功,可以打开查看
pguser 用户属性,“用户登录名”为“帐户”选项卡
更改为 postgres/pg.mydomain.ca.
现在您已经创建了密钥表文件“krb5.keytab”。
Linux 机器:将此文件作为“/etc/krb5.keytab”复制到 Linux 机器。
//Suppose file is on Desktop of user edb on Linux machine. su to
become root.
cd /etc/
cp /home/edb/Desktop/krb5.keytab .
chown enterprisedb:enterprisedb krb5.keytab
chmod 600 krb5.keytab
- 打开 postgresql.conf 文件并将 krb_server_keyfile 设置为
“/etc/krb5.keytab”(取消注释这一行,因为它被注释掉了
默认)
krb_server_keyfile = '/etc/krb5.keytab'
- 打开pg_hba.conf文件并添加以下行(注释掉所有
除了“local all enterprisedb trust/md5”之外的其他行,因此任何远程
用户只能使用 gss 连接)
local all enterprisedb trust
host all all 0.0.0.0/0 gss
- 重启服务器。
- 创建用户“pguser@MYDOMAIN.CA”。
CREATE USER "pg1postgres@HIGHGO.CA" SUPERUSER CREATEDB CREATEROLE;
来自 Windows
的 PSQL 命令
发出此命令以连接到 Linux
上的 D
psql -U pgUSER@MYDOMAIN.CA -d edb -h pg.mydomain.ca
此致,
我正在尝试为 GSSAPI 配置 Kerberos 目前我有两个节点 一个是 KDC 服务器(windows 服务器 2016),另一个是 Postgres 服务器(Ubuntu)。 我在 kdc-server 上创建了 Active Directory 并创建了名为 postgres 并选择了“密码永不过期”选项。
那我安装了MIT的kerbrose客户端。 这是 kdc 服务器上的 krb5.ini。
[libdefaults]
default_realm = HIGHGO.CA
# The following krb5.conf variables are only for MIT Kerberos.
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
# The following encryption type specification will be used by MIT Kerberos
# if uncommented. In general, the defaults in the MIT Kerberos code are
# correct and overriding these specifications only serves to disable new
# encryption types as they are added, creating interoperability problems.
#
# The only time when you might need to uncomment these lines and change
# the enctypes is if you have local software that will break on ticket
# caches containing ticket encryption types it doesn't know about (such as
# old versions of Sun Java).
# default_tgs_enctypes = des3-hmac-sha1
# default_tkt_enctypes = des3-hmac-sha1
# permitted_enctypes = des3-hmac-sha1
# The following libdefaults parameters are only for Heimdal Kerberos.
fcc-mit-ticketflags = true
[realms]
HIGHGO.CA = {
kdc = kdc.highgo.ca
admin_server = kdc.highgo.ca
}
ATHENA.MIT.EDU = {
kdc = kerberos.mit.edu
kdc = kerberos-1.mit.edu
kdc = kerberos-2.mit.edu:88
admin_server = kerberos.mit.edu
default_domain = mit.edu
}
ZONE.MIT.EDU = {
kdc = casio.mit.edu
kdc = seiko.mit.edu
admin_server = casio.mit.edu
}
CSAIL.MIT.EDU = {
admin_server = kerberos.csail.mit.edu
default_domain = csail.mit.edu
}
IHTFP.ORG = {
kdc = kerberos.ihtfp.org
admin_server = kerberos.ihtfp.org
}
1TS.ORG = {
kdc = kerberos.1ts.org
admin_server = kerberos.1ts.org
}
ANDREW.CMU.EDU = {
admin_server = kerberos.andrew.cmu.edu
default_domain = andrew.cmu.edu
}
CS.CMU.EDU = {
kdc = kerberos-1.srv.cs.cmu.edu
kdc = kerberos-2.srv.cs.cmu.edu
kdc = kerberos-3.srv.cs.cmu.edu
admin_server = kerberos.cs.cmu.edu
}
DEMENTIA.ORG = {
kdc = kerberos.dementix.org
kdc = kerberos2.dementix.org
admin_server = kerberos.dementix.org
}
stanford.edu = {
kdc = krb5auth1.stanford.edu
kdc = krb5auth2.stanford.edu
kdc = krb5auth3.stanford.edu
master_kdc = krb5auth1.stanford.edu
admin_server = krb5-admin.stanford.edu
default_domain = stanford.edu
}
UTORONTO.CA = {
kdc = kerberos1.utoronto.ca
kdc = kerberos2.utoronto.ca
kdc = kerberos3.utoronto.ca
admin_server = kerberos1.utoronto.ca
default_domain = utoronto.ca
}
[domain_realm]
.mit.edu = ATHENA.MIT.EDU
mit.edu = ATHENA.MIT.EDU
.media.mit.edu = MEDIA-LAB.MIT.EDU
media.mit.edu = MEDIA-LAB.MIT.EDU
.csail.mit.edu = CSAIL.MIT.EDU
csail.mit.edu = CSAIL.MIT.EDU
.whoi.edu = ATHENA.MIT.EDU
whoi.edu = ATHENA.MIT.EDU
.stanford.edu = stanford.edu
.slac.stanford.edu = SLAC.STANFORD.EDU
.toronto.edu = UTORONTO.CA
.utoronto.ca = UTORONTO.CA
创建原则
setspn -A postgres/pg.highgo.ca@HIGHGO.CA postgres
创建原理后,我用以下命令对其进行了测试
c:\Users\administrator\Desktop>kinit postgres
Password for postgres@HIGHGO.CA:
工作正常。
这就是我创建密钥选项卡的方式
ktpass -out pgkt.keytab -princ postgres/pg.highgo.ca@HIGHGI.CA
-mapUser enterprisedb -pass Casper@12 -crypto all -ptype KRB5_NT_PRINCIPAL
并在 postgres 服务器中复制此文件 并将其替换为具有以下权限的文件 /etc/krb5.keytab。
chmod 600 /etc/krb5.keytab
这是我在 linux 和 windows 上的 /etc/host 条目。
192.168.100.112 pg.highgo.ca
192.168.100.114 kdc.highgo.ca
并且我已经在 postgress.conf 中输入了一个条目。
krb_server_keyfile = '/etc/krb5.keytab'
这是 pg_hba.conf 个条目。
host all all 0.0.0.0/0 gss include_realm=0
之后我尝试使用以下命令访问 postgress 服务器。
psql -U postgres -d postgress -h 192.168.100.114
作为回应,我在 windows 上收到以下错误。
psql: error: could not connect to server: SSPI continuation error: The specified target is unknown or unreachable
(80090303)
并查看了 posgtes 上的日志。
2020-08-18 05:49:36.534 PDT [5086] [unknown]@[unknown] LOG: connection failed during start up processing: user= database=
2020-08-18 05:49:36.541 PDT [5087] postgres@postgres FATAL: GSSAPI authentication failed for user "postgress"
2020-08-18 05:49:36.541 PDT [5087] postgres@postgres DETAIL: Connection matched pg_hba.conf line 97: "host all all 0.0.0.0/0 gss include_realm=0 "
查了很多教程都没有机会解决。
(Note : same commands works fine with MD5 authentication )
提前致谢。
这是早期版本的 Postgres 和 EDB Postgres v.12 中遇到的常见问题,因为已添加 GSSAPI 加密,但存在错误。该错误已在提交 79e594cf04754d55196d2ce54fc869ccad5fa9c3
中修复,在 v.12.3 中发布。如果您可以升级到 v. 12.3,则可能可以解决此问题。
如果您出于某种原因需要使用较旧的客户端,请务必在您的连接字符串中设置 gssencmode=disable
或在您的环境中设置 PGGSSAPIENCMODE=disable
。
我在同事的帮助下解决了这个问题,这是在新环境中完成的。 步骤:
(Note : there no need of kerbrose client on the PG-Server machien (mine is Ubuntu 18.xx))
- Active Directory 设置于 Windows 2016 MYDOMAIN.CA 并且 两台机器上都安装了 EPAS Server 11 或 12。 Active Directory Setup Link
- 确保两台机器上的时区和时间相同。
/etc/hosts
Windows机器IP为192.168.100.19,Linux机器IP为 192.168.100.17.
同时假设 Windows 机器名称是“client”所以它的全名 是“client.mydomain.ca”。
在linux上的/etc/hosts中输入以下内容(注释掉其他 条目)
192.168.100.19 client.mydomain.ca client 192.168.100.17 pg.mydomain.ca pg
- 在c:\Windows\System32\Drivers\etc\hosts上输入以下内容 Windows
192.168.100.19 client.mydomain.ca 192.168.100.17 pg.mydomain.ca
验证主机是否正在通过 ping 进行通信。
在 Active Directory 中创建用户(Windows 计算机)
假设您以管理员身份登录,在“服务器管理器”中 单击“工具”和 select“Active Directory 用户和计算机”
你的域下“MYDOMAIN.CA” select 用户 显示所有用户
右键单击管理员并select“复制”
在“名字”和“用户登录名”字段中输入“pguser”。 点击下一步。域“MYDOMAIN.CA”应显示在组合框中 “用户登录名”
输入用户密码并取消选中“密码永不过期” 复选框。 -> 单击下一步 -> 单击完成。已创建用户帐户。
在用户列表中双击该用户或右键单击该用户并 select 属性。
在“帐户”选项卡中,在“帐户选项”下勾选“此帐户支持 kerberos AES 256 位加密”复选框并单击确定。
注销 Windows 并使用“pguser”用户登录。
创建密钥表
- Windows 机器:以管理员身份打开命令提示符并输入 以下命令创建密钥表。
ktpass -out krb5.keytab -mapUser pguser@MYDOMAIN.CA +rndPass -mapOp set +DumpSalt -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -princ POSTGRES/pg.mydomain.ca@MYDOMAIN.CA
请注意,此命令不应给出任何错误或警告。如果你 看到错误或警告并生成密钥表,此密钥表将 不工作。
如果keytab创建成功,可以打开查看 pguser 用户属性,“用户登录名”为“帐户”选项卡 更改为 postgres/pg.mydomain.ca.
现在您已经创建了密钥表文件“krb5.keytab”。
Linux 机器:将此文件作为“/etc/krb5.keytab”复制到 Linux 机器。
//Suppose file is on Desktop of user edb on Linux machine. su to become root.
cd /etc/
cp /home/edb/Desktop/krb5.keytab .
chown enterprisedb:enterprisedb krb5.keytab
chmod 600 krb5.keytab
- 打开 postgresql.conf 文件并将 krb_server_keyfile 设置为 “/etc/krb5.keytab”(取消注释这一行,因为它被注释掉了 默认)
krb_server_keyfile = '/etc/krb5.keytab'
- 打开pg_hba.conf文件并添加以下行(注释掉所有 除了“local all enterprisedb trust/md5”之外的其他行,因此任何远程 用户只能使用 gss 连接)
local all enterprisedb trust
host all all 0.0.0.0/0 gss
- 重启服务器。
- 创建用户“pguser@MYDOMAIN.CA”。
CREATE USER "pg1postgres@HIGHGO.CA" SUPERUSER CREATEDB CREATEROLE;
来自 Windows
的 PSQL 命令发出此命令以连接到 Linux
上的 Dpsql -U pgUSER@MYDOMAIN.CA -d edb -h pg.mydomain.ca
此致,