授予可执行文件比 运行 用户更多的权限
Giving an executable more permissions than running user
我有一个小型 C++ 应用程序可以为 运行Debian 9.2 上的 BeagleBone Black 板打开和关闭灯。
它通过更新文本文件来实现。
// Turn light on
fs.open("/sys/class/leds/beaglebone:green:usr0", std::fstream::out);
fs << "1";
fs.close();
如果我 运行 作为标准用户使用该程序,它 运行 没有错误,但 none 指示灯发生变化。
如果我 运行 使用 sudo
的程序一切正常,灯也亮。
我猜这是因为这些文件需要更高的访问权限。
我不是很熟悉 Linux 权限,但是有没有办法允许您的程序访问用户无法访问的文件?
有很多方法可以解决这个问题,这在很大程度上取决于更大的设置,哪一个更合适。
一种方法是更改该特定文件的权限(不确定 sysfs 是否允许)。
另一种方法是将 运行 将此文件添加到具有文件写入权限的组中。
还有一个是已经提到的设置所谓的 setuid 位并将可执行文件的所有权更改为 root 或对该文件具有写入权限的用户。这通常具有更深层次的安全隐患。
使用 sudo 或 su 来执行文件也是一种有效的方法。要限制安全风险,您可以在 sudoers 中允许此特定命令。
上述其中一项的变体是 运行 持久进程侦听来自较低特权进程的命令。
如前所述,这在很大程度上取决于它如何适应更大的环境。还需要考虑避免打开安全漏洞的影响。
仔细阅读关于setuid and about credentials(7) (and execve(2) which is how programs are started). But be careful about vulnerabilities的内容。
阅读Advanced Linux Programming (freely downloadable, but a bit old) or some newer book about Linux programming. Read intro(2) and syscalls(2)。
您还可以阅读 Operating Systems: Three Easy Pieces(可免费下载)以了解有关操作系统的更多信息。
您可以创建可执行文件 setuid(在适当的 chown
之后使用 chmod u+s
)并在适当的地方小心地调用 setreuid(2)。这就是 sudo
或 su
等程序的工作方式(它们都是 setuid)。有时您可以只使用组权限(仅设置 gid)。
但要小心,此类程序中的错误可能会造成巨大的安全漏洞。因此,保持 setuid 程序非常小并让其他人审查它们的代码是明智的。一种可能的方法是编写一个非常小的 setuid 可执行文件来做你奇怪的事情(例如只闪烁 LED)并与越来越大的普通程序(例如提供 GUI)进行通信(例如使用 pipe(7)-s or other forms of inter-process communication)。
也许您可以通过创建组 led
并授予组对 /sys/class/leds/beaglebone:green:usr0
的写权限并仅使用 setgid 技术来配置您的系统。
我有一个小型 C++ 应用程序可以为 运行Debian 9.2 上的 BeagleBone Black 板打开和关闭灯。
它通过更新文本文件来实现。
// Turn light on
fs.open("/sys/class/leds/beaglebone:green:usr0", std::fstream::out);
fs << "1";
fs.close();
如果我 运行 作为标准用户使用该程序,它 运行 没有错误,但 none 指示灯发生变化。
如果我 运行 使用 sudo
的程序一切正常,灯也亮。
我猜这是因为这些文件需要更高的访问权限。
我不是很熟悉 Linux 权限,但是有没有办法允许您的程序访问用户无法访问的文件?
有很多方法可以解决这个问题,这在很大程度上取决于更大的设置,哪一个更合适。 一种方法是更改该特定文件的权限(不确定 sysfs 是否允许)。
另一种方法是将 运行 将此文件添加到具有文件写入权限的组中。
还有一个是已经提到的设置所谓的 setuid 位并将可执行文件的所有权更改为 root 或对该文件具有写入权限的用户。这通常具有更深层次的安全隐患。
使用 sudo 或 su 来执行文件也是一种有效的方法。要限制安全风险,您可以在 sudoers 中允许此特定命令。
上述其中一项的变体是 运行 持久进程侦听来自较低特权进程的命令。
如前所述,这在很大程度上取决于它如何适应更大的环境。还需要考虑避免打开安全漏洞的影响。
仔细阅读关于setuid and about credentials(7) (and execve(2) which is how programs are started). But be careful about vulnerabilities的内容。
阅读Advanced Linux Programming (freely downloadable, but a bit old) or some newer book about Linux programming. Read intro(2) and syscalls(2)。
您还可以阅读 Operating Systems: Three Easy Pieces(可免费下载)以了解有关操作系统的更多信息。
您可以创建可执行文件 setuid(在适当的 chown
之后使用 chmod u+s
)并在适当的地方小心地调用 setreuid(2)。这就是 sudo
或 su
等程序的工作方式(它们都是 setuid)。有时您可以只使用组权限(仅设置 gid)。
但要小心,此类程序中的错误可能会造成巨大的安全漏洞。因此,保持 setuid 程序非常小并让其他人审查它们的代码是明智的。一种可能的方法是编写一个非常小的 setuid 可执行文件来做你奇怪的事情(例如只闪烁 LED)并与越来越大的普通程序(例如提供 GUI)进行通信(例如使用 pipe(7)-s or other forms of inter-process communication)。
也许您可以通过创建组 led
并授予组对 /sys/class/leds/beaglebone:green:usr0
的写权限并仅使用 setgid 技术来配置您的系统。