chroot 与 jail

所谓“监牢”就是指通过chroot机制来更改某个进程所能看到的根文件夹,即将某进程限制在指定文件夹中,保证该进程仅仅能对该文件夹及其子文件夹的文件有所动作,从而保证整个server的安全。

创建chroot“监牢”

曾经,Unix/Linux上的daemon都是以root权限启动的。当时,这似乎是一件理所当然的事情,由于像Apache这种server软件须要绑定到“众所周知”的port上(小于1024)来监听HTTP请求,而root是惟一有这种权限的用户。

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

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

为了进一步提高系统安全性,Linux内核引入了chroot机制。chroot是内核中的一个系统调用,软件能够通过调用库函数chroot,来更改某个进程所能见到的根文件夹。比方,Apache软件安装在/usr/local/httpd/文件夹下,以root用户(或具有同样权限的其他账号)启动Apache,这个root权限的父进程会派生数个以nobody权限执行的子进程,详细情况取决于个人设置。父进程监听请求自80port的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须要几个库文件,执行例如以下命令能够看到这些库文件(在真实的文件系统下执行)。

#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)

这意味着还须要在“监牢”中创建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程序的过程:

#/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 <[email protected]>

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: can‘t create /proc/net/arp from the /proc filesystem

Done.

再以Apacheserver软件为例:

#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 <[email protected]>

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.

不用在意那些警告信息,由于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绑定在低port上(通常为80),因此还须要改动port值,该值必须大于1024(如果为8080)。这个改动要应用到Apache的全部配置文件里,包含虚拟主机的配置。至于Apache的其他设置,与在真实文件系统时一样配置就可以。

接下来须要复制一些其他的文件。启动Apache最常见的方式就是调用apachectl,这是个Bash脚本。查看这个文件,会发现例如以下行:

HTTPD=‘/usr/local/httpd/bin/httpd‘
LYNX="lynx -dump"
ULIMIT_MAX_FILES="ulimit -S -n `ulimit -H -n`"
ARGV="-h"
$HTTPD -k $ARGV
$HTTPD -k start -DSSL
$HTTPD -t
$LYNX $STATUSURL | awk ‘ /process$/ { print; exit } { print } ‘

当中ulimit、lynx和awk是辅助性的程序。另外须要注意的是,程序使用不同的參数时,可能会使用不同的库文件,因此为了让Apache完整执行,使用以下的命令来跟踪全部可能的文件:
    #/usr/local/bin/addjailsw /var/chroot -P httpd "-k start -DSSL"

用上述的參数替换引號中的參数,完毕所有的工作。

最后,让成功jail的Apache执行起来:
    #su - httpd &

打开浏览器进行測试,訪问Webserver时记住加上8080port号。

jail高级应用

在前面的介绍中,使用了jail软件包中的三个Perl脚本。这里具体介绍这三个脚本的使用,以便高级用户使用。

mkjailenv
    使用方法:mkjailenv chrootdir
    作用:创建chroot“监牢”文件夹,而且从真实文件系统中拷贝主要的软件环境。
    參数:
    chrootdir指定chroot“监牢”的路径。

addjailsw
    使用方法:addjailsw chrootdir [-D] [-P program args]
    作用:从真实文件系统中拷贝指定的文件及其相关文件。
        參数:
    chrootdir指定chroot“监牢”的路径。
    -D显示具体信息。
    -P program args指定要加入?到“监牢”中的软件。program能够是个文件名称,也能够是文件的完整路径;args是參数。比方能够这样运行addjailsw:
    #addjailsw /var/chroot -P vi "-c q"

addjailuser
    使用方法:addjailuser chrootdir userdir usershell username
    作用:创建新的chroot“监牢”用户。
        參数:
    chrootdir指定chroot“监牢”的路径。
    userdir指定新加入?用户的主文件夹(相对于chroot“监牢”文件夹)。
    usershell指定新用户使用的Shell的完整路径(比方/bin/bash)。
    username为新加入?的用户名。

比方:
    #addjailuser /var/chroot /home/ftp /bin/csh ftp

这个脚本会自己主动改动“监牢”中的/etc/passwd、/etc/group和/etc/shadow文件。

从上文看,假设仅使Apache一个软件执行在“监牢”中,mkjailenv似乎过于“热心”了,因此能够不执行mkjailenv /var/chroot命令,而仅仅执行addjailsw /var/chroot -P httpd或在调试完chroot“监牢”后删除多余的文件,并改动/etc/passwd中多余的用户信息。由此想到,如今大多数流行的Web网站都採用Apache+PHP+MySQL+SSL的搭配(可能还会有FTP、Mail、Perl等组件),因此全然能够建立一个综合的Web“监牢”。系统管理员能够为这个“监牢”设置软件环境,当然这个环境仅仅包含维护Apache+PHP+MySQL+SSL这些组件的必备工具,如使用Bash、SSH、编译软件或上传等。这可能是一个浩大的project,可是却很有意义。參考上面的方法,大家能够尝试jail出完美的server来。(

chroot 与 jail

时间: 2024-12-26 18:10:36

chroot 与 jail的相关文章

[Z] 囚禁你的精灵(daemon)进程

作者:matt borland   翻译:nixe0n 简介 chroot牢笼(jail)概念综述 postfix精灵进程分析 一个禁锢(jail)howto:icecast 第一步:把icecast安装在牢笼(jail)环境中 第二步:配置牢笼(jail)环境 第三步:为这个精灵建立一个chroot包装 哪些地方不能用牢笼环境 结论 简介 我们经常会听说计算机遭到基于internet的远程攻击.通常位于攻击最前线的是一些服务器软件,例如:web.邮件和 dns,这些服务通常是通过监控进程(da

Linux 容器技术史话:从 chroot 到未来

Linux 容器是一个在单一 Linux 主机上提供多个隔离的 Linux 环境的操作系统级虚拟技术.不像虚拟机(VM),容器并不需要运行专用的访客(guest)操作系统.容器们共享宿主机的(host)操作系统内核,并使用访客操作系统的系统库来提供所需的功能.由于不需要专用的操作系统,因此容器要比虚拟器启动快得多. Virtual Machines Vs Containers (图片来自: Docker Inc.) 转载于:http://www.itxuexiwang.com/a/liunxji

ubuntu 14.04 下FTP服务器的搭建--锁定用户目录,解决vsftpd: refusing to run with writable root inside chroot()

FTP服务器的搭建,我要实现的需求是: 不允许匿名访问,因为我的机器不想让谁都能登录上来,随便获取文件, 需要锁定一个目录,因为在家里,我需要给媳妇下载一些电影 韩剧之类的东西,媳妇会来我机器下载,但是我不想让他随意操作我的东西. 万一删除我的配置文件,我就惨了(吐槽一下韩剧:媳妇问我,你都没看过韩剧怎么知道它不好看呢,我说:我没吃过屎 但是知道它一定不好吃!) 另外,需要本机也能访问,因为我要做一些关于FTP的测试.  不单独建立FTP用户,FTP也使用ubuntu桌面的用户进行登录和操作,

在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器

BIND(Berkeley internet Name Daemon)也叫做NAMED,是现今互联网上使用最为广泛的DNS 服务器程序.这篇文章将要讲述如何在 chroot 监牢中运行 BIND,这样它就无法访问文件系统中除"监牢"以外的其它部分. 例如,在这篇文章中,我会将BIND的运行根目录改为 /var/named/chroot/.当然,对于BIND来说,这个目录就是 /(根目录). "jail"(监牢,下同)是一个软件机制,其功能是使得某个程序无法访问规定区

Chroot改变世界

什么是Chroot? chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的.而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置. 为什么使用Chroot? 在经过 chroot 之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个: 1.增加了系统的安全性,限制了用户的权力

让nginx在CentOS下以chroot的方式运行

实验环境为64位的CentOS6.4,nginx使用官方最新稳定版的, 下载源码包 # wget http://nginx.org/download/nginx-1.6.2.tar.gz [[email protected] local]# tar zxvf nginx-1.6.2.tar.gz 隐藏nginx的真实版本,修改nginx显示版本及名称, [[email protected] nginx-1.6.2]# vi /usr/local/nginx-1.6.2/src/core/ngin

将DNS走进chroot的根文件系统的目录

chroot:将当前的目录作为程序运行的根目录,程序运行和访问的文件,执行的执行 都不能够超过当前的目录,所以对整个系统没有任何的影响. 场景说明:在进入到当前的根文件系统之后,无法解析域名,所以也就不可能 通过域名的方式,访问到yum的安装源仓库repo.刚开始的时候专注于/etc/resolve.d 文件的修改,但是无效化非常明显,甚至一度将当前的根文件系统创建一个网络配置 文件,但是service network restart失败了. 解决方案: 说明: DNS是一种将域名解析为IP地址

chroot详解

我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密码或修复基于 Linux/Unix的受损坏的环境? 在 Linux和类 Unix 系统下每一个进程/命令的当前工作目录称之为进程/命令的根目录(译注:译者以为此处有误,实际上没有进行过chroot的进程,其根目录是系统的根目录,而不是其工作目录).你可以使用 chroot 命令改变一个命令的根目录,

chroot 命令实例讲解

我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密码或修复基于 Linux/Unix的受损坏的环境? 在 Linux和类 Unix 系统下每一个进程/命令的当前工作目录称之为进程/命令的根目录(译注:译者以为此处有误,实际上没有进行过chroot的进程,其根目录是系统的根目 录,而不是其工作目录).你可以使用 chroot 命令改变一个命令的根目录