这是一个典型问题关于保护 LAMP 堆栈
保护 LAMP 服务器安全的绝对准则是什么?
答案1
David 的回答很好地阐述了服务器强化的一般原则。正如 David 所指出的,这是一个大问题。您采用的具体技术可能在很大程度上取决于您的环境以及服务器的使用方式。请注意,这可能需要大量工作才能在测试环境中构建并正确完成。随后需要大量工作才能集成到您的生产环境中,更重要的是,集成到业务流程中。
但是,首先,请检查您的组织是否有任何强化政策,因为这些政策可能是最直接相关的。如果没有,根据您的角色,这可能是制定这些政策的好时机。我还建议从下至上分别处理每个组件。
L
有很多不错的指南可以帮到你。此列表可能对你有帮助,也可能没用,具体取决于你的发行版。
- 互联网安全基准中心- 针对主要口味的特定分布
- CentOS 强化方法- 与 CIS RHEL5 指南非常接近,但读起来更容易
- NIST SP800-123 - 通用服务器安全指南
- NSA 强化情况说明书- 没有像 CIS 那样最近更新,但仍然基本适用
- 老虎- 实时系统安全审计软件
A
Apache 的安全保护也很有趣。我发现它比 Apache 或 PHP 更容易强化操作系统并保持可用性。
- Apache 服务器强化- IT 安全姊妹网站上的这个问题有很多有用的信息。
- 互联网安全基准中心- 再次,Apache 基准测试。
- Apache 安全提示- 直接来自 Apache 项目,看起来涵盖了基础知识
- DISA 硬化检查表- 来自国防部信息保障人员的检查表
他们
- 互联网安全基准中心- 同样,但针对 MySQL 基准测试
- OWASP MySQL 强化
- 通用安全准则- 项目开发人员的基本清单
P
这与安全编程实践的整个理念背道而驰,安全编程实践本身就是一门学科。SANS 和 OWASP 有大量关于该主题的信息,因此我不会尝试在这里重复。我将重点介绍运行时配置,其余部分则留给开发人员。有时 LAMP 中的“P”指的是 Perl,但通常是 PHP。我假设是后者。
- 强化PHP- 一些小讨论,也在 IT Security SE 网站上。
- 强化的PHP项目- 主要生产项目苏霍辛,尝试修补 PHP 应用程序以抵御某些类型的攻击。
- 使用 Suhosin 强化 PHP- 专门针对 Suhosin 的简要操作指南
- 从 php.ini 强化 PHP- 对一些与安全相关的运行时选项进行了简短但不错的讨论
答案2
坦白地说,你问的问题值得写几本书来探讨。但有一些通用的基本指导原则很有效:
- 保持更新。这意味着操作系统、所有服务,尤其是您正在运行的所有 Web 应用程序。
- 禁用所有不需要的服务,将需要的服务限制在最低限度(如果您没有远程连接到 MySQL,则不要让它监听 TCP),并运行基于主机的防火墙。(如果严格来说是 LAMP,那么您应该使用 80 和 443,但也许 SSH 也适用于管理。))
- 使用强密码。更好的是,如果您使用 SSH,请仅使用基于密钥的身份验证。
- 确保您没有以 root 身份登录。以用户身份登录并使用 su 和 sudo。
- 虽然它不会使事情变得更安全,但您应该运行像 logwatch 这样的工具,这样您就能知道服务器上发生的情况。
希望这能帮助您入门。
答案3
这是我喜欢的一份很好的入门清单。
防火墙
- 一个好的方法是首先不允许任何流量,然后只打开你需要的,正如您所需要的。这样可以打开最少的端口/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 的特定版本。虽然隐藏这些信息并不安全,但许多人都在搜索不同软件的特定版本,你免费提供的信息越少,攻击者就越有可乘之机。这是一种确保您不是唾手可得的受害者的好方法。当然,这对那些想花更多精力进入的人毫无用处
- 限制有权访问服务器的人员
答案4
我发现 SANS.org 上的这份文档非常有用http://www.sans.org/score/checklists/linuxchecklist.pdf