Linux不是安全的操作系统。但是,您可以采取一些步骤对其进行改进。本指南旨在说明如何尽可能地加强Linux的安全性和隐私性。本指南试图与发行版无关,并且不限于任何特定的指南。免责声明:如果您不确定自己在做什么,请不要尝试在本文中应用任何内容。本指南仅关注安全性和隐私性,而不关注性能,可用性或其他任何内容。本指南中列出的所有命令都将需要root特权。以" $"开头的单词符号表示一个变量,用户之间可能会有所不同,以适应他们的设置。
使用与systemd以外的其他初始化系统一起使用的发行版。 systemd包含许多不必要的攻击面;它尝试做的事情远远超出了必要,并且超出了初始化系统应做的事情。初始化系统不需要很多代码行即可正常运行。
使用musl作为默认的C库。 musl专注于最小化,这会导致很小的攻击面,而其他C库(例如glibc)则过于复杂且容易产生漏洞。例如,与musl中的极少数漏洞相比,glibc中的一百多个漏洞已被公开披露。尽管仅靠计算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是允许用户配置某些内核设置并启用各种安全功能或禁用危险功能以减少攻击面的工具。要临时更改设置,您可以执行:
要永久更改sysctls,您可以将要更改的sysctls添加到/etc/sysctl.conf或/etc/sysctl.d中的相应文件,具体取决于您的Linux发行版。以下是您应更改的建议sysctl设置。
内核指针指向内核内存中的特定位置。这些在利用内核时可能非常有用,但是默认情况下不会隐藏内核指针-例如,通过读取/ proc / kallsyms的内容即可轻松发现它们。此设置旨在减轻内核指针泄漏。另外,您可以设置kernel.kptr_restrict = 1以仅从没有CAP_SYSLOG功能的进程中隐藏内核指针。
dmesg是内核日志。它公开了大量有用的内核调试信息,但这通常会泄漏敏感信息,例如内核指针。更改上述sysctl会将内核日志限制为CAP_SYSLOG功能。
尽管dmesg_restrict的值,启动期间内核日志仍将显示在控制台中。在启动过程中能够记录屏幕的恶意软件可能会滥用此功能以获得更高的特权。此选项可防止这些信息泄漏。必须将其与下面描述的某些引导参数结合使用才能完全有效。
eBPF暴露出很大的攻击面。因此,必须加以限制。这些系统将eBPF限制为CAP_BPF功能(在5.8之前的内核版本上为CAP_SYS_ADMIN),并启用JIT强化技术,例如恒定盲化。
这将加载TTY线路规则限制为CAP_SYS_MODULE功能,以防止未特权的攻击者使用TIOCSETD ioctl加载易受攻击的线路规则,而TIOCSETD ioctl之前已在许多漏洞利用中被滥用。
userfaultfd()系统调用经常被滥用以利用“事后使用”缺陷。因此,此sysctl用于将此系统调用限制为CAP_SYS_PTRACE功能。
kexec是一个系统调用,用于在运行时引导另一个内核。可以滥用此功能来加载恶意内核并在内核模式下获得任意代码执行,因此该sysctl将其禁用。
SysRq密钥向非特权用户公开了许多潜在的危险调试功能。与通常的假设相反,SysRq不仅是物理攻击的问题,因为它还可以远程触发。此sysctl的值使其可以使用户只能使用安全注意密钥,这对于安全地访问root是必不可少的。另外,您可以简单地将值设置为0以完全禁用SysRq。
用户名称空间是内核中的一项功能,旨在改善沙箱并使非特权用户可以轻松访问它。但是,此功能公开了重要的内核攻击面,用于特权升级,因此该sysctl将用户名称空间的使用限制为CAP_SYS_ADMIN功能。对于无特权的沙箱,建议使用具有很少攻击面的setuid二进制文件,以最大程度地减少特权升级的可能性。沙箱部分将进一步讨论此主题。请注意,尽管该sysctl仅在某些Linux发行版中存在,因为它需要内核补丁。如果您的内核不包含此修补程序,则可以通过设置user.max_user_namespaces = 0来完全禁用用户名称空间(包括root用户)。
性能事件会增加大量的内核攻击面,并导致大量漏洞。此sysctl将所有性能事件的使用限制为CAP_PERFMON功能(在5.8之前的内核版本上为CAP_SYS_ADMIN)。请注意,此sysctl还需要仅在某些发行版中可用的内核补丁。否则,此设置等效于kernel.perf_event_paranoid = 2,它仅限制此功能的子集。
这有助于防止SYN泛洪攻击,这种攻击是拒绝服务攻击的一种形式,在这种攻击中,攻击者发送大量虚假的SYN请求,以尝试消耗足够的资源以使系统对合法流量不响应。
这通过丢弃处于时间等待状态的套接字的RST数据包来防止时间等待暗杀。
这些启用了从机器所有接口接收到的数据包的源验证。这样可以防止IP欺骗,其中攻击者发送带有欺诈IP地址的数据包。
这些禁用ICMP重定向接受和发送,以防止中间人攻击并最大程度地减少信息泄露。
此设置使您的系统忽略所有ICMP请求,以避免Smurf攻击,使设备更难以在网络上枚举,并防止通过ICMP时间戳识别时钟指纹。
源路由是一种允许用户重定向网络流量的机制。由于这可用于执行中间人攻击,在中间人攻击中,出于恶意目的将流量重定向,因此上述设置禁用了此功能。
恶意的IPv6路由器广告可能会导致中间人攻击,因此应将其禁用。
这将禁用TCP SACK。 SACK通常被利用,在许多情况下是不必要的,因此,如果您不需要它,则应将其禁用。
ptrace是一个系统调用,它允许程序更改和检查另一个正在运行的进程,从而使攻击者可以轻易地修改其他正在运行的程序的内存。这将ptrace的使用限制为仅具有CAP_SYS_PTRACE功能的进程。或者,将sysctl设置为3以完全禁用ptrace。
ASLR是一种常见的漏洞利用缓解措施,它可以使进程的关键部分在内存中的位置随机化。这可能会使各种各样的漏洞利用更困难,因为它们首先需要信息泄漏。上述设置增加了用于mmap ASLR的熵的位数,从而提高了其有效性。这些系统值必须相对于CPU体系结构进行设置。以上值与x86兼容,但其他体系结构可能有所不同。
仅当在可全局写入的粘性目录之外,当符号链接和关注者的所有者匹配或目录所有者与符号链接的所有者匹配时,才允许遵循符号链接。这还可以防止没有对源文件的读/写访问权限的用户创建硬链接。这两者都阻止了许多常见的TOCTOU比赛。
这些阻止了在可能由攻击者控制的环境(例如,可写入世界的目录)中创建文件,从而使数据欺骗攻击更加困难。
引导参数在引导时使用引导加载程序将设置传递给内核。类似于sysctl,某些设置可用于提高安全性。引导加载程序通常在引导参数设置方式上有所不同。下面列出了一些示例,但是您应该研究特定引导加载程序的必需步骤。如果使用GRUB作为引导程序,请编辑/ etc / default / grub并将参数添加到GRUB_CMDLINE_LINUX_DEFAULT =行。如果使用Syslinux,请编辑/boot/syslinux/syslinux.cfg并将它们添加到APPEND行中。如果使用systemd-boot,请编辑您的加载程序条目,并将其附加到linux行的末尾。建议使用以下设置以提高安全性。
这将禁用平板合并,通过防止覆盖合并缓存中的对象并使其更难以影响平板缓存布局,从而显着增加了堆利用的难度。
这些启用健全性检查(F)和重新分区(Z)。完整性检查会添加各种检查,以防止某些平板操作中的损坏。 Redzoning会在平板周围添加额外的区域,以检测平板何时被覆盖超过其实际大小,从而有助于检测溢出。
这样可以在分配和空闲时间期间将内存清零,这有助于缓解“先用后用”漏洞,并擦除内存中的敏感信息。如果您的内核版本低于5.3,则这些选项不存在。相反,请附加" P"到上面的slub_debug选项以获取slub_debug = FZP并添加page_poison = 1。由于它们实际上是一种调试功能,恰好具有一些安全性,因此它们在释放时提供的内存擦除形式较弱。
此选项使页面分配器自由列表随机化,从而通过降低页面分配的可预测性来提高安全性。这也提高了性能。
这会禁用vsyscall,因为它们已过时并已被vDSO取代。 vsyscall也在内存中的固定地址上,使其成为ROP攻击的潜在目标。
有时某些内核漏洞利用会导致所谓的“ oops”。此参数将导致内核对此类事件感到恐慌,从而防止这些攻击。但是,有时错误的驱动程序会导致无害的操作,这会导致系统崩溃,这意味着此引导参数只能在某些硬件上使用。
这仅允许加载已用有效密钥签名的内核模块,这通过使加载恶意内核模块更加困难来提高安全性。这可以防止加载所有树外内核模块(包括DKMS模块),除非您已对其进行签名,这意味着诸如VirtualBox或Nvidia驱动程序之类的模块可能不可用,但根据您的设置可能并不重要。
内核锁定LSM可以消除用户空间代码滥用以升级为内核特权并提取敏感信息的许多方法。为了在用户空间和内核之间实现清晰的安全边界,此LSM是必需的。以上选项在机密模式(最严格的选项)中启用此功能。这意味着module.sig_enforce = 1。
这导致内核对ECC内存中无法利用的不可纠正的错误感到恐慌。对于没有ECC内存的系统,这是不必要的。
这些参数可防止引导期间信息泄漏,并且必须与上面记录的kernel.printk sysctl结合使用。
最好启用适用于您的CPU的所有CPU缓解措施,以确保您不受已知漏洞的影响。这是启用所有内置缓解措施的列表:
您必须研究系统受其影响的CPU漏洞,并相应地选择上述缓解措施。请记住,您将需要安装微代码更新,以完全免受这些漏洞的影响。所有这些都可能导致性能显着下降。
如果遵循了以上所有建议(不包括特定的CPU缓解措施),则将具有:
如果将GRUB用作引导加载程序,则可能需要重新生成GRUB配置文件才能应用这些文件。
/ proc是伪文件系统,其中包含有关系统上当前正在运行的所有进程的信息。默认情况下,所有用户都可以访问此程序,这可能使攻击者可以窥探其他进程。要允许用户仅查看自己的进程,而不能查看其他用户的进程,则必须使用hidepid = 2,gid = proc挂载选项挂载/ proc。 gid = proc将proc组从此功能中排除,因此您可以将特定的用户或进程列入白名单。添加这些挂载选项的一种方法是编辑/ etc / fstab并添加:
systemd-logind仍然需要查看其他用户。因此,为了使用户会话在systemd系统上正常工作,必须创建/etc/systemd/system/systemd-logind.service.d/hidepid.conf并添加:
最好禁用并非绝对必要的任何功能,以最大程度地减少潜在的内核攻击面。这些功能不必一定很危险,它们可以只是被删除以减少攻击面的良性代码。切勿禁用您不了解的随机事物。以下是一些可能有用的示例,具体取决于您的设置。
引导参数通常可以用来减少攻击面。一个这样的示例是:禁用了整个IPv6堆栈,如果您尚未迁移到该堆栈,则可能不需要该堆栈。如果使用的是IPv6,请不要使用此引导参数。
内核允许无特权的用户通过模块自动加载来间接导致某些模块被加载。这使攻击者可以自动加载易受攻击的模块,然后加以利用。一个这样的示例是CVE-2017-6074,其中攻击者可以通过启动DCCP连接来触发DCCP内核模块的加载,然后利用该内核模块中的漏洞。可以通过将文件插入/etc/modprobe.d并将其列入黑名单的说明,将特定的内核模块列入黑名单。 install参数告诉modprobe运行特定命令,而不是像往常一样加载模块。 / bin / false是仅返回1的命令,该命令实际上什么也不会做。两者都告诉内核运行/ bin / false而不是加载模块,这将防止攻击者利用该模块。以下是最有可能不需要的内核模块:
安装dccp / bin / falseinstall sctp / bin / falseinstall rds / bin / falseinstall tipc / bin / falseinstall n-hdlc / bin / falseinstall ax25 / bin / falseinstall netrom / bin / falseinstall x25 / bin / falseinstall rose / bin / falseinstall decnet / bin / falseinstall econet / bin / falseinstall af_802154 / bin / falseinstall ipx / bin / falseinstall appletalk / bin / falseinstall psnap / bin / falseinstall p8023 / bin / falseinstall p8022 / bin / falseinstall can / bin / falseinstall atm / bin / false
安装cramfs / bin / falseinstall freevxfs / bin / falseinstall jffs2 / bin / falseinstall hfs / bin / falseinstall hfsplus / bin / falseinstall squashfs / bin / falseinstall udf / bin / false
生动的驱动程序仅用于测试目的,并且是特权提升漏洞的原因,因此应禁用它。
这会禁用网络摄像头,以防止其被用来监视您。您也可以将麦克风模块列入黑名单,但是这可能因系统而异。要查找模块的名称,请在/ proc / asound / modules中查找并将其列入黑名单。例如,一个这样的模块是snd_hda_intel。请注意,尽管有时麦克风的内核模块与扬声器的模块相同。这意味着像这样禁用麦克风也可能会无意中禁用任何扬声器。尽管扬声器也有可能变成麦克风,所以这不一定是负面的结果。最好从物理上删除这些设备,或者至少在BIOS / UEFI中禁用它们。禁用内核模块并不那么有效。
可以通过rfkill将无线设备列入黑名单,以进一步减少远程攻击面。要将所有无线设备列入黑名单,请执行:
在使用systemd的系统上,rfkill在所有会话中均保持不变,但是,在使用其他init系统的系统上,您可能必须创建一个init脚本以在引导时执行这些命令。 前面的部分防止了一些内核指针泄漏,但还有更多泄漏。 在文件系统上,存在内核映像和Syst ......