保护LAMP服务器的技巧

这是一个关于保护LAMP堆栈的典型问题

保护LAMP服务器的绝对指导是什么?

David的回答是服务器强化的一般原则的一个很好的基准。 正如大卫所言,这是一个巨大的问题。 您采取的具体技术可能高度取决于您的环境以及您的服务器将如何使用。 警告,这可能会在testing环境中花费大量工作来构build和完成正确的工作。 随之而来的是很多工作要融入你的生产环境,更重要的是业务stream程。

首先,请检查您的组织是否有任何强化政策,因为这可能是最直接相关的。 如果不是,根据你的angular色,这可能是一个伟大的时间来build立他们。 我也build议从下到上分别处理每个组件。

L
有很多很好的指南可以帮助你。 根据您的分配,此列表可能会帮助您,也可能不会帮助您。

  • 互联网安全基准中心 – 专门针对主要口味的分发
  • CentOS硬化指南 – 严格遵循CIS RHEL5指南,但读起来更容易
  • NIST SP800-123 – 通用服务器安全指南
  • 国家安全局硬化实例说明 – 最近不像CIS那样更新,但仍然适用
  • Tiger – Live系统安全审计软件

A
Apache可以很有趣,以确保安全。 我发现比Apache或PHP更容易加强操作系统和维护可用性。

  • Apache服务器强化 – 在IT安全姊妹网站上的这个问题有很多很好的信息。
  • 互联网安全基准中心 – 再次,Apache基准。
  • Apache安全提示 – 直接从Apache项目,它看起来像涵盖了基本知识
  • DISA强化清单 – 国防部信息保障人员的清单

M

  • 互联网安全基准中心 – 再次,但对于MySQL基准
  • OWASP MySQL强化
  • 一般安全指南 – 项目开发者的基本清单

P
这贯穿整个安全编程实践的思想,这是一个自己的整个学科。 SANS和OWASP在这个主题上有大量的信息,所以我不会在这里复制它。 我将关注运行时configuration,让开发人员担心其余的问题。 有时LAMP中的“P”是指Perl,但通常是PHP。 我假设后者。

  • 加强PHP – 在IT Security SE网站上也有一些小的讨论。
  • 强化PHP项目 – 生成Suhosin的主要项目,尝试修补PHP应用程序以防止某些types的攻击。
  • 用Suhosin加强PHP – 一个专门为Suhosin的简单的方法
  • 从php.ini中强化PHP – 对一些与安全相关的运行时选项的简短讨论

你问了一个问题,坦率地说,这个问题值得一些关于这个话题的书。 但是有一些基本的指导方针可以很好地工作:

  1. 保持更新。 这意味着操作系统,所有的服务,尤其是所有运行的web应用程序。
  2. 禁用任何不需要的服务,将所需的服务限制在最低限度(如果不是远程连接到MySQL,那么不要在TCP上监听),并运行基于主机的防火墙。 (如果是严格的LAMP,那么80和443应该是好的,但也可以用SSH来pipe理)
  3. 使用强密码。 更好的是,如果您使用SSH,则只能使用基于密钥的身份validation。
  4. 确保你没有以root身份login。 以用户身份login并使用su&sudo。
  5. 虽然它不会使事情更安全,但您应该运行logwatch之类的工具,以便了解服务器上正在发生的事情。

希望能帮助你开始。

这是一个很好的清单,我喜欢开始。

火墙

  • 一个好方法是不允许任何stream量开始,然后只打开你所需要的 ,因为你需要它。 这导致打开最小的端口/ ips使事情工作,并尽量减less您的曝光。
  • 对于LAMP服务器,您可能只需要打开http / https到世界的端口,为系统pipe理员打开ssh。
  • 确保像ipv6stream量的东西,如果不使用它被locking
  • AWS提供安全组,linux有iptables以及大量的软件包可供select。

SSH和用户

  • 没有密码的SSH访问(使用私钥)
  • 不要让根目录ssh (适当的用户应该ssh,然后su或sudo)
  • 为用户使用sudo,以便logging命令
  • logging未经授权的login尝试(并考虑软件阻止/禁止尝试访问您的服务器的用户,比如fail2ban)
  • ssh在非标准的端口(这可以有助于确保你不低挂水果,并保持很多烦人的stream量,但不会太多的安全,特别是本身)
  • 把sshlocking到你所要求的ip范围(大范围比没有范围要好)

数据库

  • 清理用户数据
  • 参数化查询
  • 考虑把数据库抽象到它自己的机器上。 这种分离可以使攻击者更难以到达您的networking堆栈,反之亦然。
  • 像任何保持最新的软件一样重要。
  • 一个用户为每个目的 。 创build用户时,不需要任何权限,只需添加他们需要执行的angular色。 为不同应用程序(或有时是不同应用程序的不同部分)分离用户将有助于减less攻击者妥协任何一个帐户的好处。 还要注意像GRANT这样的特殊权限,不应该轻易指定。
  • 有一个定期更改密码的策略是一个好主意。 如果你担心需要付出的努力,记住不那么频繁比永远好。
  • 了解密码encryption。 盐密码 。 不要使用md5!

软件

  • 保持软件最新 (操作系统,networking服务器,脚本语言,CMS)。 那里有很多人将扫描旧(未打补丁)版本中的已知漏洞
  • 删除任何不需要的软件(理想情况下,不要在生产服务器上保留编译软件所需的软件包,最好预先编译软件并将其作为软件包提供给生产机器)
  • 确保文件权限被locking (特别是对于用户上传和configuration文件)
  • 在Web服务器级别密码保护CMS的pipe理区域( http身份validation可以位于漏洞CMS的前面并帮助阻止访问,这是防止攻击的好方法)
  • 对pipe理区域和其他敏感数据使用SSL
  • 自动pipe理您的服务器和基础设施(如Puppet,Chef或SaltStack,如果使用AWS CloudFormation)。 这将帮助你在很多服务器上打补丁,并减less服务器A上的权限,但忘记在服务器B上执行
  • 尽可能不要放弃CMS,PHP或WebServer的特定版本。 虽然掩盖这些信息并不安全,但是有很多人在寻找特定版本的不同软件,而且越less的信息就越是被攻击者所需要的。 这是确保你不是低挂果子的好方法。 当然这对于那些想花更多精力进入的人来说什么也不会做
  • 限制有权访问服务器的人员

根据David的说法,安装的模块越多,我的意思就是限制访问特定用户/组为特定的任务和限制他们的范围,更安全的LAMP堆栈:一个例子是有一个Apache用户对于具有相应权限的Apache文件/文件夹,而不是可以访问关键系统文件/文件夹的任何组。 可以访问与要提供服务的网站相关联的MySql表的用户,并且只能访问那些表。 此外,您可以限制他们的访问权限,以便从PHP调用中获得最less的访问权限。 此外,请确保通过PHP文件使用/暴露的MySQL用户名与其他用户使用的用户名或密码不同。

这意味着:如果apache用户或MySql用户受到攻击,他们不能在apache访问的文件夹范围之外(在apache用户的情况下)和在表外s)/数据库(对于MySQL数据库的用户)。

如果MySQL用户被攻破,他们就无法访问数据库,从MySQL中删除所有的数据库,并毁掉所有的数据。 在某些情况下,他们可能会在一些孤立的数据库中的某些表中插入表或插入信息,这就是为什么只在必要的时候授予表访问权限,并且只授予所需的权限是很重要的。需要具有删除表权限或更新权限,则不要将其授予该用户。

此外,如果由于某种原因,您的pipe理帐户用户名和密码被发现用于MySQL,如果您使用的用户名不同于系统上的任何用户名,那么在进入数据库之前必须先破坏系统的安全性。 关于apache用户和访问文件也是如此。

例如时间! 我将给出一个系统的例子来简化这个想法。

说你的系统上有用户(通过类似于umod -l或passwd -l之类的东西,为了安全起见,root应该被禁用):john,barney,terence和lisa。

你可以使用bigbird的名字在MySQL中创build一个用户(确保你使用了散列密码)。 Bigbird只有select权限和更新权限,但不能删除或创build,当然不是 此外,您还创build了另一个名为garfield的pipe理MySQL用户,用于在MySQL数据库上工作,并从MySQL数据库中删除root用户,以便它不能被comprimised。 加菲猫已被授予 整个MySQL的权限(有效的,这只是重命名根)。

现在,您创build一个apache组或一个用户,我们将其称为apweb2。 Appweb2不是其他组的成员,并且apache的所有文件/文件夹都存储在/ home / apweb2 /中。 每个虚拟主机将拥有自己的子文件夹,并且每个主机都将文档根目录设置为该子文件夹。 符号链接将被禁用,以免意外提供对系统其余部分的访问。

此外,你可以限制ssh访问某些用户(或某些组,我喜欢把他们在ssh组,并使这是唯一能够使用ssh)。

此外,您可以select哪些用户具有sudo权限,以进一步限制事情。 另外一步你可以进一步做的是让任何SSH用户无法sudo,你可以创build特殊的用户,可以使用sudo,不能使用ssh,所以一旦你ssh进入,你必须login到另一个用户有访问sudo。

所以,通过模块化每个细分市场,如果一个细分受损,整个堆栈将不会受到影响,您可以解决问题,而不必从头开始。

我发现这个来自SANS.org的文档真的很有帮助http://www.sans.org/score/checklists/linuxchecklist.pdf

目前,不要忽视容器虚拟化,即Docker,systemd-nspawn以及它们构build的容器虚拟化机制(名称空间,cgroup)。 使用容器虚拟化可以让您隔离进程,例如,如果其中一个服务受到攻击,攻击者将无法访问其他服务。

在LAMP的情况下,可以使用例如四个Docker容器,SSH服务器,Apache,MySQL,PHP-FPM / Python / Perl /等。