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

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

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

sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

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

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

答案1

负 ACL

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

setfacl -m user:abcd:0 /home

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

克罗特

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

您需要将用户需要的所有文件(例如,mysql及其所有依赖项,如果您希望用户能够运行mysql)放在 chroot 下。假设 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

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

要将用户限制为 chroot,请添加一条ChrootDirectory指令/etc/sshd_config

Match User abcd
    ChrootDirectory /home/restricted/abcd

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

安全框架

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

答案2

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

这是当场写的;我现在实际上并没有站在 UNIX 机器前面。在此示例中,有一个名为 的目录,dir其中包含三个文件:abcls。前三个是常规文件。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

现在我要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
/

现在我们退出chroot

$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

我希望这能说明该chroot命令是如何工作的。基本上,要解决问题,您要做的就是chroot每次登录时以该用户身份运行命令。也许将其放入启动脚本中?

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

ln /usr/bin/mysql /path/to/chroot/target

相关内容