Linux系统安全加固指南(三)

文章详细介绍了Linux系统安全强化的各种方法,包括分区和挂载选项的设置以限制权限,增强熵的生成以保障加密安全性,避免以root身份编辑文件以防止恶意利用,以及针对特定发行版的安全配置如HTTP包管理器镜像和APT的seccomp-bpf。物理安全方面,讨论了全盘加密、BIOS/UEFI强化、引导加载程序的保护和验证引导的重要性。文章还提到了针对USB、DMA攻击的防范措施,以及冷启动攻击的缓解策略。
摘要由CSDN通过智能技术生成

目录

— 17 —

分区和挂载选项

— 18 —

— 19 —

以root身份编辑文件

— 20 —

特定发行版的安全强化

HTTP包管理器镜像

APT seccomp-bpf

— 21 —

物理安全

BIOS / UEFI强化

Bootloader密码

验证引导

USBs

DMA攻击

冷启动攻击

— 22 —

最佳实践

— 23 —

其他指南

— 24 —

术语

— 25 —

能力


17

分区和挂载选项

文件系统应分为多个分区,以对其权限进行细粒度控制。可以添加不同的安装选项以限制可以执行的操作:

nodev - 禁止使用设备

nosuid - 禁止setuid或setgid位

noexec - 禁止执行任何二进制文件

这些安装选项应在/etc/fstab中尽可能设置。如果您不能使用单独的分区,请创建绑定挂载。一个更安全的/etc/fstab的示例:

/        /          ext4    defaults                              1 1
/home    /home      ext4    defaults,nosuid,noexec,nodev          1 2
/tmp     /tmp       ext4    defaults,bind,nosuid,noexec,nodev     1 2
/var     /var       ext4    defaults,bind,nosuid                  1 2
/boot    /boot      ext4    defaults,nosuid,noexec,nodev          1 2

请注意,可以通过shell脚本绕过noexec[11]。

18

熵基本上反应操作系统信息收集的随机程度,对于诸如加密之类的事情至关重要。因此,最好通过安装其他随机数生成器(如haveged和jitterentropy)从各种来源收集尽可能多的熵。

为了使jitterentropy正确运行,必须通过创建/usr/lib/modules-load.d/jitterentropy.conf并添加以下内容尽早加载内核模块:

jitterentropy_rng

RDRAND

RDRAN是提供随机数的CPU指令。如果可用,内核会自动将其用作熵源。但是由于它是专有的并且是CPU本身的一部分,因此无法审核和验证其安全性。您甚至无法对代码进行反向工程。该RNG以前曾遭受过漏洞的攻击,其中有些可能是后门攻击。通过设置以下引导参数可以不信任此功能:

random.trust_cpu=off

19

以root身份编辑文件

建议不要以root用户身份运行普通的文本编辑器。大多数文本编辑器可以做的不仅仅是简单地编辑文本文件,而且还可以被利用。例如,以root身份打开vi并输入:sh。现在,您具有一个可以访问整个系统的root shell,攻击者可以轻松利用该shell。

解决方案是使用sudoedit。这会将文件复制到一个临时位置,以普通用户身份打开文本编辑器,编辑该临时文件并以root用户身份覆盖原始文件。这样,实际的编辑器就不会以root身份运行。要使用sudoedit,执行:

sudoedit $path_to_file

默认情况下,它使用vi,但是可以通过EDITOR或SUDO_EDITOR环境变量来切换默认编辑器。例如,要使用nano,请执行:

EDITOR=nano sudoedit $path_to_file

可以在/etc/environment中全局设置此环境变量。

20

特定发行版的安全强化

HTTP包管理器镜像

默认情况下,Linux发行版通常使用HTTP或HTTP和HTTPS镜像的混合来从其软件存储库下载软件包。人们认为这很好,因为程序包管理器会在安装前验证程序包的签名。但是,从历史上看,已经有很多绕过此方法的地方。您应将软件包管理器配置为从HTTPS镜像专门下载以进行深度防御。

APT seccomp-bpf

自软件包管理器Debian Buster以来,APT已支持可选的seccomp-bpf过滤。这限制了允许执行APT的系统调用,这可能严重限制攻击者尝试利用APT中的漏洞时对系统造成危害的能力。要启用此功能,请创建/etc/apt/apt.conf.d/40sandbox并添加:

APT::Sandbox::Seccomp "true";

21

物理安全

全盘加密可确保对驱动器上的所有数据进行加密,并且不会被物理攻击者读取。大多数发行版都支持在安装过程中启用加密,请确保设置了强密码。您也可以使用dm-crypt手动加密驱动器。

请注意,全盘加密不包括/boot,这样仍然可以修改内核、引导加载程序和其他关键文件。为了完全防止篡改,您还必须实施经过验证的引导。

BIOS / UEFI强化

如果您仍在使用旧版BIOS,则应迁移到UEFI,以利用较新的安全功能。大多数BIOS或UEFI实现都支持设置密码。最好启用它并设置一个非常强壮的密码。虽然这是很弱的保护,因为重置密码很简单。它通常存储在易失性内存中,因此攻击者只需要能够卸下CMOS电池几秒钟,或者他们就可以使用某些主板上的跳线将其重置。

您还应该禁用所有未使用的设备和引导选项,例如USB引导,以减少攻击面。

别忽略BIOS或UEFI的更新,确保将其更新。将其与常规操作系统更新一样重要。

此外,请参阅《NSA的硬件和固件安全指南[12]》

Bootloader密码

引导加载程序会在引导过程的早期执行,并负责加载操作系统。保护它非常重要,否则,它可能会被篡改。例如,本地攻击者可以通过在启动时使用init=/bin/bash作为内核参数来轻松获得root shell,该命令告诉内核执行/bin/bash而不是常规的init系统。您可以通过为引导加载程序设置密码来防止这种情况。仅设置引导程序密码不足以完全保护它。还必须按照以下说明设置经过验证的启动。

Grub:

要为GRUB设置密码,请执行:

grub-mkpasswd-pbkdf2

输入您的密码,该密码将生成一个字符串。它将类似于“ grub.pbkdf2.sha512.10000.C4009... “ 。创建/etc/grub.d/40_password并添加:

set superusers="$username"
password_pbkdf2 $username $password

用grub-mkpasswd-pbkdf2生成的字符串替换“ password”。“ username”将用于被允许使用GRUB命令行,编辑菜单项和执行任何菜单项的超级用户。对于大多数人来说,这只是“root”。

重新生成您的配置文件,GRUB现在将受到密码保护。

要仅限制编辑引导参数并访问GRUB控制台,同时仍然允许您引导,请编辑 /boot/grub/grub.cfg并在 “menuentry '$OSName' ”旁边添加“ --unrestricted”参数。

menuentry 'Arch Linux' --unrestricted

您将需要再次重新生成配置文件以应用此更改。

Syslinux:

Syslinux可以设置主密码或菜单密码。引导任何条目都需要主密码,而引导特定条目仅需要菜单密码。

要为Syslinux设置主密码,请编辑/boot/syslinux/syslinux.cfg并添加:

MENU MASTER PASSWD $password

要设置菜单密码,请编辑/boot/syslinux/syslinux.cfg,并在带有您要密码保护的项目的标签内,添加:

MENU PASSWD $password

将“$password”替换为您要设置的密码。

这些密码可以是纯文本,也可以使用MD5,SHA-1,SHA-256或SHA-512进行散列。建议先使用强哈希算法(例如SHA-256或SHA-512)对密码进行哈希处理,以避免将其存储为明文形式。

systemd-boot:

systemd-boot具有防止在引导时编辑内核参数的选项。在loader.conf文件中,添加:

editor no

systemd-boot并不正式支持保护内核参数编辑器的密码,但是您可以使用systemd-boot-password来实现。

验证引导

经过验证的引导通过密码验证来确保引导链和基本系统的完整性。这可用于确保物理攻击者无法修改设备上的软件。

如果没有经过验证的引导,则一旦获得物理访问权限,就可以轻松绕过上述所有预防措施。经过验证的引导不仅像许多人认为的那样是为了物理安全。它还可以用于防止远程恶意软件持久化——如果攻击者设法破坏了整个系统并获得了很高的特权,则经过验证的引导将在重新引导后还原其更改,并确保它们无法持久化。

经过验证的最常见的引导实现是UEFI安全引导,但是它本身并不是一个完整的实现,因为它仅会验证引导加载程序和内核,这意味着可以通过以下方法:

仅UEFI安全启动就没有一成不变的信任根,因此物理攻击者仍然可以刷新设备的固件。为了减轻这种情况,请结合使用UEFI安全启动和Intel Boot Guard或AMD Secure Boot。

远程攻击者(或不使用加密的物理攻击者)可以简单地修改操作系统的任何其他特权部分。例如,如果他们有修改内核的特权,那么他们也可以修改/sbin/init来有效地获得相同的结果。因此,仅验证内核和引导加载程序不会对远程攻击者产生任何影响。为了减轻这种情况,您必须使用dm-verity验证基本操作系统,尽管由于传统Linux发行版的布局,这非常困难且笨拙。

通常,很难在传统Linux上实现可靠的经过验证的引导实现。

USBs

USB设备为物理攻击提供了重要的攻击面。例如BadUSB和Stuxnet是此类攻击的范例。最佳实践是禁止所有新连接的USB且仅将受信任设备列入白名单,USBGuard对此非常有用。

您也可以将nousb用作内核引导参数,以禁用内核中的所有USB支持。可以sysctl设置kernel.deny_new_usb=1

DMA攻击

直接内存访问(DMA)攻击涉及通过插入某些物理设备来完全访问所有系统内存。这可以通过控制设备可访问的内存区域的IOMMU或将特别易受攻击的内核模块列入黑名单来缓解。

要启用IOMMU,请设置以下内核引导参数:

intel_iommu=on amd_iommu=on

您只需要为特定的CPU制造商启用该选项,但同时启用这两个选项就没有问题。

efi=disable_early_pci_dma

通过在非常早的启动过程中禁用所有PCI桥接器上的busmaster位,此选项可修复上述IOMMU中的漏洞[13]。

此外,Thunderbolt和FireWire通常容易受到DMA攻击。要禁用它们,请将这些内核模块列入黑名单:

install firewire-core /bin/false
install thunderbolt /bin/false

冷启动攻击

当攻击者在擦除RAM中的数据之前对其进行分析时,就会发生冷启动攻击。使用现代RAM时,冷启动攻击不太实用,因为RAM通常会在几秒钟或几分钟内清除,除非将其放入冷却液(如液氮或冷冻机)中。攻击者必须在几秒钟内将设备中的RAM棒拔出并将其暴露于液氮中,而且确保用户不会注意到。

如果冷启动攻击是威胁模型的一部分,请在关机后保护计算机几分钟,以确保没有人可以访问您的RAM记忆棒。您也可以将RAM棒焊接到主板上,以使其更难以卡住。如果使用笔记本电脑,请取出电池,然后直接用充电电缆供电。关机后请拔出电缆,以确保RAM彻底断电无法访问。

在内核自我保护启动参数部分中,空闲时内存清零选项将用零覆盖内存中的敏感数据。此外,强化的内存分配器可以通过CONFIG_ZERO_ON_FREE配置选项清除用户空间堆内存中的敏感数据。尽管如此,某些数据仍可能保留在内存中。

此外,现代内核还包括复位攻击缓解措施,该命令可命令固件在关机时擦除数据,尽管这需要固件支持。

确保正常关闭计算机,以使上述缓解措施可以开始。

如果以上都不适用您的威胁模型,则可以实施Tails的内存擦除过程,该过程将擦除大部分内存(视频内存除外),并且已被证明是有效的。

22

最佳实践

一旦对系统进行了尽可能多的加固,就应该遵循良好的隐私和安全性惯例:

禁用或删除不需要的东西以最小化攻击面。

保持更新。配置cron任务或init脚本以每天更新系统。

不要泄漏有关您或您的系统的任何信息,无论它看起来多么渺小。

遵循常规的安全和隐私建议[14]

尽管已经进行了强化,但您必须记住Linux仍然是一个有缺陷的操作系统,没有任何强化可以完全修复它。

23

其他指南

您应该进行尽可能多的研究,而不要依赖单一的信息来源。最大的安全问题之一就是用户。这些是我认为有价值的其他指南的链接:

  • https://wiki.archlinux.org/index.php/Security
  • https://www.whonix.org/wiki/Documentation
  • https://apps.nsa.gov/iaarchive/library/ia-guidance/security-configuration/operating-systems/guide-to-the-secure-configuration-of-red-hat-enterprise.cfm
  • https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project/Recommended_Settings
  • https://github.com/a13xp0p0v/kconfig-hardened-check/

24

术语

您可能需要重新生成GRUB配置,以应用对引导加载程序所做的某些更改。在不同的发行版之间,执行此操作的步骤有时可能会有所不同。例如,在诸如Arch Linux之类的发行版上,应通过执行以下命令来重新生成配置文件:

grub-mkconfig -o $path_to_grub_config

“$path_to_grub_config”取决于您如何设置系统。它通常是/boot/grub/grub.cfg或/boot/EFI/grub/grub.cfg,但是在执行此命令之前,请务必确保正确。

另外,在Debian或Ubuntu等发行版上,您应该执行以下命令:

update-grub

25

能力

在Linux内核中,“ root特权”分为各种不同的能力(capabilities)。这在应用最小特权原则时很有帮助——可以给它们仅授予特定的子集,而不是授予进程总的root特权。例如,如果程序只需要设置系统时间,则只需要CAP_SYS_TIME而不是root所有能力。这会限制可能造成的损害,但是,您仍必须谨慎授予能力,因为无论如何,其中许多能力可能会被滥用以获取完整的root特权。

相关链接:

  1. https://github.com/Whonix/security-misc/blob/master/lib/systemd/system/hide-hardware-info.service
  2. https://www.whonix.org/wiki/Hardened-kernel
  3. https://gitlab.com/apparmor/apparmor/-/wikis/Documentation
  4. https://madaidans-insecurities.github.io/linux.html#firejail
  5. https://www.freedesktop.org/software/systemd/man/systemd.exec.html
  6. https://www.whonix.org/wiki/KVM#Why_Use_KVM_Over_VirtualBox.3F
  7. https://www.whonix.org/wiki/Hardened_Malloc
  8. https://lists.llvm.org/pipermail/cfe-dev/2020-April/065221.html
  9. https://wiki.archlinux.org/index.php/Iptables
  10. https://linux.die.net/man/8/iptables
  11. https://chromium.googlesource.com/chromiumos/docs/+/master/security/noexec_shell_scripts.md
  12. https://github.com/nsacyber/Hardware-and-Firmware-Security-Guidance
  13. https://mjg59.dreamwidth.org/54433.html
  14. https://madaidans-insecurities.github.io/security-privacy-advice.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值