ChinaUnix.net 首页 | 博客 | Linux | 论坛 | 人才 | 培训 | 知识库 | 资料 | 读书 | 手册 | 精华 | 下载 | 沙龙 | 搜索
Linux首页 | Linux论坛 | 论坛精华 | 开源新闻 | 技术文章 | 专题专栏 | 新手指南 | 迁移方案 | 产品方案 | 开源项目 | 开源图书 | 软件下载 | 人才招聘 | Linux博客
  搜索

  产品与方案
·中科红旗全面打造现代化邮政体系
·红旗助力“网上审批服务” 推动电子政务
·红旗正版化开创呼和浩特网吧建设新起点
·红旗Linux助信息产业部邮件服务器“快跑”
·中标普华Linux 为电子政务信息化保驾护航
·中标普华Linux助力基金产业
·中标普华Office率先支持UOF标准
·中标普华邮件系统助力西藏政府信息化建设
·红旗Linux助力国库集中支付系统改革
·红旗助中信卫星 掀起GIS通信应用风暴
·红旗软件助力烟草总局 全面建设“数字烟草”
·红旗助力“信访阳光工程”打造畅通信访渠道
·红帽联合FIS发布下一代实时核心银行平台
·红旗助力金盾 打造全无忧出入境信息系统
·红旗Linux全力打造中国邮政总局名址信息库
·爱尔兰证交所从Unix迁移到红帽企业Linux
·一流的意大利银行选择使用红帽企业Linux
·PLUS Finanzservice选择使用红帽企业Linux
·红帽助力TransACT Communications 公司
·法国零售业巨头Lapeyre采用Redhat Linux
·旅游预订网站选择使用红帽企业Linux
·马哈拉施特拉邦政府的红帽解决之道
·美国联邦政府案例
·红帽为慕尼黑展览会提供现代化集群系统
·Yuba郡用开源软件和红帽产品提高了效率
·红帽企业Linux助印度理工建立高性能计算中心
·采用红帽Linux 将系统维护时间缩短了65%
·从UNIX迁移到Linux使Peñoles公司获益非浅
·Hikal公司用红帽企业Linux开展任务关键的ERP项目
·KDE3.5.4新版本发布
·芝加哥商业交易所从Unix向Linux迁移
·南方基金管理有限公司成功案例 Red Hat Linux
·广东北电通讯设备有限公司成功案例
·挪威国家石油公司从UNIX迁移到红帽Linux,成本减半
·中央电视台CCTV动画部案例 Red Hat Linux

  图书

鸟哥的Linux私房菜基础学..


Linux程序设计.第3版


Linux设备驱动开发详解


  下载
·Endian Firewall
·linux kernel(Linux 内核)
·CentOS
·Fedora Core 6
·Scientific Linux
·Slackware 11.0
·Gentoo Linux
·ubuntu-6.10-i386服务器版本
·ubuntu-6.10-amd64服务器版
·ubuntu-6.10-i386桌面版
·ubuntu-6.10-amd64桌面版
·Engarde Linux
您的位置: Linux时代 > 技术文档 > 系统安全 >

使用mod_proxy改进LAMP 安全

日期:2007-01-08 作者:Nick Maynard 来自:IBM DW中国


在本文中,Nick Maynard 描述了一种使用 Apache 的 mod_proxy 模块改进 LAMP 设置的安全性的方法。本文专门针对 Linux;但是,也可以将一些原理应用于其他操作系统。

Apache Software Foundation 的 HTTP 服务器项目(通常称为 Apache)是当今互联网上占据优势的 Web 服务器,它占据了 60% 以上的市场份额。Apache 服务器是日渐流行的 LAMP 软件配置的一部分。LAMP 是一套免费软件程序,是在 Linux®、Apache、MySQL 和 PHP 等开放源码技术之上构建的 Web 平台。在本文中,您将学习一种使用 mod_proxy 模块和多个后端服务器来改进 LAMP 安全性的方法。我将讨论这种方法的优点和缺点,并提供一个配置示例。

PHP 和 Apache:安全性难题

LAMP 管理员面对的一个挑战是,提供完整 PHP 系统的所有特性,同时确保为系统的所有用户提供一个安全的环境。使用 PHP 的安全模式是实现这一目标的一种技术,但是它也过度地限制了用户,而且启用了这个设施之后,一些 PHP 应用程序就不能发挥作用。

PHP 安全问题的根源在于大多数 Apache 服务器的配置方式。因为大多数 Apache 配置运行在特殊的 www-data 用户 ID 下,对 Web 站点进行主机托管的所有用户在默认情况下必须确保这个用户可以读取他们的文件。因此,系统上的所有其他用户都可能访问一个用户的所有 Web 可访问文件;所以系统上原本与您无关的安全漏洞会成为攻击您的 Web 站点的突破口。如果文件或目录必须设置为 www-data 用户可写的,那么这种情况会更加严重。

通过使用 CGI 程序,比如用 Perl 和 Python 等流行语言编写的程序,可以在使用 suEXEC 机制时消除这个问题的部分影响。简单地说,suEXEC 使用一个特殊的中间程序以程序所有者的用户 ID 执行 CGI 程序。(更多细节请参见 参考资料 中文章的链接。)这是一种非常有效的机制,已经使用了许多年了。

但是,在使用 mod_php 模块主机托管时,PHP 页面作为 Apache 主进程的一部分执行。因此,它们继承 Apache 进程的所有凭证,而且它们在文件系统上执行的任何工作必须作为 www-data 用户执行。

在多个用户 ID 下运行 Apache

对于上面描述的问题,明显的解决方案是要求对一个用户域的所有请求都来自一个只拥有此用户的凭证的 Apache 实例。可以将 Apache 配置为在启动时获取任何用户的凭证。对于给每个用户分配一个单独的互联网可见 IP 地址/端口组合的简单设置,这种方法可以解决问题。

对于更复杂的设置(在其中 IP 地址很宝贵),这种方法是无效的。当单一 Apache 实例可以控制一个特定的 IP 地址/端口组合时,只能使用虚拟主机,这是 Apache 系统中广泛使用的一种技术。这就排除了让属于多个用户的多个域使用同一个 IP 地址/端口组合的可能性。

Apache 2.0 引入了多处理模块(multiprocessing module,MPM) 的概念。在基本 Apache 2.0 包提供的 MPM 中有一个实验性的模块 perchild,它可以将一个分布器线程分配给 IP 地址/端口组合,并将请求传递给在单独用户的凭证下运行的子线程,从而实现多个用户 ID 下的虚拟主机。遗憾的是,perchild 仍然是实验性的,它不一定能够发挥作用,而且在 Apache 2.2 发布时从正式 Apache 发行包中删除了。在此之前,由于认识到仍然需要一个稳定的能够发挥作用的与 perchild 相似的 MPM,Apache 社区开始研发许多 MPM 来弥补这一欠缺。MetuxMPM 以及面向过程的 peruser 正在朝着这个方向努力。(关于 MetuxMPM 和 peruser MPM 的更多信息,参见 参考资料)。

一个解决方案:mod_proxy

尽管还没有正式的 Apache MPM 能够直接提供多个用户 ID 下的虚拟主机,但是仍然可以通过某些配置和管理在 Apache 系统中实现这种行为。这种方法的核心概念是使用 mod_proxy 模块,这个模块(加上其他功能)使 Apache 能够将页面请求转发给其他服务器,并将响应传递回原来发出请求的客户机。


清单 1. 基本请求转发的反向代理配置示例
ProxyRequests Off

ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar 

清单 1 中的代码是一个简单的示例,它将对一个主机的 /foo 层次结构下任何页面的请求转发到 http://foo.example.com/bar 的对应页面。例如,对 /foo/index.htm 页面的请求会转发到 http://foo.example.com/bar/index.htm。可以使用这一原理解决问题。

示例场景

我们来考虑一个场景:Apache 管理员必须为两个单独的客户建立两个域。一个客户是在线创业企业,很关注在线安全性。另一个是个人客户,他在站点安全性方面比较宽松,可能将不安全的代码上载到这个站点。因此,Apache 管理员必须采取措施将这两个站点隔离开。

因此,管理员有两个域:www.startup.tld,它属于在线创业企业(用户 ID startup);以及 www.reckless.tld,它属于个人(用户 ID nimrod)。为了解决这个问题,管理员决定使用 mod_proxy 解决方案。管理员给每个用户一个单独的 Apache 实例,这个实例运行在用户自己的用户 ID 下,使用私有的 IP 地址/端口组合,并使用 mod_proxy 解决方案通过一个 facade 服务器提供对这两个用户的域的访问,这个服务器作为 www-data 运行,使用一个公共的 IP 地址/端口组合。图 1 说明了整个场景。


图 1. 场景示例
场景示例

推荐的 Apache 版本

对于示例应用程序配置中的每个元素,Apache 管理员应该使用 表 1 中列出的 Apache 版本。


表 1. 示例应用程序中使用的 Apache 版本
元素 Apache 版本 原因
facade 服务器 Apache 2,运行 worker 或 event MPM Apache 2 对 mod_proxy 模块做了重要的改进。worker 和 event MPM 是线程化的,有助于减少 facade 服务器的内存开销。
后端服务器 Apache 1.3,或运行 prefork MPM 的 Apache 2 Apache 管理员必须意识到 PHP 模块不应该运行在线程化环境中。这两个解决方案为 PHP 模块提供了基于进程的环境。

后端 Apache 实例的配置

清单 2 和 清单 3 中的代码片段说明了与标准 Apache 配置的基本差异。应该根据需要将它们添加到适当的配置中,比如这里忽略的 PHP 功能配置。


清单 2. 在线创业企业的 Apache 配置
# Stuff every Apache configuration needs
ServerType standalone
LockFile /var/lock/apache/accept.startup.lock
PidFile /var/run/apache.startup.pid

ServerName necessaryevil.startup.tld
DocumentRoot "/home/startup/web"

# Essential modules
LoadModule access_module /usr/lib/apache/1.3/mod_access.so

# Which user to run this Apache configuration as
User startup
Group startup

# This must be off else the host isn't passed correctly
UseCanonicalName Off

# The IP/port combination to listen on
Listen 127.0.0.2:10000

# Using name-based virtual hosting allows you to host multiple sites per IP/port combo
NameVirtualHost 127.0.0.2:10000

<VirtualHost 127.0.0.2:10000>
        ServerName www.startup.tld

        # You can add aliases so long as the facade server is aware of them!
        ServerAlias startup.tld

        DocumentRoot "/home/startup/web/www.startup.tld"

        <Directory /home/startup/web/www.startup.tld/>
            Options Indexes FollowSymLinks MultiViews ExecCGI Includes
            AllowOverride All
            Order allow,deny
            Allow from all
        </Directory>

</VirtualHost>


清单 3. 个人客户的 Apache 配置
# Stuff every Apache configuration needs
ServerType standalone
LockFile /var/lock/apache/accept.nimrod.lock
PidFile /var/run/apache.nimrod.pid

ServerName necessaryevil.nimrod.tld
DocumentRoot "/home/nimrod/web"

# Essential modules
LoadModule access_module /usr/lib/apache/1.3/mod_access.so

# Which user to run this Apache configuration as
User nimrod
Group nimrod

# This must be off else the host isn't passed correctly
UseCanonicalName Off

# The IP/port combination to listen on
Listen 127.0.0.2:10001

# Using name-based virtual hosting allows you to host multiple sites per IP/port combo
NameVirtualHost 127.0.0.2:10001

<VirtualHost 127.0.0.2:10001>
        ServerName www.reckless.tld

        # You can add aliases so long as the facade server is aware of them!
        ServerAlias reckless.tld

        DocumentRoot "/home/nimrod/web/www.reckless.tld"

        <Directory /home/nimrod/web/www.reckless.tld/>
            Options Indexes FollowSymLinks MultiViews ExecCGI Includes
            AllowOverride All
            Order allow,deny
            Allow from all
        </Directory>

</VirtualHost>

清单 4 说明了门面 Apache 实例的配置。


清单 4. 门面 Apache 实例的 Apache 配置
# Stuff every Apache configuration needs
LockFile /var/lock/apache/accept.www-data.lock
PidFile /var/run/apache.www-data.pid

ServerName necessaryevil.facade.server
DocumentRoot "/home/www-data"

# Essential modules
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so

# Which user to run this Apache configuration as
User www-data
Group www-data

# These must be set else the host isn't passed correctly
UseCanonicalName Off
ProxyVia On
ProxyRequests Off
# This must also be set, though it's only an option in Apache2
ProxyPreserveHost On    

# The IP/port combination to listen on
Listen 9.20.1.1:80

# Using name-based virtual hosting allows you to host multiple sites per IP/port combo
NameVirtualHost 9.20.1.1:80

# Configuration to forward requests for startup.tld
<VirtualHost 9.20.1.1:80>
        ServerName www.startup.tld
        ServerAlias startup.tld

        ProxyPass / http://127.0.0.2:10000/
        ProxyPassReverse / http://127.0.0.2:10000/
        ProxyPassReverse / http://www.startup.tld:10000/
        ProxyPassReverse / http://startup.tld:10000/
</VirtualHost>

# Configuration to forward requests for reckless.tld
<VirtualHost 9.20.1.1:80>
        ServerName www.reckless.tld
        ServerAlias reckless.tld

        ProxyPass / http://127.0.0.2:10001/
        ProxyPassReverse / http://127.0.0.2:10001/
        ProxyPassReverse / http://www.reckless.tld:10001/
        ProxyPassReverse / http://reckless.tld:10001/
</VirtualHost>

一定要注意这里的 ProxyPreserveHost 指令。这个指令是 Apache 2 提供的,它解决了将正确的 HTTP 头转发给后端服务器的一些问题。因此,强烈建议使用 Apache 2 实例作为 facade 服务器。

运行示例配置

根用户应该运行每个配置。Apache 将取得配置文件中指定的特权,并将其用于所有与主机相关的进程。清单 5 说明运行示例的方法。


清单 5. 启动示例服务器
				/usr/sbin/apache -f /etc/apache/startup.tld.conf
/usr/sbin/apache -f /etc/apache/nimrod.tld.conf
/usr/sbin/apache2 -f /etc/apache2/facade.tld.conf

mod_proxy 方法的限制

一定要注意,本文中描述的方法不适用于需要 SSL 连接的域。这是因为 SSL 协议不允许域的虚拟主机。由于这个限制,任何 SSL 主机必须以适当的方式执行,让每个 SSL 域使用它自己的 IP/端口组合。这个限制对所有 Apache 配置都存在,使用这个解决方案的 Apache 也不例外。仍然可以在它们的所有者的用户 ID 下运行 SSL 域。

结束语

在本文中,使用 Apache 的 mod_proxy 模块构建了一个环境,在这个环境中有一个门面服务器将请求转发给两个后端服务器。可以对一系列后端服务器采用同样的方法。这种方法使系统管理员能够降低潜在的安全风险,同时保持 PHP 等工具提供的灵活性。

原文链接:http://www.ibm.com/developerworks/cn/web/wa-lampsec/index.html?ca=drs-

本文被浏览



 相关新闻

如何检测和重启Apache和Lighttpd2006-11-27 11:38:22
监视并记录Apache网站服务器的运行2006-11-08 15:14:05
Apache 门户项目组介绍2006-11-08 14:05:32
Apache Server 负载能力测试2006-11-07 15:35:30
WEB服务器市场Apache占六成 IIS居第二2006-11-07 09:31:17
apache22+php5+tomcat5快速安装指南2006-10-24 11:16:15
热点关注:Apache重拳出击开源项目2006-10-17 10:57:57
微软IIS Web服务器超越Apache2006-10-13 15:21:01


 相关评论
关于我们 | 联系方式 | 广告合作 | 诚聘英才 | 网站地图 | 免费注册

Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们

京ICP证041476号