仅授予用户对一个目录的读/写访问权限

Man*_*rth 24 permissions account-restrictions files

我正在运行一个服务器,我需要向单个用户授予对特定目录的读/写访问权限。我尝试了以下方法:

sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd
Run Code Online (Sandbox Code Playgroud)

以上似乎有效,但是它为用户提供了对服务器其余部分的只读访问权限。

如何设置权限以便用户只能读取和写入特定文件夹?用户还应该能够运行像mysql.

Gil*_*il' 25

负 ACL

您可以通过设置访问控制列表来阻止用户访问文件系统的某些部分。例如,要确保用户abcd无法访问 下的任何文件/home

setfacl -m user:abcd:0 /home
Run Code Online (Sandbox Code Playgroud)

这种方法很简单,但您必须记住阻止访问您不想访问的所有内容abcd

要对abcd可以看到的内容进行积极控制,请设置一个chroot,即将用户限制在文件系统的子树中。

您需要在 chroot 下制作用户需要的所有文件(例如mysql及其所有依赖项,如果您希望用户能够运行mysql)。说 chroot 的路径是/home/restricted/abcd; 该mysql程序需要在 下可用/home/restricted/abcd。指向 chroot 外部的符号链接是不好的,因为符号链接查找会受到 chroot jail 的影响。在 Linux 下,可以很好地利用绑定挂载:

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr
Run Code Online (Sandbox Code Playgroud)

您还可以复制文件(但是您需要注意它们是最新的)。

要将用户限制在 chroot 中,请ChrootDirectory/etc/sshd_config.

Match User abcd
    ChrootDirectory /home/restricted/abcd
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法对其进行测试: chroot --userspec=abcd /home/restricted/abcd/ /bin/bash

安全框架

您还可以使用安全框架,例如 SELinux 或 AppArmor。在这两种情况下,您都需要编写一个相当精细的配置,以确保不会留下任何漏洞。


str*_*gee 6

你应该使用chroot. 该chroot命令更改所有子进程看到的根目录。我将举一个例子来演示它是如何工作的。

这是当场写的;我现在实际上并不在 UNIX 机器前。在这个例子中,有一个名为目录中dir有三个文件:abc,和ls。前三个是常规文件。ls是真正ls二进制文件的硬链接,以便我们可以在 chroot 中列出文件。

我要chroot进入dir. (请注意,我可能忘记了根目录中的某些目录。)

这是shell输出形式的设置:

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var
Run Code Online (Sandbox Code Playgroud)

现在我将chroot进入dir. 该/bin/bash参数选择应使用新根目录运行的进程。它默认为/bin/sh.

$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/
Run Code Online (Sandbox Code Playgroud)

现在我们退出chroot

$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test
Run Code Online (Sandbox Code Playgroud)

我希望这说明了chroot命令是如何工作的。基本上你必须做的来解决你的问题是chroot每次登录时都以该用户的身份运行命令。也许把它放在启动脚本中?

文件的硬链接将继续在 内工作chroot,即使该文件无法通过其他方式访问(这是有效的,因为硬链接指向 inode,而不是路径)。因此,为了允许用户访问例如mysql命令,您将执行:

ln /usr/bin/mysql /path/to/chroot/target
Run Code Online (Sandbox Code Playgroud)