假设我编写了一个 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_UID
和SUDO_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)标识。我还没有弄清楚如何将数字映射到哈希方法。