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


18

我正在运行服务器,并且需要将单个目录的读写权限授予单个用户。我尝试了以下方法:

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


2
简短的答案:使用chroot。
克里斯·

@Chris Care在回答中对此进行详细说明?Manish和我一直在为此苦苦挣扎,似乎无法使其正常工作。
2013年

mysql程序位于何处?用户必须能够读取它以及它需要的所有库和数据文件。
吉尔斯(Gilles)'所以

@吉尔斯Hmm。据我所知,这是从apt-get进行的标准mysql安装(不是我的系统,它是Undo的)。
Manishearth

Answers:


18

负ACL

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

setfacl -m user:abcd:0 /home

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

Chroot

要获得对abcd可见内容的积极控制,请设置chroot,即将用户限制为文件系统的子树。

您需要在chroot下制作用户需要的所有文件(例如,mysql以及所有依赖关系,如果您希望用户能够运行mysql)。说到chroot的路径是/home/restricted/abcd; 该mysql程序需要在下提供/home/restricted/abcd。指向chroot外部的符号链接不好,因为chroot监狱会影响符号链接查找。在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。在这两种情况下,您都需要编写一个相当精细的配置,以确保您没有留下任何漏洞。


通过组可以更简单的方式授予特定目录的读写权限吗?例如,他可以创建一个新组,并使用chown使目录组成为已创建组的所有者,并将用户添加到该组。最后,授予目录对组的读写权限。
卡西姆

@Qasim要求所有文件均具有所需的权限和所有权设置。有很多事情可能出错(从其他位置复制的文件或保留了权限的文件从存档中提取的文件,需要属于另一个组的文件,不应该组可读的文件,犯错或可以做错的用户)请确保组的可访问性保持在期望的水平...)组不会真正解决此问题。
吉尔(Gilles)“所以,别再邪恶了”

我的意思是,如果目录的组权限设置为没有用户可以“ cd”进入目录或“ ls”目录的方式,那么我将看不到文件将如何拥有自己的权限。
卡西姆

@Qasim /var/www/allowfolder必须访问每个文件及其子目录,而不仅仅是/var/www/allowfolder其自身。相反,其他文件也不能访问。实际上,仅基于文件权限和ACL的解决方案不能完全满足要求:它至少允许用户测试给定名称下是否存在/var/www,因为他们需要具有x权限/var/www才能访问/var/www/allowfolder
吉尔(Gilles)“所以,别再邪恶了”

哦,好了,我知道了,但是如果我们不从中排除/ var目录,而是说我们正在谈论/ home / user目录中的普通目录呢?
卡西姆

5

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

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

我要chrootdir。(请注意,我可能会忘记根目录中的某些目录。)

这是外壳输出形式的设置:

$ 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用户每次登录时以该用户身份运行命令。也许将其放在启动脚本中?

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

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

但这是否不要求我使用所有符号链接来设置整个chroot环境?运行命令以使新用户无权访问其他目录,但apache之类的程序不会失去对其他目录的访问权限会更容易吗?
Manishearth

基本上,是否有任何方法(通过chmod)使用户失去对其余fs的读取访问权限而又不影响其他用户的访问权限?
Manishearth

@Manishearth没有简单的方法chmod。当您说“运行命令不是更容易...不要失去对它们的访问权限”时,该命令为chroot。如果您解释“整个chroot环境”的含义,或者为什么会出现问题,那么也许我会更好地理解。(请注意,你可以给访问与oneliner所有可执行文件:ln /bin/* /path/to/chroot/target
strugee

@Manishearth,如果我的例子没有道理,我鼓励你chroot自己玩或者让我知道什么没道理。更好的是,两者都做。(并阅读联机帮助页。)
奋斗

@Manishearth如果此答案可以帮助您充分引导您找到答案,则应考虑接受它。
13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.