目录
— 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特权。
相关链接:
- https://github.com/Whonix/security-misc/blob/master/lib/systemd/system/hide-hardware-info.service
- https://www.whonix.org/wiki/Hardened-kernel
- https://gitlab.com/apparmor/apparmor/-/wikis/Documentation
- https://madaidans-insecurities.github.io/linux.html#firejail
- https://www.freedesktop.org/software/systemd/man/systemd.exec.html
- https://www.whonix.org/wiki/KVM#Why_Use_KVM_Over_VirtualBox.3F
- https://www.whonix.org/wiki/Hardened_Malloc
- https://lists.llvm.org/pipermail/cfe-dev/2020-April/065221.html
- https://wiki.archlinux.org/index.php/Iptables
- https://linux.die.net/man/8/iptables
- https://chromium.googlesource.com/chromiumos/docs/+/master/security/noexec_shell_scripts.md
- https://github.com/nsacyber/Hardware-and-Firmware-Security-Guidance
- https://mjg59.dreamwidth.org/54433.html
- https://madaidans-insecurities.github.io/security-privacy-advice.html