5

本文翻译自DigitalOcean的An Introduction to Securing your Linux VPS,建议阅读原文

前言

利用这个伟大平台的强大功能和灵活性,掌控你自己的Linux服务器是学习新事物的良好机会。不过Linux服务器管理员必须对任何可联网的机器采取同样的谨慎措施,以确保它的安全。

归类在"Linux security"的主题各种各样,至于怎样恰当的安全级别才看起来像Linux服务器有很多不同的意见。

你必须自己决定什么样的安全保护措施是必要的。在你做之前需要知道风险,并在实用性和安全性之间做出权衡,合理得做出决定。

这篇文章旨在提供一些Linux服务器环境下最常见的安全措施供你参考。这不是一份详尽的清单,也不包括推荐的配置,但是提供了更加全面的资源的链接,并讨论为什么每个组件是系统的重要组成部分。

使用防火墙阻止连接

建议所有用户都采取的最简单的一个措施是:配置并启用防火墙。防火墙扮演了网络流量和你的机器之间屏障的角色。它们管理着服务器上流量的进和出,并决定是否允许它传递信息。

防火墙根据用户配置的一系列规则检查有关的流量来实现上述功能。通常,一台服务器只为正当合理的服务开启特定的几个端口。剩下的端口全都关闭,而且需要被防火墙保护,它会拒绝所有发往这些端口的流量。
这允许你删除你不期望的数据甚至在某些情况下能条件化使用真实服务。合理的防火墙规则能提供稳健的基础网络安全。

可用的防火墙解决方案有很多。这里我们仅仅讨论其中一些。

UFW

UFW是简单的防火墙(uncomplicated firewall)的简称。它的目标是无需其他防火墙那么复杂的语法就能提供良好的保护。

UFW和绝大多数Linux防火墙一样,其实是包含在Linux内核的netfilter 防火墙的前端控制。这对还不熟悉Linux防火墙人来说是个简易的选择,通常来说还是个不错的选择。

IPTables

也许最著名的Linux防火墙解决方案就是iptables了。IPTables是用来管理包含在Linux内核中的netfilter防火墙的另一个组成部分。它已经存在了很长时间并经历了严格的安全审计,以确保其安全性。有一个版本的iptables称为ip6tables,它用于创建对IPv6的约束。

在你管理Linux服务器时也许会碰到iptables配置。一开始掌握语法可能会有点困难,但它是一个令人难以置信,非常强大的工具,可以为它配置非常灵活的规则集。

IP6Tables

正如上面提到的那样,iptables用于操作包含IPv4的规则表。如果你在服务器上启动了IPv6,则需要同时关注IPv6,也就是ip6tables。

包含在Linux内核中的netfilter防火墙使IPv4和IPv6流量完全分离。他们保存在不同的表。决定一个数据包的最终命运的规则是由正在使用的协议版本确定的。

这对于服务器的管理意味着当IPv6启用时,必须要维持一个规则集。ip6tables 命令与iptables共享相同的语法,所以在执行IPv6表中一样的约束集时通常是直接转发。但是你必须确保流量定向的是IPv6地址,这才能正常工作

NFTables

虽然iptables一直在Linux环境下防火墙的标准,但是一个新的名为nftables的防火墙最近也添加到了Linux内核。这和iptables和同一个团队,NFTables旨在最终取代iptables。

nftables防火墙试图实现较它的前身IPTables更加可读的语法,并实现在同一个工具里支持IPv4和IPv6。虽然现在大多数Linux内核还不够新无法实现NFTables,但它很快就会非常普遍,你应该尽量熟悉它的使用。

使用SSH安全得远程登录

当管理一台不在本地的服务器时,就需要远程登录了。SSH意思是secure shell,通过这个协议Linux系统能安全得完成远程登录。SSH提供端到端加密,能够将不安全的流量通过安全连接,X-forwarding(网络连接的图形化界面),等等。基本上,如果你不能访问本地或者带外管理,SSH是你与服务器交互的主要方式。

虽然协议本身是非常安全的并且已经做了大量的研究和代码检查,但是你的配置选择会帮助或者阻碍服务的安全性。我们将在下面讨论:

密码 vs SSH-Key 登录

SSH有非常灵活的身份认证方式,允许你使用不同的方法登录。最常见的两种方式是密码认证和SSH-Key认证。

密码认证可能是大部分用户自然选择的方式,安全性上不及SSH-Key认证。密码登录允许潜在的入侵者不断猜测密码,直到密码被发现。这就是所谓的暴力破解并且入侵者可以使用现代工具很容易得实现自动化。

另一方面,SSH-Key是通过产生一个安全密钥对来操作的。一个公钥作为测试类型被创建,以识别一个对象。它可以毫无问题得公开分享。但除了识别用户之外它不能用于其他任何事情,当和私钥完成匹配之后,它才允许用户登录。私钥应当秘密得保存,并且通过其关联的公钥的测试。

主要来说你可以向服务器添加SSH key,然后SSH key会允许你使用匹配的私钥进行登录。这些key非常复杂,使用暴力来破解是不切实际的。此外,还可以选择添加长口令,为你的key增加安全性。

点击此处了解更多关于如何使用SSH,点击这个链接来学习如何在服务器上创建SSH密钥

实现fail2ban拉黑恶意IP地址

实现类似fail2ban的解决方案一般能提升SSH配置的安全性。fail2ban是一项监控日志文件的服务,以此确定远程系统是否是一个合法用户。如果不是合法用户,则暂时禁止相关IP地址的流量。

设置合理的fail2ban策略可以让你标志出那些不断尝试登录但是失败的计算机,然后添加防火墙规则,在一段时间内阻止他们的流量。这是一种阻止暴力破解的简单方法,因为被禁止之后他们不得不停下来休息一会儿。

你可以在这里学习如何在Ubuntu上实现fail2ban策略。这里还有类似的在DebianCentOS上的指导。

实现入侵检测系统检测非法入侵

需要记住的一条重要的考虑因素是制定检测一项检测非法使用的策略。你可能有到位的预防措施,但你也需要知道他们是否失败。

入侵检测系统,也被称为IDS,在状态良好时会记录配置和文件详细信息。然后对这些记录的状态进行比较,以找出文件和设置是否被修改。

入侵检测系统有很多,我们将在下文了解:

Tripwire

Tripwire是最知名的IDS实现之一。Tripwire编制了一份系统文件的数据库,并且用一组键保护其配置文件和二进制文件。在详细定义了选择和异常的配置之后,Tripwire会通知其监视的文件发生的任何改变。
Tripwire的策略模型是非常灵活的,允许你为你的环境塑造其属性。你可以通过cron作业配置tripwire运行,甚至还能实现异常事件邮件通知。

这里你将了解更多关于怎样实现tripwire

Aide

另一个IDS选择是Aide,和tripwire类似,Aide通过构建一个数据库并比较当前系统状态和数据库中存储的已知的好的状态。当差异出现时,它会通知管理员这问题。

对于相同的问题Aide和tripwire都提供了类似的解决方案。看看文档两种解决方案都尝试一下,然后找出你更喜欢的。

点击这里,查看有关如何使用Aide的指导。

Psad

与上述两种工具相比,psad工具所关注的系统部分与之不同。psad关注的是防火墙日志以检测恶意活动,而不是检测系统文件。

譬如,如果用户试图用端口扫描来探测漏洞,psad能检测到这种活动并动态得改变防火墙规则并锁定用户。这个工具能注册不同的威胁级别并且根据问题的严重性进行响应。psad也能通过电子邮件通知管理员。

了解更多关于如何使用psad

Bro

另一个基于网络的IDS是Bro。实际上Bro是一个网络检测框架,它能被用作网络IDS,也能用于其他目的,如收集使用情况,调查问题或者检测模式。

Bro系统分为两层。第一层监测活动和生成它所考虑的事件。第二层通过一个策略框架运行着生成的事件,这个框架决定着应该怎样做。如果有任何与流量相关的,它会生成警报并执行系统命令,记录下事件或者采取其他措施。

点击这里,弄清楚怎样使用Bro

RKHunter

RKHunter为了检测rootkit和已知的恶意软件,执行了和基于host的入侵检测系统类似的原则,而不是技术上的入侵系统。

虽然在Linux世界里,病毒是罕见的,但是周围的恶意软件和rootkit会危及系统或者允许成功的入侵者继续为所欲为。RKHunter下载了已知漏洞的列表然后检查系统。如果在常见应用上检测到不安全的设置,RKHunter也会提醒你。

看看这篇文章了解更多关于在Ubuntu上使用RKHunter

常规的安全建议

虽然上述工具和配置可以帮助你保护系统的一部分,但是良好的安全性并不是仅仅靠实现工具,所以忘记它吧。良好的安全性体现在一定的思维定势上,是一个尽职调查,审查和参与安全的过程。

下面有一些通用的规则,可以帮助你在正确的方向上确保系统的安全。

注意更新和有规律得更新

系统上安装的几乎所有类型的软件都可能随时发现软件漏洞。通常发行版的维护者们得跟上最新的安全补丁并且将这些更新推送到他们的仓库。

然而如果你不下载或者安装这些更新,仓库里可用的安全更新对于你的服务器来说没什么好处。虽然很多服务器得益于稳定版本的软件,但是安全更新不应该被推迟,而应该看作重要更新。

大部分发行版提供安全性邮件列表和独立的只能下载和安装补丁的安全仓库。

通过非官方渠道下载软件时要小心

大部分用户会坚持从发行版官方仓库下载可用软件,并且大部分发行版提供已签名的软件包。一般而言用户可以信任发行版的维护者们,并将关注点放在非官方渠道的软件安全性上。

也许你会选择信任来自发行版的软件包,或者官网网站上的软件,但要注意,除非你是自己审核每个软件,不然都会涉及风险。大部分用户觉得这是一个可接受的风险水平。

另一方面,从随机仓库和PPA获取软件,并且维护他们的人你无法识别,这也是一个巨大安全风险。这没有一套规则可参考,并且大部分非官方软件源是完全安全的。但只要你信任另一方,你就在经历风险。

了解你的服务并约束它们

虽然运行服务器主要是提供可以访问的服务,但是仍需要限制运行在上面的你使用或者需要的服务。要考虑每一种功能的服务都有可能成为威胁的载体,所以在不影响核心功能的前提下你要尽可能多得消除威胁媒介。

如果你运行的是无头(没有显示器连接的)服务器,并且不运行任何图形(非web)程序,这意味着你应该禁止和卸载X display服务。在其他领域也可以采取类似的措施。没有打印机?那就禁止"IP"服务。不需要Windows网络共享?那就禁止"samba"服务。

可以发现各种方法通过各种方式运行在你的计算机上。在"create a list of requirements"章节下的这篇文章涵盖了怎样检测已经启动的服务

不要使用FTP并用SFTP代替

对于很多用户来说这可能很难,但是FTP是一种本质上不安全的协议。所有身份认证方式以纯文本方式发送,这意味着任何人只要监测服务器与你本地计算机之间的连接,就能看到登录的详细信息。

只有在很少数的情况下,FTP可能是较好的措施。如果你运行着匿名,公开,只读的下载镜像站,FTP是不错的选择。另一种情况是你信任你的网络是安全的,只是简单得在两台开启了NAT防火墙的计算机之间传输文件,那FTP也是蛮好的选择。

在几乎所有的其他情况下,你应该使用一种更加安全的替代方案。在SSH套件中有一个替代协议称为SFTP,表面上它们操作方式类似,但是SFTP是基于与SSH协议一样的安全性。

这可以让你以同样的方式进行信息传递,就和使用传统的FTP一样,但是这没有风险。大部分现在FTP客户端也可以与SFTP通信。

要了解更多怎样使用SFTP安全得传输文件,看看这个指南。

实现合理的用户安全策略

这里有一些你可以采取的措施,当管理用户时,可以更好得保护系统。

其中一项建议是禁止root登录。因为root用户存在于任何POSIX-like 系统,并且是一个全能的用户。这往往成为很多许多攻击者的目标。通常来说在配置完sudo访问之后,禁止root登录是一个好主意。或者你使用su命令。很多人对这个建议不以为然,你需要检查看这是否合适你。

SSH服务中禁用远程root登录是可能的,或者禁用本地登录。你可以/etc/securetty 文件中限制。也可以设置root用户的shell为non-shell来禁止root shell的访问,并设置PAM规则限制root登录。RedHat有一篇不错的文章,关于如何禁止root登录

另一个好的策略是为每个用户和服务创建独一无二的账户,并且给以它们能够完成它们工作的最小权限。锁定它们不需要访问的所有东西,并剥夺他们的一切特权。

这是条很重要的策略,因为当某个用户或者服务被破坏,这不会导致多米诺效应,多米诺效应指的是入侵者会因此获得被破坏的用户或服务的访问权限甚至是系统的。划分的系统可以帮助你隔离问题,就像当船身出现缺口时。舱壁和水密门系统可以防止船舶沉没。

和我们上面讨论过的服务策略类似,应该小心得禁用不再需要的用户账户。当你卸载软件或者用户不再访问系统,这就可能发生。

注意权限设置

文件权限对于很多用户来说是挫折的巨大来源。找到权限间的平衡,既允许你做你想做的事情,又不会产生伤害,这是一件很困难的事情,这需要在每个场景中认真关注与思考。

设置健全的umask策略(定义新文件和目录默认权限的属性)在创建缺省值时会有很大帮助。在这可以学习关于权限是如何工作如何调整umask值

通常,在设置某事物为world-writeable,尤其是它能够以某种方式访问互联网时,需要三思而后行。这可能产生极端的后果。此外,你不应该设置权限的SGID或者SUID位,除非你百分百了解你在做什么。另外,检查文件的所有者和组。

具体用法不同,文件权限设置会相差很大。但是你应该总是尝试看啊可能,是否有一种方式可以给以更小的权限。这是得到错误的最简单的方式,并且在互联网上在这方面有很多糟糕的建议流传。

如何保护你使用的特定软件

虽然本指南并不能包含每种类型的服务或者应用的安全细节,但在网上有很多可用的教程和指南。你应该阅读每个项目的安全建议,并在你的系统上实现。

此外,诸如web服务器或者数据库管理系统这样流行的服务器软件,拥有整个网站和专门的安全数据库。一般情况下,你应该仔细阅读并在上线前确保每个服务。

你可以查看我们的安全章节,获取更多关于你正在使用的软件具体的建议。

结论

现在你应该对可以在Linux服务器上实现的常用安全实践有较好的理解。虽然我们已经很努力得提高了很多领域的重视,但在一天结束之际,你必须自己做出决定。当你管理一台服务器时,你必须得为这台服务器的安全负责。

这不是你一开始就能快速配置并完成的事情。这是一个过程,不断得练习审计系统,实施解决方案,评估日志和警报,重新评估需求等等的过程。保护系统,你需要保持警惕,随时评估和检测你实施的解决方案的结果。

By Justin Ellingwood


FullStackDeveloper
9k 声望992 粉丝

一位孤独的工程师