首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>网络管理>网络安全>正文

使用mod_proxy改进LAMP 安全

http://www.oklinux.cn  2007-01-10  来源: 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>
      

 

[1] [2] 下一页  

共6页: 上一页 1 [2] [3] [4] [5] [6] 下一页

上一篇:使用Linux系统的Live CD进行安全审核   下一篇:MPPE加密VPN服务器详解


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·MPPE加密VPN服务器详解
·使用Linux系统的Live CD进行安全审核
·Linux系统安全之程序日志的使用概述
·增强Linux/Unix服务器系统安全性介绍
·Linux系统中用户帐户清洁与安全方法
·在breezy安装AntiVir的全攻略
·用Apache Proxy的指令改进LAMP安全性
·清除Linux系统上的蠕虫程序Ramen
·linux安全:Linux ACL 体验
·入侵监测系统的构建(chkrootkit )
·审计跟踪Linux的异常活动
·详解Linux安全管理的基本技巧三
·详解Linux安全管理的基本技巧二
·Linux系统利用SSH远程控制安全问题
·通过Linux系统伪装方法加固系统安全
·详解Linux安全管理的基本技巧一
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Linux主机开启后门的几种办法
·Linux服务器安全技术分析
·Linux系统在企业安全管理中的应用
·Linux少病毒主要原因是编写出来找不到
·简单设置让你的Linux系统更安全
·Linux安全之网上惊现傻瓜型病毒制作工
·改进Linux内部安全机制 提高了系统安全
·Linux防火墙生成工具介绍
·Linux服务器如何防止DoS攻击
·构建安全的Linux服务器
·Linux操作系统的安全命令
·Linux下nmap命令的使用
  阅读排行
·为Linux服务器部署高效防毒软件
·从Linux内核的漏洞角度考虑系统安全
·用Apache Proxy的指令改进LAMP安全性
·linux安全:Linux ACL 体验
·玩转Ubuntu Linux之加密文件系统篇
·操作系统安全防护技巧介绍之Linux篇
·通过Linux工具来全面保障无线网络安全
·使用SSL 保护VNC应用程序
·通过Linux系统伪装方法加固系统安全
·MPPE加密VPN服务器详解
·增强Linux/Unix服务器系统安全性介绍
·构筑Unix系统防火墙体系的多种解决方案
·在breezy安装AntiVir的全攻略
·Linux操作系统下的网络安全工具详细介
·在Linux下建立VPN服务器来做加密代理
网摘收藏: