Linux nginx:Chroot( Jail)设置

时间:2020-01-09 10:40:39  来源:igfitidea点击:

如何在chroot(jail)中运行Nginx Web服务器,以便通过将Web服务器隔离到文件系统的一小部分来最大程度地减少潜在入侵所造成的损害?
您可以在nginx中使用传统的chroot类型的设置。

我们的设置环境:

  • Jail目录:/nginx(D =/nginx)
  • 测试环境:64位Linux系统(RHEL/CentOS/Fedora等)
  • Nginx角色:SSL和HTTP反向代理
  • Nginx 64位库路径:/lib64和/usr/lib64(对于32位系统,请使用/lib和/usr/lib)

步骤1:设置Chroot目录

首先,您需要定义一个chroot目录。
执行以下命令:

# D=/nginx
# mkdir -p $D

步骤2:创建隔离的环境

执行以下命令:

# mkdir -p $D/etc
# mkdir -p $D/dev
# mkdir -p $D/var
# mkdir -p $D/usr
# mkdir -p $D/usr/local/nginx
# mkdir -p $D/tmp
# chmod 1777 $D/tmp
# mkdir -p $D/var/tmp
# chmod 1777 $D/var/tmp
# mkdir -p $D/lib64

步骤3:在$D/dev中创建所需的设备

您需要创建以下三个设备条目,以便nginx可以在 Jail中正常工作:

# ls -l /dev/{null,random,urandom}

输出示例:

crw-rw-rw- 1 root root 1, 3 Apr  5 11:03 /dev/null
crw-rw-rw- 1 root root 1, 8 Apr  5 11:03 /dev/random
cr--r--r-- 1 root root 1, 9 Apr  5 11:03 /dev/urandom

您需要使用mknod命令制作块或字符特殊文件,执行:

# /bin/mknod -m 0666 $D/dev/null c 1 3
# /bin/mknod -m 0666 $D/dev/random c 1 8
# /bin/mknod -m 0444 $D/dev/urandom c 1 9

步骤4:复制目录中的所有Nginx文件

您需要将/usr/local/nginx /复制到$D/usr/local/nginx,执行:

# /bin/cp -farv /usr/local/nginx/* $D/usr/local/nginx

步骤5:将所需的库复制到 Jail

$D/usr/local/nginx/sbin/nginx取决于各种库,您需要将它们复制到$D/lib64和$D/usr/lib64。
要显示共享库的依赖性,请执行:

# ldd /usr/local/nginx/sbin/nginx

输出示例:

libpcre.so.0 -  /lib64/libpcre.so.0 (0x000000316b800000)
	libssl.so.6 -  /lib64/libssl.so.6 (0x0000003170400000)
	libcrypto.so.6 -  /lib64/libcrypto.so.6 (0x000000316d400000)
	libdl.so.2 -  /lib64/libdl.so.2 (0x000000316b000000)
	libz.so.1 -  /usr/lib64/libz.so.1 (0x000000316c400000)
	libc.so.6 -  /lib64/libc.so.6 (0x000000316ac00000)
	libgssapi_krb5.so.2 -  /usr/lib64/libgssapi_krb5.so.2 (0x000000316e400000)
	libkrb5.so.3 -  /usr/lib64/libkrb5.so.3 (0x0000003170000000)
	libcom_err.so.2 -  /lib64/libcom_err.so.2 (0x000000316ec00000)
	libk5crypto.so.3 -  /usr/lib64/libk5crypto.so.3 (0x000000316f800000)
	/lib64/ld-linux-x86-64.so.2 (0x000000316a800000)
	libkrb5support.so.0 -  /usr/lib64/libkrb5support.so.0 (0x000000316fc00000)
	libkeyutils.so.1 -  /lib64/libkeyutils.so.1 (0x000000316f000000)
	libresolv.so.2 -  /lib64/libresolv.so.2 (0x000000316d800000)
	libselinux.so.1 -  /lib64/libselinux.so.1 (0x000000316c000000)
	libsepol.so.1 -  /lib64/libsepol.so.1 (0x000000316bc00000)

您需要使用cp命令将上述所有文件复制到$D,如下所示:

# cp /lib64/libsepol.so.1 $D/lib64

要使此过程自动化,请使用我们的脚本n2chroot:

# cd /tmp
# wget http://bash.theitroad.local/dl/527.sh.zip
# unzip 527.sh.zip
# mv 527.sh /usr/bin/n2chroot
# chmod +x /usr/bin/n2chroot

编辑脚本并设置BASE目录:

# vi /usr/bin/n2chroot

最后,如下运行:

# n2chroot /usr/local/nginx/sbin/nginx
# /bin/cp -fv /lib64/* $D/lib64

步骤6:将/etc复制到 Jail

最后,将/etc复制到$D,执行:

# cp -fv /etc/{group,prelink.cache,services,adjtime,shells,gshadow,shadow,hosts.deny,localtime,nsswitch.conf,nscd.conf,prelink.conf,protocols,hosts,passwd,ld.so.cache,ld.so.conf,resolv.conf,host.conf} $D/etc

还有一些目录:

# cp -avr /etc/{ld.so.conf.d,prelink.conf.d} $D/etc

如何启动Chrooted nginx?

首先,杀死现有的nginx(如果正在运行):

# killall -9 nginx

要启动chroot的nginx,请执行:

# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx -t
# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx

确保nginx在系统重启时启动:

# echo '/usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx' >> /etc/rc.local

如何重新加载Chrooted nginx?

输入以下命令

# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx -s reload

如何编辑Chrooted Nginx配置文件?

执行以下命令:

# cd /nginx/usr/local/nginx/conf/
# vi nginx.conf

保存并关闭文件。
测试并重新加载:

# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx -t
# /usr/sbin/chroot /nginx /usr/local/nginx/sbin/nginx -s reload