保护LAMP服务器的提示


Answers:


107

David的答案是服务器强化一般原则的良好基线。正如戴维指出的,这是一个巨大的问题。您采用的特定技术可能在很大程度上取决于您的环境以及服务器的使用方式。警告,这可能需要在测试环境中进行大量工作才能构建并正确完成。其次是将很多工作集成到您的生产环境中,更重要的是,将其集成到业务流程中。

但是,首先,请检查您的组织是否具有任何强化策略,因为这些策略可能是最直接相关的。如果不是,则根据您的角色,这可能是构建它们的绝佳时机。我还建议从下至上分别处理每个组件。

L
有很多好的指南可以帮助您。此列表可能会或可能不会帮助您,具体取决于您的分布。

该A
Apache可以是有趣的安全。我发现,与Apache或PHP相比,强化操作系统和维护可用性更容易。

M

P
This完全融入了“安全编程实践”的整个思想,这是其自身的一门完整学科。SANS和OWASP上有关该主题的信息非常荒谬,因此我不会在此处重复。我将专注于运行时配置,让您的开发人员担心其余的事情。有时,LAMP中的“ P”是指Perl,但通常是PHP。我假设是后者。


1
我想对该答案至少投票10次。
2011年

10
静默N-使用IPTables或外部防火墙,仅将网络连接阻止给公众访问所需的内容。
马特

这应该是社区Wiki
Brian Adkins 2013年

1
忘记防火墙是如此容易。我听说有人为网站构建了Web服务器,甚至还破解了TCP / IP堆栈以丢弃不是端口80的流量。另一件事被忽略了,那就是不必要的服务-如果不需要的话要打开,请关闭它。
亚伦·梅森

4
@AaronMason:恭喜!您有一个成功的轶事。让我们记住您的具体情况很好,但是希望未来的读者了解您的不寻常环境。在一般情况下,此建议非常危险。
Scott Pack

14

坦率地说,您已经提出了一个值得该主题的书籍的问题。但是,有些通用的基本准则很有效:

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

希望对您有所帮助。


1
我建议阅读由NSA撰写的“ Red Hat Enterprise Linux 5安全配置指南”
ALex_hha

1
晚了,但是最近我读到“不以root身份登录”已不再是一件大事,特别是如果您使用基于公钥/私钥的SSH身份验证。
–thether

8

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

防火墙功能

  • 一个不错的方法是不允许任何流量开始,然后仅在需要时打开所需的内容。这样可以打开最小的端口/ ips来使工作正常进行,并最大程度地减少您的暴露。
  • 对于LAMP服务器,您可能只需要打开http / https到世界的端口和ssh来打开sysadmins。
  • 如果不使用ipv6流量,请确保将其锁定
  • AWS提供了安全组,Linux具有iptables以及许多可供选择的软件包。

SSH和用户

  • 没有用于ssh访问的密码(使用私钥)
  • 不允许root通过ssh(适当的用户应该SSH方式,然后通过su或sudo)
  • 为用户使用sudo以便记录命令
  • 记录未经授权的登录尝试(并考虑使用软件来阻止/禁止尝试多次访问您的服务器的用户,例如fail2ban)
  • 在非标准端口上使用ssh(这对于确保您不会掉队的水果很有用,并且可以避免大量烦人的流量,但是对安全性不会有多大作用,尤其是单独使用)
  • 将ssh锁定到仅您需要的IP范围(大范围总比没有好)

数据库

  • 清理用户数据
  • 参数化查询
  • 考虑将数据库抽象到它自己的计算机上。这种分离会使攻击者更难进入您的Web堆栈,反之亦然。
  • 像其他任何软件一样,保持最新很重要。
  • 一个用户的各种用途。创建用户时,没有特权,只添加执行角色所需的特权。对于不同的应用程序(有时甚至是应用程序的不同部分)拥有单独的用户,将有助于减少攻击者在破坏任何一个帐户时所享有的利益。另外,请特别注意不要轻易授予GRANT之类的特殊特权。
  • 制定定期更改密码的策略是一个好主意。如果您担心所需的工作量,请记住少花点时间总比没有好。
  • 了解密码加密。盐密码。不要使用md5!

软件

  • 使软件保持最新(操作系统,Web服务器,脚本语言,CMS)。许多人将扫描旧(未修补)版本中的已知漏洞
  • 删除不需要的任何软件(理想情况下,无需保留在生产服务器上编译软件所需的软件包,最好预先编译软件并将其作为软件包提供给生产机器)
  • 确保文件权限被锁定(尤其是对于用户上传和配置文件之类的东西)
  • 在Web服务器级别对CMS进行密码保护的管理区域(http身份验证可以位于易受攻击的CMS的前面并帮助阻止访问,这是防止攻击的好方法)
  • 对管理区域和其他敏感数据使用SSL
  • 自动管理服务器和基础架构(如Puppet,Chef或SaltStack。如果也使用AWS CloudFormation,则可以自动管理)。这将帮助您在很多服务器上打补丁,并减少诸如修复服务器A上的权限但忘记在服务器B上进行操作之类的方案。
  • 尽可能不要放弃CMS,PHP或WebServer的特定版本。尽管掩盖这些信息不是安全的,但是有很多人正在扫描不同软件的特定版本,而您自由给出的信息越少,攻击者的工作量就越大。这是确保您不是垂头丧气的水果之一的好方法。当然,这对于想要花更多精力进入的人无济于事
  • 限制有权访问服务器的人员

5

补充David的建议,您的安装越模块化,即意味着限制对专门为一项任务创建的某些用户/组的访问并限制其范围,则LAMP堆栈越安全:例如,有一个Apache用户用于具有相应权限设置的Apache文件/文件夹,而不是可以访问关键系统文件/文件夹的任何组。可以访问与要服务的网站关联的MySql表的用户,并且只能访问这些表。此外,您可以限制其访问权限,以使来自PHP调用的访问量最少。另外,请确保通过PHP文件使用/公开的MySQL用户名与其他用户使用的用户名或密码不同。

这意味着什么:如果apache用户或MySql用户受到威胁,则它们在apache可以访问的文件夹范围之外(在apache用户的情况下)和表外部都不会造成任何危害( (一个或多个)/数据库(对于MySQL数据库的用户而言)。

如果要以某种方式破坏MySQL用户,例如,他们将无法访问数据库并从MySQL删除所有数据库并破坏所有数据。在某些情况下,他们可能会删除表或在隔离的数据库中的某些表中插入信息,这就是为什么仅在绝对必要的情况下才授予表访问权限,并仅授予所需的权限的重要性……无需具有删除表特权或更新特权,则不必将其授予该用户。

另外,如果出于某种原因找到了MySQL的管理帐户用户名和密码,并且您使用的用户名与系统上的其他用户名不同,则它们必须首先破坏系统的安全性,然后才能进入数据库进行破坏。apache用户和对文件的访问也是如此。

时间示例!我将举一个系统示例来简化该想法。

说您的系统上有用户(应该通过umod -l或passwd -l等禁用root用户的安全性):john,barney,terence和lisa。

您可以在MySQL中使用bigbird的名称创建一个用户(确保使用哈希密码)。Bigbird仅具有选择权限和更新权限,而没有拖放或创建权限,当然也没有 另外,您创建了另一个名为garfield的管理MySQL用户,用于在MySQL数据库上工作,并且从MySQL数据库中删除了根用户,以免对其造成威胁。加菲猫已被批准MySQL权限(实际上,这只是重命名root)。

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

另外,您可以将ssh访问权限仅限制为某些用户(或某些组,我喜欢将它们放在ssh组中,并使该用户只能使用ssh)。

另外,您可以选择哪些用户具有sudo特权来进一步限制操作。您可以进一步采取的另一步骤是,使所有无法使用sudo的ssh用户,可以创建可以使用不能使用ssh的sudo的特殊用户,以便一旦使用ssh,就必须登录另一个用户才能拥有访问sudo。

因此,通过模块化每个段,如果一个段被攻破,整个堆栈就不会被攻破,您可以解决第一个问题,而不必从头开始。


3

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


欢迎来到服务器故障!通常,我们希望网站上的答案能够独立存在-链接很棒,但是,如果该链接中断,则答案应该具有足够的信息,仍然会有所帮助。请考虑编辑您的答案以包括更多详细信息。有关更多信息,请参见FAQ
slm

1

目前,不要忽视容器虚拟化,即Docker,systemd-nspawn和构建它们的容器虚拟化机制(命名空间,cgroup)。使用容器虚拟化可让您隔离进程,例如,如果其中一项服务受到威胁,攻击者将无法获得对其他服务的访问权限。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.