sudoer 文件如何授予特定用户仅对特定文件的完全访问权限

sudoer 文件如何授予特定用户仅对特定文件的完全访问权限

我想授予用户仅对某些文件的完全访问权限,有人可以告诉我如何做到这一点吗?例如,我想修改 sudoer 文件以授予用户仅访问特定文件的权限。谢谢。

答案1

您可以使用访问控制列表来做到这一点:

1)首先,检查该文件的ACL:

getfacl PATH/files

输出将是这样的:

# file: PATH/file
# owner: root
# group: root
user::rw-
group::r--
other::r--

2)设置文件的ACL,以便为特定用户设置完全访问权限:

setfacl -m u:USERNAME:rwx PATH/file

3)现在,如果您在文件上尝试“ls -l”命令,则会在输出中添加加号(+):

-rw-rwxr--+ 1 root  root      0 Nov 10 20:12 file

4)再次获取文件的ACL查看变化(命令与步骤1相同),输出将是这样的:

# file: file
# owner: root
# group: root
user::rw-
user:USERNAME:rwx
group::r--
mask::rwx
other::r--

您可以看到,为您的特定用户声明了一个例外,使其具有与所有者用户、所有者组和其他权限不同的此文件的权限。

我希望你的问题尽快得到解决:)

答案2

这通常是使用组来完成的。

所有权

文件有两个所有者:用户和组。例如:

$ ls -l file1.txt
-rw-rw-r-- 1 foo foo 6 Nov  9 15:37 file1.txt

这里,用户和组都是foo

我们可以使用以下命令更改文件所有权 乔恩。请注意,该链接链接到 Linux 的联机帮助页,但chown它是相当标准的,因此它可能会起作用。如有疑问,请查阅操作系统手册 ( man chown)。

例如,将组更改为bar

$ chown :bar file1.txt
$ ls -l file1.txt
-rw-rw-r-- 1 foo bar 6 Nov  9 15:37 file1.txt

请注意,该bar组需要存在。下面您将看到如何添加新组。

权限

权限如下:

-rw-rw-r--
Tuuugggooo

哪里T是类型;对于普通文件-,对于目录d,对于符号链接l等。用户权限是::
读、写。组权限也是。其他人 ( ) 获得或 只读访问权限。uuurw-gggrw-ooor--

我们可以使用更改权限chmod(同样,Linux 手册页,但 chmod 是相当标准的)。如果我们想bar从文件中删除组的写权限,我们可以这样做:

$ chmod g-w file1.txt
$ ls -l file1.txt
-rw-r--r-- 1 foo bar 6 Nov  9 15:37 file1.txt

添加新组

您可以添加专门用于管理对某些文件的访问的组。如何完成此操作取决于平台。对于Linux,有添加组:

addgroup bar

对于 FreeBSD,有密码。检查您的操作系统手册以获取正确的命令!

将用户添加到组中

这又是依赖于平台的。对于 FreeBSD,pw上面提到的命令可以处理这个问题。对于Linux来说,是用户模式

用户通常具有主要(或初始)组和次要(或补充)组。创建新文件时使用主组。

对于 Linux,将 ( -a) 用户添加foo到辅助 ( -G)bar组的操作如下:

$ usermod -G bar -a foo

现在,下次用户foo登录时,他/她的组将被更新。使用id命令(Linux ID/FreeBSD ID:非常标准)来检查组成员身份:

$ id
uid=1000(foo) gid=1000(foo) groups=1000(foo),1001(bar)

答案3

供参考、检查man sudoman sudoers

下面是一个仅适用于 Linux 的示例,介绍如何配置 sudoers 文件以以 root 身份执行 SYSV Linux 服务脚本。

为用户编辑/创建 sudoers 文件(我将使用theusername):

visudo /etc/sudoers.d/theusername

格式为

# <user list> <host list> = <operator list> <tag list> <command list>

您需要添加这一行:

theusername ALL = (root:root) NOPASSWD: /usr/sbin/service

可能需要将用户添加theusernamesudo组中;详情请参阅我的另一个答案。

更新

OP(通过评论)想要执行此操作:

ProcessBuilder ntpProcessBuilder = new ProcessBuilder(
    "/bin/sh", "-c",
    "echo " + PUB_PASSWORD + 
    "| sudo -S bash -c \"cp -f " + ntp_conf_file_temp + " " + ntp_conf_file +
    "; service ntp reload\"" );

这将需要设置文件权限以便能够覆盖ntp_conf_file我们假设由 root 拥有的权限。详情请参阅另一个答案。但是,这里有一个替代解决方案,使用脚本,放置在/etc/ntp-update.sh

#!/bin/bash
/bin/cp /etc/managed-ntp/temp.conf /etc/ntpd/ntp.conf
/usr/sbin/service ntp reload

如您所见,为了安全起见,文件路径被编码。

为了进行设置,我们为用户编辑 sudoers 文件,以授予以 root 身份运行此脚本的权限:

theusername ALL = (root:root) NOPASSWD: /etc/ntp-update.sh

并创建目录:

mkdir /etc/managed-ntp
chmod 2775 /etc/managed-ntp
chown theusername:theusergroup /etc/managed-ntp

in是2位,它确保在该目录中创建的文件归该目录的组所有。当以 root 身份运行时,这并不是真正必要的,但可能会派上用场。2775setgid

现在,应用程序可以执行以下操作:

// Make sure you write ntp_conf_file_tmp in /etc/managed-ntp/temp.conf!    
ProcessBuilder ntpProcessBuilder = new ProcessBuilder(
    "/usr/bin/sudo", "/etc/ntp-update.sh"
);

相关内容