日志:启动处理期间连接失败:用户 = 数据库 = 致命:用户"postgres"的 GSSAPI 身份验证失败



我正在尝试为GSSAPI配置Kerberos当前我有两个节点一个是KDC服务器(windows服务器2016),另一个是Postgres服务器(Ubuntu)。我已经在kdc服务器上创建了Active directory,并创建了名为的用户postgres并选择选项";密码永远不会过期";。

然后我安装了一个麻省理工学院的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:UsersadministratorDesktop>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服务器中cpoy此文件并将其替换为具有以下权限的文件/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 "

我检查了很多教程,但没有机会解决它。

(注意:相同的命令适用于MD5身份验证)

提前感谢。

这是Postgres和EDB Postgres v.12早期版本中遇到的常见问题,因为添加了GSSAPI加密,但存在一个错误。这个错误已经在第12.3版中发布的提交79e594cf04754d55196d2ce54fc869ccad5fa9c3中修复。如果您可以升级到v.12.3,您可能可以解决这个问题。

如果出于某种原因需要使用较旧的客户端,请确保在连接字符串中设置gssencmode=disable或在环境中设置PGGSSAPIENCMODE=disable

我在同事的帮助下解决了这个问题,这是在新鲜的环境中完成的。步骤:

(注意:在PG服务器machien上不需要kerbrose客户端(我的是Ubuntu18.xx))

  1. Active Directory是在Windows 2016 MYDOMAIN.CA和两台机器上都安装了EPAS服务器11或12。Active Directory安装程序链接
  2. 确保两台机器上的时区和时间相同
  • /etc/hosts

  • Windows机器的IP为192.168.100.19,Linux的IP为192.168.100.17.

    还假设Windows计算机名称为"客户端",因此其全名是"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计算机)中创建用户

  • 假设您以管理员身份登录,在"服务器管理器"中单击"工具"并选择"Active Directory用户和计算机">

  • 在您的域"MYDOMAIN.CA"下选择用户以显示所有用户

    右键单击管理员并选择"复制">

  • 在"名字"one_answers"用户登录名"字段中输入"pguser"。单击"下一步"。域"MYDOMAIN.CA"应显示在组合框中"用户登录名">

  • 输入用户密码并取消选中"密码永不过期"复选框->单击"下一步"->单击"完成"。用户帐户已创建。

  • 双击"用户"列表中的该用户,或右键单击该用户,然后选择"属性"。

  • 在"帐户"选项卡的"帐户选项"下,选中"此帐户支持kerberos AES 256位加密"复选框,然后单击"确定"。

  • 注销Windows并使用"pguser"用户登录。

创建键选项卡

  • Windows计算机:以管理员身份打开命令提示符,然后输入按照命令创建Keytab
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,则此keytab将不起作用。

  • 如果键选项卡创建成功,则可以通过打开进行检查pguser用户属性,"用户登录名"所在的"帐户"选项卡已更改为postgres/pg.mydomain.ca.

  • 现在您已经创建了keytab文件"krb5.keytab".

  • Linux机器:将此文件作为"/etc/krb5.keytab"复制到Linux机器。

//假设文件在Linux机器上的用户edb的桌面上。su到成为根。

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-enterprisedbtrust/md5"之外的其他行,因此任何远程用户只能使用gss进行连接)

本地所有企业数据库信任

承载所有0.0.0.0/0 gss

  • 重新启动服务器
  • 创建用户"pguser@MYDOMAIN.CA">

CREATE USER"pg1postgres@HIGHGO.CA"超级用户CREATEDB CREATEROLE;

Windows中的PSQL命令

发出此命令以连接到Linux 上的D

psql-UpgUSER@MYDOMAIN.CA-d edb-h pg.mydomain.ca

问候,

最新更新