我已经使用 psql 在 CLI 上设置了 PostgreSQL 9.4 和 MIT Kerberos 5 以及 CAN 连接。在归还指纹后,我的校长是 bgiles/postgres@REALM,pg_hba.conf 有
host all all 0.0.0.0/0 gss include_realm=1 map=gss krb_realm=REALM
和 pg_ident.conf 文件有
gss /^(.*)/postgres@REALM$ \1
我创建了该主体,将其保存到 keytab,如果我
$ kinit -k -t krb5.keytab bgiles/postgres
我可以成功连接到我的 PostgreSQL 服务器'kpg'。这证明 Kerberos 和 keytab 已正确设置。
$ psql -h kpg dbname
(connection information...)
但是,当我使用相同的 keytab 通过 JDBC 连接时,我得到一个 GSS 身份验证错误,这是由于 PostgreSQL 拒绝执行映射。
2016-04-20 00:13:16 UTC [18919-1] bgiles/postgres@bgiles LOG: no match in usermap "gss" for user "bgiles/postgres" authenticated as "bgiles/postgres@REALM"
2016-04-20 00:13:16 UTC [18919-2] bgiles/postgres@bgiles FATAL: GSSAPI authentication failed for user "bgiles/postgres"
2016-04-20 00:13:16 UTC [18919-3] bgiles/postgres@bgiles DETAIL: Connection matched pg_hba.conf line 100: "host all all 75.144.16.201/32 gss include_realm=1 map=gss krb_realm=REALM"
(我注意到 the_1_and 怀疑这是问题的关键,但完全被 it.)难倒
测试代码是
public class KerberosPostgreSQLTest {
static {
URL url = Thread.currentThread().getContextClassLoader().getResource("jaas.conf");
System.setProperty("java.security.auth.login.config", url.toExternalForm());
System.setProperty("java.security.krb5.realm", "REALM");
System.setProperty("java.security.krb5.kdc", "kdc");
}
@Test
public void test() throws Exception {
String url = "jdbc:postgresql://kpg/bgiles";
String user = "bgiles/postgres";
Properties connInfo = new Properties();
connInfo.put("user", user);
connInfo.put("jaasApplicationName", "pgjdbc");
try (Connection conn = DriverManager.getConnection(url, connInfo)) {
}
}
}
和 JAAS 配置文件是
pgjdbc {
com.sun.security.auth.module.Krb5LoginModule required
refreshKrb5Config=true
doNotPrompt=true
useTicketCache=true
renewTGT=false
useKeyTab=true
keyTab="/tmp/krb5.keytab"
debug=true
client=true
principal="bgiles/postgres"
;
};
PostgreSQL 数据库肯定会识别有效的 Kerberos 连接尝试。它正在最后一步,它从 Kerberos 主体映射到 PostgreSQL 用户 ID。不知何故,java/jaas/jdbc 代码正在破坏它,并且在 CLI 上工作的东西不能通过 JDBC 工作。
我使用了无数的布尔标志变体,并添加或 removing_1_and 找到了许多方法来防止 GSS 身份验证发生,但没有任何东西可以让我连接到服务器。
有任何想法吗?唯一的区别在于 java/jaas/jdbc 代码,但我无法理解如何获得仍被 KDC 接受的受损主体。 TGT 问题?
谢谢,
熊