将Linux用户限制为他拥有的文件


24

想象一下,一个共享的虚拟主机公司的服务器设置,其中有多个(约100个)客户可以通过外壳访问单个服务器。

很多网络“软件”建议将chmod文件0777。我对我们的客户不明智地遵循这些教程感到不安,他们向其他客户开放他们的文件。(我当然不是在cmod 0777不必要地使用我!)是否有一种方法可以确保客户只能访问自己的文件,并阻止他们访问其他用户的世界可读文件?

我研究了AppArmor,但这与流程紧密相关,在该环境中似乎失败了。


12
实际上,我会考虑是否chmod files 0777绝对需要“ Web软件”的建议,即解决问题的根本原因,而不是通过这样做的征兆,即任何人都可以读取任何人的文件。很多时候,“ 允许所有人访问”建议只是避免支持电话的一种廉价方法,或者是在能够正确设置权限方面缺乏技术能力的简单方法。几乎在任何情况下,我都无需0777在请求时设置文件或授予应用程序完全root访问权限。用户和/或供应商的教育在这里大有帮助。
Cosmic Ossifrage 2014年

3
@CosmicOssifrage,无法轻松地教育用户,他们不想阅读说明或手册。
Cristian Ciupitu 2014年

12
任何仍然建议777权限的“网络软件”都需要取出并射击。使用suexecmpm_itk或相似。
Shadur 2014年

3
@CosmicOssifrage我不认为Phillipp在告诉或强迫用户访问chmod 0777他们的文件。我认为他是担心他们会loltoturialz.com/php_problems和设置chmod 0777,而盲从写得不好的文章自己。确实没有办法阻止他们这样做,或者防止有人偷东西时让他们感到不安。
凯文-恢复莫妮卡

2
@kevin-这就是为什么保修无效的原因。没有这样的子句,我几乎从来没有见过一个严肃的设备(无论是软件编译,一堆脚本还是其他)。信不信由你-在大多数公司环境中,用户都清楚这一点
Dani_l 2014年

Answers:


34

在外界和受保护的文件之间放置一个受限制不变的目录,例如

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

/home/joe/restricted/public_html

受限意味着只有用户(也许是Web服务器)可以读取它(例如mode 0700/ 0750或某些ACL)。

不变性可以chattr +i通过将所有权更改为或来实现root:joe

在Ubuntu上创建该层次结构的一种简单方法是将其编辑/etc/adduser.conf并设置GROUPHOMESyes


15

您可能要考虑一个选项(取决于您要为此做多少工作)。

正如其他人已经发布的那样,“通常”您不能阻止具有外壳访问权限的人读取世界可读文件。

但是,您可以将它们chroot到自己的主目录中,从而基本上限制了对shell的访问,首先,仅访问您想要的根目录(又称主目录),其次,阻止用户执行您不希望他们执行的所有操作。

当我有一个用户可以访问Web文件时,我采取了类似的方法,但是我不想让他看到Web文件夹之外的其他文件。

这确实有很多开销,设置起来一团糟,每当我更新某些内容时,它就崩溃了。

但是对于今天,我认为您可以使用OpenSSH chroot选项轻松实现:

维基图书OpenSSH


用于SFTP的chroot很容易实现,但是我不确定shell访问是否那么容易。您必须为每个用户设置一个带有所有二进制文件和库的chroot。
Cristian Ciupitu 2014年

2
那是特定于实现的。ARCHLINUX具有特定的arch-chroot命令,该命令负责处理所有额外的绑定安装等。wiki.archlinux.org
index.php/Change_Root#

@CristianCiupitu那就是我所做的,只允许特定的命令子集链接所有nessesary库,这就是为什么我说那是一团糟:) Dani_l是的,我的设置是一台debian服务器,我从来没有时间可悲地检查gentoo 。
丹尼斯·诺尔特2014年

@Dani_l:安装的软件包如何?该arch-chroot命令似乎没有涵盖该内容。然后还有所有重复磁盘空间浪费的问题。我并不是说不可能做到这一点,只是说当前可能会更加复杂。
Cristian Ciupitu 2014年

1
使该操作更容易的方法是使用UnionFS将用户以chroot身份以只读模式和读写主目录加入rootfs的特殊联合,这意味着他们可以看到所有系统软件包和二进制文件,但是写入会自动在他们的主文件夹。这必须与使所有主目录具有700个权限相结合,否则用户仍然可以从其他用户读取文件。

11

我发现POSIX访问控制列表使您(作为系统管理员)可以通过覆盖常规的用户组-其他文件系统权限来保护用户免受最糟糕的无知之苦,而没有太多机会破坏任何重要的内容。

如果您(fi)需要主目录可以在世界范围内访问,则它们可能特别有用,因为Web内容需要可访问~/public_html/。(尽管有了ACL,您现在可以执行相反的操作,删除所有用户的访问权限,并为apache用户使用特定的有效ACL。)

是的,有知识的用户可以再次删除/覆盖它们,这非常罕见,以至于不太可能,并且那些通常不是方便chmod -R 777 ~/的用户,对吗?

您需要使用aclmount选项来挂载文件系统:

 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访问的服务器。这远非万无一失,但是通常只有少数用户会同时登录,这意味着只有这些用户的主目录是可见的和可访问的。


5
什么是“ fi”?我不建议使用首字母缩写词或缩写,除非它们是经典的缩写,例如“ eg”,“ ie”,“ etc”以及OP。
Cristian Ciupitu 2014年

3

Linux容器(LXC)可能是chroot和独立系统的最佳组合。

  1. 它们更像是高级chroot,而不是虚拟化,但是您可以在一个服务器中组合不同的操作系统。

  2. 您可以为用户提供完整的操作系统,然后在该目录中将其更改为chroot,因此,当用户登录时,他将转到其容器。您还可以在那里限制处理器和内存的使用。

LXC的作者StéphaneGraber有一个很好的教程可以帮助您入门。


您不能真正组合不同的操作系统,因为它们都需要使用Linux内核,但是您可以使用不同的发行版
Cristian Ciupitu 2014年

1
谢谢:)是的,基于Linux内核的操作系统不同。
疯狂

@CristianCiupitu您是否表示相同的Linux内核?还是意味着每个容器可以具有不同版本的内核?
agks mehx 2014年

@agksmehx,所有LXC容器共享主机的内核。仅使用其应用程序和库。因此,例如,如果您有一台带有Ubuntu 14.04容器的RHEL 7主机,则将使用RHEL内核(3.10.0-123),而不会使用Ubuntu 1(3.13.0-24.46)。另请阅读教程中的评论。顺便说一下,由于不使用容器的内核,因此删除它们以节省一些磁盘空间可能是一个好主意。
Cristian Ciupitu 2014年

@CristianCiupitu这就是我的想法。从答案或评论中还不清楚,所以我想澄清一下。
agks mehx 2014年

3

例如,如果您希望用户只能访问自己的home目录,则应该执行以下操作:

cd /home
sudo chmod 700 *

现在/home/username仅对其所有者可见。要将其设置为所有新用户的默认值,请编辑/etc/adduser.conf并设置DIR_MODE0700而不是0755默认值。

当然,如果要更改默认的DIR_MODE取决于您的发行版,我发布的版本适用于Ubuntu

编辑

正如@Dani_l正确提及的那样,此答案是正确的,以使它们无法被世界读取。


由于某种原因,它们被称为“世界可读”。
Mark K Cowan 2014年

1
@DennisNolte实际上,即使文件是世界可读的,它也确实有帮助,即使它们位于您既未读取也不执行的目录中,也无论如何都无法读取它们。

1
@Vality是,删除我的评论是完全错误的。
丹尼斯·诺尔特2014年

2

只是想学-不,没有。
@Marek给出了正确的答案,但您的问题不正确-您无法阻止任何人访问“世界可读”文件。
它们要么是世界可读的,要么不是。@Marek的答案是正确的,使它们不能被世界范围读取。


2
错误的,将用户chroot / jail到一个子文件夹,并且他无法读取“正常”的世界可读文件。
丹尼斯·诺尔特

1
-1我认为您不必要地批评OP的问题。他想给他的客户一个安全网,以防他们不了解自己的权限。但是在我看来,OP并不了解Unix文件权限的工作方式或基本的安全原理。
凯文-恢复莫妮卡

另外,您可以将文件放入000权限目录中的目录中,即使文件是世界可读的,也没有人可以访问它们。

没有人?甚至没有根?;-)
Dani_l 2014年

@Kevin同意我的评论被批评为不必要的评论。但是,达尼(Dani_I)不应该因为他的脚踏实地和蜜蜂的错误而对它感到不满。并不是说我不同意他的其余回答。
丹尼斯·诺尔特

0

到目前为止,我还没有提到“受限外壳”。

ln / bin / bash / bin / rbash

将此设置为其登录外壳程序。


0

如果Web服务器对于托管的每个域都以相同的用户和组身份运行,则很难(如果不是不可能)确保设置的安全性。

您希望用户和Web服务器可以访问某些文件,而其他用户则不能。但是,只要Web服务器可以访问它们,另一个用户就可以通过在其自己的网站内的文件上放置符号链接来阅读它们。

如果您可以让每个网站都以单独的用户身份运行,那么它将变得非常简单。现在,每个客户在系统上将有两个用户,一个用于Web服务器,一个用于shell访问。

创建一个包含这两个用户的组。现在,使用该组和用户root创建目录。该目录应该具有权限750,这意味着root拥有完全访问权限,而group拥有读取和执行访问权限。在该目录中,您可以为两个用户分别创建主目录。这意味着用户的主目录将不再具有形式/home/username,而是至少包含一个以上目录组件的形式。这不是问题,也不需要根据该特定约定来命名主目录。

如果您正在使用基于名称的虚拟主机,则使网站以不同的用户和组运行可能会很棘手。事实证明,您只能使分离与基于IP的虚拟主机一起使用,而每个站点没有足够的IP,则可以将每个网站托管在IPv6地址上,并将所有反向代理放在一个IPv4地址。

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.