C/CPP, Unix Like, 操作系统, 程序设计

Linux chroot Shell —— 简单chroot指定用户

对于Linux服务器,有时需要开放登录权限给一部分用户,但并非所有用户都愿意安分守己,也无法知道谁是不安分守己的,给多一个这些用户开放登录权限,系统的威胁就多了一分。

目前来说比较好的方案是chroot,调用了chroot(),就能把的根目录改成指定的根目录。何为根目录?顾名思义,“根”就是所有目录的“根”,一切目录均从“根”而生,没有“根”就没有其他目录,换句话说,“根目录”就是最原始的目录。你无法访问“根”之前前的数据,没有“根”的时候,怎么可以发展数据呢?

二进制程序chroot乃GNU的核心程序中的一个,Linux发行版本一般都有Coreutils,不过二进制版的chroot在这种情况下帮不上忙,因为仅有特权用户(root)才能调用chroot(),why?想想如果任何人都能调用chroot,如果用户自建了一个自定义了root密码的根文件系统,那他岂不是可以chroot进去后把自己提升为root?

SSH自带chroot功能,不过也仅仅是帮你chroot,如果让所有用户共享一个chroot文件系统,一个用户的数据可能会泄露到其他用户手上,要让不同用户使用不同chroot文件系统,管理和配置起来又麻烦。不仅如此,每chroot一个用户,就需要更改SSH的配置文件,记录多了异常麻烦。

如何简单地管理chroot文件系统,还方便地chroot用户?

Linux-CHROOT-SHELL就是为了解决此问题而生的。

拥有了Linux-CHROOT-SHELL,你只需要建立且维护一个chroot根文件系统。

拥有了Linux-CHROOT-SHELL,你可以让所有用户使用的chroot环境相互隔离。

拥有了Linux-CHROOT-SHELL,你不再需要维护多余的配置文件,繁杂的配置记录。

多说没用,下面让我来告诉大家如何使用Linux-CHROOT-SHELL。

 

Linux-CHROOT-SHELL由C语言编写,代码托管在GIT服务器上,因此需要安装gcc与git:

从GIT服务器上获取源码,并进入源码目录:

编译Linux-CHROOT-SHELL:

一切无误后,编译完毕的二进制文件将会存放到/usr/bin/chroot_shell。

 

由于调用chroot(),内核的要求是特权用户身份,因此需要给予用户临时的root权限,不过不用担心,一旦chroot完毕后,本shell将会自动把身份更改为原用户的身份:

执行这条命令后,程序将会获得set uid和set gid属性,所有执行本程序的用户都可以取得文件所有者和所属群组的权限,所以必须确保本文件的所有者和所属群组为root。不过,既然你编译的时候能把文件输出到/usr/bin/,那你一定是以用root身份操作的,那么本文件的所有者和所属群组也必定是root。

 

接下来构建chroot文件系统:

为了简单起见,这里直接使用了OpenVZ的模板构建chroot文件系统。

构建完毕后,可以对根文件系统进行设置:

例如更改/etc/resolv.conf中所设置的DNS服务器。

设置完毕后,执行exit退出:

 

最后一步,创建用户:

创建用户的方法和平常差不多,只不过需要把用户的Shell指定为/usr/bin/chroot_shell:

添加用户成功后,更改用户密码:

如果要更改原有用户的Shell,使用usermod即可:

别忘了,还要同步passwd的记录到chroot文件系统:

可以把这个命令写到cron任务中,实现周期性同步。

 

接下来,你可以尝试使用指定了chroot_shell的用户登录:

user1

user2

可以看到,chroot_user和chroot_user2互相无法访问对方的目录,根据下图,可以看出两个chroot的用户无法访问原根存在的文件,说明chroot成功:

root

不仅如此,chroot后,用户还能访问自己家目录原有的数据,此外,除了用户自己的家目录和/tmp,所有其他目录均为只读模式,/tmp也实现了隔离,所有用户使用的/tmp不相干扰,相互独立。

 

由于没有挂载/proc和/dev,用户自然无法调用程序查看系统信息。

 

有了chroot shell,chroot用户变得简单起来,再也不用担心给了用户登录权限后,给服务器增加安全隐患了。

Comments are closed.