如何防止用户访问除自己的主目录之外的任何内容?

如何防止用户访问除自己的主目录之外的任何内容?
例如,我在/media/ntfs下挂载了一个NTFS分区,所以如果用户通过ssh登录,他可以访问到这个分区。我该如何禁止用户从他们的主目录中cd出去?
6个回答

首先,重新评估一下你的需求。你试图解决的问题是什么?你为什么要阻止用户离开他们的主目录?难道不是因为你不希望他们在特定的其他目录中翻找,比如其他用户的主目录吗?
实际上,阻止用户离开他们的主目录非常困难,而且有点愚蠢(接下来会解释原因)。相比之下,阻止用户进入你不希望他们进入的目录要简单得多。
首先,是的,你可以给用户提供所谓的“受限制的shell”,参见man rbash。这将阻止他们在该shell内部进行cd操作。但是,如果用户启动vi或nano(或任何其他能够打开文件的程序),他们仍然可以在系统上的任何位置打开文件。事实上,受限制的shell并不能阻止例如cat /etc/passwd这样的操作。
下一步是使用根目录监狱。关于社区维基这个问题的更多信息。尽管根目录监狱会将用户锁定在一个有限的环境中,只能访问您有意放置的文件和命令,但它实际上是用于隔离不受信任的软件而不是用户。特别是用于需要以提升的权限运行的软件,因此称为监狱。
另一方面,用户是可信任的:他们必须进行身份验证并且没有提升的权限运行。因此,文件权限足以防止他们更改不属于自己的文件,并防止他们看到不应该看到的内容。要防止用户读取文件的内容,请使用chmod o-r FILE来删除其对全局可读的权限。要防止用户进入目录,请使用chmod o-rwx DIR使其对全局不可访问。
世界可读性是默认设置,有很好的原因:用户实际上需要文件系统上的大部分内容。不要仅仅因为外面存在秘密而将用户锁在家中。
为什么将用户限制在他们的主目录下有些愚蠢
要做任何有用的事情,用户需要访问命令和应用程序。这些都位于像/bin和/usr/bin这样的目录中,所以除非您将他们所需的所有命令从那里复制到他们的主目录中,否则用户将需要访问/bin和/usr/bin。但这只是开始。应用程序还需要来自/usr/lib和/lib的库,这些库又需要访问系统资源,这些资源位于/dev中,并且需要访问/etc和/usr/share中的配置文件。
这只是只读部分。应用程序还希望写入/tmp和通常/var。因此,如果您想限制用户在他的主目录中,那么您将不得不将很多内容复制到其中。事实上,几乎是整个基本文件系统 - 您已经位于/处。

17这对我来说没有意义,为什么只允许用户访问一个文件夹可能有很多原因。一个例子可能是为了从一个服务器传输文件到另一个服务器而给予访问权限。 相比之下,我认为任何用户都可以浏览整个系统有点傻 - Richard
1在我的情况下,我正在设置一个用户,允许设备通过反向SSH连接到机器,以便远程管理设备。因此,我希望尽可能地限制该用户账户,以防万一被入侵 - 我只需要成功建立连接即可。我不会说这是愚蠢的,这取决于你想要实现什么目标。 - John

我需要为用户sam提供对/var/xyz的访问权限,并阻止列出/var/内其他文件夹的内容。
我使用了以下命令序列:
setfacl -R -m user:sam:--- /var/

setfacl -m user:sam:rx /var/

setfacl -R -m user:sam:rwx /var/xyz/

所以用户可以看到在/var/下列出的目录,但不能看到子目录下的内容,除了/var/xyz

2欢迎来到askubuntu!我认为这并不是对于有关家目录的问题的回答。 - Elder Geek
6@ElderGeek OP可以使用相同的命令,但是针对主目录进行操作吗? - Seth
@Seth 是的,但对普通用户来说会清楚吗? - Elder Geek
5@长者 是的,我相信会有答案。虽然不完美,但仍然是一个答案。 - Seth
如果文件夹是/var/abc/xyz,那么设置权限为setfacl -m user:sam:rx /var/abc/。这对我有效。 - Aravind

为了完整回答@Willman的问题,你可以简单地这样做:
首先,为了不列出所有用户的主目录:
chmod 701 /home

但是如果您知道用户主目录的路径,您仍然可以使用cd命令访问它。

所以您可以只为所有已创建的用户目录执行chmod 750命令。

但是我们想要的是防止任何用户的主目录具有755权限。有一个负责配置新用户的文件:/etc/adduser.conf

只需将DIR_MODE=0755更改为DIR_MODE=0750


一般来说,我们应该将/home目录设置为750,这样组内的所有用户都可以读取和执行文件夹中的内容。对于共享文件夹,760也是合理的选择。然后通过用户组来控制访问权限。这实际上是用户组的主要优势,可以实现基于角色的访问控制。也许还有必要了解如何将用户添加到多个不同的用户组中。 - undefined

除了限制对其他目录的访问,尤其是其他用户的主目录外,我还不希望用户能够执行`ll /home`命令并看到系统上其他用户的名称。
为了防止这种情况发生,在root权限下运行`chmod 701 /home`命令。这将使`/home`目录本身对root用户具有“读/写/执行”权限,但对其他人只有“执行”权限。虽然用户仍然可以通过`cd`命令进入`/home`目录,但他们无法读取其中的内容-即其他用户的主文件夹和用户名。

尽管这并不严格回答问题,但仍然非常有趣...在你操作一个远程服务器,客户可以通过ssh登录的情况下,这是很棒的。他们仍然可以像预期的那样自由移动,同时保留其他客户用户名的隐私。 - Jack_Hu
这正是我正在寻找的答案。 - Nesha Zoric

这是对我有效的方法:
sudo adduser --home /the/only/accessed/directory baby_user --no-create-home

chown baby_user:baby_user /the/only/accessed/directory

chmod 755 /the/only/accessed/directory

然后:

setfacl -m user:baby_user:rx /the/only/accessed/directory

呼啦,baby_user不能向上cd了…


老实说,这是解决问题最简单的方法。我不明白为什么它还没有得到更多的赞成票。 - undefined

这对我有效:
运行以下命令: ``` vi /bin/restrictedbash ```
然后在文件中添加以下内容: ``` #!/bin/bash bash --restricted ```
然后使用以下命令更改文件的权限: ``` chmod 755 /bin/restrictedbash ```
然后运行以下命令编辑`passwd`文件: ``` vi /etc/passwd ```
然后将属于用户的行替换为以下内容: ``` ali:x:1001:1001:,,,:/home/ali:/bin/bash ``` 替换为 ``` ali:x:1001:1001:,,,:/home/ali:/bin/restrictedbash ```
然后用户ali将被限制在自己的主目录下。

阿里为什么不能只是运送他自己的无限制的bash并从受限制的bash中运行它呢?阿里的主目录是否在只读文件系统上?阿里的主目录是否挂载了noexec - hanshenrik
这在使用命令行进行SSH登录时效果很好,但是如果你尝试在FileZilla上使用SFTP,它就不起作用了。有什么解决办法吗? - Saurin Dashadia