这是一个关于保护LAMP堆栈的典型问题
保护LAMP服务器的绝对指导是什么?
David的回答是服务器强化的一般原则的一个很好的基准。 正如大卫所言,这是一个巨大的问题。 您采取的具体技术可能高度取决于您的环境以及您的服务器将如何使用。 警告,这可能会在testing环境中花费大量工作来构build和完成正确的工作。 随之而来的是很多工作要融入你的生产环境,更重要的是业务stream程。
首先,请检查您的组织是否有任何强化政策,因为这可能是最直接相关的。 如果不是,根据你的angular色,这可能是一个伟大的时间来build立他们。 我也build议从下到上分别处理每个组件。
L
有很多很好的指南可以帮助你。 根据您的分配,此列表可能会帮助您,也可能不会帮助您。
A
Apache可以很有趣,以确保安全。 我发现比Apache或PHP更容易加强操作系统和维护可用性。
M
P
这贯穿整个安全编程实践的思想,这是一个自己的整个学科。 SANS和OWASP在这个主题上有大量的信息,所以我不会在这里复制它。 我将关注运行时configuration,让开发人员担心其余的问题。 有时LAMP中的“P”是指Perl,但通常是PHP。 我假设后者。
你问了一个问题,坦率地说,这个问题值得一些关于这个话题的书。 但是有一些基本的指导方针可以很好地工作:
希望能帮助你开始。
这是一个很好的清单,我喜欢开始。
根据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 /等。