我正在尝试将某些文件从非常低(几乎没有权限)的用户复制到root用户。我需要允许有权访问低帐户的人将某些文件复制到更高的帐户。我曾考虑使用bin / Bash脚本,但我不希望文件中的任何密码被查看。
我决定创建一个C ++应用程序,其中包含我想传递给su / setuid命令的帐户的密码。我知道密码可以在二进制文件中查看,但不是问题。密码不是纯文本就足够了。
我的问题是我无法弄清楚如何登录"作为用户,我需要更新该帐户中运行的服务的文件。我有用户帐户名,即localadmin,以及该帐户的密码。但是如何将这些文件传递给Linux以将文件从C ++应用程序复制到localadmin account home /子目录?
我在C ++中尝试过:
系统(" su localadmin"); //提示输入密码,但不知道如何传递密码。
setuid(0); //再次,我在哪里传递密码才能获得帐户权限?我得到的只是"操作不被允许"。
如果这是一个简单的问题,我道歉。我只是尝试将命令作为localadmin运行并完成。
答案 0 :(得分:6)
您不需要提供密码。使您的应用程序setuid root,以便它以root权限运行。
使用root权限,请执行以下操作:
chown root {program}
chmod 4755 {program}
现在您的可执行文件由root拥有并且设置了setuid位。因此,当任何用户运行它时,它以root身份运行。然后程序可以做它需要做的事情。
在创建setuid根程序时,需要特别注意确保所有输入都已正确清理,以防止缓冲区溢出或格式化字符串漏洞。此外,如果您的程序不只是调用另一个程序,它应该在开始使用seteuid({callers_uid})
时删除权限,在seteuid(0)
需要时提高权限,并在您重新启动时再将其删除完成。
如果您只希望特定用户运行此程序,您可以使用sudo
而不是使程序setuid root。 root用户需要更新/ etc / sudoers文件并为相关用户和程序添加条目,并包含不需要密码的选项。
例如:
user_name ALL = (root) NOPASSWD:program_to_run
然后用户可以运行:
sudo program_to_run
然后这个用户(只有这个用户)可以运行具有root权限的程序来执行它需要做的任何事情。
答案 1 :(得分:0)
我认为你误解了setuid
通常如何运作。您无需在应用程序中存储任何类型的密码:您只需按正常编码即可执行您需要执行的操作,就像您root
一样。获得二进制文件(由root拥有)后,使用setuid
将其chmod
权限设置为二进制文件的属性。
执行二进制文件后,任何允许执行它的用户都会将它们提升为root用于执行二进制代码。不需要为此提供密码。
请注意,您需要小心setuid
个程序:由于root
权限,它们可能会导致安全问题。最好保持它们尽可能简单和集中,做到实际需要root权限的绝对最小值,让其他非setuid
程序执行任何非特权工作,以最大限度地减少潜在的可利用错误。