chroot apache(中文翻译)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 原文来源:www.linux.com翻译:山崖  (如需转载,由你自己高兴是否保留此行。)2007年6月1日  chroot守护进程允许你运行一个程序,使得它感觉你给它的目录就是根(/)目录。
原文来源:www.linux.com
翻译:山崖  (如需转载,由你自己高兴是否保留此行。
2007年6月1日

  chroot守护进程允许你运行一个程序,使得它感觉你给它的目录就是根(/)目录。实际上就是把进程孤立与真正的"/"文件系统,锁定在一个你给它的文件系统中(chroot囚禁)

。在这一章中我们将讨论如何安装apache服务器在这样的一个环境中。   
  chroot囚禁安装apache并不会跟apache自身带来什么安全。当然,把apache及其子进程限制在一个特定的文件系统中对防止入侵者非常有利。但是,这也有其潜在的问题。

  所以在你决定是否需要chroot你的web服务器之前,你应该考虑下这样安装的利与弊。

优点:
如果apache被入侵者攻克,那么他只能访问到chroot中的文件。
具有潜在威胁的CGI脚本不能访问你chroot之外的文件系统。
你web目录中的内容在一特定的区域,很容易备份或是删除。

缺点:
  chroot安装跟传统的安装方法比较起来困难很多,特别是当你运行一些诸如:perl,php,mysql或python等外部软件的时候。

如果你的整个WEB目录在单一的文件系统中,那么进程仅仅是能运行.
(译注:我也不明白这句话什么意思,可能作者的意思是在性能上会有所下降.)

编译安装apache二进制文件

  在安装apache为chroot之前我们并没有什么特别的步骤。下面的安装步骤适用于预编译包(像RPM)的安装或是你自己编译安装。良好的开始有助于以后的调试工作。你仅需要确

定你的服务器使用的是最新的补丁包。正常安装apache,并且确定它跟你预想的一样正常运行着。
   最后,确定你以配置apache运行在它自己的用户ID和组ID之上。用下面的命令创建用户和组。

# groupadd apache
# useradd -c "Apache Server" -d /dev/null -g apache -s /bin/false apache

以上命令建立了一个叫apache的普通用户和一个apache用户组。默认情况下apache运行于nobody用户。可能有很多守护进程在使用nobody,如果该帐号被入侵者获得,那么他就得

到了运行于该UID下所有守护进程的访问权限。

  创建chroot目录树

chroot囚禁其实就是一个最小化的LINUX文件系统。我更喜欢单独给它分一个区,然后挂载为/chroot,然后在我的chroot分区中为apache建立一个名为httpd的目录。

# mkdir /chroot/httpd
# mkdir /chroot/httpd/dev
# mkdir /chroot/httpd/lib
# mkdir /chroot/httpd/etc
# mkdir -p /chroot/httpd/usr/sbin
# mkdir /chroot/httpd/usr/lib
# mkdir /chroot/httpd/usr/libexec
# mkdir -p /chroot/httpd/var/run
# mkdir -p /chroot/httpd/var/log/apache
# mkdir -p /chroot/httpd/home/httpd

现在为目录结构设置权限:

# chown -R root /chroot/httpd
# chmod -R 0755 /chroot/httpd
# chmod 750 /chroot/httpd/var/log/apache/

一但你创建了这些必需的目录后,你还应该再创建一个NULL设备.

# mknod  /chroot/httpd/dev/null c 1 3
# chown root.sys /chroot/httpd/dev/null (译注:原文如此,不清楚这里为什么不是chown 0.0)
# chmod 666 /chroot/httpd/dev/null
  你必需建立NULL设备和/chroot/httpd/var/log/httpd/,因为当你运行chroot,apache就会把/chroot/httpd目录当成"/".这句话的意思是,它将不能访问正常文件系统下

的/dev/null 或是/var/log.

copy必需的文件

  现在关闭apache,运行 killall httpd,然后你可以开始copy文件了.他们的目录可能不同,取决于当初你是如何安装apache的.首先,copy配置文件:

# cp -r /etc/apache /chroot/httpd/etc/

  接着,copy apache主目录和CGI脚本目录:

# cp -r /home/httpd/html /chroot/httpd/home/httpd/
# cp -r /home/httpd/cgi-bin /chroot/httpd/home/httpd/

  然后从/usr/sbin/下copy你的httpd文件(和apache脚本,如果使用他们)

# cp /usr/sbin/httpd /chroot/usr/sbin/
# cp /usr/sbin/apache* /chroot/usr/sbin/

  如果使用mod_ssl,你还需要copy /etc/ssl目录:

# cp -a /etc/ssl /chroot/httpd/etc/
  
  完成拷贝apache(和ssl,如果你需要),你还必需copy apache依赖运行的所有共享库,为了找出你需要copy的文件,执行:# ldd /chroot/httpd/usr/sbin/httpd.输出应该类似于:

        /lib/libsafe.so.2 => /lib/libsafe.so.2 (0x40017000)
        libm.so.6 => /lib/libm.so.6 (0x40037000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x40059000)
        libdb.so.2 => /lib/libdb.so.2 (0x40086000)
        libexpat.so.0 => /usr/lib/libexpat.so.0 (0x40096000)
        libdl.so.2 => /lib/libdl.so.2 (0x400b6000)
        libc.so.6 => /lib/libc.so.6 (0x400b9000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

首先应该弄清楚以上输出这些文件的相互依赖关系,然后copy它们到各自的目录.

# cp /lib/libsafe* /chroot/httpd/lib/
# cp /lib/libm* /chroot/httpd/lib/
# cp /lib/libcrypt* /chroot/httpd/lib/
# cp /lib/libdb* /chroot/httpd/lib/
# cp /usr/lib/libexpat* /chroot/httpd/usr/lib/
# cp /lib/libdl* /chroot/httpd/lib/
# cp /lib/libc* /chroot/httpd/lib/
# cp /lib/ld-* /chroot/httpd/lib/

你还要需要一些提供标准网络功能的库文件.
# cp /lib/libnss_compat* /chroot/httpd/lib/
# cp /lib/libnss_dns* /chroot/httpd/lib/
# cp /lib/libnss_files* /chroot/httpd/lib/
# cp /lib/libnsl* /chroot/httpd/lib/


/chroot/httpd/etc 配置文件

为了让apache工作起来,可能还要在/etc下配置几个文件.首先,编辑/etc/pass和/etc/group文件,这两个文件仅应该有你之前创建的用户和组.例如:

/etc/passwd:
apache:x:12347:12348:Apache Server:/dev/null:/bin/false

/etc/group:
apache:x:12347:

你还要再编辑几个网络配置文件:

# cp /etc/hosts /chroot/httpd/etc/
# cp /etc/host.conf /chroot/httpd/etc/
# cp /etc/resolv.conf /chroot/httpd/etc/
# cp /etc/nsswitch.conf /chroot/httpd/etc/

为了得到更多的安全,你还可以对这些文件加"i"标志位,当设置了"i"标志位后,只有root用户去掉标志位,文件才可修改.那么当入侵者想要修改这些文件,他们还必需付出更多的努



# chattr +i /chroot/httpd/etc/hosts
# chattr +i /chroot/httpd/etc/host.conf
# chattr +i /chroot/httpd/etc/resolv.conf
# chattr +i /chroot/httpd/etc/nsswitch.conf
# chattr +i /chroot/httpd/etc/passwd
# chattr +i /chroot/httpd/etc/group

为了让日志文件的时间正确,你还得检查/etc/localtime.localtime文件是否连接到/usr/share/zoneinfo文件.运行ls -l /etc/localtime找出是哪个文件.然后copy它

到/chroot/httpd/etc/localtime.

默认,syslogd守护进程仅监视/var/log日志文件,而chroot后的httpd守护进程会把日志写入/chroot/httpd/var/log.因此,你还需要告诉syslogd守护进程也监视这个目录.编辑你的

启动脚本/etc/rc.d/rc.syslog 或是 /etc/rc.d/init.d/syslog文件.

打开 /etc/rc.d/rc.syslog 文件

修改: daemon syslogd -m 0
为: daemon syslogd -m 0 -a /chroot/httpd/dev/log

修改:  echo -n " /usr/sbin/syslogd"
    /usr/sbin/syslogd
为:
    echo -n " /usr/sbin/syslogd"
    /usr/sbin/syslogd -m 0 -a /chroot/httpd/dev/log

(译注:这好像是slackware,如果你是其他的发行版,请自行参考管理员手册)

在创建日志文件后给它们加上"a"标志位,是一个不错的主意

# touch /chroot/httpd/var/log/apache/access_log
# touch /chroot/httpd/var/log/apache/error_log
# chmod 600 /chroot/httpd/var/log/apache/*
# chattr +a /chroot/httpd/var/log/apache/*

最后,修改httpd启动脚本让它运行chroot后的httpd.打开/etc/rc.d/rc.httpd或者/etc/rc.d/init.d/httpd文件,修改命令让httpd守护进程运行.
/usr/sbin/chroot  /chroot/httpd/  /usr/sbin/httpd.


测试服务器

关闭HTTPD守护进程,然后重启syslog: /etc/rc.d/rc.syslog restart(或 /etc/rc.d/init.d/syslog restart).
好了,现在可以启动以经chroot后的apache了.
/etc/rc.d/rc.httpd start (或 /etc/rc.d/init.d/httpd start).

如果没有发现错误,那么运行命令ps -aux |grep httpd 检查守护进程是否在运行.
如果你看到有输出,那么表示apache以经运行.记录下ps命令输出的进程号,然后运行
ls -l /proc/PROC_NUMBER/root/ 显示的是你的/chroot/httpd目录 而不是你服务器的"/"文件目录。
(译注:其实我认为运行ls -l /proc/PROC_NUMBER/ 的输出更直观一点.因为你直接就看到了诸如: root -> /chroot/httpd的输出)

一旦所有的工作都完成,你就可以删除你原来安装的apache了.

  总结:虽然chroot有助于创建一个更安全的环境,但它也并不是完美的.你仍需要保证你的 web服务器的补丁包是最新的并经常查看日志文件.当然,一旦系统出现未知的漏洞,营造web服务器的chroot环境更有助于你控制入侵者,保护你系统中的主文件系统.

---------------------------------------------------------------------------------------------------------------------------
译者注:就如原作者所说的那样,chroot只能在一定的基础上保证整个系统的安全,为了防范诸如SQL注入类的攻击,正确配置apache仍是极其重要的。除了文中介绍严格的目录、CGI脚本权限,健全的日志等之外,编译并合理配置mod_security模块,是一个不错的选择。相关的文章请网上搜索,因本人水平有限,本翻译文档仅供参考,不当之处还请大家斧正。
 
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
Web App开发 Java Apache
阿帕奇 Http 组件(Apache HttpComponents)- Apache 翻译过来好像都不认识了吧
Apache HttpComponents 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
1458 0
|
Linux Apache
Red Hat / CentOS: Chroot Apache 2 Web Server
http://www.cyberciti.biz/tips/chroot-apache-under-rhel-fedora-centos-linux.
759 0
|
3月前
|
存储 消息中间件 Java
Apache Flink 实践问题之原生TM UI日志问题如何解决
Apache Flink 实践问题之原生TM UI日志问题如何解决
45 1
|
28天前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
575 13
Apache Flink 2.0-preview released
|
1月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
63 3
|
2月前
|
SQL 消息中间件 关系型数据库
Apache Doris Flink Connector 24.0.0 版本正式发布
该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。
|
3月前
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
217 2
|
3月前
|
消息中间件 分布式计算 Hadoop
Apache Flink 实践问题之Flume与Hadoop之间的物理墙问题如何解决
Apache Flink 实践问题之Flume与Hadoop之间的物理墙问题如何解决
51 3

推荐镜像

更多