保护 LAMP 服务器的技巧

Adi*_*kla 102 security linux lamp

这是一个关于保护 LAMP 堆栈的规范问题

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

Sco*_*ack 111

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

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

L
有很多很好的指南可以帮助您。此列表可能对您有帮助,也可能无济于事,具体取决于您的发行版。

A
Apache 保护起来很有趣。我发现强化操作系统和维护可用性比 Apache 或 PHP 更容易。

他们

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

  • 静默 N - 使用 IPTables 或外部防火墙,仅阻止公众访问所需的网络连接。 (11认同)
  • @AaronMason:恭喜!你有一个成功的轶事。让我们记住,您的特定情况运行良好,但我们希望未来的读者能够理解您不寻常的环境。在一般情况下,这个建议是非常危险的。 (4认同)

小智 16

你问了一个问题,坦率地说,值得读几本书来讨论这个话题。但是有一些通用的基本准则可以很好地工作:

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

希望能帮助您入门。


Dre*_*ury 9

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

防火墙

  • 一个不错的方法是不让任何流量开始,然后只打开你需要的,当你需要的时候。这会导致打开最少的端口/ip 以使事情正常工作并最大限度地减少您的暴露。
  • 对于 LAMP 服务器,您可能只需要为世界开放 http/https 端口,为系统管理员开放 ssh 端口。
  • 如果不使用它,请确保诸如 ipv6 流量之类的东西被锁定
  • AWS 提供了安全组,linux 有 iptables 以及大量可供选择的软件包。

SSH 和用户

  • ssh 访问没有密码(使用私钥)
  • 不允许 root ssh(适当的用户应该 ssh,然后 su 或 sudo)
  • 对用户使用 sudo 以便记录命令
  • 记录未经授权的登录尝试(并考虑使用软件来阻止/禁止尝试访问您服务器的次数过多的用户,例如fail2ban)
  • 在非标准端口上使用 ssh(这有助于确保您不是轻而易举的果实,并远离许多烦人的流量,但不会对安全起太大作用,尤其是它本身)
  • 将 ssh 锁定到您需要的 ip 范围(大范围比没有范围好)

数据库

  • 清理用户数据
  • 参数化查询
  • 考虑将数据库抽象到它自己的机器上。这种分离会使攻击者更难进入您的网络堆栈,反之亦然。
  • 像任何软件一样,保持最新状态很重要。
  • 每个目的一个用户。创建用户时,从没有权限开始,只添加他们需要执行角色的权限。为不同的应用程序(或有时应用程序的不同部分)设置不同的用户将有助于减少攻击者在破坏任何一个帐户时所获得的好处。还要小心像 GRANT 这样的特殊权限,它不应该被轻易分配。
  • 制定定期更改密码的策略是个好主意。如果您担心所需的工作量,请记住少做总比不做好。
  • 了解密码加密。盐密码。不要使用md5!

软件

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


小智 5

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

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

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

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

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

假设您的系统上有用户(为了安全起见,应该通过 umod -l 或 passwd -l 等禁用 root 用户):john、barney、terence 和 lisa。

您可以在 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 个问题,而不必从头开始。