2

我正在尝试使用 python-kerberos (1.0.90-3.el6) 为 GSSAPI 服务器端身份验证初始化上下文。我的问题是 myserver.localdomain 被转换为 myserver - 我给定的主体的一部分在某处被砍掉。为什么会这样?

失败示例:

>>> import kerberos
>>> kerberos.authGSSServerInit("HTTP@myserver.localdomain")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
kerberos.GSSError: (('Unspecified GSS failure.  Minor code may provide more information', 851968), ('Unknown error', 0))
>>>

在 KRB5_TRACE 的帮助下,我得到了原因:

[1257] 1346344556.406343: Retrieving HTTP/myserver@LOCALDOMAIN from WRFILE:/etc/krb5.keytab (vno 0, enctype 0) with result: -1765328203/No key table entry found for HTTP/myserver@LOCALDOMAIN

我无法为普通的 HTTP/myserver@LOCALDOMAIN 生成密钥表,因为它还会强制用户使用这样的地址访问服务器。我需要让函数使用正确的 FQDN 名称。据我所见,authGSSServerInit 应该与 FQDN 一起工作而不会破坏它。

我认为 python-kerberos 方法调用了以下 krb5-libs (1.9-33.el6) 提供的函数,问题也可能出在这些函数中:

maj_stat = gss_import_name(&min_stat, &name_token, GSS_C_NT_HOSTBASED_SERVICE, &state->server_name);
maj_stat = gss_acquire_cred(&min_stat, state->server_name,GSS_C_INDEFINITE,GSS_C_NO_OID_SET, GSS_C_ACCEPT, &state->server_creds, NULL, NULL);

kerberos 已在此主机上正确配置,并确认可以正常工作。例如,我可以以用户身份 kinit,并对票证进行身份验证。只是 authGSSServerInit 无法正常运行。

4

2 回答 2

3

一些文档具有误导性:

def authGSSServerInit(service):
    """
    Initializes a context for GSSAPI server-side authentication with the given service principal.
    authGSSServerClean must be called after this function returns an OK result to dispose of
    the context once all GSSAPI operations are complete.

    @param service: a string containing the service principal in the form 'type@fqdn'
        (e.g. 'imap@mail.apple.com').
    @return: a tuple of (result, context) where result is the result code (see above) and
        context is an opaque value that will need to be passed to subsequent functions.
    """

事实上,API 只需要类型。例如“HTTP”。主体的其余部分在 resolver(3) 的帮助下生成。尽管 kerberos 的其余部分很乐意使用短名称,但解析器会生成 FQDN,但前提是正确设置了 dnsdomainname。

于 2012-08-30T17:31:06.680 回答
0

为了完整起见,请提供更多信息,在 python 命令中包含以下变量:

  1. 这是可选的 -> KRB5_TRACE=/path-to-log/file.log
  2. 通常这个路径 -> KRB5_CONFIG= /etc/krb5.conf
  3. 通常这个路径 -> KTNAME=/etc/security/keytabs/foo.keytab

例如:

KRB5_TRACE=/path-to-log/file.log KRB5_CONFIG='/etc/krb5.conf' KTNAME=/etc/security/keytabs/foo.keytab /opt/anaconda3.5/bin/python3.6

在 python 运行中:

import kerberos
kerberos.authGSSServerInit("user")

注意事项:

  1. 在您的密钥表中,主体必须是 user/host@REALM
  2. 两个“用户”必须相同
  3. 完整的主体将由您的 kerberos 客户端配置组成

如果返回码为 0,你就完成了!恭喜!

如果没有转到日志文件并享受调试:P

于 2018-06-04T19:54:49.763 回答