Kerberos 管理员授权
Kerberos administrator authorization
我正在编写 linux 与 MS Active Directory 集成的应用程序。为此,我使用了 Kerberos。我已经实现了使用给定凭据对域用户进行身份验证的机制,但现在我想检查用户是否是管理员组的成员。
所以我从函数中获得了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 = ad
或 id_provider=ipa
以及 FreeIPA 和 AD 之间的跨林信任),您可以依靠 pam_sss
来处理通过 SSSD 的身份验证和授权步骤。
最新版本的 SSSD 通过将 GPO 登录权限映射到 PAM 服务来支持基于 GPO 的访问。
使用 SSSD,您的 AD 用户和组将显示为 POSIX 用户和组。这允许您基于组成员身份构建简单的访问控制,您可以在使用 krb5_aname_to_localname()
.
将 Kerberos 主体映射到本地用户名后通过 getgrouplist(3)
调用获得该成员身份
如果您还需要了解有关从 Kerberos 主体映射的用户的其他信息,您可以使用 SSSD 的 infopipe 接口。通过 infopipe 可用的信息是从 Kerberos 票证(如果可用)和 AD LDAP(全局目录或直接 DC)收集的。通过使用 infopipe,您不需要像 SSSD 那样将 MS-PAC 中的 SID 解析为名称、解析组成员身份并验证 MS-PAC 和票证的其他组件的签名。有关实际实施,请参阅 https://fedorahosted.org/sssd/wiki/DesignDocs/DBusResponder and http://www.adelton.com/apache/mod_lookup_identity/。
我正在编写 linux 与 MS Active Directory 集成的应用程序。为此,我使用了 Kerberos。我已经实现了使用给定凭据对域用户进行身份验证的机制,但现在我想检查用户是否是管理员组的成员。
所以我从函数中获得了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 = ad
或 id_provider=ipa
以及 FreeIPA 和 AD 之间的跨林信任),您可以依靠 pam_sss
来处理通过 SSSD 的身份验证和授权步骤。
最新版本的 SSSD 通过将 GPO 登录权限映射到 PAM 服务来支持基于 GPO 的访问。
使用 SSSD,您的 AD 用户和组将显示为 POSIX 用户和组。这允许您基于组成员身份构建简单的访问控制,您可以在使用 krb5_aname_to_localname()
.
getgrouplist(3)
调用获得该成员身份
如果您还需要了解有关从 Kerberos 主体映射的用户的其他信息,您可以使用 SSSD 的 infopipe 接口。通过 infopipe 可用的信息是从 Kerberos 票证(如果可用)和 AD LDAP(全局目录或直接 DC)收集的。通过使用 infopipe,您不需要像 SSSD 那样将 MS-PAC 中的 SID 解析为名称、解析组成员身份并验证 MS-PAC 和票证的其他组件的签名。有关实际实施,请参阅 https://fedorahosted.org/sssd/wiki/DesignDocs/DBusResponder and http://www.adelton.com/apache/mod_lookup_identity/。