我正在编写与MS Active Directory集成的linux应用程序。为此我正在使用Kerberos。我已经实现了使用给定凭据对域用户进行身份验证的机制,但现在我想检查用户是否是管理员组的成员。
所以我从函数中获得creds
。
error = krb5_get_init_creds_password(context, &creds, principals,
password.c_str(), NULL, NULL, 0, NULL, NULL);
在这里,我想实现授权用户/管理员的逻辑
if(!error) {
// admin check
}
我正在考虑使用krb5_verify_init_creds
功能,但我不知道该怎么做。
答案 0 :(得分:2)
正如Fred所说,Kerberos用于身份验证,而不是用于授权。虽然AD DC发布的Kerberos票证包含MS-PAC记录,其中包含有关映射到此Kerberos主体的AD对象成员资格的其他信息,但您需要的不仅仅是知道故障单中显示的记录格式以便使用它。
在典型的Linux环境中,您的应用程序最好依靠PAM堆栈来分离身份验证和授权步骤。通常,PAM会话设置用于运行授权检查。如果您的Linux计算机配置为使用SSSD(id_provider = ad
或id_provider=ipa
以及FreeIPA和AD之间的跨林信任),您可以依靠pam_sss
来处理身份验证和授权通过SSSD的步骤。
最新版本的SSSD通过将GPO登录权限映射到PAM服务来支持基于GPO的访问。
使用SSSD,您的AD用户和组将显示为POSIX用户和组。这允许您在使用getgrouplist(3)
将Kerberos主体映射到本地用户名后,根据您可以通过krb5_aname_to_localname()
调用获得的组成员身份构建一个简单的访问控制。
如果您仍需要了解有关从Kerberos主体映射的用户的其他信息,则可以使用SSSD的infopipe接口。通过infopipe提供的信息是从Kerberos票证(如果可用)和AD LDAP(全局目录或DC直接)中收集的。通过使用infopipe,您不需要将MS-PAC中的SID解析为名称,解析组成员身份并验证MS-PAC和票证的其他组件的签名,因为SSSD会为您执行此操作。有关实际实施,请参阅https://fedorahosted.org/sssd/wiki/DesignDocs/DBusResponder和http://www.adelton.com/apache/mod_lookup_identity/。