创建一个仅具有 root 访问权限的文件,并且无需密码即可被另一个文件访问

创建一个仅具有 root 访问权限的文件,并且无需密码即可被另一个文件访问

我有两个文件 A 和 B。我需要只有 root 才能访问 A 的内容,因此我运行了命令chmod 000 A

现在,我想让文件 B 能够访问文件 A,而无需输入 root 密码。我该怎么做?

答案1

假设我们有两个文件AB。这两个文件都位于普通用户的主目录中。该文件A归该用户所有root,并且只有该用户具有读取权限,如下所示:

$ cat A                   # output the content of the file
"Test content of file A"

$ chmod 400 A             # change the permissions of file A to read only by the user/owner
$ sudo chown root:root A  # change the ownership of the file to user and :group 'root'

$ ls -l A                 # check the permissions and the ownership, 'stat -c "%a %n" A' to get them in octal
-r-------- 1 root root 24 яну 22 10:17 A

$ sudo cat A              # output the content of the file A, that is ownes by 'root'
"Test content of file A"

该文件B是一个输出内容的简单脚本A,它属于普通用户所有。B具有以下可执行权限:

$ cat B                   # output the content of the file
#!/bin/bash
cat /home/<user>/A

$ chmod +x B              # add executable permissions to the file for all users

$ ./B                     # execute file B by a regular user
cat: /home/<user>/A: Permission denied

$ sudo ./B                # execute file B with root privileges
[sudo] password for <user>: 
"Test content of file A"

要执行上述最后一个命令而无需密码,我们可以使用NOPASSWD文件中的指令/etc/sudoers,也可以创建专门用于此任务的单独文件,位于/etc/sudoers.d/(如下一个示例所示)。请注意,使用命令visudo绝对必要当您编辑这些文件时。因此,运行以下命令:

$ sudo visudo -f /etc/sudoers.d/no-passwd-A-B

在里面添加如下内容,保存关闭:

<user> ALL=(ALL) NOPASSWD: /bin/cat /home/<user>/A

现在您将能够执行以下命令,并且不会要求输入密码:

$ sudo ./B
"Test content of file A"

如果你不想sudo在命令前面输入,你可以将其放在脚本里面:

$ cat B                   # output the content of the file
#!/bin/bash
sudo cat /home/<user>/A

$ ./B
"Test content of file A"

笔记:在里面先前版本的答案描述了如何在脚本文件(在我们的例子中是文件)NOPASSWD中添加指令,但是,sudoersB@RoVo据说,这种方法非常危险,因为如果用户对文件有写权限,它可以对文件内部进行有害更改。实际上,用户可以做任何事情/破坏文件。

如果要使用这个变体,其中的内容为/etc/sudoers.d/no-passwd-A-B

<user> ALL=(ALL) NOPASSWD: /home/<user>/B

然后,出于安全原因,将文件的所有权更改B为 root,并授予其他用户的读取和执行(但不授予写入)权限,例如:

$ chmod 605 B
$ sudo chown root:root B

$ ls -l B
-rw----r-x 1 root root 38 яну 22 15:31 B

另一种增加系统安全性的方法是通过@PerlDuck,就是sudo检查可执行文件是否被篡改:

  1. 为此,获取可执行文件的 sha256sum:

    $ openssl dgst -binary -sha256 /home/<user>/B | openssl base64
    sfDELCTNqfrDY9QKzz8Ra2wTnIpFXyyN8sG9JFxUJtA=
    
  2. 将 sha256sum 添加到 sudoers 文件中,如下所示:

     <user> ALL=(ALL) NOPASSWD: sha256:sfDEL...xUJtA= /home/<user>/B
    

sudo如果脚本的 sha256 与 sudoers 文件中的值不匹配,则会发出抱怨。

相关内容