Kerberos管理员授权
Kerberos administrator authorization
我正在编写与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 = ad
或id_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/。
- 在没有管理员权限的情况下连接到同一网络中的命名管道
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- C++程序复制后不需要管理员/UAC
- 以管理员身份运行应用程序时,有没有办法获取非管理员用户名
- 具有管理员权限的外壳执行不会结束
- 如何在 curl 代码C++设置授权持有者标头?我得到的授权不足,即使它在命令行上工作
- 只允许授权代码调用库中的例程
- 即使在我为我的应用程序授予管理员后也无法从 Windows 系统复制目录
- 如何在Qt中请求管理员权限?
- CreateProcess() 可以授予管理员权限吗?
- 如何使用管理员权限运行 EXE
- 检查用户是否是 Windows 中本地计算机上的管理员C++
- QSettings没有管理员权限不保存ini更改
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 如何在Windows应用程序中使用CMAKE获得管理员特权
- 在没有管理员权限的情况下安装 Vulkan SDK
- 我如何在代码中找到(和删除)需要管理员特权的位置
- Onvif PullpointProxy Pullmessages返回错误401未经授权
- 如何以与Explorer中的管理员的启动相同的方式从CPP运行程序
- Kerberos管理员授权