创建chroot环境

来源:互联网 发布:影视后期剪辑软件界面 编辑:程序博客网 时间:2024/05/21 19:23

文章来自

http://www.ringkee.com/note/opensource/debian/index.html

创建chroot环境

chroot是changeroot的缩写,顾名思义,就是改变根目录的意思。它可以让系统管理员在一个权限受到限制的根目录中执行一个shell或运行进程。如果在chroot环境下以根用户权限运行进程,则有很多种方法可以逃离chroot环境,对系统造成危害。所以运行在chroot环境下的进程一般都运行在非根用户权限下,一旦chroot环境被黑客攻破,也不会影响系统其它服务的正常运行。chroot环境是我们强化服务安全的一个有力技术,系统管理员一定要掌握好它。

创建chroot环境的步骤如下:

  • 创建chroot环境的基础目录

    debian:~# mkdir chroot
    debian:~# mkdir chroot/bin
    debian:~# mkdir chroot/lib
    debian:~# mkdir chroot/etc
  • chroot环境相当于我们系统的一个简化版,所以我们要在chroot的基础目录下创建一些相关的子目录,并拷贝一些必须的文件进来。这些文件包括我们在chroot环境下运行shell环境或进程所需的所有二进程程序文件、库文件和配置文件。strace程序可以跟踪运行程序所需的库文件、系统调用和配置文件。如:

    debian:~/c# strace ls
    execve("/bin/ls", ["ls"], [/* 35 vars */]) = 0
    uname({sys="Linux", node="debian.tigerhead", ...}) = 0
    brk(0) = 0x805c000
    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
    mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc5000
    access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
    mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc4000
    open("/etc/ld.so.cache", O_RDONLY) = 3
    fstat64(3, {st_mode=S_IFREG|0644, st_size=67031, ...}) = 0
    mmap2(NULL, 67031, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fb3000
    close(3) = 0
    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
    open("/lib/tls/librt.so.1", O_RDONLY) = 3
    read(3, "/177ELF/1/1/1/0/0/0/0/0/0/0/0/0/3/0/3/0/1/0/0/0`/35/0/000"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0644, st_size=26516, ...}) = 0
    mmap2(NULL, 29264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7fab000
    mmap2(0xb7fb1000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5) = 0xb7fb1000
    close(3) = 0
    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
    open("/lib/libacl.so.1", O_RDONLY) = 3
    read(3, "/177ELF/1/1/1/0/0/0/0/0/0/0/0/0/3/0/3/0/1/0/0/0/320/23"..., 512) = 512

    .....

    以open开头的就是ls程序需打开的文件,如:open("/lib/libacl.so.1", O_RDONLY) =3,说明ls程序运行时需要libacl.so.1这个动态链接库。我们也可使用ldd命令来跟踪动态链接库文件,ldd命令输出的信息比较简洁,但它不会列出运行程序所需的配置文件和系统调用,所以这两个程序我们可结合起来使用。下面是使用ldd命令输出的信息:

    debian:~# ldd /bin/ls
    linux-gate.so.1 => (0xffffe000)
    librt.so.1 => /lib/tls/librt.so.1 (0xb7f1e000)
    libacl.so.1 => /lib/libacl.so.1 (0xb7f18000)
    libselinux.so.1 => /lib/libselinux.so.1 (0xb7f03000)
    libc.so.6 => /lib/tls/libc.so.6 (0xb7dd1000)
    libpthread.so.0 => /lib/tls/libpthread.so.0 (0xb7dbf000)
    /lib/ld-linux.so.2 (0xb7f39000)
    libattr.so.1 => /lib/libattr.so.1 (0xb7dba000)
    libdl.so.2 => /lib/tls/libdl.so.2 (0xb7db6000)
    libsepol.so.1 => /lib/libsepol.so.1 (0xb7d75000)

    如果我们需要在chroot环境下运行ls命令,我们首先要把/bin/ls命令拷贝到chroot/bin目录下。

    debian:~# cp /bin/ls chroot/bin/.

    如果现在在chroot环境下运行ls命令,则会提示出错,如:

    debian:~# chroot chroot /bin/ls
    chroot: cannot run command `/bin/ls': No such file or directory

    这里的出错提示说不能运行ls命令是因为没有文件或路径,其实不然,出错的原因应该是ls命令找不到所需的动态链接库。所以下一步我们要把运行ls程序所需的库文件拷贝到chroot/lib目录下,这些库文件在上面用ldd命令已列出。在拷贝这些库文件之前,我们要把/lib/ld-linux.so.2库文件拷贝到chroot/lib目录,因为所有的二进制程序都需要使用该文件来确定它的库文件的依赖关系,也就是说,ld-linux.so.2动态链接库是所有程序都需要用到的动态链接库。在用cp命令拷贝库文件时记住要用-p参数,这样才能把库文件的内容和所有属性原封不动地拷贝过来。我们先拷贝ld-linux.so.2这个库:

    debian:~# cp -p /lib/ld-linux.so.2 chroot/lib/.

    现在我们再试试运行chroot环境下的ls命令。

    debian:~# chroot chroot /bin/ls
    /bin/ls: error while loading shared libraries: librt.so.1: cannot open shared object file: No such file or directory

    有了ld-linux.so.2库后,运行chroot环境下的ls命令就会提示缺少的动态链接库的名称。这个动态链接库在ldd命令中也是有列出的。当我们把ls命令所需的链接库全部拷贝完成后就可以在chroot环境下正常运行ls命令了。

    debian:~# chroot chroot /bin/ls
    bin lib

    这里列出了chroot环境根目录下的文件和目录。按相同的步骤我们就可以创建一个完整的chroot环境来运行我们的服务器,如Apache、DNS等。在创建chroot环境中最大的挑战是确定二进程文件的动态链接库的依赖关系。如果需要为chroot环境提供一个交互式的shell,则我们可利用busybox这个软件包。它为我们提供一个完整的,静态编译的工具集,不需我们手工复制大量的shell、系统工具和动态链接库。有关busybox软件包的安装和使用请参考本笔记的相关内容。

    在chroot中安装服务时,应该采用在chroot中从源码开始重新编译安装的方式,而不是采用从主系统中把服务程序目录直接复制过去的方式。因为从源码重新编译安装能确保chroot中的服务是最新和最可靠的。

  • 有些应用程序需要用到设备文件与CD-ROM、USB和远程访问打交道。设备文件不能使用cp命令复制,要用MAKEDEV命令来创建。因为在chroot环境下创建设备文件系统不会对系统安全造成不良影响,所以我们可在chroot环境下用MAKEDEV命令创建一套标准的设备文件。

    debian:~# cd chroot
    debian:~# mkdir dev
    debian:~# cd dev
    debian:~/chroot/dev# MAKEDEV generic

    "generic"参数使MAKEDEV脚本创建一组默认的设备文件。

  • 在chroot中我们也需要设置日志系统,记录chroot中各种活动,为系统维护和安全审计提供依据。在chroot中使用日志系统,有两种主要的方式,一种是在chroot环境下直接创建日志系统,在chroot环境的/var/log目录下创建如下的目录结构:

    chroot/var/log
    lastlog
    messages
    secure
    wtmp
    /run

    日志信息记录在chroot环境下,再通过主系统中有权限访问chroot/var/log目录和文件的用户定期采集日志信息。另一种方式是把日志信息直接发送给syslog服务器。如果采用这种方式,则需在chroot环境下创建一个/etc/syslog.conf文件。

使用chroot环境应注意的问题:

  • 要用strace或ldd命令仔细检查程序的依赖关系,不要遗漏。特别注意/etc/目录下的几个常用的文件,如:resolv.conf和nsswitch.conf。

  • 默认chroot环境的日志信息是写在chroot环境下的/var/log目录,而不是主系统。

  • 注意检查chroot环境下各种文件的权限是否正确,尽量使用cp -p 或 tar -p选项来复制和解包文件。

  • 注意chroot环境的磁盘空间,要留有足够的空间来运行程序。

  • 不要把chroot系统挂装在NFS文件系统上,因为在默认情况下,NFS会自动去除文件上的根用户权限并把它们映射为"nobody"用户。

  • chroot环境配置好后,要及时做好备份工作。备份时要记住使用-p选项,如:

    debian:!# tar czvfp chroot.tar.gz chroot
  • 要及时为chroot中的各种软件打补丁。

原创粉丝点击