我有一个二进制文件,需要在启动时在所有帐户(包括非特权用户帐户)上运行,因此运行它的命令将被放入/etc/rc.local
.程序本身仅具有执行权限,因此非特权用户无法读取或修改它。它位于/usr/bin
。
但是,它在运行时需要访问密钥(密钥位于/usr/share
)。是否可以创建一个包含密钥的文件,该文件对所有普通用户都不可读取或写入,但可由程序读取?该文件可以利用该程序的特权吗?
也许它可以对文件权限(chmod)进行某种设置?或者有没有一种方法可以以某种方式对其进行加密?
答案1
如果正如您所说,“需要在启动时在非特权用户帐户上运行”,那么它必然有权访问相关非特权用户帐户有权访问的所有文件。
您可以创建一个专用的非特权用户帐户来运行脚本。设置密钥文件的权限,以便只有专用用户帐户才能读取它。但听起来您需要在特定的预先存在的用户帐户下运行该程序,因此这可能不适合您。
还有其他解决方案,例如在chroot()
有权访问密钥的文件中运行它,但这是否可行取决于它的作用以及除了密钥文件之外它还需要访问什么。
sudo
在任何情况下都不需要使用,因为/etc/rc.local
以 root 身份运行,因此您可以su
直接使用最终选择运行程序的帐户。
编辑澄清问题后:
它需要在每次任何类型的用户登录时执行。
我懂了。这/etc/rc.local
与您最初所说的仅在启动时运行一次完全不同!
在这种情况下,您最好的选择可能是尝试将密钥嵌入到二进制文件中,而不是将其作为外部文件访问,让二进制文件由 root 拥有并可执行,但其他用户无法读取(例如rwx--x--x
.无法访问密钥(除非他们破坏系统上的 root 权限),但他们可以运行二进制文件。
如果您无法将秘密密钥嵌入到二进制文件中,那么您可以将二进制文件 setuid 提供给可以访问秘密密钥的某个用户...但在编写 setuid 二进制文件时要格外小心。