出于教学目的,我需要用 C 创建一个服务器/客户端应用程序,在 Ubuntu 等操作系统上运行。客户端必须检查服务器上是否存在特定用户,因此服务器(可能以用户身份运行
nobody
)必须验证用户名/密码的组合,然后如果登录成功,新验证的用户可以创建文件代表他,即即使服务器以用户 nobody
身份运行,当 userA
登录并决定创建文件时,该文件也必须归 userA
所有。
所以我的问题是:
我在 PAM 世界中迷失了方向,因为我经验不足
是的,使用 PAM 似乎是个好主意。至少重新发明轮子是一个非常糟糕的主意。无论如何,重新发明轮子总是一个坏主意,但这对于身份验证来说尤其糟糕。
PAM 仅与身份验证有关。在用户通过身份验证后,它不提供任何内容来赋予用户任何特殊权力。 例如,它不允许使用与用户关联的权限写入文件。如果我可以这么说的话,它所做的只是允许您劫持 linux 中存在的登录身份验证(允许用户在控制台中登录的身份验证)以获取自己的利益:使用登录名/密码数据库(
/etc/password
、/etc/shadow
等),提示用户以安全的方式输入密码,并以安全的方式验证密码等。
将其视为一个可以为您阅读/etc/password
的图书馆。
而且,有了
session
的东西,它还可以处理身份验证令牌,这样即使其他代码也可以对同一用户使用 pam 并查看该用户已经经过身份验证,以避免多次询问密码。
因此,如果您需要做的是,一旦用户通过身份验证,修改属于该用户的文件(并确保这些操作不会写入该用户不应写入的文件),那么用户所有权,那么,是的,
setuid
是自然的方式。
(如果您所做的只是在服务器中使用临时代码编写文件,您也可以只编写它们,然后使用 chown
或类似工具自己直接处理)。
但是你的问题似乎暗示这里有一个替代方案:pam 会话或
setuid
。这不是替代方案。两者都有不同的用途,并且您都需要两者(或使用另一个替代品,但这是两个不同的操作)。一是验证谁是用户,二是一旦确定您被允许就以该用户的身份执行操作。
像
sudo
这样的程序,可以同时使用两者。首先,它使用 pam
来检查您是否确实是您所声称的人。然后,在检查sudoers
后,您所声称的身份(甚至您是谁,因为现在已通过pam
验证)是否被允许执行所需的命令。然后,它使用 setuid
来执行该命令,如 root
。
同样,诸如
su user
之类的命令使用 pam 来检查您是否拥有 user
的密码。然后,完成后,使用 setuid
生成一个 /bin/bash
shell,以用户 user
身份执行。