Chroot机制使服务器技术更安全

  • 来源:网络
  • 更新日期:2020-06-02

摘要: 我们现在追求的是一个安全的社会不仅是是在我们的生活当中,在我们的网络世界也应该处处多有人去维护和保护他们的存在。我们需要一个有隐私的世界,我们需要一个自己空间

我们现在追求的是一个安全的社会不仅是是在我们的生活当中,在我们的网络世界也应该处处多有人去维护和保护他们的存在。我们需要一个有隐私的世界,我们需要一个自己空间的网络,我们需要一个可以自己发泄的场所,这就是网络安全的重要性。

创建chroot“监牢”
以前,Unix/Linux上的daemon都是以root权限启动的。当时,这似乎是一件理所当然的事情,因为像Apache这样的服务器软件需要绑定到“众所周知”的端口上(小于1024)来监听HTTP请求,而root是惟一有这种权限的用户。

但是,随着攻击者活动的日益频繁,尤其是缓冲区溢出漏洞数量的激增,使服务器安全受到了更大的威胁。一旦某个网络服务存在漏洞,攻击者就能够访问并控制整个系统。因此,为了减缓这种攻击所带来的负面影响,现在服务器软件通常设计为以root权限启动,然后服务器进程自行放弃root,再以某个低权限的系统账号来运行进程。这种方式的好处在于一旦该服务被攻击者利用漏洞入侵,由于进程权限很低,攻击者得到的访问权限又是基于这个较低权限的,对系统造成的危害比以前减轻了许多。

有些攻击者会试图找到系统其它的漏洞来提升权限,直至达到root。由于本地安全性远低于远程安全保护,因此攻击者很有可能在系统中找到可以提升权限的东西。即使没有找到本地漏洞,攻击者也可能会造成其它损害,如删除文件、涂改主页等。

为了进一步提高系统安全性,Linux内核引入了chroot机制。chroot是内核中的一个系统调用,软件可以通过调用库函数chroot,来更改某个进程所能见到的根目录。比如,Apache软件安装在/usr/local/httpd/目录下,以root用户(或具有相同权限的其它账号)启动Apache,这个root权限的父进程会派生数个以nobody权限运行的子进程,具体情况取决于个人设置。父进程监听请求自80端口的tcp数据流,然后根据内部算法将这个请求分配给某个子进程来处理。这时Apache子进程所处的目录继承自父进程,即/usr/local/httpd/。

但是,一旦目录权限设定失误,被攻击的Apache子进程可以访问/usr/local、/usr、/tmp,甚至整个文件系统,因为Apache进程所处的根目录仍是整个文件系统的根。如果能够利用chroot将Apache限制在/usr/local/httpd/,那么,Apache所能存取的文件都是/usr/local/httpd/下的文件或其子目录下的文件。创建chroot“监牢”的作用就是将进程权限限制在文件系统目录树中的某一子树中。

为什么需要jail

将软件chroot化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到chroot目录中,通常称这个目录为chroot jail(chroot“监牢”)。如果要在“监牢”中运行/sbin/httpd,而事实上根本看不到文件系统中那个真正的/sbin目录。因此需要事先创建/sbin目录,并将httpd复制到其中。同时httpd需要几个库文件,执行如下命令可以看到这些库文件(在真实的文件系统下运行)。

_CODE>#ldd /sbin/httpd

libaprutil-0.so.0 => /usr/local/httpd/lib/libaprutil-0.so.0 (0x40017000)

libgdbm.so.2 => /usr/lib/libgdbm.so.2 (0x4003c000)

libdb-4.0.so => /lib/libdb-4.0.so (0x40043000)

libpthread.so.0 => /lib/tls/libpthread.so.0 (0x400eb000)

libexpat.so.0 => /usr/lib/libexpat.so.0 (0x400f8000)

libapr-0.so.0 => /usr/local/httpd/lib/libapr-0.so.0 (0x40118000)

librt.so.1 => /lib/librt.so.1 (0x40139000)

lIBM.so.6 => /lib/tls/lIBM.so.6 (0x4014b000)

libcrypt.so.1 => /lib/libcrypt.so.1 (0x4016d000)

libnsl.so.1 => /lib/libnsl.so.1 (0x4019a000)

libdl.so.2 => /lib/libdl.so.2 (0x401af000)

libc.so.6 => /lib/tls/libc.so.6 (0x42000000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)_CODE>

这意味着还需要在“监牢”中创建lib目录,并将库文件复制到其中。这一工作可以交由计算机完成,用jail等软件包来帮助简化chroot“监牢”建立的过程。

编译和安装jail

从http://www.jmcresearch.com/static/dwn/projects/jail/jail.tar.gz可以下载到jail的最新版本,它是由位于http://www.jmcresearch.com/projects/jail/的jail chroot项目小组开发的。该软件包包含了帮助自动创建chroot“监牢”的C程序、Perl程序和Bash脚本。
首先将jail.tar.gz置于任意目录,然后执行命令:

#tar xzvf jail.tar.gz && cd jail/src

按照个人实际情况修改makefile文件,尤其是安装路径(默认安装路径是/usr/local)、体系结构(jail支持Linux、FreeBSD、IRIX和Solaris),以及编译选项等。最后执行命令:

#make && make install

为jail创建chroot“监牢”

现在创建一个目录作为chroot“监牢”,以/var/chroot/为例。执行下面的命令为chroot“监牢”创建环境:

#/usr/local/bin/mkjailenv /var/chroot

这样“监牢”就建好了。jail软件包提供了几个Perl脚本作为其核心命令,包括mkjailenv、addjailuser和addjailsw。如addjailsw会从真实文件系统中拷贝二进制可执行文件及其相关的其它文件(包括库文件、辅助性文件和设备文件)到该“监牢”中。

为jail“监牢”添加软件

接下来需要为这个“监牢”增加一些软件,以便让它运行起来。执行以下命令安装一些基本的软件,包括ls、cat、cp等程序和ld-linux.so.2等库文件。

#/usr/local/bin/addjailsw /var/chroot

事实上仅有这些基本软件是不够的,还需要把一些真正有用的东西限制起来。下面的例子展示了为“监牢”添加arp程序的过程:

_CODE>#/usr/local/bin/addjailsw /var/chroot -P arp

addjailsw

A component of Jail (version 1.9 for linux)

http://www.jmcresearch.com/projects/jail/

Juan M. Casillas

Guessing arp args(0)

Warning: file .//lib/tls/libc.so.6 exists. Overwritting it

Warning: file .//lib/ld-linux.so.2 exists. Overwritting it

Warning: file .//etc/ld.so.cache exists. Overwritting it

Warning: file .//usr/lib/locale/locale-archive exists. Overwritting it

Warning: file .//usr/share/locale/locale.alias exists. Overwritting it

Warning: cant create /proc/net/arp from the /proc filesystem

Done._CODE>

再以Apache服务器软件为例:

_CODE>#addjailsw /var/chroot/ -P /usr/local/httpd/bin/httpd

addjailsw

A component of Jail (version 1.9 for linux)

http://www.jmcresearch.com/projects/jail/

Juan M. Casillas

Guessing /usr/local/httpd/bin/httpd args(0)

Warning: file /var/chroot//lib/libssl.so.4 exists. Overwritting it

Warning: file /var/chroot//lib/libcrypto.so.4 exists. Overwritting it

Warning: file /var/chroot//lib/libresolv.so.2 exists. Overwritting it

……

Done._CODE>

不用在意那些警告信息,因为jail会调用ldd检查httpd用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件。

接下来将Apache的相关文件拷贝到“监牢”中:

#cp -a /usr/local/httpd/ /var/chroot/usr/local/

可根据个人情况依次将Apache需要的文件复制到“监牢”中。

“监禁”囚犯

有时候需要为chroot“监牢”创建新的用户,比如Apache要求创建nobody用户作为子进程用户。鉴于可能有其它进程使用nobody,还可以使用另一用户——httpd。首先需要在真实系统中创建httpd用户:

#useradd -d /var/chroot -s /usr/local/bin/jail httpd

然后执行以下命令在chroot“监牢”中创建httpd用户:

#/usr/local/bin/addjailuser /var/chroot /usr/local/httpd /usr/sbin/httpd httpd

接下来修改/var/chroot/usr/local/httpd/conf/httpd.conf,将User nobody替换为User httpd。由于chroot后Apache将以httpd身份启动进程,只有root有权将Apache绑定在低端口上(通常为80),因此还需要修改端口值,该值必须大于1024(假设为8080)。这个修改要应用到Apache的所有配置文件中,包括虚拟主机的配置。至于Apache的其它设置,与在真实文件系统时一样配置即可。

大家看完这篇文章以后是不是觉得这个机制使得服务器变得更加安全了也有应该有的保障了,是一件非常重要的事情,我也是这样觉得的,所以当我们有什么好的软件或者什么好的服务器呢请你及时推荐。