用户验证

用户验证

假设我编写了一个 setuid root 可执行文件,并且我希望它通过要求用户提供他/她的密码来验证用户不是脚本(当然,用户可以保存他们的密码并在脚本中使用它,但这并不不关我的事)。

这样做的好方法是什么?越便携越好。

答案1

大多数现代 Unix 系统都使用聚丙烯酰胺来处理身份验证。该模块是针对和pam_unix进行密码验证的模块。/etc/password/etc/shadow

但是,您不应该重新发明轮子。询问用户密码并以 root 身份运行是基本配置须藤,事实上的标准提升特权的方式。请注意,正确提升权限是很棘手的:您是否记得清除所有可能影响您的程序的环境变量?须藤煞费苦心地确保安全。

要允许用户在输入密码后使用她选择的任何参数以 rootalice身份运行,请在文件(sudo 配置文件)/usr/local/bin/myprogram中使用以下行:sudoers

alice ALL = (root) /usr/local/bin/myprogram

要编辑该sudoers文件,请运行命令visudo

爱丽丝将不得不逃跑sudo myprogram。如果您希望她能够仅键入程序名称,请将其隐藏在包装脚本中。但请注意,Alice 可能更喜欢运行类似的命令gksudo myprogram来获取 GUI 提示。

许多变化都是可能的,包括禁止调用者传递参数:

alice ALL = (root) /usr/local/bin/myprogram ""

或将条目应用于组:

%mygroup ALL = (root) /usr/local/bin/myprogram

如果您的程序需要知道谁调用了它,则 sudo 可以在环境变量SUDO_UIDSUDO_USER.

答案2

我正在寻找这样的东西

(重击):

hash=$(sudo cat /etc/shadow |grep "^$USER:" |cut -d: -f2) 
cmphash=$(mkpasswd -m sha-512 -S "$(echo "$hash" | cut -d '$' -f3)")
cmp <(echo "$hash") <(echo "$cmphash") && echo "Correct password!"

这是可行的,但对哈希方法进行了编码,该方法以某种方式由数字(echo "$hash" | cut -d '$' -f2在本例中为 6)标识。我还没有弄清楚如何将数字映射到哈希方法。

相关内容