在 Linux 中,Chroot 是一种操作,用于更改正在运行的进程及其子进程的明显根目录,例如:/。
在 Chroot 中运行的进程无法访问该环境目录树之外的文件和命令。
这个修改后的环境称为 Chroot Jail 。
通过 chroot Apache Web 服务器,我们实际上并没有提高安全性,而是限制了 httpd 进程对文件和命令的访问,并减少了当 Apache Web 服务器受到威胁时可能产生的影响。
还有潜在危险的 CGI 脚本只能访问环境根目录。
与传统安装相比,chroot 环境的设置相对困难,尤其是当我们运行其他软件(如 MySQL、PHP、Python 等)时。
在这篇文章中,我们将为 RHEL/CentOS 7 中的 Apache Web Server 设置一个 chroot jail,并创建 systemd 单元来自动启动 httpd 服务。
对 Apache Web 服务器进行chroot
创建用于设置 chroot jail 的目录。
[root@webserver-01 ~]# mkdir -p /chroot/httpd/
现在,使用 yum 安装 Apache Web 服务器,但在一个非默认目录中。
[root@webserver-01 ~]# yum install -y httpd --installroot=/chroot/httpd
上面的命令将在 /chroot/httpd 中安装 Apache Web 服务器及其依赖项。
我们可能会注意到,它安装了许多已安装在默认根目录/上的软件包。
为了 chroot jail 设置,这些包被重新安装在 /chroot/httpd 中。
为 chroot 环境创建一些必需的设备。
[root@webserver-01 ~]# cd /chroot/httpd/dev [root@webserver-01 dev]# rm -f null [root@webserver-01 dev]# mknod /chroot/httpd/dev/null c 1 3 [root@webserver-01 dev]# mknod /chroot/httpd/dev/random c 1 8 [root@webserver-01 dev]# mknod /chroot/httpd/dev/urandom c 1 9 [root@webserver-01 dev]# ls -al total 0 drwxr-xr-x. 2 root root 47 Sep 2 19:26 . dr-xr-xr-x. 17 root root 224 Sep 2 19:17 .. crw-r--r--. 1 root root 1, 3 Sep 2 19:26 null crw-r--r--. 1 root root 1, 8 Sep 2 19:26 random crw-r--r--. 1 root root 1, 9 Sep 2 19:26 urandom [root@webserver-01 dev]#
为 Apache Web 服务器添加默认主页。
[root@webserver-01 dev]# cd /chroot/httpd/var/www/html/ [root@webserver-01 html]# cat >> index.html << EOF > <html> > <head> > <body> > <h1>Apache Homepage from Chroot Jail.</h1> > </body> > </html> > EOF [root@webserver-01 html]# Allow httpd service to communicate through Firewall. [root@webserver-01 html]# firewall-cmd --permanent --add-service=http success [root@webserver-01 html]# firewall-cmd --reload success
配置 systemd 单元以自动启动 httpd 服务。
首先将所需的配置文件从 chroot jail 复制到宿主环境。
[root@webserver-01 html]# cp /chroot/httpd/etc/sysconfig/httpd /etc/sysconfig/ [root@webserver-01 html]# cp /chroot/httpd/usr/lib/systemd/system/httpd.service /usr/lib/systemd/system/
现在编辑 httpd.service 单元以在 chrooted 环境中启动 Apache。
[root@webserver-01 html]# vi /usr/lib/systemd/system/httpd.service
搜索并更新以下三行。
Type=simple ExecStart=/sbin/chroot /chroot/httpd /usr/sbin/httpd $OPTIONS -DFOREGROUND ExecReload=/sbin/chroot /chroot/httpd /usr/sbin/httpd $OPTIONS -k graceful
启动并启用 httpd 服务。
[root@webserver-01 html]# systemctl daemon-reload [root@webserver-01 html]# systemctl start httpd ; systemctl enable httpd Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
检查根目录以运行 httpd 服务。
首先我们获取httpd进程的PID,然后检查它在proc文件夹中的根目录。
[root@webserver-01 html]# systemctl status httpd [root@webserver-01 html]# ls /proc/10620/root -al lrwxrwxrwx. 1 root root 0 Sep 2 20:20 /proc/10620/root -> /chroot/httpd [root@webserver-01 html]#
使用浏览器打开 http://webserver-01.onitroad.com/ 以验证 httpd 服务。