想象一下共享网络托管公司的服务器设置,其中多个(约 100 个)客户可以访问单个服务器的 shell 权限。
许多网络“软件”建议chmod 文件 0777。我担心我们的客户会不明智地遵循这些教程,将他们的文件开放给我们的其他客户。(我当然不会cmod 0777
无谓地使用!)有没有一种方法可以确保客户只能访问自己的文件,并阻止他们访问其他用户的可读文件?
我调查了应用装甲但是它与某个进程紧密耦合,而该进程在该环境下似乎会失败。
答案1
放一个受限制的和不可变的外部世界和受保护文件之间的目录,例如
/
├─ bin
├─ home
│ └─ joe <===== restricted and immutable
│ └─ joe <== regular home directory
或者/home/joe/restricted/public_html
。
受限意味着只有用户和 Web 服务器可以读取它(例如模式0700
/0750
或某些ACL)。
不变性可以通过chattr +i
或者将所有权更改为类似的root:joe
。
在 Ubuntu 上创建该层次结构的简单方法是编辑/etc/adduser.conf
并设置GROUPHOMES
为yes
。
答案2
您可能需要考虑一个选项(取决于您愿意为此做多少工作)。
正如其他人已经发布的,“通常”你无法阻止具有 shell 访问权限的人读取全世界可读的文件。
但是,您可以将它们 chroot 到它们自己的主目录中,从根本上限制 shell 的访问,首先,只能访问您想要的根目录(又称主目录);其次,阻止用户执行您不希望他们执行的所有操作。
当我有一个用户可以访问 Web 文件时,我采用了类似的方法,但我不想让他看到 Web 文件夹之外的其他文件。
这确实有很多开销,设置起来很混乱,而且每次我更新某些东西时它就会崩溃。
但今天我认为你可以很容易地实现它OpenSSHchroot 选项:
答案3
我发现 POSIX 访问控制列表允许您(作为系统管理员)通过覆盖常规用户组其他文件系统权限来保护您的用户免受因他们自己的无知而造成的最严重后果,而不会有太多机会破坏任何关键的东西。
它们特别有用,例如(fi)如果您需要主目录可供全世界访问,因为 webcontent 需要可供 apache 访问~/public_html/
。(尽管使用 ACL,您现在可以执行相反的操作,删除所有人的访问权限并为 apache 用户使用特定的有效 ACL。)
是的,有知识的用户可以再次删除/覆盖它们,但由于这种情况不常见,所以不太可能发生,而且那些可以这样做的用户通常不是方便的用户chmod -R 777 ~/
,对吗?
您需要使用acl
mount 选项挂载文件系统:
mount -o remount,acl /home
在许多发行版中,默认创建用户组,每个用户都有他们的主要组,而我将所有用户都设置在具有缺乏想象力的名称的次要组中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 -m g: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:---
表明,该组实际上没有访问权限,尽管其他组有常规访问权限other::rwx
并以 user1 身份进行测试:
[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied
共享系统上的第二种常见解决方案是让自动挂载程序按需挂载主目录,并安装专用于 shell 访问的服务器。这远非万无一失,但通常只有少数用户会同时登录,这意味着只有这些用户的主目录可见且可访问。
答案4
例如,如果您希望用户只能访问他自己的home
目录,您应该执行以下操作:
cd /home
sudo chmod 700 *
现在/home/username
只有所有者可见。要将此设置为所有新用户的默认设置,请编辑/etc/adduser.conf
并将其设置DIR_MODE
为0700
而不是0755
默认值。
当然,如果您想改变默认的 DIR_MODE,这取决于您的发行版,我发布的版本适用Ubuntu
。
编辑
作为@Dani_l正确提及,这个答案是正确的,使它们不可读。