简单易行的方法来监禁用户

我需要一个简单易用的方法来在Oneiric中将用户禁闭在他们的主目录中。你有没有一个简单的配置来禁闭用户,并提供完整的帮助,或者一些好的网页链接?
我将提供一个在线免费公共服务器,拥有10到20GB的免费空间。我不知道会有多少用户。我想给他们SSH和SFTP,这样他们就可以通过FileZilla连接。

如果用户没有被锁定在主目录中,进行第二次更新。 - One Zero
我相信你 1- 如@Marco所提到的,你想尝试使用ChrootDirectory来进行SSH 2- 你可能希望超越标准的做事方式,因为你需要扩展它以处理"大量"存储... 3- SSH是你最好的选择吗? 用户是否需要在你的服务上使用SSH? 4- 祝你好运 - Ali
1我还有其他计划……对于普通用户,我们将仅提供带有我的安全Shell的SFTP,这非常容易处理。 - One Zero
我该如何移除这个监狱,比如(home/jail)? 当我添加一些监狱部分,例如 jk_init -v -f /home/jail netutils,我要如何移除它? - user294399
4个回答

Jailkit是一组工具,可以将用户帐户限制在特定的目录树和特定的命令中。使用Jailkit工具设置监狱比手动设置要容易得多。监狱是您在文件系统中创建的目录树;用户无法看到监狱目录之外的任何目录或文件。用户被关押在该目录及其子目录中。
下载和安装:

http://olivier.sessink.nl/jailkit/index.html#download

VERSION=2.20 # from November 2018
cd /tmp
wget https://olivier.sessink.nl/jailkit/jailkit-$VERSION.tar.gz
tar -zxvf jailkit-$VERSION.tar.gz
cd jailkit-$VERSION/
./configure
make
su -
make install

设置监狱

现在是设置监狱目录的时候了。被监禁的用户将把这个目录视为服务器的根目录。我选择使用/home/jail:

mkdir /home/jail
chown root:root /home/jail

使用jk_init可以快速创建一个带有多个文件或目录的监狱,以满足特定任务或配置文件的需求(点击并阅读完整详情)。

jk_init -v /home/jail basicshell
jk_init -v /home/jail netutils
jk_init -v /home/jail ssh
jk_init -v /home/jail jk_lsh

添加用户

添加一个具有主目录和bash shell的新用户,并设置密码:

useradd -d /home/jailtest -m jailtest -s /bin/bash
passwd jailtest

现在是时候将此用户禁闭起来了

使用以下命令:

jk_jailuser -m -j /home/jail jailtest

你的 /etc/passwd 现在应该包含类似这样的内容:
jailtest:x:1001:1001::/home/jail/./home/jailtest:/usr/sbin/jk_chrootsh

启用bash

通过使用jk_cp将bash库复制到监狱中:

jk_cp -v -f /home/jail /bin/bash

编辑/home/jail/etc/passwd

替换这一行:

jailtest:x:1001:1001::test:/usr/sbin/jk_lsh

用这个:
jailtest:x:1001:1001::/home/jailtest:/bin/bash

维护

通过使用jk_update,可以在监狱中更新真实系统。

干运行将显示正在进行的操作:

jk_update -j /home/jail -d

没有使用-d参数,真正的更新将被执行。更多维护操作可以在这里找到。

(如果/home/jail/opt不存在,请使用mkdir -p /home/jail/opt/创建它 然后再次运行jk_update -j /home/jail)

给予其他目录访问权限

您可以挂载特殊文件夹,让监狱用户现在可以访问。例如:

mount --bind /media/$USER/Data/ /home/jail/home/jailtest/test/

帮助已获得

http://olivier.sessink.nl/jailkit/howtos_chroot_shell.html

http://olivier.sessink.nl/jailkit/index.html#intro(非常好的帮助)

还有这个

已经检查和验证,正常工作


+1非常好。强烈建议阅读您在“接受帮助”部分提到的链接。 - cwd
2这在Ubuntu 13.10上不起作用。当你尝试最终登录时,你会立即收到欢迎消息,然后连接关闭。 - hookenz
确保按照最后两个步骤操作:复制 bash 二进制文件并编辑 /home/jail/etc/passwd 文件。 - ONOZ
2这要么不再起作用,要么自从发布教程以来有些变化。我遇到了和MattH一模一样的问题。 - James Heald
我在欢迎信息之后也遇到了连接关闭的问题。根据这里的阅读http://www.linuxquestions.org/questions/linux-software-2/can%27t-access-to-a-user-jailed-by-jailkit-836690/#post4120537,我在chroot passwd文件中将登录shell从jk_lsh更改为bash。这不是一个解决方案,而是一个权宜之计! - Attila Fulop
谢谢你的回答。 不幸的是,我无法正确配置它,以便用户可以通过sftp连接。 :(Sep 23 05:39:31 nsXXXXXX jk_chrootsh[2701]: 现在进入jail /home/jail,用户为usersftp(1001),参数为-c /usr/lib/openssh/sftp-server Sep 23 05:39:31 nsXXXXXX sshd[2700]: 收到来自84.91.XXX.XXX的断开连接请求:11:用户主动断开连接 - PJunior
看起来在最新的Ubuntu版本上,该解决方案不再有效:我已经执行了sudo su - testuser ,但没有任何反应。我该怎么办?而sudo -su testuser会在受监禁的用户目录下打开,但我仍然可以看到其他人的目录。@MariusMatutiae - alper
我编辑了答案:优化格式、更新版本为2.20并为其创建了一个变量;在正确的位置添加了su -,将testuser重新命名为jailtest,以避免攻击和与其他测试用户发生冲突——这在我的Ubuntu 18.10上运行良好。 - rubo77
但是在Debian上似乎无法工作(在wheezy和stretch上进行了测试)。这是-vvv ssh日志:https://pastebin.com/Mwbsz4Wq - rubo77

你不能把它们限制在/home目录下,因为它们需要访问系统二进制文件、bash和/etc目录中的配置文件。
我个人认为,保护用户最简单的方法是使用apparmor。
你可以创建一个硬链接。
ln /bin/bash /usr/local/bin/jailbash

你需要将jailbash添加到/etc/shells中。
然后,你可以将jailbash分配给用户的shell,并为jailbash编写一个apparmor配置文件,以允许最小限度的访问。
sudo chsh -s /usr/local/bin/jailbash user_to_confine

你将需要自己编写一个 AppArmor 配置文件,但我有一个配置文件可以作为你的起点。

http://bodhizazen.com/aa-profiles/bodhizazen/ubuntu-10.04/usr.local.bin.jailbash


你不能把它们限制在/home目录下,因为它们需要访问系统二进制文件、bash和/etc目录中的配置文件。如果你觉得有必要,你可以自由地链接或复制所需的文件。 - user606723
2是的,你可以按照用户606723的建议去做,但这并不容易。在我看来,所有潜在的解决方案中,这是最不实际和最困难的一种。还不如构建一个chroot环境或使用lxc容器。你需要复制一个二进制文件,然后再复制相关的库文件。通常你需要手动使用ldd命令来识别所需的库文件。这种方法需要大量的工作来设置。而且你还需要保持监狱环境的更新,你必须手动更新(复制)二进制文件和库文件。使用链接可能在更新方面效果更好,但你仍然需要设置它们。我不认为这是原帖作者所想要的。那么如何保持它们的限制呢? - Panther
1我认为问题的整个重点是指出自动化这个过程的工具...就像OP提到的jailkit一样。 - user606723
@bodhi.zazen . 你对这个的看法如何.. debootstrap (oneiric) 然后使用 lxc 创建一个容器。使用 jail kit > 用户到容器 > . 到目前为止我做的是,我有 debbootstrap oneiric 最小化然后使用了 jailkit > 运行得很好。 - One Zero
在这个任务中,您可以使用LXC。但要注意,LXC的隔离有时是不完全的。只要用户在容器中没有root访问权限,您应该没问题,并且建议您订阅LXC邮件列表。 - Panther
@bodhi.zazen,我在想的是...用户如何直接进入LXC容器...是否与我使用debootstrap时的配置相同? - One Zero
lxc有些类似于chroot(debootstrap),但它更加复杂一些。有些人使用脚本来设置lxc。 - Panther
我使用了Jailkit、Debootstrap等工具,以及LXC容器来实现这个功能。我已经测试了所有的东西,现在只需要找到一种方法将用户锁定在他们的家目录中。 - One Zero
1非常感谢你。我尝试了三个得票最高的答案,而你的答案是最简单的。实际上,只有你的答案对我有效。 - Dmitry Koroliov
@caligula - 欢迎您 - Panther

很难猜测你可能想要实现什么目的。如果是为了在提供FTP的同时拒绝ssh/sftp,并提供受限访问... 很简单:
在/etc/shells中添加一个新的shell:
sudo -e /etc/shells

添加一行:
/bin/false

保存。对于每个您想要拒绝 SSH/SFTP 的用户,更改用户的 shell:
sudo chsh -s /bin/false userx

现在用户x无法通过ssh/sftp登录。
安装vsftpd:
sudo apt-get install vsftpd

编辑配置文件:
sudo -e /etc/vsftpd.conf

还有一些改变...

anonymous_enable=NO
local_enable=YES
chroot_local_user=YES

保存。重新启动vsftpd:

sudo /etc/init.d/vsftpd restart

我想给他们提供SSH + SFTP(通过FileZilla连接)。 - One Zero

你可以尝试使用rbash作为你的用户的shell。
man bash

搜索“RESTRICTED SHELL”部分
或者查看这个页面 http://linux.die.net/man/1/bash

4请小心使用rbash,它很容易被突破,而且有点过时了。请参考http://blog.bodhizazen.net/linux/how-to-restrict-access-with-rbash/。 - Panther
@bodhi.zazen 你是指 rbash 吗? - Karlson
是的,抱歉我修复了那个问题。几年前有一篇博客,有人打破了我设置的rbash监狱,我认为它非常严密和最小化,但他们不到5分钟就逃脱了。从未有人越狱过jailbash。 - Panther
请问您能告诉我如何配置它吗?...jailbash - One Zero
是的,Bash确实有帮助。使用Bash受限shell功能更加简单。 - c4f4t0r