这是有关保护LAMP堆栈的规范问题
保护LAMP服务器的绝对准则是什么?
#1 楼
David的答案是服务器强化一般原则的良好基线。正如戴维指出的,这是一个巨大的问题。您采用的特定技术可能在很大程度上取决于您的环境以及服务器的使用方式。警告,这可能需要在测试环境中进行大量工作才能构建并正确完成。接下来要进行大量工作以整合到生产环境中,更重要的是要整合到业务流程中。但是,首先,请检查您的组织是否具有任何强化策略,因为这些策略可能是最直接相关的。如果不是,则根据您的角色,这可能是构建它们的绝佳时机。我还建议从下至上分别处理每个组件。
L
有很多好的指南可以帮助您。此列表可能会或可能不会帮助您,具体取决于您的发行版。 NCIS SP800-123-通用服务器安全性指南
NSA强化情况说明书-与CIS RHEL5指南非常接近,但更容易阅读
NIST SP800-123-通用服务器安全性指南
老虎-实时系统安全审核软件
A
Apache可以很好地保护安全。我发现,与Apache或PHP相比,加强操作系统和维护可用性更容易。
Apache服务器加强-IT Security姐妹站点上的此问题具有很多有用的信息。 >
Internet安全基准测试中心-再次是Apache基准测试。
Apache安全性提示-直接来自Apache项目,看起来它涵盖了基础知识
DISA强化检查表-国防部信息保证人员的检查表
Internet安全基准中心的M
-再次,但针对MySQL基准
OWASP MySQL硬化
通用安全准则-项目开发人员的基本检查表
P
直接进入了“安全编程实践”的整个思想,这是其自身的一门学科。 SANS和OWASP上有关该主题的信息非常荒谬,因此我不会在此处重复。我将专注于运行时配置,让您的开发人员担心其余的事情。有时,LAMP中的“ P”是指Perl,但通常是PHP。我假设是后者。
Hardening PHP-也在IT Security SE网站上进行了一些小讨论。尝试修补PHP应用程序以针对某些类型的攻击进行投射。
使用Suhosin增强PHP-专门针对Suhosin的简要HowTo
从php.ini增强PHP的方法-简短,但可以很好地讨论一些与安全性相关的运行时选项
#2 楼
坦率地说,您已经提出了一个值得该主题的书籍的问题。但是,有些通用的基本准则很有效:请保持更新。这意味着您正在运行的操作系统,所有服务,尤其是所有Web应用程序。
禁用所有不需要的服务,将所需的服务限制在最小程度(如果您不远程连接到MySQL,则不要让它侦听TCP),然后运行基于主机的防火墙。 (如果严格来说是LAMP,则最好使用80和443,但也可以使用SSH进行管理。)
使用强密码。更好的是,如果您使用SSH,则仅使用基于密钥的身份验证。
请确保您未以root用户身份登录。以用户身份登录并使用su&sudo。
虽然这不能使事情变得更加安全,但是您应该运行logwatch之类的工具,以便了解服务器上正在发生的事情。
希望对您有所帮助。
评论
我建议阅读由NSA撰写的“ Red Hat Enterprise Linux 5安全配置指南”
– ALex_hha
13年7月30日在7:55
晚了,但是最近我读到“不以root身份登录”已不再是什么大问题,尤其是如果您使用基于公钥/私钥的SSH身份验证。
–兰迪L
16年8月23日在18:11
#3 楼
这是我想开始的一个很好的清单。防火墙
一种不错的方法是不允许任何流量开头,而只能
根据需要打开所需的内容。这样可以打开
最小端口/ 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 。尽管掩盖这些信息不是安全的,但仍有很多人在扫描不同软件的特定版本,而您自由给出的信息越少,攻击者的工作量就越大。这是确保您不是垂头丧气的水果之一的好方法。当然,这对于想要花更多精力进行访问的人没有任何作用。
#4 楼
补充David的建议,安装越模块化,我的意思是将访问权限限制为专门为一项任务创建的某些用户/组并限制其范围,则您的LAMP堆栈越安全:例如,有一个Apache用户用于具有相应权限设置的Apache文件/文件夹,而不是可以访问关键系统文件/文件夹的任何组。可以访问与要服务的网站相关联的MySql表的用户,并且只能访问这些表。此外,您可以限制其访问权限,以从PHP调用中获得最少的访问量。另外,请确保通过PHP文件使用/公开的MySQL用户名与其他用户使用的用户名或密码不同。这意味着什么:如果apache用户或MySql用户受到威胁,对于apache可以访问的文件夹范围(对于apache用户而言)和在表/数据库之外(对于用户而言,对于MySQL数据库)。
例如,如果要以某种方式破坏MySQL用户,他们将无法访问数据库并从MySQL删除所有数据库并破坏您的所有数据。在某些情况下,他们可能能够删除表或在隔离的数据库中的某些表中插入信息,这就是为什么仅在绝对必要的情况下才授予表访问权限,并仅授予所需的权限的重要性……如果您不这样做,不需要具有删除表特权或更新特权,那么就不要将其授予该用户。
此外,如果出于某种原因,对于MySQL找到了您的管理帐户用户名和密码,则使用用户名不同于系统上的任何用户名,它们必须先破坏系统的安全性,然后才能进入数据库进行破坏。 apache用户和对文件的访问也是如此。
示例时间!
我将举一个系统示例来简化该想法。 。):
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进入,您必须登录另一个用户才能拥有因此,通过模块化每个段,如果一个段被攻破,整个堆栈就不会被攻破,您可以解决第一个问题,而不必从头开始。
#5 楼
我发现来自SANS.org的这份文档确实很有帮助http://www.sans.org/score/checklists/linuxchecklist.pdf评论
欢迎来到服务器故障!通常,我们希望网站上的答案能够独立存在-链接很棒,但是,如果该链接中断,则答案应该具有足够的信息,仍然会有所帮助。请考虑编辑您的答案以包括更多详细信息。有关更多信息,请参见FAQ。
–slm
13年8月10日在12:43
#6 楼
目前,不要忽视容器虚拟化,即Docker,systemd-nspawn和构建它们的容器虚拟化机制(命名空间,cgroup)。使用容器虚拟化可以隔离进程,例如,如果其中一项服务被破坏,攻击者将无法访问其他服务。
对于LAMP,例如,可以将四个Docker容器与SSH服务器,Apache一起使用,MySQL,PHP-FPM / Python / Perl / etc。
评论
我要对该答案至少投票10次。
–user58859
2011-1-24的16:32
静默N-使用IPTables或外部防火墙,仅将网络连接阻止给公众访问所需的内容。
–马特
2012年8月28日在21:03
这应该是社区维基
–布莱恩·阿德金斯(Brian Adkins)
2013年6月1日22:13
忘记防火墙是如此容易。我听说有人为网站构建了Web服务器,甚至还破解了TCP / IP堆栈以丢弃不是端口80的流量。另一件事被忽略了,那就是不必要的服务-如果不需要的话要打开,请关闭它。
–亚伦·梅森(Aaron Mason)
2013年9月13日在1:35
@AaronMason:恭喜!您有一个成功的轶事。让我们记住您的具体情况很好,但是希望未来的读者了解您不寻常的环境。在一般情况下,此建议非常危险。
–斯科特包
2013年9月16日下午4:37