Kerberos管理员授权

Kerberos administrator authorization

本文关键字:授权 管理员 Kerberos      更新时间:2023-10-16

我正在编写与MS Active Directory集成的linux应用程序。为此,我使用Kerberos。我已经实现了使用给定凭据对域用户进行身份验证的机制,但是现在我想检查用户是否是administrators组的成员。

从函数中得到creds

error = krb5_get_init_creds_password(context, &creds, principals,
        password.c_str(), NULL, NULL, 0, NULL, NULL);

这里我想实现授权user/administrator

的逻辑
if(!error) {
    // admin check
}

我正在考虑使用krb5_verify_init_creds功能,但我不确定我怎么能做到这一点。

Kerberos不进行授权,只进行身份验证。(也就是说,它可以知道你是谁,但不能知道你被允许做什么)。

一般来说,一旦您有了kerberos ID,您将询问一些授权服务允许该ID做什么。在这种情况下,最直接的做法是执行ldap查询,以确定用户是否是您感兴趣的组中的成员。

MS kerberos违反了这一原则,将AD知道的额外组信息添加到kerberos服务票证中。但是,我不知道有任何标准kerberos API提供对这些信息的访问。

正如Fred所指出的,Kerberos是用于身份验证,而不是用于授权。虽然由AD DC发出的Kerberos票据包含MS-PAC记录,其中包含映射到此Kerberos主体的AD对象的成员关系的附加信息,但要使用它,您需要的不仅仅是知道票据中显示的记录的格式。

在典型的Linux环境中,应用程序最好依赖PAM堆栈来解耦身份验证和授权步骤。通常使用PAM会话设置来运行授权检查。如果您的Linux机器配置为使用SSSD(使用id_provider = adid_provider=ipa以及FreeIPA和AD之间的跨森林信任),则可以依赖pam_sss通过SSSD处理身份验证和授权步骤。

最新版本的ssd通过将GPO登录权限映射到PAM服务来支持基于GPO的访问。

使用ssd,您的AD用户和组将显示为POSIX用户和组。这允许您基于组成员关系构建一个简单的访问控制,在使用krb5_aname_to_localname()将Kerberos主体映射到本地用户名之后,您可以通过getgrouplist(3)调用获得组成员关系。

如果仍然需要了解关于从Kerberos主体映射的用户的其他信息,可以利用ssd的infoppipe接口。通过infoppipe获得的信息是从Kerberos票据(可用时)和AD LDAP(直接使用全局目录或DC)中收集的。通过使用信息管道,您不需要像SSSD那样将MS-PAC中的sid解析为名称、解析组成员关系和验证MS-PAC的签名以及票证的其他组件。具体实现请参见https://fedorahosted.org/sssd/wiki/DesignDocs/DBusResponder和http://www.adelton.com/apache/mod_lookup_identity/。