Linux强化 – Web服务器

在build立Linuxnetworking服务器时,你的清单/程序是什么?

你推荐什么来实现最大的安全性?

有什么优先的方式来执行重复的维护?

  • 首先,请注意,Apache(php,cgi,ruby,…)中的任何脚本编写能力都等同于拥有运行脚本的用户权限的shell帐户。

  • 如果服务器与多个用户共享,则可能需要考虑使用suexec( – 或ITK MPM – 由David Schmitt推荐 ),因此不是每个脚本都以相同的apache用户身份运行。

  • 虚拟化或chroot apache,以便任何妥协至less有点包含在一个额外的安全层。 要知道,当你chroot apache的时候,维护可能变得更加困难,因为你最终将库移动到了监狱等等。如果你在FreeBSD上,你可以使用jail来代替,因为你可以安装apache从端口,并从它内部运行portaudit,而不必担心任何库依赖和手动移动文件,这总是成为一个丑陋的混乱。 有了BSD监狱,你可以简单地继续使用包pipe理系统(端口)。 (在GNU / Linux上,你也可以使用VServer进行虚拟化 – David Schmittbuild议

  • (显然)跟上更新和补丁,不仅为Apache,而且PHP,ruby,Perl等…不只是相信你的操作系统给你所有的更新。 一些发行版的补丁速度非常慢。 尽可能将曝光时间限制为0天的漏洞。 在您的RSS阅读器中粘贴milw0rm feed,订阅insecure.org邮件列表等,不仅可以帮助您在操作系统发布补丁之前了解漏洞,还可以了解某些php中的漏洞cms应用程序,例如,甚至可能不被您的操作系统pipe理或打补丁。

  • 使用诸如tripwire / aide,audit或mtree(在BSD上)来跟踪文件系统的变化。 这个真的很重要。 有任何更改定期邮寄给你,每天手动审查。 如果任何文件更改不应更改,请调查原因。 如果某种恶意的JavaScript以某种方式被插入到您的网页中,您将以这种方式捕捉到它。 这不仅可以节省您的服务器,还可以节省您的用户,因为您的网页可能会被滥用来感染您的访问者。 (这是非常常见的策略,攻击者经常不关心你的服务器,他们只是想尽可能多的感染你的访问者,直到被发现,这些攻击者也不会经常隐藏自己的踪迹。像这样尽可能快地达成妥协非常重要。)

  • 使用像suhosin的东西来保护PHP的帮助。 但也学会了解它,调整它的configuration到你的应用程序的预期参数。

  • 使用诸如PaX之类的内核补丁可能有助于保护您免受许多缓冲区溢出漏洞的攻击。 即使你的软件是脆弱的。 (这不会让你无懈可击,它只是另一个小的层次。)

  • 使用某种安全工具时不要过分自信。 了解你使用的工具,并使用常识。 阅读,学习,尽可能多地跟上。

  • 考虑使用强制访问控制(例如: SELinux )。 它允许您为每个应用程序指定允许执行的操作。 哪些文件是允许访问的。 它允许进行什么内核调用等。这是一个非常复杂的过程,需要大量的理解。 一些发行版为它们的软件包提供了预制的SELinux策略(例如: Gentoo )。 这个build议与下面的有点矛盾,但是仍然有效。

  • 保持简单。 一个复杂的安全策略可能会对你有用。

  • 在Apache中,设置一个非常严格的默认规则(Options None,Deny from all等),并根据需要覆盖特定的VirtualHost。

  • 拒绝访问所有的dotfiles(这也立即涵盖.htaccess文件)

  • 在任何有密码authentication的地方总是使用https。

  • 防火墙应该是一个拒绝的默认策略。 在防火墙中build立一些特定的规则来logging特定的stream量。

  • 设置日志分析脚本来扫描您的日志中的exception情况。 ( 前奏IDS套件可以做到这一点,但说实话,我build议你随着时间的推移build立自己的脚本,因为它会帮助你更好地理解你自己的工具和规则。)

  • 让服务器每天向最近login的用户发送报告,主动连接,使用的带宽等。

  • 对suid二进制文件,世界可写文件以及类似的东西进行cron扫描,并将它们邮寄给你。

  • 对于您设置的任何东西都会邮寄给您,您应该随着时间的推移build立一个例外列表。 (文件夹忽略文件系统更改,允许777个文件,suid二进制文件允许)。 只有通知不应该发生的事情才是重要的。 如果你每天都收到一些微不足道的邮件,你会开始忽略它们,而这些邮件将变得毫无意义。

  • 有一个很好的分层冗余备份策略。 不要只是假设制作一切形象或副本的作品。 例如,如果在备份过程中MySQL正处于写入表的过程中,那么当您恢复备份时,MySQL二进制文件可能会损坏。 所以你将需要一个cron,mysqldump的数据库在普通的图像或夜间tarball或版本控制或任何其他设置。 考虑一下你的备份策略。 我的意思是,真的想一想。

  • 不要依赖这样的名单来安全:)真的! 你会在互联网上find许多这样的东西,去阅读所有的东西,研究每一个build议,用常识和经验做出自己的想法。 最后,经验和常识是唯一能拯救你的东西。 不是列表,也不是工具。 请阅读,但不要只是不理解而复制。

我推荐来自SAN的Linux安全清单 。 我使用它,再加上另一个内部程序。 清单可能有点过时,但许多关键点是真实的。

  • 我build立了一个防火墙,并且只挖洞来分别添加每个服务
  • 对于任何服务,我都阅读应用程序的帮助文档以获取其configuration文件,并确保至less浏览每个设置。
  • 我订阅安全邮件列表
  • 我每天晚上在一个cron工作上运行rkhunter和lynis
  • 我有超过一定的门槛寄给我的所有错误
  • 我有所有与日志logging(重新启动日志服务等)的变化通过电子邮件发送给我
  • 我坚持等颠覆

编辑你的〜/ .ssh / config

permit_root_login no 

这使得

 ssh root@server 

没有回应,但

 ssh user@server user$ su 

将工作,如果你想以rootlogin。

永远有无数的权限检查,无数的清单,永远不会发现新的错误/漏洞。 安全我不认为是你打开或closures的东西,这是你不断做的事情。

鉴于软件的“不可避免的失败”,SELinux有助于消除一些担忧(再次没有安全的银弹)。 假设一个用户空间应用程序被破坏,正确的SELinux策略将阻止它按照惯常的方式运行(即,如果SELinux被禁用或许可)。 这当然会要求您监视您的审计日志并分析已安装的策略,并在必要时进行修改,以使应用程序正常运行。

不说默认政策不会有帮助,但我个人喜欢知道它允许的。