想象一个共享虚拟主机公司的服务器设置,其中多个(~100)客户可以通过shell访问单个服务器。
很多networking“软件”build议chmod文件0777 。 遵循这些教程,我不明智地为我们的客户感到紧张,向其他客户开放了他们的文件。 (我肯定没有cmod 0777
自己使用cmod 0777
!)有没有一种方法可以确保客户只能访问他们自己的文件,并阻止他们访问其他用户的世界可读文件?
我查看了AppArmor ,但是它与一个进程非常紧密地联系在一起,这个进程似乎在那个环境下失败了。
在外部世界和受保护的文件之间放置一个受限制且不可改变的目录,例如
/ ├─ bin ├─ home │ └─ joe <===== restricted and immutable │ └─ joe <== regular home directory
或/home/joe/restricted/public_html
。
受限意味着只有用户和Web服务器才能读取它(例如,模式0750
或某些ACL )。
不可变性可以通过chattr +i
完成,也可以通过将所有权更改为root:joe
。
在Ubuntu上创build层次结构的简单方法是编辑/etc/adduser.conf
并将GROUPHOMES
设置为yes
。
有一个选项,你可能要考虑(取决于你想做多less工作)。
正如其他人已经发布,“通常”,你不能阻止有人访问shell访问世界可读的文件。
然而,你可以把它们放到自己的家里,基本上限制了shell的访问权限,首先,只有你想要的根目录(也就是主目录),其次是防止用户执行你不想让它们执行的所有内容。
当我有一个用户访问web文件时,我做了一个类似的方法,但我不希望让他看到web文件夹外的其他文件。
这确实有很多的开销,是一个混乱的设置,每次我更新的东西,它打破了。
但是今天我想你可以用OpenSSH chroot选项来实现它:
WikiBooks OpenSSH
我发现POSIX访问控制列表允许你像系统pipe理员一样通过覆盖常规的用户组和其他文件系统权限来保护用户免受他们自己的无知,而没有太多机会打破任何关键。
例如(fi)需要主目录是世界可访问的,因为webcontent需要在~/public_html/
apache可访问,所以它们可能特别有用。 (尽pipe使用ACL,现在可以做相反的事情,但是为所有用户删除访问权限,并为apache用户使用特定的有效ACL。)
是的,一个有知识的用户可以删除/重写他们再次,只是不常见的,这是不可能的,那些用户通常不能方便地chmod -R 777 ~/
无论如何,对吧?
您需要使用acl
挂载选项挂载文件系统:
mount -o remount,acl /home
在很多发行版中,默认情况下是创build用户组,每个用户都有自己的主要组,并且我已经将所有用户设置为次要组中的users
。
使用ACL的现在是微不足道的,以防止其他用户访问主目录:
之前:
chmod 0777 /home/user* ls -l /home/user* drwxrwxrwx. 2 user1 user1 4096 Jul 11 15:40 user1 drwxrwxrwx. 2 user2 user2 4096 Jul 11 15:24 user2
现在,将users
组成员的有效目录权限设置为0
不允许读取,写入或访问:
setfacl setfacl -mg:users:0 /home/user* ls -l drwxrwxrwx+ 2 user1 user1 4096 Jul 11 15:40 user1 drwxrwxrwx+ 2 user2 user2 4096 Jul 11 15:24 user2
+
符号表示在那里存在ACL设置。 getfacl
可以确认:
getfacl /home/user1 getfacl: Removing leading '/' from absolute path names # file: home/user1 # owner: user1 # group: user1 user::rwx group::rwx group:users:--- mask::rwx other::rwx
该group:users:---
显示该组有效地没有访问权限,尽pipe对于其他的other::rwx
的定期权限
并以user1进行testing:
[user1@access ~]$ ls -la /home/user2 ls: cannot open directory /home/user2: Permission denied
共享系统上的第二种常见解决scheme是让自动挂载程序根据需要将主目录挂载到专门用于shell访问的服务器上。 这远不是傻瓜certificate,但通常只有less数用户同时login,这意味着只有这些用户的主目录是可见的和可访问的。
例如,如果您希望用户只能访问自己的home
目录,则应执行以下操作:
cd /home sudo chmod 700 *
现在/home/username
只对其所有者可见。 要将其作为所有新用户的默认设置,请编辑/etc/adduser.conf
并将DIR_MODE
设置为0700
而不是0755
默认值。
当然,如果你想改变默认的DIR_MODE取决于你的分布,我发布的工作在Ubuntu
。
正如@Dani_l正确地提到,这个答案是正确的,使他们不可读的世界。
Linux容器(LXC)可能是chroot和独立系统的最佳组合。
它们更像是一个高级的chroot,而不是虚拟化,但是你可以在一个服务器上结合不同的操作系统。
你可以为用户提供一个完整的操作系统,并在那里进行chroot,所以当用户login时,他会去他的容器。 你也可以限制处理器和内存的使用。
LXC的作者StéphaneGraber有一个很好的教程来帮助你开始。
只是为了迂腐 – 不,没有。
@Marek给出了一个正确的答案 ,但是你的问题是不正确的 – 你不能阻止任何人访问“世界可读的”文件。
要么他们是世界可读的,要么他们不是。 @马立克的答案是正确的,使他们不可读的世界。
迄今为止,我看不出有关“限制shell”的答案。
ln / bin / bash / bin / rbash
将其设置为他们的loginshell。
如果Web服务器作为托pipe的每个域的相同用户和组运行,则难以(如果不是不可能的话)使设置安全。
您希望某些文件可以被用户以及Web服务器访问,但不能被其他用户访问。 但只要Web服务器可以访问它们,另一个用户就可以通过在自己的Web站点中对文件进行符号链接来读取它们。
如果你可以让每个网站作为一个单独的用户运行,那么它变得相当简单。 现在,每个客户在系统上都有两个用户,一个用于Web服务器,一个用于shell访问。
创build一个包含这两个用户的组。 现在用该组和root用户创build一个目录。 该目录应具有权限750
,这意味着root拥有完全访问权限,并且组具有读取和执行访问权限。 在该目录中,您可以为两个用户中的每一个创build主目录。 这意味着用户的主目录将不再具有/home/username
的forms,而是至less有一个目录组件。 这不是一个问题,没有要求主目录根据特定的惯例命名。
如果您使用基于名称的虚拟主机,使用不同的用户和组运行网站可能会非常棘手。 如果事实certificate,只能使用基于IP的虚拟主机进行分离工作,并且每个站点没有足够的IP地址,则可以将每个网站托pipe在IPv6地址上,并将所有虚拟主机的反向代理放在IPv4地址。