题 保护LAMP服务器的提示


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

保护LAMP服务器的绝对准则是什么?


91
2017-12-14 01:52






答案:


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

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

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

A
Apache可以很有趣。我发现比Apache或PHP更容易强化操作系统并保持可用性。

M

P
这贯穿于安全编程实践的整个想法,这是一个完整的自己的学科。 SANS和OWASP有关于这个主题的大量信息,所以我不会试图在这里复制它。我将重点关注运行时配置,让开发人员担心其余部分。有时LAMP中的'P'指的是Perl,但通常是PHP。我假设后者。


105
2017-12-14 14:50



我想至少投票10次这个答案。 - user58859
静音N - 使用IPTables或外部防火墙,阻止网络连接到公众访问所需的内容。 - Matt
这应该是社区维基 - Brian Adkins
忘记防火墙很容易。我听说有人为一个网站构建了一个Web服务器,甚至还破解了TCP / IP堆栈以丢弃不是端口80的流量。另一件被忽视的事情是不必要的服务 - 如果它不需要要打开,请将其关闭。 - Aaron Mason
@AaronMason:恭喜!你有一个成功的轶事。让我们记住你的具体情况很好,但我们希望未来的读者能够理解你不寻常的环境。在一般情况下,这个建议非常危险。 - Scott Pack


你坦白地问过一个问题,值得一些关于这个主题的书。但是有一些一般的基本指导方针运作良好:

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

希望能帮助您入门。


13
2017-12-14 02:23



我建议阅读NSA编写的“红帽企业Linux 5安全配置指南” - ALex_hha
迟到了,但我最近读到“不以root身份登录”不再是一件大事,特别是如果你使用基于公钥/私钥的SSH身份验证。 - the0ther


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

火墙

  • 一个不错的方法是不允许任何流量开始 只要 打开你需要的东西,因为你需要它。这导致打开了 最小的端口/ ips使工作正常,并最大限度地减少您的工作量 曝光。
  • 对于LAMP服务器,您可能只需要打开端口 http / https到世界,ssh用于sysadmins。
  • 如果不使用它,请确保ipv6流量等内容被锁定
  • AWS提供安全组,linux有iptables以及大量的软件包可供选择 从。

SSH和用户

  • 没有密码 用于ssh访问(使用私钥)
  • 不要让root用户ssh (适当的用户应该ssh in,su或sudo)
  • 对用户使用sudo,以便记录命令
  • 记录未经授权的登录尝试(并考虑软件阻止/禁止尝试访问您的服务器的用户太多次,例如fail2ban)
  • ssh在非标准端口上(这可以用来确保你不会低水平,并保持很多恼人的流量,但对安全性不会做太多,尤其是它本身)
  • 将ssh锁定到你需要的ip范围(大范围优于无范围)

数据库

  • 清理用户数据
  • 参数化查询
  • 考虑将DB抽象到它自己的机器上。这种分离可能使攻击者更难以访问您的Web堆栈,反之亦然。
  • 像任何软件一样 保持最新 很重要
  • 用于各种目的的用户。创建用户时,没有特权,只添加他们预先形成角色所需的权限。为不同的应用程序(或有时是应用程序的不同部分)分别拥有用户将有助于降低攻击者在攻击任何一个帐户时所带来的好处。另外要注意GRANT等特殊权限,不应轻易分配。
  • 有定期更改密码的策略是个好主意。如果你担心所需的努力量,记住频率越低越好。
  • 了解密码加密。 盐密码。不要用md5!

软件

  • 使软件保持最新 (os,web服务器,脚本语言,CMS)。很多人都会扫描旧的(未修补的)版本中的已知漏洞
  • 删除任何不需要的软件(理想情况下不要保留在生产服务器上编译软件所需的软件包,最好预编译软件并将其作为软件包提供给生产机器)
  • 确保文件 权限被锁定 (特别是对于用户上传和配置文件等内容)
  • 密码保护Web服务器级别的CMS管理区域(http身份验证 可以坐在漏洞CMS的前面并帮助阻止访问,这是防止攻击的好方法)
  • 使用SSL 用于管理区域和其他敏感数据
  • 自动管理您的服务器和基础设施(如Puppet,Chef或SaltStack。如果使用AWS CloudFormation也是如此)。这将帮助您修补许多服务器上的内容,并减少修复服务器A上的权限但忘记在服务器B上执行此操作的方案
  • 在可能的情况下,不要泄露CMS,PHP或WebServer的特定版本。虽然模糊这些信息并不是安全性,但是有许多人在那里扫描不同软件的特定版本,而且你自由发出的信息越少,攻击者就越需要工作。这是一个很好的方法,以确保你不是一个低悬的果实。当然,对于想要花费更多精力进入的人来说,这无济于事
  • 限制有权访问服务器的人员

7
2017-08-10 08:08





除了David建议之外,您的安装越模块化,我的意思是限制对专门为一个任务创建的某些用户/组的访问权限并限制其范围,LAMP堆栈就越安全:一个例子就是拥有一个Apache用户对于具有相应权限设置的Apache文件/文件夹,而不是任何可以访问关键系统文件/文件夹的组。可以访问与您要提供的网站关联的MySql表的用户,以及仅访问这些表的用户。此外,您可以限制其访问权限,以便从PHP调用中获得最少的访问权限。此外,请确保通过PHP文件使用/公开的MySQL用户名与用于其他用户的用户名或密码不同。

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

如果以某种方式使MySQL用户受到攻击,他们就无法访问数据库并从MySQL中删除所有数据库并破坏所有数据。在某些情况下,它们可能会丢弃表或在隔离数据库中的某些表中插入信息,这就是为什么仅在绝对必要的情况下授予表访问权限并且仅授予所需权限的重要性...如果您不这样做需要具有删除表权限或更新权限,然后不要将它们提供给该用户。

此外,如果由于某种原因发现了MySQL的管理帐户用户名和密码,如果您使用的用户名与系统上的任何用户名不同,则必须首先破坏系统的安全性,然后才能进入数据库进行破坏。关于apache用户和对文件的访问也是如此。

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

假设你的系统上有用户(应该通过umod -l或passwd -l等来禁用root用户的安全性): 约翰,巴尼,特伦斯和丽莎。

你可以在MySQL中创建一个名为bigbird的用户(确保你使用哈希密码)。 Bigbird只有选择权限和更新权限,但不会删除或创建,当然也不会 此外,您创建另一个名为garfield的管理MySQL用户,用于处理MySQL数据库,并从MySQL数据库中删除root用户,以使其无法进行编译。加菲尔德已获批准  整个MySQL的权限(实际上,这只是重命名root)。

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

此外,您可以仅限制某些用户的ssh访问(或某些组,我喜欢将它们放在ssh组中,并使其成为唯一能够使用ssh的东西)。

此外,您可以选择具有sudo权限的用户进一步限制事物。你可以进一步采取的另一个步骤是让任何ssh用户都不能sudo,你可以创建可以使用不能使用ssh的sudo的特殊用户,这样一旦你进入ssh,你必须登录到另一个用户才能拥有访问sudo。

因此,通过模块化每个段,如果一个段被泄露,整个堆栈将不会受到损害,您可以解决1个问题,而不必从头开始重新开始。


4
2017-07-30 04:49





我发现SANS.org的这个文件非常有帮助 http://www.sans.org/score/checklists/linuxchecklist.pdf


2
2017-08-10 11:50



欢迎来到服务器故障!一般来说,我们喜欢网站上的答案能够独立站立 - 链接很棒,但如果这个链接打破了答案应该有足够的信息仍然有用。请考虑编辑您的答案以包含更多详细信息。见 常问问题 了解更多信息。 - slm


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

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


0
2017-07-27 20:00