Linux 系统安全强化指南建议收藏的教程

2021-10-11 18:00 PHP开源社区
点击进入“PHP开源社区”    
免费获取进阶面试、文档、视频资源
PHP开源社区
PHP开源社区
免费提供10GPHP进阶架构师学习教程,关注即可免费领取。每天推送PHP最新资讯技术文章。
84篇原创内容
公众号

本指南旨在说明如何尽可能地加强Linux的安全性和隐私性,并且不限于任何特定的指南。


免责声明:如果您不确定自己在做什么,请不要尝试在本文中使用任何内容。


本指南仅关注安全性和隐私性,而不关注性能,可用性或其他内容。列出的所有命令都将需要root特权。以“$”符号开头的单词表示一个变量,不同终端之间可能会有所不同。

选择正确的Linux发行版

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

避免分发冻结程序包,因为它们在安全更新中通常很落后


不使用与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根二进制文件。因此,对内核进行尽可能多的强化非常重要。

Stable vs LTS 内核

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

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

但是,有了这些修复程序,稳定的内核将包含更多新功能,因此大大增加了内核的攻击面,并引入了大量新错误。相反,LTS内核的受攻击面较小,因为这些功能没有被不断添加。

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

总而言之,在选择稳定或LTS内核时需要权衡取舍。LTS内核具有较少的强化功能,并且并非当时所有的公共错误修复都已向后移植,但是通常它的攻击面更少,并且引入未知错误的可能性也较小。稳定的内核具有更多的强化功能,并且包括所有已知的错误修复,但它也具有更多的攻击面以及引入更多未知错误的机会更大。最后,最好使用较新的LTS分支(如4.19内核)。

Sysctl

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=3 3 3 3

尽管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

userfaultfd() 系统调用经常被滥用以利用“事后使用(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.perf_event_paranoid=3

性能事件会增加大量内核攻击面,并导致大量漏洞。此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

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


            本文章转载自公众号:phpopensource        

首页 - PHP 相关的更多文章: