代表另一个用户在 C/Linux 中执行命令

问题描述 投票:0回答:1

出于教学目的,我需要用 C 创建一个服务器/客户端应用程序,在 Ubuntu 等操作系统上运行。客户端必须检查服务器上是否存在特定用户,因此服务器(可能以用户身份运行

nobody
)必须验证用户名/密码的组合,然后如果登录成功,新验证的用户可以创建文件代表他,即即使服务器以用户
nobody
身份运行,当
userA
登录并决定创建文件时,该文件也必须归
userA
所有。 所以我的问题是:

  1. 我的想法是使用PAM进行用户身份验证,这是正确的吗?
  2. 在我设法使用 PAM 对用户进行身份验证后,我应该使用 PAM Open Session 之类的东西,还是 setuid() 之类的东西?这两种方法中哪一种可以被认为是正确的,并且可以让我保持简单?

我在 PAM 世界中迷失了方向,因为我经验不足

c linux authentication client-server pam
1个回答
0
投票
  1. 是的,使用 PAM 似乎是个好主意。至少重新发明轮子是一个非常糟糕的主意。无论如何,重新发明轮子总是一个坏主意,但这对于身份验证来说尤其糟糕。

  2. 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
身份执行。

© www.soinside.com 2019 - 2024. All rights reserved.