1. 首页 > 服务器安全

服务器安全怎么保障?Ubuntu加固技巧和工具推荐

系统加固过程在安装期间和安装后都至关重要。它有助于系统正常运行。这篇博文将为您提供一些 Ubuntu 系统加固技巧。文章将深入探讨最关键的初始步骤,并在此基础上添加更具体的加固措施。大多数安全指南仅告诉您该怎么做,而我们将详细解释特定安全措施的重要性。这样,您可以根据实际情况,决定执行哪些步骤,或者跳过哪些步骤。毕竟,每个系统都是独一无二的,其安全策略也应随之灵活调整。

支持的操作系统:

  • Ubuntu 20.04 LTS 桌面版和服务器版
  • Ubuntu 22.04 LTS 桌面版和服务器版
  • Ubuntu 24.04 LTS 桌面版和服务器版

大部分步骤适用于这些版本之前和之后的 Ubuntu 版本。本指南将涵盖桌面版和服务器版,并指出它们之间的主要差异。

Ubuntu本身就很安全,对吧?

每个 Linux 发行版都需要在功能、性能和安全性之间做出权衡。虽然 Ubuntu 的默认设置很安全,但仍然需要根据使用情况进行调整。Ubuntu 桌面和服务器需要进行配置,才能将安全防御提升到最佳水平。默认配置往往是为了兼容性和易用性而优化,而非绝对安全。

系统加固

如果您是系统加固方面的新手,让我们先从定义开始:

系统加固是指通过缩小攻击面来提高Linux系统安全性的技术过程。它会针对对系统构成最大风险的组件采取特定的安全措施。这些措施可以通过添加、调整或移除Linux系统的某些组件来实现。可以将其理解为为您的系统“免疫系统”进行升级,主动防御潜在威胁。

在本指南的后续步骤中,我们将采用多种措施来提升您的 Ubuntu 安装和配置的安全性。虽然 Ubuntu 有一些特有的安全功能,但大多数加固技巧也适用于其他 Linux 发行版,如 Debian 或 CentOS。

桌面端与服务器端

Ubuntu 系统加固流程对于桌面和服务器来说非常相似。唯一的区别在于机器的用途。桌面用户通常用它来浏览网页或收发电子邮件,隐私可能是一个重要的关注点。而服务器上不太可能进行这些活动,因为服务器通常更注重数据完整性和可用性。因此,虽然加固步骤类似,但始终要牢记系统的用途。例如,桌面系统可能更关注浏览器和文档查看器的安全,而服务器则需强化SSH和Web服务。

安装过程中的加固步骤

最初的几项加固改进措施可以在安装过程中完成。如果您的系统已经运行,那么这些步骤很可能无法在事后轻易实施。您可以考虑重新安装系统,或者将这些加固措施作为未来安装的一部分。在系统生命周期的早期建立安全基线,其成本远低于后期改造。

使用强密码

完成初始安装步骤后,系统将创建一个用户帐户。该用户将被添加到管理员组,从而拥有 root 权限。因此,密码必须设置得足够强。这是抵御未经授权访问的第一道,也是最重要的一道防线。

Ubuntu 安装过程中显示的弱密码截图

服务器加固工作开局不利。应该使用强密码。

为什么强密码至关重要 :弱密码不应该出现在系统中。无论是在开发阶段还是在生产环境中,弱密码都不可或缺。这会带来严重的风险,因为自动化工具每秒可以进行多次密码猜测,通常只需几秒钟就能发现弱密码。因此,系统加固也应该包括提高密码强度。攻击者常使用字典攻击和暴力破解工具,弱密码极易被攻破。

增强密码安全性的技巧 :使用更长的密码可以大大增加暴力破解的难度。一个简单有效的技巧是在密码中多次添加同一个字符(例如,在密码开头添加 10 个美元符号)。除了增加密码长度之外,字符的多样性也很重要。添加大写字母、数字和其他特殊字符。

密码示例破解难度说明
password极低最常见的弱密码,秒破
P@ssw0rd简单的字符替换,易被规则字典猜中
MyDogIsFluffy!中等长度足够,但包含常见单词
G7#kLp$2qRz!完全随机,长度适中,非常安全
CorrectHorseBatteryStaple很高长密码短语,易于记忆且难以破解

专家建议:除了强密码,强烈建议为所有用户账户启用两步验证(2FA) ,特别是对于拥有sudo权限的管理员账户。这能为账户安全提供额外一层保障,即使密码意外泄露,也能有效防止未经授权的访问。

使用磁盘加密

在安装 Ubuntu 桌面或服务器系统时启用加密 LVM 卷。这对于加固系统,尤其是保护数据安全,是一项非常有效的措施。虽然它不能抵御所有攻击,但对于我们所说的 静态数据 至关重要。这意味着,即使您的系统被盗,攻击者也只有拥有解密数据的密钥或密码才能恢复数据。

选择引导式分区方法,并“使用整个磁盘并设置加密 LVM”。

启用 LVM 和加密来加固 Ubuntu 服务器的屏幕截图

下一步是选择一个密码短语。该密码短语在启动过程中用于解锁磁盘(或卷)。

定义用于加密 LVM 的密码短语的屏幕截图

设置一个好的密码短语:越长越好

为什么磁盘加密很重要? :即使是服务器,您的系统也可能被盗。另一种可能是您需要归还损坏的磁盘。在这两种情况下,其他人都不应该能够读取磁盘上存储的数据。对于笔记本电脑,这是必须采取的措施;对于机架式服务器,如果其物理安全无法得到100%保证,也同样重要。

注意事项:启用磁盘加密后,系统每次启动都需要手动输入密码短语,这会使得无人值守的远程重启变得复杂。对于服务器,需要权衡安全性和可用性。一种解决方案是使用 TPM(可信平台模块) 来存储密钥,实现自动解锁,但这需要硬件支持。请务必牢记解密密码,否则数据将彻底无法恢复。

自动安全更新

每台服务器在其生命周期内都需要软件包才能正常运行。请确保定期使用 无人值守升级功能 进行补丁更新。这可以通过在安装过程中选择“自动安装安全更新”选项来实现。

截图以启用 Ubuntu 服务器上的自动安全更新

为什么应用自动安全更新至关重要 :几乎每天都会在软件包中发现新的漏洞。Ubuntu 服务器也不例外。虽然大多数管理员并不愿意自动更新系统,但仅应用安全更新的风险相对较低。这是因为安全更新不会引入任何新功能,只会修复安全漏洞。修复完成后,会发布新的软件更新来解决相关的漏洞。这些更新通常会关联一个CVE 编号 (通用漏洞披露),其中包含有关漏洞本身的更多信息。因此,为了避免风险,请务必应用自动安全更新。

相关知识普及:CVE(Common Vulnerabilities and Exposures)是一个公开的漏洞数据库,为每个已知的安全漏洞分配一个唯一编号。关注与自己系统相关软件的CVE公告,是了解潜在风险的重要途径。Ubuntu官方也提供了安全通告邮件列表,建议管理员订阅。

最小安装

Ubuntu 的安装过程在过去几年中得到了改进,它已经应用了“精简”原则,只安装真正需要的组件。管理员仍然可以选择额外的软件包或软件组。可以在安装过程结束时添加新的软件组,也可以稍后手动添加。我们的安全建议是只选择真正需要的软件包和服务。对于服务器系统,选择 SSH 服务器角色是明智之举。这样,OpenSSH 和 SSH 守护进程就会被安装。

截屏选择 Ubuntu 服务器安装程序中的软件包

只选择你真正需要的选项,之后还可以添加更多。

为什么最小化安装至关重要 :Ubuntu 倾向于默认启用已安装的服务。这意味着,如果您只是安装一个软件包,它可能实际上已经在以不安全的默认配置运行。安全专家经常谈到“安全足迹”或“攻击面”。这意味着,安装的软件包越多,安全漏洞的风险就越高。不仅是软件包,运行的服务数量或已启用的(旧)用户数量也会增加安全风险。换句话说,每个软件包、服务或用户都会增加您的安全防御被攻破的可能性。

专家建议:可以将最小化安装原则与 容器化虚拟化 技术结合。在宿主机上仅安装必要的管理工具,将具体应用部署在独立的容器或虚拟机中。这样即使应用被攻破,攻击者获得的也只是一个受限环境,难以影响到宿主机核心系统,有效限制了攻击的横向移动。

安装后的加固步骤

系统安装完毕后,就到了配置阶段。同时,这也是安全防御最容易被削弱的阶段。因此,每次在服务器上执行操作时,都要考虑这些操作会对服务器的整体安全级别产生什么影响。

软件更新

安装过程中,可以选择启用自动安全更新。如果您已经有一个正在运行的系统,可以通过安装 无人值守升级 包轻松添加此组件。

apt install unattended-upgrades

虽然此软件包开箱即用,但您可能需要检查其配置。这是因为只有安全软件仓库中的软件包才会更新,其他软件仓库中的软件包会被跳过。因此,请查找系统可能可用的外部软件仓库,并考虑将这些软件包添加到配置中。无人值守升级的配置文件位于 **/etc/apt/apt.conf.d/** 50unattended-upgrades。有关配置的更多详细信息,请参阅我们关于无人值守升级的更详细的文章。

除了安全更新之外,我们建议您定期安排时间安装常规更新。这些更新通常包含提升系统稳定性的改进措施。尤其对于服务器而言,这一点至关重要。

apt update && apt upgrade

注意事项:在执行apt upgrade之前,尤其是在生产服务器上,建议先在预发布环境中进行测试。因为常规更新可能引入不兼容的更改或新的问题。对于关键业务系统,可以考虑使用 LTS(长期支持) 版本的内核,并启用 Livepatch 服务,它允许您在不重启的情况下应用某些关键的内核安全补丁,极大地提升了服务器的可用性。

账户

除了必要的软件包之外,系统只有在允许用户使用的情况下才能正常运行。在某些情况下,我们会授予用户服务器访问权限,尤其是在进行系统管理时。此外,对于Web服务器,用户通常可以通过SSH和SCP直接访问系统,以便更新用户的网站。

用户账户相关风险

系统(尤其是服务器)上的用户帐户存在一些风险,因此必须加强这方面的安全防护。第一个风险是本地用户可能利用本地漏洞提升权限,成为 root 用户。幸运的是,这种情况只有在系统存在已知漏洞且用户具备运行相关恶意脚本或代码的技术能力时才会发生。不幸的是,我们经常看到 Linux 服务器运行多年而无需重启。即使安全更新会自动安装,内核更新仍然需要重启系统。

第二个风险是旧账户可能在服务器上保留过久。有时,一些已离职的员工或客户会保留这些账户。如果这些账户的密码强度不足,将来可能会被滥用。为了应对这种情况,需要制定密码策略,并在账户不再需要时将其删除。最后一个风险比较棘手,因为您可能需要一套严格的流程来控制谁可以访问系统,以及一种方法来判断用户是否已无权再访问相关系统。

专家建议:实施 基于角色的访问控制(RBAC) 。为不同的管理任务创建专用的系统账户,而不是所有管理员共享一个账户。同时,应定期(例如每季度)审查所有用户账户和组,清理无用账户。对于员工离职,应立即禁用或删除其账户,并撤销其SSH密钥。

配置 PAM:pwquality

PAM 是Pluggable Authentication Module(可插拔身份验证模块) 的缩写。它扩展了现有身份验证步骤的功能,允许进行非常精细的配置。对于不熟悉 PAM 配置的人来说,它通常会让人感到有些不知所措,因为它没有清晰的配置路径。文件之间相互包含,而且文件名有时也比较晦涩难懂。不过,别担心,先在拥有 root 权限的虚拟系统上测试你的更改。创建一个额外的测试用户并使用该用户登录,以便进行测试。

第一步是安装 PAM 组件“pwquality”,即密码质量的缩写。

apt install libpam-pwquality

我们之前了解到,密码越长越安全。这是因为自动化工具破解长密码通常需要更长时间。因此,如果您想增加所有用户的最小密码长度,我们需要在 PAM 配置中进行相应设置。

用文本编辑器打开 /etc/pam.d/common-password 文件,查找包含 pam_pwquality.so 引用的行。默认情况下,该行只包含“retry=3”。这个数字表示用户在 PAM 显示身份验证失败并禁止访问之前可以尝试的重试次数。

由于我们想要增加最小密码长度,因此我们在重试参数之前添加了“minlen=10”。

password    requisite    pam_pwquality.so minlen=10 retry=3

保存文件,然后在另一个终端切换到你的测试用户。现在使用 passwd 命令,尝试使用一个像 123456 这样的短密码。如果配置正确,应该会失败。

下一步是向 pwquality 模块添加复杂度规则。这可以通过参数 dcredit、ucredit、lcredit 和 ocredit 来实现。有关详细信息,请参阅手册页,并再次测试您的更改。

man pam_pwquality

除了密码长度和复杂度之外,我们还可以配置用户更改密码的频率。这可以通过修改 /etc/login.defs 文件,使用 PASS_MIN_DAYSPASS_MAX_DAYS 选项来实现。默认情况下,最大更改天数设置为 99999 天,可能需要适当降低。对于更敏感的系统,这个数值应该设置得比较低,例如每 30 天更改一次。

注意事项:过于频繁的密码更改(如30天)可能导致用户选择弱密码或写下密码。建议结合密码历史记录(remember参数)来阻止重复使用旧密码。同时,可以配置账户锁定策略,在多次登录失败后暂时锁定账户,以抵御暴力破解攻击,这可以通过 pam_tally2 模块实现。

防火墙安装和配置

现在我们已经实施了一些措施,接下来需要关注网络服务。即使是已经通过网络防火墙过滤的系统,也可能从本地防火墙中受益。Linux 防火墙有多种选择,包括 UFW 和 iptables。

防火墙选项

对于 Ubuntu 来说,最好的防火墙就是你能轻松管理的防火墙。最常见的选择是iptables 。这个过滤引擎已经存在很长时间了,而且非常稳定可靠。它的语法相比 BSD 上的 pf 等其他防火墙来说并不那么友好。不过,它确实能完成任务,而且你会逐渐熟练掌握它的使用方法。UFW (Uncomplicated FireWall,简易防火墙)对于那些只想应用一些简单规则的用户来说是一个不错的选择。UFW 会自动生成 iptables 所需的规则。

防火墙方案优点缺点适用场景
iptables功能极其强大、灵活,底层实现语法复杂,学习曲线陡峭需要精细控制网络流量、构建复杂规则的高级用户和脚本环境
UFW简单易用,基于iptables,命令直观功能相对有限,无法实现极其复杂的规则桌面用户、初级服务器管理员、需要快速设置基本防火墙的场景
nftablesiptables的替代者,语法更清晰,性能更好相对较新,部分旧教程不适用希望使用现代防火墙框架的用户,是未来的主流趋势

为什么要在Ubuntu上使用防火墙?

使用防火墙的一个重要原因是保护本地子网中的其他系统免受攻击。假设您在所有服务器上启用了 SSH,并在网络防火墙上过滤了 SSH 流量。其他系统仍然可以在内部使用该服务。一旦某个系统遭到入侵,其他系统也可能受到影响。因此,一种解决方案是仅允许来自预定义系统(例如堡垒主机,也称为跳板服务器或跳板服务器)的 SSH 连接。

使用 iptables 或其他防火墙解决方案的另一个原因是阻止恶意流量。当然,如果能在网络层面进行拦截就更好了,但有时只有接收系统才能判断流量的合法性。尤其是在流量加密的情况下,例如 HTTPS。接收服务器对流量的走向有更清晰的了解,如果某个客户端发送了过多无效或恶意请求,接收服务器可能会决定阻止该客户端的访问。

一个基本的iptables配置可能如下所示:

# Accept all incoming traffic on local interface  
iptables -A INPUT -I lo -j ACCEPT

下一步是允许流量访问我们的服务:

# Allow traffic to SSH (to port 2222), SMTP (25), and our web server (80, 443)  
iptables -A INPUT -p tcp -m tcp -dport 2222 -m state -state NEW,ESTABLISHED -j ACCEPT  
iptables -A INPUT -p tcp -m tcp -dport 25 -m state -state NEW,ESTABLISHED -j ACCEPT  
iptables -A INPUT -p tcp -m tcp -dport 80 -m state -state NEW,ESTABLISHED -j ACCEPT  
iptables -A INPUT -p tcp -m tcp -dport 443 -m state -state NEW,ESTABLISHED -j ACCEPT

最后,丢弃输入 链中的所有其他流量:

iptables -A INPUT -j DROP

这种简单的配置只是一个开始。它仍然允许出站流量,这些流量可能也需要进行一些过滤。

专家建议:对于生产环境,应始终配置 默认拒绝(Deny by Default) 策略。即先禁止所有流量,再根据业务需求逐条放行必要的端口和服务。使用 iptables-saveiptables-restore 命令持久化规则,并建议编写启动脚本以确保服务器重启后规则自动生效。UFW用户可以简单地使用ufw default deny incomingufw default allow outgoing命令。

使用 AppArmor 安全框架

SELinux 和 AppArmor 是两个知名的Linux 安全框架。在 Debian 和 Ubuntu 系统上选择使用哪个框架很简单,因为只有 AppArmor 可用。这是因为 Linux 内核只编译了对 AppArmor 的支持。

如果您真的想加强 Ubuntu 系统的安全性,那么 AppArmor 是一个不错的选择。这个框架定义了正在运行的进程可以执行哪些操作或访问哪些资源。您可以把它想象成一个狱警,持续监控囚犯,确保他们只进行允许的活动。允许的活动及其相关进程都存储在策略文件中。

要确定 AppArmor 的当前状态,请使用该aa-status命令。

请在 Linux 安全框架部分阅读更多关于AppArmor 的信息。

AppArmor模式:禁用、发出警告或强制执行

AppArmor 可以运行三种不同的模式。第一种是 禁用模式 。在此模式下,AppArmor 将忽略策略,不会限制任何进程。在 警告 模式下,AppArmor 将执行监控,并且仅在进程执行未经授权的操作时发出通知。限制最严格的模式是 强制 模式。所有未经授权的操作都将被阻止并记录。

模式行为日志记录适用场景
禁用 (Disabled)不加载任何策略完全关闭AppArmor,通常用于故障排查或性能敏感且已通过其他方式加固的环境
警告 (Complain)允许所有操作,但记录违规记录所有违规尝试推荐用于初始阶段,用于观察和调试策略,确保不会误杀正常应用
强制执行 (Enforce)阻止未授权的操作并记录记录所有被阻止的操作生产环境下的推荐模式,主动防御零日漏洞或应用缺陷

要了解有关 AppArmor 的更多信息,请参阅AppArmor 服务器指南。

注意事项:AppArmor的策略文件(位于/etc/apparmor.d/)需要精心编写和维护。在切换到强制模式前,务必在警告模式下运行足够长的时间,收集并分析日志(通常在/var/log/syslog中),确保所有正常的应用操作都不会被阻断。否则,可能会导致服务启动失败或功能异常。使用aa-genprofaa-logprof工具可以帮助你生成和更新策略。

系统安全的下一步措施

现在您已经完成了基本的 Ubuntu 安全加固措施,接下来需要进行以下步骤:

  • 实现 sudo:精细化授权,避免直接使用root账户。配置/etc/sudoers文件,为不同管理员分配最小化权限。
  • OpenSSH 安全性和加固:禁用root登录、禁用密码认证(改用密钥认证)、更改默认端口(22)、使用TCP Wrappers等。
  • 加强编译器和开发工具:在生产服务器上移除或限制gcc、make等工具,防止攻击者在本地编译恶意软件。
  • 检查恶意软件:定期使用clamavrkhunterchkrootkit等工具扫描系统,检测后门和Rootkit。
  • Web服务器加固:根据使用的服务(如Nginx、Apache),配置TLS/SSL强加密套件、隐藏版本信息、设置请求限制等。
  • 检测恶意流量:部署入侵检测/防御系统(IDS/IPS),如 SnortSuricata,对网络流量进行实时分析。
  • 安装文件完整性监控:使用 AIDETripwire 监控关键系统文件的哈希值,在文件被恶意篡改时发出警报。
  • 配置备份:制定并实施 3-2-1备份策略(3份数据,2种不同介质,1份异地存储),并定期测试恢复流程,确保数据可恢复性。
  • 为程序创建 AppArmor 配置文件:为自行部署的应用(如数据库、自定义服务)编写专属的AppArmor策略,实现最小权限隔离。
  • 对 Linux 系统进行深入的安全审计:使用 lynis 等自动化审计工具进行全面扫描,并根据报告建议进行持续改进。

专家建议:系统安全是一个持续的过程,而非一次性的任务。建议将上述步骤集成到服务器的 CI/CD(持续集成/持续部署) 流程中,实现安全配置的“基础设施即代码(IaC)”,确保每一次部署都符合安全基线。同时,关注Ubuntu官方和各大安全社区的最新动态,及时应对新出现的威胁。

本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/anquan/9549.html

联系我们

在线咨询:点击这里给我发消息

Q Q:2220678578