资讯详情

Linux操作系统加固

如何尽可能Linux安全隐私?

以下列出的所有命令都将需要root特权。以“$符号开头的单词表示变量,不同的终端可能会有所不同。

一、

选个好的Linux发行版有很多因素。

  • 避免分发冻结程序包,因为它们通常落后于安全更新。

  • 不使用与Systemd发行机制版。Systemd它包含了许多不必要的攻击面;它尝试做的远远超出了必要和初始化系统应该做的。

  • 使用musl作为默认的C库。Musl专注于最小化会导致很小的攻击面,而其他C库(如glibc)过于复杂,容易产生漏洞。例如,与musl与极少数漏洞相比,glibc公开披露了100多个漏洞。尽管仅靠披露CVE本身通常是不准确的统计信息,但有时这种情况有时可以用来表示过分的问题。Musl利用缓解措施,特别是其新的强化内存分配器,也有很好的漏洞。

  • 默认情况下最好使用LibreSSL而不是OpenSSL的发行版。OpenSSL它包含大量完全不必要的攻击面,并遵循不良的安全做法。例如,它仍然保持着OS / 2和VMS支持这些有几十年历史的古老操作系统。这些烦人的安全做法导致了可怕的事情Heartbleed漏洞。LibreSSL是OpenBSD团队的OpenSSL它采用了优秀的编程实践,消除了许多攻击面。在LibreSSL在成立的第一年,它缓解了许多漏洞,包括一些高度严重的漏洞。

最为强化操作系统基础的最佳发行版本是Gentoo Linux,因为它可以让你准确地配置系统,以达到理想的效果,这将非常有用,特别是指我们在下一章中使用更安全的编译标志。

但是,由于Gentoo对许多人来说,巨大的可用性缺陷可能并不容易。在这种情况下,Void Linux的Musl构建是一个很好的折衷方案。

二、

核心是操作系统的核心,不幸的是容易受到攻击。Brad Spengler正如我曾经说过的,它可以被视为系统中最大、最容易攻击的setuid根二进制文件。因此,尽可能多地加强核心是非常重要的。

Linux内核以稳定和长期支持两种主要形式发布:(LTS)。稳定版是比较新的版本,LTS发行版本是一个旧的稳定版本,长期以来一直得到支持。选择上述任何发行版本都有很多后果。

Linux内核未使用CVE识别安全漏洞。这意味着大多数安全漏洞的修复程序不能移植到后面LTS内核。但是稳定版包括到目前为止所有的安全修复。

然而,有了这些修复程序,稳定的核心将包含更多的新功能,从而大大增加了核心的攻击面,并引入了大量的新错误。LTS由于这些功能没有不断增加,内核的攻击面较小。

此外,稳定的内核还包括更新的强化功能,以减轻LTS内核没有一些用途。这些功能的一些示例是Lockdown LSM和STACKLEAK GCC插件。

总之,选择稳定或稳定LTS内核需要权衡选择。LTS核心具有较少的强化功能,并不是所有的公共错误修复都被移植到后面,但通常攻击面较少,不太可能引入未知的错误。

稳定的核心具有更多的强化功能,包括所有已知的错误修复,但它也有更多的攻击面和更多未知错误的机会。最后,最好使用更新的LTS分支(如4.19内核)。

sysctl允许用户配置某些核心设置,并使用各种安全功能或禁用危险功能来减少攻击面。您可以临时更改设置:

sysctl-w$tunable=$value

要永久更改sysctls,你可以改变sysctls添加到/etc/sysctl.conf或/etc/sysctl.d相应的文件取决于你Linux发行版。

以下是您应该更改的建议sysctl设置。

kernel self-protection:

kernel.kptr_restrict=2

内核指针指向内核内存的特定位置。这些可能对使用核心非常有用,但默认情况下不会隐藏核心指针。例如,通过阅读/proc/kallsyms它们的内容很容易找到。本设置旨在减少内核指针泄漏。另外,您可以设置它kernel.kptr_restrict = 1以仅从没有CAP_SYSLOG内核指针隐藏在功能过程中。

kernel.dmesg_restrict=1

dmesg它是一个核心日志,它披露了大量有用的核心调试信息,但它通常泄露敏感信息,如核心指针。更改上述信息sysctl设置将限制内核日志CAP_SYSLOG功能。

kernel.printk=3333

尽管dmesg_restrict内核日志在启动过程中仍将显示在控制台中。在指导过程中记录屏幕的恶意软件可能会滥用恶意软件以获得更高的特权。该选项可以防止这些信息泄露。它必须与下面描述的一些指导参数结合使用,才能完全有效。

kernel.unprivileged_bpf_disabled=1 net.core.bpf_jit_harden=2

eBPF暴露了很大的攻击面,需要限制。这些系统将被限制eBPF限制为CAP_BPF功能(在5.8之前的内核版本是CAP_SYS_ADMIN),并启用JIT常量绑定等强化技术。

dev.tty.ldisc_autoload=0

这将加载TTY规则限制为CAP_SYS_MODULE防止非特权攻击者使用功能TIOCSETD ioctl加载易受攻击的线路规则TIOCSETD ioctl以前滥用过很多漏洞。

vm.unprivileged_userfaultfd=0

serfaultfd() 经常滥用系统调用事后使用(use-after-free)缺陷。所以,该sysctl用于将此syscall限制为CAP_SYS_PTRACE功能。

kernel.kexec_load_disabled=1

kexec在运行过程中,用于引导另一个内核的系统调用。可滥用此功能加载恶意内核,并在内核模式下获得任何代码执行能力,因此应该sysctl设置将被禁止。

kernel.sysrq=4

SysRq密钥向非特权用户披露了许多潜在的危险调试功能。与通常的假设相反,SysRq不仅是物理攻击,还有远程触发。sysctl值使用户只能使用SAK安全访问密钥root这是必不可少的。或者,您可以简单地将值设置为0以完全禁用SysRq。

kernel.unprivileged_userns_clone=0

用户名空间是核心的一个功能,旨在改进沙箱,使非特权用户容易访问。然而,该功能披露了重要的核心攻击面来升级特权,因此应该sysctl限制用户名空间的使用CAP_SYS_ADMIN功能。对于无特权的沙箱,建议使用具有很少攻击面的setuid二进制文件可以最大限度地降低特权升级的可能性。本主题将在沙箱章节中进一步讨论。

尽管如此,请注意sysctl仅在某些Linux它存在于发行版本中,因为它需要内核补丁。如果您的内核不包括此补丁,可以设置user.max_user_namespaces = 完全禁用户名空间(包括0)root用户)。

kernel.unprivileged_userns_clone=0

能量使用事件会增加大量的内核攻击面,导致大量的漏洞。sysctl设置限制性能事件的所有使用CAP_PERFMON功能(5.8之前的核版本是CAP_SYS_ADMIN)。

请注意,此sysctl设置需要在某些发行版中具备相关的内核补丁。否则,此设置等效于kernel.perf_event_paranoid = 2.它仅限此功能的子集。

网络:

net.ipv4.tcp_syncookies=1

有助于预防SYN泛洪攻击是拒绝服务攻击的一种形式。在这种攻击中,攻击者发送了大量虚假攻击SYN要求,尽量消耗足够的资源,使系统不响应合法流量。

net.ipv4.tcp_rfc1337=1

这是通过丢弃处于时间等待状态的套接字来实现的RST防止数据包time-wait状态。

net.ipv4.conf.all.rp_filter=1 net.ipv4.conf.default.rp_filter=1

为了验证从计算机所有网络接口接收到的数据包,这些都启用了源验证。

net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.default.accept_redirects=0 net.ipv4.conf.all.secure_redirects=0 net.ipv4.conf.default.secure_redirects=0 net.ipv6.conf.all.accept_redirects=0 net.ipv6.conf.default.accept_redirects=0 net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.default.send_redirects=0

禁止使用这些设置ICMP重定向,防止中间人攻击,最大限度地减少信息泄露。

net.ipv4.icmp_echo_ignore_all=1

这个设置使您的系统忽略了所有ICMP要求避免Smurf攻击使设备更加困难网络上枚举,并防止通过ICMP时间戳识别时钟指纹。

net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.default.accept_source_route=0

源路由是一种允许用户重定向网络流量的机制。由于这可用于执行中间人攻击,在中间人攻击中,出于恶意目的将流量重定向,因此上述设置将会禁用此功能。

net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.default.accept_ra=0

恶意的IPv6路由广告可能会导致中间人攻击,因此应将其禁用。

net.ipv4.tcp_sack=0
net.ipv4.tcp_dsack=0
net.ipv4.tcp_fack=0

禁用TCP SACK。ACK通常被利用,并且在许多情况下是不必要的,因此如果您不需要它,则应将其禁用。

用户空间:

kernel.yama.ptrace_scope=2

ptrace是一个系统调用,它允许程序调试、修改和检查另一个正在运行的进程,从而使攻击者可以轻易修改其他正在运行的程序的内存。设置将ptrace的使用限制为仅具有CAP_SYS_PTRACE功能的进程。或者,将sysctl设置为3以完全禁用ptrace。

vm.mmap_rnd_bits=32
vm.mmap_rnd_compat_bits=16

ASLR是一种常见的漏洞利用缓解措施,它可以使进程的关键部分在内存中的位置随机化。这可能会使各种各样的漏洞利用更困难,因为它们首先需要信息泄漏。上述设置增加了用于mmap ASLR的熵的位数,从而提高了其有效性。

这些sysctls的值必须根据CPU体系结构进行设置。以上值与x86兼容,但其他体系结构可能有所不同。

fs.protected_symlinks=1
fs.protected_hardlinks=1

仅当在可全局写入的粘性目录之外,当符号链接和关注者的所有者匹配或目录所有者与符号链接的所有者匹配时,才允许遵循符号链接。这还可以防止没有对源文件的读/写访问权限的用户创建硬链接。这两者都阻止了许多常见的TOCTOU漏洞(time-of-check-to-time-of-use)。

fs.protected_fifos=2
fs.protected_regular=2

这些阻止了在可能由攻击者控制的环境(例如,全局可写目录)中创建文件,从而使数据欺骗攻击更加困难。

引导参数在引导时使用引导加载程序(bootloader)将设置传递给内核。类似于sysctl,可以使用某些设置来提高安全性。引导加载程序通常在引导参数设置方式上有所不同。下面列出了一些示例,但是您应该研究特定bootloader的修改参数的必要步骤。

如果使用GRUB作为引导程序,请编辑/etc /default/grub并将参数添加到GRUB_CMDLINE_LINUX_DEFAULT=line。

如果使用Syslinux,请编辑/boot/syslinux/syslinux.cfg并将它们添加到APPEND行中。

如果使用systemd-boot,请编辑您的加载程序条目,并将其附加到linux行的末尾。

建议使用以下设置以提高安全性。

Kernel self-protection:

slab_nomerge

这将禁用slab合并,这将通过防止覆盖合并的缓存中的对象并使其更难以影响slab缓存的布局,从而大大增加了堆利用的难度。

slub_debug=FZ

这些启用健全性检查(F)和重新分区(Z)。健全性检查会添加各种检查,以防止某些slab操作中的损坏。重新分区会在slab周围添加额外的区域,以检测slab何时被覆盖超过其实际大小,从而有助于检测溢出。

init_on_alloc=1 init_on_free=1

这样可以在分配和空闲时间期间将内存清零,这可以帮助减轻使用后使用的漏洞并清除内存中的敏感信息。如果您的内核版本低于5.3,则这些选项不存在。而是在上述slub_debug选项后面附加“ P”,以获得slub_debug=FZP并添加page_poison=1。由于它们实际上是一种调试功能,刚好具有一些安全性,因此它们在释放时提供的内存擦除形式较弱。

page_alloc.shuffle=1

此选项使页分配器空闲列表随机化,从而通过降低页分配的可预测性来提高安全性,同时这也提高了性能。

pti=on

这将启用内核页表隔离,从而减轻崩溃并防止某些KASLR绕过。

vsyscall=none

这将禁用vsyscall,因为它们已过时且已被vDSO取代。vsyscall也在内存中的固定地址上,使其成为ROP攻击的潜在目标。

debugfs=off

这将禁用debugfs,它会公开许多有关内核的敏感信息。

oops=panic

有时某些内核漏洞利用会导致所谓的“oops”。此参数将引发内核对此类事件panic,从而防止这些攻击。但是,有时错误的驱动程序会导致无害的操作,这会导致系统崩溃,这意味着此引导参数只能在某些硬件上使用。

module.sig_enforce=1

这仅允许加载已使用有效密钥签名的内核模块,使加载恶意内核模块更加困难。

这可以防止加载所有树外内核模块(包括DKMS模块),除非您已对其进行签名,这意味着诸如VirtualBox或Nvidia驱动程序之类的模块可能不可用,但根据您的设置可能并不重要。

lockdown=confidentiality

内核定LSM可以消除用户空间代码滥用以升级为内核特权并提取敏感信息的许多方法。为了在用户空间和内核之间实现清晰的安全边界,此LSM是必需的。上面的选项在confidentiality模式(最严格的选项)中启用此功能。这意味着module.sig_enforce=1。

mce=0

这将导致内核对ECC内存中无法利用的错误panic,而这些错误可能会被利用。对于没有ECC内存的系统,这是不必要的。

quiet loglevel=0

这些参数可防止引导期间信息泄漏,并且必须与上面的kernel.printk sysctl结合使用。

CPU缓解:

最好启用适用于您的CPU的所有CPU缓解措施,以确保您不受已知漏洞的影响。这是启用所有内置缓解措施的列表:

spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force

您必须研究系统受其影响的CPU漏洞,并相应地选择上述缓解措施。请记住,您将需要安装微代码更新,以完全免受这些漏洞的影响。但所有这些操作都可能导致性能显着下降。

结果:

如果遵循了以上所有建议(不包括特定的CPU缓解措施),则将具有:

slab_nomerge slub_debug=FZ init_on_alloc=1 init_on_free=1 page_alloc.shuffle=1 pti=on vsyscall=none debugfs=off oops=panic module.sig_enforce=1 lockdown=confidentiality mce=0 quiet loglevel=0

如果将GRUB用作引导加载程序,则可能需要重新生成GRUB配置文件才能应用这些文件。

proc是一个伪文件系统,其中包含有关系统上当前正在运行的所有进程的信息。默认情况下,所有用户都可以访问此程序,这可能使攻击者可以窥探其他进程。

要只允许用户看到自己的进程,而不能看到其他用户的进程,则必须使用hidepid=2,gid=proc挂载选项来挂载/proc。gid=proc将proc组从此功能中排除,因此您可以将特定的用户或进程列入白名单。添加这些选项的一种方法是编辑/etc/fstab并添加:

proc /proc proc nosuid,nodev,noexec,hidepid=2,gid=proc 0 0

systemd-logind仍然需要查看其他用户的进程,因此,要使用户会话在systemd系统上正常工作,必须创建/etc/systemd/system/systemd-logind.service.d/hidepid.conf 并添加:

[Service]
SupplementaryGroups=proc

最好禁用不是绝对必要的任何功能,以最大程度地减少潜在的内核攻击面。这些功能不必一定很危险,它们可以只是被删除以减少攻击面的良性代码。切勿禁用您不了解的随机事物。以下是一些可能有用的示例,具体取决于您的设置。

引导参数:

引导参数通常可以用来减少攻击面,这样的例子之一是:

ipv6.disable=1

这将禁用整个IPv6堆栈,如果您尚未迁移到该堆栈,则可能不需要该堆栈。如果正在使用的IPv6,请不要使用此引导参数。

将内核模块列入黑名单:

内核允许非特权的用户通过模块自动加载来间接导致某些模块被加载。这使攻击者可以自动加载易受攻击的模块,然后加以利用。一个这样的示例是CVE-2017-6074,其中攻击者可以通过启动DCCP连接来触发DCCP内核模块的加载,然后利用该内核模块中的漏洞。

可以通过将文件插入/etc/modprobe.d并将指定的内核模块列入黑名单的方法,将特定的内核模块列入黑名单。

Install参数告诉modprobe运行特定命令,而不是像往常一样加载模块。/bin/false是仅返回1的命令,该命令实际上不会执行任何操作。两者都告诉内核运行/bin/false 而不是加载模块,这将防止攻击者利用该模块。以下是最有可能不需要的内核模块:

install dccp /bin/false
install sctp /bin/false
install rds /bin/false
install tipc /bin/false
install n-hdlc /bin/false
install ax25 /bin/false
install netrom /bin/false
install x25 /bin/false
install rose /bin/false
install decnet /bin/false
install econet /bin/false
install af_802154 /bin/false
install ipx /bin/false
install appletalk /bin/false
install psnap /bin/false
install p8023 /bin/false
install p8022 /bin/false
install can /bin/false
install atm /bin/false

特别是模糊的网络协议会增加大量的远程攻击面。此黑名单:

DCCP — Datagram Congestion Control Protocol 
SCTP — Stream Control Transmission Protocol 
RDS — Reliable Datagram Sockets 
TIPC — Transparent Inter-process Communication 
HDLC — High-Level Data Link Control 
AX25 — Amateur X.25 
NetRom 
X25 
ROSE 
DECnet 
Econet 
af_802154 — IEEE 802.15.4 
IPX — Internetwork Packet Exchange 
AppleTalk 
PSNAP — Subnetwork Access Protocol 
p8023 — Novell raw IEEE 802.3
p8022 — IEEE 802.2
CAN — Controller Area Network 
ATM
install cramfs /bin/false
install freevxfs /bin/false
install jffs2 /bin/false
install hfs /bin/false
install hfsplus /bin/false
install squashfs /bin/false
install udf /bin/false

将各种稀有文件系统列入黑名单。

install cifs /bin/true
install nfs /bin/true
install nfsv3 /bin/true
install nfsv4 /bin/true
install gfs2 /bin/true

如果不使用网络文件系统,也可以将其列入黑名单。

install vivid /bin/false

vivid driver驱动程序仅用于测试目的,并且是特权提升漏洞的原因,因此应禁用它。

install bluetooth /bin/false
install btusb /bin/false

禁用具有安全问题历史记录的蓝牙。

install uvcvideo /bin/false

这会禁用网络摄像头,以防止其被用来监视您。

您也可以将麦克风模块列入黑名单,但这在系统之间可能会有所不同。要查找模块的名称,请在/proc/asound/modules中查找并将其列入黑名单。例如,一个这样的模块是snd_hda_intel。

请注意,尽管有时麦克风的内核模块与扬声器的模块相同。这意味着像这样禁用麦克风也可能会无意中禁用任何扬声器,虽然扬声器也有可能变成麦克风,所以这不一定是消极的结果。

最好从物理上删除这些设备,或者至少在BIOS/UEFI中禁用它们。禁用内核模块并不总是那么有效。

rfkill:

可以通过rfkill将无线设备列入黑名单,以进一步减少远程攻击面。要将所有无线设备列入黑名单,请执行:

rfkill block all

WiFi可以通过以下方式解锁:

rfkill unblock wifi

在使用systemd的系统上,rfkill在所有会话中均保持不变,但是,在使用其他init系统的系统上,您可能必须创建一个init脚本以在引导时执行这些命令。

前面的部分已经防止了一些内核指针泄漏,但是还有更多泄漏。

在文件系统上,/boot中存在内核映像和System.map文件。/usr/src和/{,usr/} lib/modules目录中还有其他敏感的内核信息。您应该限制这些目录的文件权限,以使它们只能由root用户读取。您还应该删除System.map文件,因为除高级调试外,它们都不需要。

此外,某些日志记录守护程序(例如systemd的journalctl)包括内核日志,可用于绕过上述dmesg_restrict保护。从adm组中删除用户通常足以撤销对以下日志的访问:

gpasswd -d $user adm

sysfs是伪文件系统,可提供大量的内核和硬件信息。它通常安装在/sys上。sysfs导致大量信息泄漏,尤其是内核指针泄漏。Whonix的security-misc软件包包括hide-hardware-info脚本,该脚本限制访问此目录以及/proc中的一些脚本,以试图隐藏潜在的硬件标识符并防止内核指针泄漏。

该脚本是可配置的,并允许基于组将特定的应用程序列入白名单。建议应用此方法,并使其在启动时使用init脚本执行。或者这样做成systemd服务。

为了使基本功能在使用systemd的系统上运行,必须将一些系统服务列入白名单。这可以通过创建/etc/systemd/system/user@.service.d/sysfs.conf并添加以下内容来完成:​​​​​​​

[Service]
SupplementaryGroups=sysfs

但是,这不能解决所有问题。许多应用程序可能仍会中断,您需要将它们正确列入白名单。

某些发行版(例如Arch Linux)包括强化的内核程序包。它包含许多强化补丁程序和更注重安全性的内核配置。如果可能的话,建议安装它。

Grsecurity是一组内核修补程序,可以大大提高内核安全性。这些补丁曾经可以免费获得,但是现在需要购买了。如果可用,则强烈建议您获取它。Grsecurity提供了最新的内核和用户空间保护。

Linux Kernel Runtime Guard(LKRG)是一个内核模块,可确保运行时内核的完整性并检测漏洞。它可以杀死整个类别的内核漏洞。但这并不是一个完美的缓解方法,因为LKRG在设计上可以绕开。它仅适用于现成的恶意软件。但是,尽管可能性不大,但LKRG本身可能会像其他任何内核模块一样公开新的漏洞。

建议编译您自己的内核,同时启用尽可能少的内核模块和尽可能多的安全性功能,以将内核的受攻击面保持在绝对最低限度。

另外,应用内核强化补丁,例如如上所述的linux-hardened或grsecurity。

发行版编译的内核还具有公共内核指针/符号,这对于漏洞利用非常有用。编译自己的内核将为您提供独特的内核符号,连同kptr_restrict,dmesg_restrict和其他针对内核指针泄漏的强化措施,将使攻击者更加难以创建依赖于内核指针知识的漏洞利用程序。

您就可以从Whonix的强化内核[2]中汲取灵感或使用它。

三、

强制访问控制(MAC)系统对程序可以访问的内容进行细粒度的控制。这意味着您的浏览器将无权访问您的整个主目录或类似目录。

最常用的MAC措施是SELinux和AppArmor。SELinux比AppArmor更安全,因为它的粒度更细。例如,它是基于inode而不是基于路径的,允许强制执行明显更严格的限制,可以过滤内核ioctl等。不幸的是,这是以难以使用和难以学习为代价的,因此某些人可能会首选AppArmor。

要在内核中启用AppArmor,必须设置以下引导参数:

apparmor=1 security=apparmor

要启用SELinux,请设置以下参数:

selinux=1 security=selinux

请记住,仅启用MAC措施本身并不能神奇地提高安全性。您必须制定严格的政策才能充分利用它。例如,要创建AppArmor配置文件,请执行:

aa-genprof $path_to_program

打开程序,然后像往常一样开始使用它。AppArmor将检测需要访问哪些文件,并将它们添加到配置文件中(如果您选择的话)。但是,仅凭这一点不足以提供高质量的配置文件。请参阅AppArmor文档以获取更多详细信息。

如果您想更进一步,则可以通过实施initramfs勾子来设置一个完整的系统MAC策略,该策略限制每个单个用户空间进程,该挂钩对init系统强制实施MAC策略。这就是Android使用SELinux的方式,以及Whonix未来将如何使用AppArmor的方式。对于加强实施最小特权原则的强大安全模型是必要的。

四、

沙箱可让您在隔离的环境中运行程序,该环境对系统的其余部分具有有限的访问权限或完全没有访问权限。您可以使用它们来保护应用程序安全或运行不受信任的程序。

建议与AppArmor或SELinux一起在单独的用户帐户中使用Bubblewrap到沙箱程序。您也可以考虑改用gVisor,它的优点是为每个来宾提供了自己的内核。

这些方法中的任何一个都可以用来创建一个功能强大的沙箱,并且暴露的攻击面最小。如果您不想自己创建沙箱,请在完成后考虑使用Whonix的sandbox-app-launcher。您不应该使用Firejail[4]。

诸如Docker和LXC之类的容器解决方案经常被误导为沙盒形式。它们太宽松了,无法广泛支持各种应用程序,因此不能认为它们是强大的应用程序沙箱。

  • PulseAudio:PulseAudio是一种常见的声音服务器,但在编写时并未考虑隔离或沙盒的问题,这使其成为重复出现的沙盒逃逸漏洞。为了防止这种情况,建议您从沙箱中阻止对PulseAudio的访问,或者从系统中完全卸载它。

  • D-Bus:D-Bus是台式机Linux上最流行的进程间通信形式,但它也是沙箱逃逸的另一种常见途径,因为它允许与服务自由交互。这些漏洞的一个例子就是Firejail。您应该从沙箱中阻止对D-Bus的访问,或者通过MAC以细粒度的规则进行调解。

  • GUI隔离:任何Xorg窗口都可以访问另一个窗口。这允许琐碎的键盘记录或屏幕截图程序,甚至可以记录诸如root密码之类的内容。您可以使用嵌套的X11服务器(例如Xpra或Xephyr和bubblewrap)将Xorg窗口沙箱化。默认情况下,Wayland将窗口彼此隔离,这将是一个比Xorg更好的选择,尽管Wayland可能不如Xorg普遍可用,因为它在开发中较早。

  • ptrace:如前所述,ptrace是一个系统调用,可能会被滥用破坏在沙箱外部运行的进程。为避免这种情况,您可以通过sysctl启用内核YAMA ptrace限制,也可以在seccomp过滤器中将ptrace syscall列入黑名单。

  • TIOCSTI:TIOCSTI是一个ioctl,它允许注入终端命令,并为攻击者提供了一种简单的机制,可以在同一用户会话内的其他进程之间横向移动。可以通过将seccomp过滤器中的ioctl列入黑名单或使用bubblewrap的--new-session参数来缓解这种攻击。

  • Systemd沙箱:虽然不建议使用systemd,但有些系统可能无法切换。这些人至少可以使用沙盒服务,因此他们只能访问所需的内容。

这是一个沙箱化systemd服务的示例:

[Service]

CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ProtectSystem=strict
ProtectHome=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
ProtectKernelLogs=true
ProtectHostname=true
ProtectClock=true
ProtectProc=invisible
ProcSubset=pid
PrivateTmp=true
PrivateUsers=yes
PrivateDevices=true
MemoryDenyWriteExecute=true
NoNewPrivileges=true
LockPersonality=true
RestrictRealtime=true
RestrictSUIDSGID=true
RestrictAddressFamilies=AF_INET
RestrictNamespaces=yes
SystemCallFilter=write read openat close brk fstat lseek mmap mprotect munmap rt_sigaction rt_sigprocmask ioctl nanosleep select access execve getuid arch_prctl set_tid_address set_robust_list prlimit64 pread64 getrandom
SystemCallArchitectures=native
UMask=0077
IPAddressDeny=any
AppArmorProfile=/etc/apparmor.d/usr.bin.example

​​​​​​​所有选项的说明:

CapabilityBoundingSet=— Specifies the capabilitiesthe process is given.
ProtectHome=true— Makes all home directories inaccessible.
ProtectKernelTunables=true— Mounts kernel tunables such as those modified throughsysctlas read-only.
ProtectKernelModules=true— Denies module loading and unloading.
ProtectControlGroups=true— Mounts all control group hierarchies as read-only.
ProtectKernelLogs=true— Prevents accessing the kernel logs.
ProtectHostname=true— Prevents changes to the system hostname.
ProtectClock— Prevents changes to the system clock.
ProtectProc=invisible— Hides all outside processes.
ProcSubset=pid— Permits access to only the pid subset of/proc.
PrivateTmp=true— Mounts an empty tmpfs over/tmpand/var/tmp, therefore hiding their previous contents.
PrivateUsers=true— Sets up an empty user namespace to hide other user accounts on the system.
PrivateDevices=true— Creates a new/devmount with minimal devies present.
MemoryDenyWriteExecute=true— Enforces a memory W^X policy
NoNewPrivileges=true— Prevents escalating privileges.
LockPersonality=true— Locks down thepersonality()syscall to prevent switching execution domains.
RestrictRealtime=true— Prevents attempts to enable realtime scheduling.
RestrictSUIDSGID=true— Prevents executing setuid or setgid binaries.
RestrictAddressFamilies=AF_INET— Restricts the usable socket address families to IPv4 only (AF_INET).
RestrictNamespaces=true— Prevents creating any new namespaces.
SystemCallFilter=...— Restricts the allowed syscalls to the absolute minimum. If you aren't willing to maintain your own custom seccomp filter, then systemd provides many [predefined system call sets](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#System Call Filtering) that you can use.@system-servicewill be suitable for many use cases.
SystemCallArchitectures=native— Prevents executing syscalls from other CPU architectures.
UMask=0077— Sets the umaskto a more restrictive value.
IPAddressDeny=any— Blocks all incoming and outgoing traffic to/from any IP address. SetIPAddressAllow=to configure a whitelist. Alternatively, setup a network namespace withPrivateNetwork=true.
AppArmorProfile=...— Runs the process under the specified AppArmor profile.

您不能仅将此示例配置复制到您的配置中,每种服务的要求各不相同,并且必须针对每种服务微调沙箱。要了解有关您可以设置的所有选项的更多信息,请阅读systemd.exec手册页。

如果您使用的系统不是systemd而是init,那么可以使用bubblewrap轻松复制所有这些选项。

普通沙箱固有地与主机共享同一内核。您信任我们已经评估为不安全的内核,可以正确限制这些程序。由于主机内核的整个攻击面已完全暴露,因此沙盒中的内核利用程序可以绕过任何限制。已经进行了一些努力来限制使用seccomp的攻击面,但不足以完全解决此问题。

GVisor是解决此问题的方法。它为每个应用程序提供了自己的内核,该内核以内存安全的语言重新实现了Linux内核的大部分系统调用,从而提供了明显更强的隔离性。

虽然不是传统的“沙盒”,但虚拟机通过虚拟化全新系统来分离进程,从而提供了非常强大的隔离性。KVM是内核模块,它允许内核充当管理程序,而QEMU是利用KVM的仿真器。Virt-manager和GNOME Boxs都是良好且易于使用的GUI,用于管理KVM / QEMU虚拟机。不建议使用Virtualbox的原因有很多。

五、

hardened_malloc是一种硬化的内存分配器,可为堆内存损坏漏洞提供实质性的保护。它很大程度上基于OpenBSD的malloc设计,但具有许多改进。

可以通过LD_PRELOAD环境变量针对每个应用程序使用hardened_malloc。例如,假设您编译的库位于/usr/lib/libhardened_malloc.so,则可以执行:

LD_PRELOAD="/usr/lib/libhardened_malloc.so" $program

通过全局预加载该库,也可以在系统范围内使用它,这是使用它的推荐方法。为此,请编辑/etc/ld.so.preload并插入:

/usr/lib/libhardened_malloc.so

尽管大多数应用程序都可以正常工作,但hardened_malloc可能会破坏某些应用程序。建议使用以下选项编译hardened_malloc以最大程度地减少损坏:

CONFIG_SLAB_QUARANTINE_RANDOM_LENGTH=0 CONFIG_SLAB_QUARANTINE_QUEUE_LENGTH=0 CONFIG_GUARD_SLABS_INTERVAL=8

您还应该使用sysctl设置以下内容,以适应hardened_malloc创建的大量保护页:

vm.max_map_count=524240

Whonix项目为基于Debian的发行版提供了hardened_malloc软件包。

六、

编译自己的程序可以带来很多好处,因为它使您能够优化程序的安全性。但是,执行完全相反的操作并降低安全性很容易,如果您不确定自己在做什么,请跳过本节。在基于源的发行版(例如Gentoo)上,这将是最简单的,但也可以在其他发行版上这样做。

某些编译选项可用于添加其他漏洞利用缓解措施,从而消除整个类别的常见漏洞。您可能听说过常规保护,例如位置独立可执行文件,堆栈粉碎保护程序,立即绑定,只读重定位和FORTIFY_SOURCE,但是本节将不做介绍,因为它们已被广泛采用。相反,它将讨论诸如控制流完整性和影子堆栈之类的现代漏洞利用缓解措施。

本节涉及主要用C或C ++编写的本机程序。您必须使用Clang编译器,因为这些功能在GCC上不可用。请记住,由于未广泛采用这些缓解措施,因此某些应用程序在启用它们后可能无法运行。

控制流完整性(CFI)是一种缓解漏洞利用的方法,旨在防止诸如ROP或JOP之类的代码重用攻击。由于更广泛采用的缓解措施(例如NX)使过时的利用技术过时了,因此使用这些技术利用了很大一部分漏洞。Clang支持细粒度的前沿CFI,这意味着它可以有效缓解JOP攻击。Clang的CFI本身并不能减轻ROP;您还必须使用下面记录的单独机制。要启用此功能,必须应用以下编译标志:-flto -fvisibility=hidden -fsanitize=cfi

影子堆栈通过将程序复制到其他隐藏堆栈中来保护程序的返回地址。然后比较主堆栈和影子堆栈中的返回地址,看两者是否不同。如果是这样,则表明存在攻击,程序将中止,从而减轻了ROP攻击。Clang具有称为ShadowCallStack的功能,可以完成此操作,但是,仅在ARM64上可用。要启用此功能,必须应用以下编译标志:-fsanitize=shadow-call-stack

如果上述ShadowCallStack不是一个选项,则可以选择使用具有相似目标的SafeStack。但是,不幸的是,此功能有许多漏洞,因此效果不甚理想。如果仍然希望启用此功能,则必须应用以下编译标志:-fsanitize=safe-stack

最常见的内存损坏漏洞之一是未初始化的内存。Clang有一个选项可以使用零或特定模式自动初始化变量。建议将变量初始化为零,因为使用其他模式比利用漏洞缓解功能更适合发现错误。要启用此功能,必须应用以下编译标志:-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang 但该选项的存在目前正在辩论中。

七、

用内存安全语言编写的程序会自动受到保护,免受各种安全漏洞的影响,这些安全漏洞包括缓冲区溢出,未初始化的变量,售后使用等。Microsoft和Google的安全研究人员进行的研究证明,已发现的大多数漏洞都是内存安全问题。这样的内存安全语言的示例包括Rust,Swift和Java,而内存不安全语言的示例包括C和C ++。如果可行,应使用内存安全替代品替换尽可能多的程序。

八、

root可以执行任何操作,并且可以访问您的整个系统。因此,应尽可能将其锁定,以使攻击者无法轻松获得root用户访问权限。

/etc/securetty文件指定允许您以root用户身份登录的位置。该文件应保留为空,以便任何人都不能从终端上这样做。

su可让您从终端切换用户。默认情况下,它尝试以root用户身份登录。要将su的使用限制在wheel组中,请编辑/etc/pam.d/su和/etc/pam.d/su-l并添加:

auth required pam_wheel.so use_uid

您应该在wheel组中拥有尽可能少的用户。

要锁定root帐户以防止任何人以root身份登录,请执行:

passwd -l root

在执行此操作之前,请确保您具有获取根的替代方法(例如,从活动USB引导并更改为文件系统的chroot),以免您无意中将自己锁定在系统之外。

为了防止某人通过SSH以root身份登录,请编辑/etc/ssh/sshd_config并添加:

PermitRootLogin no

您可以增加shadow使用的哈希回合数,从而通过迫使攻击者计算更多的哈希值来破解您的密码,从而提高哈希密码的安全性。默认情况下,shadow使用5000次回合,但是您可以将其增加到任意数量。尽管配置的回合越多,登录速度就越慢。编辑/etc/pam.d/passwd并添加回合选项。

password required pam_unix.so sha512 shadow nullok rounds=65536

这使shadow执行65536次散列回合。

应用此设置后,密码不会自动重新加密,因此您需要使用以下方法重置密码:

passwd $username

默认情况下,某些发行版以root用户身份运行Xorg,这是一个问题,因为Xorg包含大量古老而又复杂的代码,这增加了巨大的攻击面,并使其更有可能拥有可以获取root特权的漏洞利用程序。要阻止它作为root用户执行,请编辑/etc/X11/Xwrapper.config并添加:

needs_root_rights = no

恶意软件可以使用多种方法来嗅探root帐户的密码。因此,访问根帐户的传统方式是不安全的,最好根本不访问根,但这实际上是不可行的。本节详细介绍了访问根帐户的最安全方法。在安装操作系统后,应立即应用这些说明,以确保该软件不含恶意软件。

您绝对不能使用普通用户帐户访问root,因为root可能已被盗用。您也不能直接登录到根帐户。通过执行以下操作,创建一个单独的“管理员”用户帐户,该帐户仅用于访问root用户,而不能用于访问其他用户:

useradd admin

执行并来设置一个非常强的密码:

passwd admin

仅允许该帐户使用您首选的权限提升机制。例如,如果使用sudo,则通过执行以下命令来添加sudoers异常:

visudo -f /etc/sudoers.d/admin-account

然后输入:

admin ALL=(ALL) ALL

确保没有其他帐户可以访问sudo(或您的首选机制)。

现在,要实际登录到该帐户,请先重新启动-例如,这可以防止受损的窗口管理器执行登录欺骗。当提供登录提示时,请通过按键盘上的以下组合键来激活安全注意键:

Alt + SysRq + k

这将杀死当前虚拟控制台上的所有应用程序,从而克服登录欺骗攻击。现在,您可以安全地登录到您的管理员帐户,并使用root用户执行任务。完成后,注销管理员帐户,然后重新登录到非特权用户帐户。

九、

防火墙可以控制传入和传出的网络流量,并且可以用来阻止或允许某些类型的流量。除非有特殊原因,否则应始终阻止所有传入流量。建议设置严格的iptables或nftables防火墙。火墙必须针对您的系统进行微调,并且没有一个适合所有防火墙的规则集。建议您熟悉创建防火墙规则。Arch Wiki和手册页都是很好的资源。

这是基本iptables配置的示例,该配置禁止所有传入的网络流量:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT

但是,您不应尝试在实际系统上使用此示例。它仅适用于某些台式机系统。

十、

为了保护隐私,最好最大程度地减少可追溯到您的信息量。

请勿在主机名或用户名中添加唯一标识的内容。将它们保留为通用名称,例如“host”和“user”,以便它们无法识别您。

如果可能,应将您的时区设置为“ UTC”,将区域设置和键盘映射设置为“ US”。

一个独一无二的机器ID被存储在/var/lib/dbus/machine-id (systemd系统是保存在/etc/machine-id)这些应编辑为通用名称,例如Whonix ID。

b08dfa6083e7567a1921a715000001fb

MAC地址是分配给网络接口控制器(NIC)的唯一标识符。每次您连接到网络时(WIFI或以太网)则您的MAC地址已暴露。这使人们可以使用它来跟踪您并在本地网络上唯一地标识您。

但您不应该完全随机化MAC地址。拥有完全随机的MAC地址是显而易见的,并且会对您脱颖而出的行为产生不利影响。

MAC地址的OUI(组织唯一标识符)部分标识芯片组的制造商。对MAC地址的这一部分进行随机化处理可能会为您提供以前从未使用过的OUI,数十年来从未使用过的OUI或在您所在的地区极为罕见的OUI,因此使您脱颖而出,很明显地表明您在欺骗MAC地址。

MAC地址的末尾标识您的特定设备,并且可以用来跟踪您的设备。仅对MAC地址的这一部分进行随机化可防止您被跟踪,同时仍使MAC地址看起来可信。

要欺骗这些地址,请首先执行以下命令找出您的网络接口名称:

ip a

接下来,安装macchanger并执行:

macchanger -e $network_interface

要在每次引导时随机分配MAC地址,您应该为您的特定初始化系统创建一个初始化脚本。这是systemd的一个示例:

[Unit]
Description=macchanger on eth0
Wants=network-pre.target
Before=network-pre.target
BindsTo=sys-subsystem-net-devices-eth0.device
After=sys-subsystem-net-devices-eth0.device
 
[Service]
ExecStart=/usr/bin/macchanger -e eth0
Type=oneshot
 
[Install]
WantedBy=multi-user.target

上面的示例在启动时欺骗了eth0接口的MAC地址。将eth0替换为您的网络接口。

几乎每个系统都有不同的时间。这可用于时钟偏斜指纹攻击,几毫秒的差异足以使用户被暴露识别。

ICMP时间戳:

ICMP时间戳会在查询答复中泄漏系统时间。阻止这些攻击的最简单方法是利用防火墙阻止传入连接,或者使内核忽略ICMP请求。

TCP时间戳:

TCP时间戳也会泄漏系统时间。内核尝试通过对每个连接使用随机偏移量来解决此问题,但这不足以解决问题。因此应该禁用TCP时间戳,可以通过使用sysctl设置以下内容来完成:

net.ipv4.tcp_timestamps=0

TCP初始化序号:

TCP初始序列号(ISN)是泄漏系统时间的另一种方法。为了减轻这种情况,您必须安装tirdad内核模块,该模块会生成用于连接的随机ISN。

时间同步:

时间同步对于匿名性和安全性至关重要。错误的系统时钟可能使您遭受时钟偏斜指纹攻击,或者可以用来为您提供过时的HTTPS证书,从而绕过证书到期或吊销。

最流行的时间同步方法NTP是不安全的,因为它未经加密和未经身份验证,因此攻击者可以轻易地拦截和修改请求。NTP还会以NTP时间戳格式泄漏本地系统时间,该格式可用于时钟偏斜指纹识别,如前所述。

因此,您应该卸载所有NTP客户端并禁用systemd-timesyncd(如果正在使用)。您可以通过安全连接(HTTPS或最好是Torion服务)连接到受信任的网站,而不是NTP,并从HTTP标头中提取当前时间。达到此目的的工具是sdwdate或我自己的安全时间同步工具。

可以通过他们在键盘上输入键的方式来对人进行指纹识别。您可以通过键入速度,在两次按键之间的暂停,每次按键被按下和释放的确切时间等方式来唯一地进行指纹识别。可以使用KeyTrac在线进行测试。

Kloak是一种工具,旨在通过混淆按键和释放事件之间的时间间隔来克服这种跟踪方法。当按键被按下时,它会引入随机延迟,然后由应用程序选择。

十一、

默认情况下,文件的权限是非常宽松的。您应该在整个系统中搜索权限不当的文件和目录,并对其进行限制。例如,在诸如Debian之类的某些发行版中,用户的Home目录是全局可读的。

这可以通过执行以下操作来限制:

chmod 700 /home/$user

另外一些示例是/boot,/usr /src和/ {,usr /} lib/modules 它们包含内核映像,System.map和其他各种文件,所有这些文件都可能泄漏有关内核的敏感信息。

chmod 700 /boot /usr/src /lib/modules /usr/lib/modules

在基于Debian的发行版中,必须使用dpkg-statoverride保留文件许可权。否则,它们将在更新期间被覆盖。

Whonix的SUID Disabler和Permission Hardener会自动应用本节中详细介绍的步骤。

Setuid / SUID允许用户使用二进制文件所有者的特权执行二进制文件。这通常用于允许非特权用户使用通常仅为root用户保留的某些功能。因此,许多SUID二进制文件都有特权升级安全漏洞的历史记录。Setgid / SGID类似,但适用于组而不是用户。要使用setuid或setgid位查找系统上的所有二进制文件,请执行:

find / -type f \( -perm -4000 -o -perm -2000 \)

然后,您应该删除不使用的程序上的所有不必要的setuid / setgid位,或将其替换为功能。要删除setuid位,请执行:

chmod u-s $path_to_program

要删除setgid位,执行:

chmod g-s $path_to_program

要向文件添加功能,请执行:

setcap $capability+ep $path_to_program

或者,要删除不必要的功能,请执行:

setcap -r $path_to_program

umask设置新创建文件的默认文件权限。默认的umask是0022,它不是很安全,因为它为系统上的每个用户提供了对新创建文件的读取访问权限。要使所有者以外的任何人都不可读新文件,请编辑/etc/profile并添加:

umask 0077

十二、

核心转储包含特定时间(通常是该程序崩溃时)该程序的已记录内存。它们可能包含敏感信息,例如密码和加密密钥,因此必须将其禁用。

禁用它们的方法主要有三种:sysctl,systemd和ulimit。

通过sysctl设置以下设置:

kernel.core_pattern=|/bin/false

创建/etc/systemd/coredump.conf.d/disable.conf并添加如下内容:​​​​​​​

[Coredump]
Storage=none

编辑/etc/security/limits.conf并添加如下内容:

* hard core 0

即使在进行了这些设置之后,以提升的特权运行的进程仍可能会转储其内存。

为了防止他们这样做,请通过sysctl设置以下内容:

fs.suid_dumpable=0

十三、

与核心转储类似,交换或分页将部分内存复制到磁盘,其中可能包含敏感信息。应该将内核配置为仅在绝对必要时进行交换,相应的sysctl设置:

vm.swappiness=1

十四、

PAM是用于用户身份验证的框架。这就是您登录时使用的机制。您可以通过要求使用强密码或在失败的登录尝试后强制执行延迟验证来使其更加安全。

要强制使用强密码,可以使用pam_pwquality。它强制执行密码的可配置策略。例如,如果您希望密码至少包含16个字符(最小),与旧密码(difok)至少6个不同的字符,至少3个数字(dcredit),至少2个大写字母(ucredit),至少2个字符小写字母(lcredit)和至少3个其他字符(ocredit),然后编辑/etc/pam.d/passwd并添加:​​​​​​​

password required pam_pwquality.so retry=2 minlen=16 difok=6 dcredit=-3 ucredit=-2 lcredit=-2 ocredit=-3 enforce_for_root
password required pam_unix.so use_authtok sha512 shadow

要强制执行延迟验证,可以使用pam_faildelay。要在两次失败的登录尝试之间添加至少4秒的延迟以阻止暴力破解尝试,请编辑/etc/pam.d/system-login并添加:

auth optional pam_faildelay.so delay=4000000

4000000 是4秒(以微秒为单位)。

十五、

Microcode更新对于修复关键的CPU漏洞(如Meltdown和Spectre等)至关重要。大多数发行版都将这些发行版包含在其软件仓库中,例如Arch Linux和Debian。

十六、

IPv6地址是从计算机的MAC地址生成的,从而使您的IPv6地址是唯一的,并直接绑定到计算机。隐私扩展会生成一个随机的IPv6地址,以减轻这种形式的跟踪。请注意,如果您开启了MAC地址欺骗机制或禁用了IPv6,则无需执行这些步骤。

要启用这些功能,请通过sysctl设置以下设置:​​​​​​​

net.ipv6.conf.all.use_tempaddr=2
net.ipv6.conf.default.use_tempaddr=2

要为NetworkManager启用隐私扩展,请编辑/etc/NetworkManager/NetworkManager.conf并添加:​​​​​​​

[connection]
ipv6.ip6-privacy=2

要为systemd-networkd启用隐私扩展,请创建/etc/systemd/network/ipv6-privacy.conf并添加:

[Network]
IPv6PrivacyExtensions=kernel

十七、

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

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。

十八、

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

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

jitterentropy_rng

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

random.trust_cpu=off

十九、

建议不要以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中全局设置此环境变量。

二十、

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

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

APT::Sandbox::Seccomp "true";

二十一、

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

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

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

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

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

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

引导加载程序会在引导过程的早期执行,并负责加载操作系统。保护它非常重要,否则,它可能会被篡改。例如,本地攻击者可以通过在启动时使用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现在将受到密码保护。

要仅限

标签: 6074连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台