- 浏览: 19951 次
- 来自: ...
最新评论
mod_proxy.so
mod_proxy_connect.so
mod_proxy_ftp.so
其中mod_proxy.so是开启后面三个功能的基本模块,如果需要开通proxy功能,则mod_proxy.so必须加入到apache 的运行空间中。
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
CONNECT
方法
的支持,主要用于处理
通过代理服务器的隧道 SSL 请求。
Order allow,deny
Allow from all
Deny from 127.0.0.1
</Proxy>
ProxyBlock的作用是设置对所有使用者都起作用,如
在本文中,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 版本。
后端 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 实例的 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>
|
/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
|
在本文中,使用 Apache 的 mod_proxy 模块构建了一个环境,在这个环境中有一个门面服务器将请求转发给两个后端服务器。可以对一系列后端服务器采用同样的方法。这种方法使系统管理员能够降低潜在的安全风险,同时保持 PHP 等工具提供的灵活性 。
发表评论
-
apache+tomcat配置以及url转发总结
2009-12-17 14:47 1935http://blog.csdn.net/jacklondon ... -
Apache HTTP Server 与 Tomcat 的三种连接方式介绍
2009-12-17 11:53 817整合 Apache Http Server 和 Tomcat ... -
Eclipse常用插件(持续更新中)更新地址
2009-11-20 15:34 841svn插件:http://subclipse.tigris.o ... -
ativemq
2008-01-25 13:16 1041最近一直在看关于mq的一些资料,从openjms到active ...
相关推荐
- `mod_proxy`:Apache的代理模块。 #### 三、工作原理与应用场景 **工作原理:** 当客户端向本地服务器发出请求时,Apache服务器通过`ProxyPass`指令将请求重写并转发到远程服务器上。远程服务器处理请求后,再将...
只需在`ProxyPass`和`ProxyPassReverse`指令中添加多个后端Tomcat服务器,Apache会根据设定的策略(如轮询、最少连接等)将请求分发给不同的Tomcat实例。 总结来说,Apache与Tomcat结合使用`mod_proxy_ajp`能实现...
Apache的ProxyPass和ProxyPassReverse指令配合使用时,可以根据后端服务器的健康状态动态调整转发策略。通过mod_proxy_health_check,Apache可以定期检查后端服务器的运行状态,确保转发的可靠性。 综上所述,...
这通常通过使用Apache的模块mod_proxy来完成。在Apache的配置文件(如httpd.conf)中,你需要启用mod_proxy模块,并添加相应的代理配置。 ```apache LoadModule proxy_module modules/mod_proxy.so LoadModule ...
在`httpd.conf`或`apache2.conf`中,你需要启用`mod_proxy`模块,这是一个用于实现代理功能的模块,可以通过在文件末尾添加以下行来启用: ```apacheconf LoadModule proxy_module modules/mod_proxy.so ...
在Apache中配置负载均衡,首先需要安装mod_proxy和mod_proxy_balancer模块。这些模块允许Apache作为反向代理服务器,接收用户请求并转发到适当的Tomcat实例。以下是一个基本的配置示例: ```apacheconf LoadModule ...
在Apache配置文件中,创建一个`<Proxy>`指令,定义后端服务器组。这里我们以轮询策略为例: ```apacheconf <Proxy balancer://mycluster> BalancerMember http://server1:80 BalancerMember http://server2:80 ...
ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled/proxy.load ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enabled/proxy_http.load ln -s /etc/apache2/mods-...
配置Apache2.2.4和Tomcat的负载均衡,你需要编辑Apache的配置文件httpd.conf,添加mod_proxy相关指令,例如: ```apacheconf LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module ...
##### proxy_pass 指令 `proxy_pass`用于指定Nginx将请求转发给哪个后端服务器。这里有两种常用的方法: - **方法一**:将所有请求转发给Apache处理,除了特定类型(如图片、JavaScript、CSS)的静态资源。这利用了...
- 解除`Include`指令的注释,以包含其他配置文件,如`httpd-vhosts.conf`、`httpd-default.conf`和`httpd-languages.conf`。 - 允许`/usr/local/apache/htdocs`目录的`.htaccess`文件覆盖配置(将`AllowOverride ...
2. 配置`mod_jk`:将`mod_jk.so`模块加载到Apache的配置文件(`httpd.conf`)中,通常通过`LoadModule`指令完成。然后,需要配置`workers.properties`文件,定义每个Tomcat实例(worker)的属性,如IP地址、端口等。 ...
Apache反向代理的实现主要依赖于`mod_proxy`模块,这是一个核心模块,通常在安装Apache时就已经包含。要启用反向代理功能,我们需要在Apache的配置文件`httpd.conf`中进行相应的设置。首先,我们需要确保`mod_proxy`...
Apache MPM 公共指令 mpm_netware(MPM) winnt(MPM) prefork(MPM) 指令速查 worker(MPM) The Apache EBCDIC Port 针对特定平台的说明 Using Apache With Novell NetWare Running a High-Performance Web Server on ...
2. 模块改进:更新了多个核心模块,如mod_rewrite增强了URL重写规则,mod_deflate提高了压缩效率,mod_proxy支持更灵活的代理设置。 3. 多线程支持:引入了MPM(Multi-Processing Modules)多进程模型,如worker MPM...
3. 配置Apache作为反向代理:在Apache的配置文件(如httpd.conf)中,添加mod_proxy相关的指令,定义Tomcat服务器的地址和端口。 4. 配置负载均衡策略:根据需求选择合适的负载均衡策略,并在Apache配置中指定。 5. ...