gpt4 book ai didi

c - PAM 的不同访问级别

转载 作者:太空狗 更新时间:2023-10-29 12:08:24 26 4
gpt4 key购买 nike

目前我有一个图形应用程序,它有两个级别的访问权限:运算符(operator)和管理员。登录和身份验证都是自制的,我想将应用程序切换为使用 PAM。我不确定这样做的正确方法是什么。

如果我错了,请纠正我,但似乎 PAM 归结为"is"或“否”检查——是的,您可以访问此服务,否则,您不能。没有根据登录的用户提供不同级别的访问权限的规定。不过,我需要能够分辨谁是运算符(operator),谁是管理员,并且如果可能的话,我希望能够严格通过 PAM 来做到这一点。

所以我的想法是,我会设置两个具有两种不同配置的服务/etc/pam.d/pamdemo 用于运算符(operator)和/etc/pam.d/pamdemo-admin 用于管理员。然后,我的应用程序将首先尝试针对 pamdemo-admin 进行身份验证,如果失败,则使用 pamdemo。如果两者都失败,则拒绝访问。 我走在正确的轨道上还是完全偏离了轨道?

这是我编写的一些示例 C 代码,作为概念证明。当我登录时,我不想提示用户两次输入他的凭据。我知道了,所以它会记住两次 pam_start() 调用中的用户名,但我无法从应用程序级别访问 pam_get_item(PAM_AUTHTOK) 来执行相同的缓存密码。正是在尝试这样做的过程中,我意识到可能有一种完全不同的方法来做到这一点。 无论采用何种身份验证方法,我都希望此应用程序能够正常工作,无论是用户名/密码还是 Kerberos 票证或指纹等等。

pam_handle_t *try_login(const char *service, int *retval)
{
static char * username = NULL;
struct pam_conv pam_conversation = { conv, NULL };
pam_handle_t * pamh;

*retval = pam_start(service, username, &pam_conversation, &pamh);

if (*retval == PAM_SUCCESS) *retval = pam_authenticate(pamh, 0);
if (*retval == PAM_SUCCESS) *retval = pam_acct_mgmt (pamh, 0);
if (*retval == PAM_SUCCESS) *retval = pam_open_session(pamh, 0);

if (username == NULL) {
if (pam_get_item(pamh, PAM_USER, (const void **) &username) == PAM_SUCCESS) {
username = strdup(username);
}
}

if (*retval != PAM_SUCCESS) {
fprintf(stderr, "%s: %s\n", service, pam_strerror(pamh, *retval));
pam_end(pamh, *retval);
pamh = NULL;
}

return pamh;
}

int main(void)
{
pam_handle_t *pamh = NULL;
int retval;
const char *service, *username;

if (!pamh) pamh = try_login("pamdemo-admin", &retval);
if (!pamh) pamh = try_login("pamdemo", &retval);

if (!pamh) {
fprintf(stderr, "Access denied.\n");
return 1;
}

pam_get_item(pamh, PAM_SERVICE, (const void **) &service);
pam_get_item(pamh, PAM_USER, (const void **) &username);

printf("Logged into %s as %s.\n", service, username);

pam_close_session(pamh, 0);
pam_end (pamh, retval);

return 0;
}

正如所写,此演示程序重复“密码:”提示。我不想让它问两次!

最佳答案

我相信一个正确的方法可能是:

  • 设置“pamdemo”服务来执行帐户、身份验证和 session 功能。
  • 将“pamdemo-admin”服务设置为执行帐户(可能还有 session )功能。无需身份验证。
  • 登录时,首先让他们通过“pamdemo”(以确保他们是他们所说的人)——如果失败,将他们踢出。
  • 然后,一旦通过身份验证,将它们交给“pamdemo-admin”。这只是检查他们是否被允许成为管理员 - 如果他们是,则此检查成功,如果他们不是,则不会。因为此检查不执行身份验证模块,所以不会再次提示它们输入密码。

关于c - PAM 的不同访问级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1168552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com