Linux隔离技术-CHROOT

关于隔离环境–CHROOT

chroot – change root, 主要是将程序运行环境切换到指定目录。什么是将运行环境切换到指定目录呢,就是切换过去之后,在应用程序内,根目录“/”的位置变成了你指定的目录了,这样一来,就要求你的目录下必须包括程序的所有依赖环境,比如程序调用的系统命令(及其依赖项),系统调用的动态链接库等。

建立CHROOT环境

检查需要在CHROOT下运行程序的依赖库

为了检测我们的程序调用了哪些动态链接库,我们可以使用ldd命令,例如:

ldd /bin/bash

该命令会运行某个/bin/bash文件,并追踪该文件加载的动态链接库,*.so文件。

v2-4811158f8a2d0b780646b5f08d28c563_720w.webp

P.S. ldd命令是一个脚本文件,经过查看,发现其本质是通过调用bash内置的eval命令,追踪其调用的动态链接库。上述命令实际上就等价于:

eval LD_TRACE_LOADED_OBJECTS=1 LD_VERBOSE=1 /bin/bash
v2-bb7adcea998cd0dd3a337bce246094d0_720w.webp

在系统上缺少ldd命令时,可以执行此命令,如果此命令查找的依赖项不全,还可以通过以下命令检查在内存中正常运行程序所加载的动态库

pmap $PID
v2-1cae61124917d63f8c6e73d0b0b59cb1_720w.webp

lsof -p $PID

v2-4b18eaae9391e870e3b73290ad771b2e_720w.webp

P.S. 以上分析都会使程序运行并加载到内存中,对于未知程序来说具有较高的风险性,针对未知程序来说,一般建议使用readelf, nm, objdump之类的反编译工具。不过通过这种方式获取到的依赖结果不是特别完整就是了。

我们将依赖文件拷贝到CHROOT的目录下

mkdir -p $DIR/lib64
cp -pfL /lib64/xxx.so.y $DIR/lib64/

构建部分所需的设备文件(一般来说不需要,但对于一些访问系统底层功能的应用可能会用到,比如常见的真随机数设备/dev/random)

ls -l /dev/{random,stdin,stdout,stderr,tty} #查看设备文件类型及主次设备号

按照同样的配置权限、类型、主次设备号构建

mknod -m 666 random c 1 8 

该命令创建random设备文件,模式为rw-rw-rw, 设备类型为c(CHAR),主设备号1,次设备号8,可通过ls -l /dev/random 查看

注:实测貌似/dev/stdin, stdout, stderr貌似不需要创建

二、以指定目录为根目录并快速创建CHROOT环境

不管是常见的包管理工具,还是系统自带的rpm工具,都能以指定目录为根目录安装软件包。并在指定目录下释放相关文件。

使用rpm工具

rpm --root=/opt/c-root -ivh xxxx.rpm

如果不检查依赖,则加上 –nodeps 参数

使用yum包管理

yum --installroot=/opt/c-root/ install package-name

这个就比较厉害了,会将软件包相关文件及其依赖项安装到特定目录,这里是/opt/c-root/,这样,通常情况下,直接就能以chroot方式运行了。

编译安装

./configure --prefix=/opt/c-root

默认情况下会将文件编译安装到/usr目录下

通过busybox快速获得一个虚拟环境

yum --installroot=/opt/c-root install busybox
cd /opt/c-root/sbin
ln -s busybox ln
ln -s busybox sh
ln -s busybox clear
....
chroot /opt/c-root sh
v2-cabe3a0ae7ba9f0b4d47d09df77458e6_720w.webp
v2-4b80c69000bdd4d1208eff0ea9a2f700_720w.webp

解析出程序依赖项后,只需要将相关文件封装进以当前运行的操作系统版本的基础docker镜像,然后写好启动命令即可。当然理论比较简单,实际操作起来就是另一回事了。

Share

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注