如何:运行每个系统/虚拟机实例的网络服务以提高 Web 堆栈(LAMP)的整体安全性
Web堆栈不过是许多开源软件(例如操作系统、Web 服务器、数据库服务器、服务器端编程语言)的集合。最常见的 Web 堆栈是 LAMP。它是免费开源软件解决方案堆栈的首字母缩写,指的是 Linux(操作系统)、Apache Web 服务器、MySQL 数据库软件和 PHP(或有时是 Perl 或 Python)的首字母。我们所有与安全相关的教程都建议在单独的系统或虚拟机实例上运行不同的网络服务。当然,如果攻击者能够成功利用一个网络服务中的软件漏洞,这会限制可以破解的其他服务的数量。这也是通过电子邮件请求最多的文章之一。在本指南中,我将解释如何设置一个解决方案,该解决方案可以通过在单独的服务器或虚拟机实例上运行来提供静态内容、动态内容、数据库和缓存。
LAMP:传统设置与拆分设置
您最终使用单个服务器或虚拟机实例设置所有内容,以提供所有内容,如下所示:
One Big Server / VM instance +-----------------------------------------+ | Apache+PHP/Perl @ 75.126.153.206:80 | | Mysql @ 127.0.0.1:3306 (or unix socket) | | Pgsql @ 127.0.0.1:5432 (or unix socket) | | netfilter for filtering traffic | +-----------------------------------------+ *** Dedicated LAMP server *** OS: RHEL/CentOS/Debian/Ubuntu/*BSD/Unix RAM: 4-8GiB ECC CPU: Single or dual Intel/Amd Storage: RAID-1/5 server class sata/sas
假设 Apache Web 服务器受到攻击,攻击者也会访问您的数据库、缓存和网络的其他部分。因此,您需要按以下方式拆分每个服务器的服务:
///////////////////////// / Internet/ISP router / /////////////////////// \ | \ ---------| vm00 75.126.153.206:80 - eth0 192.168.1.1 - eth1 +----------------------------+ | Reverse Proxy | | Firewall | eth0:192.168.1.10/vm01 +----------------------------+ +----------------------+ | | Lighttpd static files| +-----------------------------------+ /var/www/static | | +----------------------+ | | eth0:192.168.1.11/vm02 +-----------------------------------+-----------------------+ | | Apache+php+perl+python| | | /var/www/html | | +-----------------------+ | | eth0:192.168.1.12/vm03 +-----------------------------------+-----------------------+ | |Database sql caching | | |Redis/Memcached etc | | +-----------------------+ | | eth0:192.168.1.13/vm04 (or a dedicated server for database w/ RAID-10) +-----------------------------------+------------------------+ | | Mysql/pgsql db server | | | @192.168.1.13:3306/5432| | +------------------------+ | | eth0:192.168.1.14/vm05 (or a dedicated server for storing all files via NFSv4 w/ RAID-10) +-----------------------------------+------------------------+ | | NFSv4 running on Linux | | | /export/{static,html | | +------------------------+
叉子设置有很多好处,例如:
- 安全
- 可扩展性和增长
- 优化
- 易于使用
- 易于监控
- 轻松添加高级功能,如故障转移(vm00 级别的 VIP)、负载平衡、cdn 等。
每个虚拟机/服务器的角色:
以下提供了更多详细信息。基于 wordpress 的博客或基于 drupal 的网站或托管在以下设置上的定制应用程序每月可以轻松提供数百万的页面浏览量。
虚拟机/服务器 | 描述 | 软件(堆栈的一部分) |
---|---|---|
vm00,配备 2 个核心和 2GiB RAM | 这是您要向世界公开的唯一部分。此节点/虚拟机必须具有两个网络接口。一个接口称为公共接口,供客户端连接到您的网站。另一个接口称为私有接口(VLAN),仅用于节点之间的网络流量。此虚拟机或服务器必须具有两个网络接口。 | nginx/haproxy 作为反向代理,netfilter 作为防火墙。 |
vm01,1个核心,1GiB RAM | 使用此节点提供静态文件(例如 images/js/css)。您需要将文件存储在名为 vm05 的 nfs 服务器上,并将其挂载在 /var/www/static/ | Lighttpd/tux/nginx 和 Linux nfs 客户端 |
具有 2-4 个核心和 4GiB RAM 的vm2 | 此节点用于提供动态页面。例如,您可以在此节点上安装 wordpress 或用 PHP5/Python/Perl 编写的自定义应用程序。您需要将应用程序文件存储在名为 vm05 的 nfs 服务器上,并将其挂载在 /var/www/html/。您需要将日志本地存储在 /var/log/apache 目录中。 | Apache 2 带有 fastcgi+php5+perl+python 等和 Linux nfs 客户端。 |
vm3,单核,1-2GiB RAM | 该节点用于通过在 RAM 中缓存数据和对象来加速动态数据库驱动的网站,以减少外部数据源的次数。 | Memcached 或 Redis 等。 |
配备 2-4 核和 2-4GiB RAM+RAID 混合存储的vm4 | 该节点将您的数据存储在 RDBMS 中,例如 mysql 或 postgresql。 | Postgresql 或 Mysql 服务器。 |
配备 4 核和 4-6GiB RAM+RAID 混合存储的vm5 | 此节点充当网络文件系统 (NFS) 服务器,这是一种分布式文件系统。您只能在此服务器上将图像、js、css 存储在 /var/www/static 目录中,将 php、perl、python 文件存储在 /var/www/html 目录中。您需要使用 /etc/exports 配置文件导出 /var/www/html 和 /var/www/static 目录。客户端计算机 vm01 和 vm02 请求访问导出的数据,通常是通过发出 mount 命令。然后,客户端计算机上的 Apache 和 lighttpd 服务器守护程序可以查看服务器上已安装的文件系统并与之交互。您还需要在此服务器上创建 ssh / sftp 用户,以便他们可以上传文件。 | Linux NFSv4 服务器 |
托管数据中心的 ISP 路由器或上行链路端口。 | vm00 节点使用 ISP 提供的上行链路连接到 Internet。您可以从 eth0 的 100Mbps 或 1000Mbps 上行链路端口开始。私有端口 (eth1) 仅用于所有 vm 节点之间的网络流量,并且可以基于 100/1000Mbps 的 VLAN 设置。 | 由于特定于站点,因此没有针对上行链路的建议。 |
它是如何工作的?
让我们看看我们的设置和反向代理是如何工作的。在这个例子中,我将把反向代理和 http 服务器放在防火墙内。参见图 1。网站名称是 www.example.com,它解析为静态公共 IPv4 地址 202.54.1.1,该地址分配给 eth0。192.168.1.1 是我们的内部 IP,分配给 eth1。此站点是您的反向代理。其余所有服务器都在 LAN 内,无法通过 Internet 直接访问。
图 1 ~ 点击放大
硬件(或 OpenBSD / Linux 软件)防火墙规则仅允许 202.54.1.1 在端口 80 和 443 上使用。所有其他端口均被阻止。每个 vm 节点还运行 iptables 并仅允许访问所需的端口。您的反向代理定义 http 服务器池如下:
## our upstream for www.example.com ## upstream mybackend { server 192.168.1.10:80; #server1 server 192.168.1.11:80; #server2 .... .. .. server 192.168.1.100:80; # server100 }
Apache 和 lighttpd 服务器将使用在 vm05 上配置的 nfs 服务器访问其文件。Apache Web 服务器配置了 PHP。我们的 PHP 应用程序配置为连接到托管在 vm04 上的数据库服务器。我们的 PHP 应用程序使用 vm03 通过 memcached 服务器缓存 sql 查询。
注意:您还可以将反向代理放在 DMZ 上,并将 http 和其他服务器放在防火墙内,以提高安全性。这会增加项目成本。
说得够多了,给我看看实际的服务器配置
本文列出的大多数操作都是假设它们将由在 CentOS 6.x / Red Hat Enterprise Linux 6.x 上运行 bash 的 root 用户执行。但是,您可以轻松地在任何其他 *nix 类操作系统上复制该设置。
- 步骤#1:配置/安装:NFS 文件服务器
- 步骤#2:配置/安装:MySQL 数据库服务器
- 步骤#3:配置/安装:Memcached 缓存服务器
- 步骤#4:配置/安装:Apache+php5 应用 Web 服务器
- 步骤#5:配置/安装:用于静态资产的 Lighttpd Web 服务器
- 步骤#6:配置/安装:Nginx 反向代理服务器