Answers:
首先,请注意,Apache中的任何脚本功能(php,cgi,ruby等)都可以等同于具有运行脚本用户权限的shell帐户。
如果服务器与多个用户共享,则您可能要考虑使用suexec(-或ITK MPM - David Schmitt建议),因此并非每个脚本都以同一apache用户身份运行。
虚拟化或chroot apache,以便任何妥协至少都包含在附加安全层中。请注意,当您使用chroot apache时,维护工作可能会变得更加困难,因为最终您将库移到了jail等地方。如果您使用的是FreeBSD,则可以改用jail进行维护,因为您只需安装apache就可以了。从端口运行,然后从其中运行portaudit,而不必担心任何库依赖关系和手动移动文件,这总是很麻烦。使用BSD监狱,您可以简单地继续使用软件包管理系统(端口)。(在GNU / Linux上,您也可以使用VServer进行虚拟化。- David Schmitt建议)
(显然)不但要了解Apache的更新和补丁,还要了解PHP,ruby,perl等的更新和补丁……不仅要信任您的OS来为您提供所有更新。一些发行版的补丁程序非常慢。尽可能将暴露时间限制为0天漏洞。将milw0rm feed 粘贴到RSS阅读器中,订阅insecure.org邮件列表,等等。。。它不仅可以帮助您在操作系统发行补丁之前了解漏洞,而且还可以了解某些php中的漏洞。例如cms应用程序,它们甚至可能根本无法由您的操作系统进行管理或打补丁。
使用Tripwire / aide,audit或mtree(在BSD上)之类的东西来跟踪文件系统上的更改。这一点真的很重要。定期将任何更改发送给您,每天手动进行检查。如果有文件更改不应该更改,请调查原因。如果以某种方式通过某种方法将某些恶意javascript插入您的网页,则将以这种方式捕获它。这不仅可以节省您的服务器,还可以节省您的用户,因为您自己的网页可能被滥用来感染您的访问者。(这是非常非常常见的策略,攻击者通常甚至不关心您的服务器,他们只想感染尽可能多的访问者,直到被发现为止。这些攻击者通常也不会费心隐藏自己的踪迹。尽快找到这样的妥协非常重要。)
使用诸如suhosin之类的东西来保护php 会有帮助。但也要学习理解它,将其配置调整为应用程序的预期参数。
使用PaX之类的内核补丁可以帮助您避免许多缓冲区溢出漏洞。即使您的软件容易受到攻击。(这不会使您无懈可击,只是另一个较小的层次。)
使用某些安全工具时不要过于自信。了解您使用的工具,并使用常识。阅读,学习,尽可能多地跟上。
考虑使用强制访问控制(例如:SELinux)。它允许您为每个应用程序详细指定允许执行的操作。允许访问哪些文件。它允许进行内核调用等操作。这是一个非常复杂的过程,需要很多理解。一些发行版为其软件包提供了预制的SELinux策略(例如:Gentoo)。此建议与以下建议有些矛盾,但仍然有效。
保持简单。复杂的安全策略可能会对您不利。
在Apache中,设置非常严格的默认规则(选项None,全部拒绝等),并根据需要覆盖特定的VirtualHosts。
拒绝访问所有点文件(也立即覆盖.htaccess文件)
在任何类型的密码身份验证中,始终使用https。
防火墙应该是默认拒绝策略。在防火墙中建立一些特定规则以记录特定流量。
设置日志解析脚本以扫描日志中的异常。(前奏IDS套件可以做到这一点,但是老实说,我建议您随着时间的推移建立自己的脚本,因为它将帮助您更好地了解自己的工具和规则。)
让服务器向您发送有关上次登录用户,活动连接,使用的带宽等的每日报告。
对Suid二进制文件,世界可写文件以及类似的东西进行cron扫描,然后将它们邮寄给您。
对于您设置的任何要邮寄给您的东西,您都应该逐步建立一个例外列表。(忽略文件系统更改的文件夹,允许777个文件,允许suid二进制文件)。重要的是,您仅应通知不应该发生的事情。如果每天收到一封包含琐碎内容的邮件,您将开始忽略它们,它们将变得毫无意义。
拥有良好的固态分层冗余备份策略。并且不要仅仅假设制作图像或复制所有内容都可以。例如,如果在备份期间MySQL正在写表,则还原备份时MySQL二进制文件可能已损坏。因此,您将需要一个cron,以便mysqldump在常规映像或夜间tarball或版本控制或任何其他已设置的数据之上存储数据库。考虑一下您的备份策略。我的意思是,请认真考虑。
不要为了安全而依赖这样的列表:)认真!您会在互联网上找到很多此类内容,阅读所有内容,研究每个建议,并使用常识和经验来下定决心。最后,经验和常识是唯一可以挽救您的东西。不是列表,也不是工具。一定要阅读,但不要只是在没有理解的情况下进行复制。
我建议从SAN 获得Linux安全清单。我用它,再加上另一个内部程序。该清单可能有些过时,但是许多关键点仍然成立。