Linux系统安全强化指南
Linux系统安全强化指南
选择正确的Linux发?版内核
Stable vs LTS 内核Sysctl
Kernel self-protection?络?户空间引导参数
Kernel self-protectionCPU缓解结果hidepid减少内核攻击?
引导参数
将内核模块列??名单rfkill
其他内核指针泄漏限制对sysfs的访问Linux强化Grsecurity内核运?时防护?编译内核强制访问措施沙箱
应?沙箱常?沙箱逃逸
PulseAudioD-BusGUI隔离ptraceTIOCSTISystemd沙箱gVisor虚拟机强化内存分配器强化编译标志内存安全语?Root账户
/etc/securetty限制su锁定root账户
拒绝通过SSH的远程root登陆增加散列回合数限制Xorg root访问安全访问root防?墙身份标识
主机名和?户名
Timezones / Locales / Keymaps机器IDMAC地址欺骗时间攻击
ICMP时间戳TCP时间戳TCP初始化序号时间同步按键指纹?件权限
setuid / setgidumask核?转储
sysctlsystemdulimitsetuid进程SwapPAM
Microcode更新IPv6隐私扩展
NetworkManagersystemd-networkd分区和挂载选项熵
RDRAND以root身份编辑?件特定发?版的安全强化
HTTP包管理器镜像APT seccomp-bpf物理安全
BIOS / UEFI强化Bootloader密码
GrubSyslinuxsystemd-boot验证引导USBsDMA攻击
冷启动攻击最佳实践其他指南术语能?本?翻译?:https://madaidans-insecurities.github.io/guides/linux-hardening.html译者Blog:http://blog.gaochao.me本指南旨在说明如何尽可能地加强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构建是?个很好的折衷?案。1内核
内核是操作系统的核?,不幸的是很容易受到攻击。正如Brad Spengler曾经说过的那样,可以将其视为系统上最?,最易受攻击的setuid根?进制?件。因此,对内核进?尽可能多的强化?常重要。
Stable vs LTS 内核
Linux内核以两种主要形式发布:稳定和?期?持(LTS)。稳定版本是较新的版本,?LTS发?版本是较?的稳定版本,?期以来?直受?持。选择上述任何?个发?版本都有许多后果。
Linux内核未使?CVE标识安全漏洞。这意味着?多数安全漏洞的修复程序不能向后移植到LTS内核。但是稳定版本包含到?前为?进?的所有安全修复。
但是,有了这些修复程序,稳定的内核将包含更多新功能,因此??增加了内核的攻击?,并引?了?量新错误。相反,LTS内核的受攻击?较?,因为这些功能没有被不断添加。
此外,稳定的内核还包括更新的强化功能,以减轻LTS内核没有的某些利?。此类功能的?些示例是LockdownLSM和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
12内核指针指向内核内存中的特定位置。这些在利?内核??可能?常有?,但是默认情况下不会隐藏内核指针,例如,通过读取/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=1net.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
1kexec是?个系统调?,?于在运?时引导另?个内核。可以滥?此功能来加载恶意内核并在内核模式下获得任意代码执?能?,因此该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
23456178这通过丢弃处于时间等待状态的套接字的RST数据包来防?time-wait状态。
net.ipv4.conf.all.rp_filter=1net.ipv4.conf.default.rp_filter=1
这些启?了源验证,以验证从计算机所有?络接?接收到的数据包。
net.ipv4.conf.all.accept_redirects=0net.ipv4.conf.default.accept_redirects=0net.ipv4.conf.all.secure_redirects=0net.ipv4.conf.default.secure_redirects=0net.ipv6.conf.all.accept_redirects=0net.ipv6.conf.default.accept_redirects=0net.ipv4.conf.all.send_redirects=0net.ipv4.conf.default.send_redirects=0
这些设置禁?了ICMP重定向,以防?中间?攻击并最?程度地减少信息泄露。
net.ipv4.icmp_echo_ignore_all=1
此设置使您的系统忽略所有ICMP请求,以避免Smurf攻击,使设备更难以在?络上枚举,并防?通过ICMP时间戳识别时钟指纹。
net.ipv4.conf.all.accept_source_route=0net.ipv4.conf.default.accept_source_route=0net.ipv6.conf.all.accept_source_route=0net.ipv6.conf.default.accept_source_route=0
源路由是?种允许?户重定向?络流量的机制。由于这可?于执?中间?攻击,在中间?攻击中,出于恶意?的将流量重定向,因此上述设置将会禁?此功能。
net.ipv6.conf.all.accept_ra=0net.ipv6.conf.default.accept_ra=0
恶意的IPv6路由?告可能会导致中间?攻击,因此应将其禁?。
213net.ipv4.tcp_sack=0net.ipv4.tcp_dsack=0net.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=1fs.protected_hardlinks=1
仅当在可全局写?的粘性?录之外,当符号链接和关注者的所有者匹配或?录所有者与符号链接的所有者匹配时,才允许遵循符号链接。这还可以防?没有对源?件的读/写访问权限的?户创建硬链接。这两者都阻?了许多常?的TOCTOU漏洞(time-of-check-to-time-of-use)
fs.protected_fifos=2fs.protected_regular=2
这些阻?了在可能由攻击者控制的环境(例如,全局可写?录)中创建?件,从?使数据欺骗攻击更加困难。
1引导参数
引导参数在引导时使?引导加载程序(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
此选项使?分配器空闲列表随机化,从?通过降低?分配的可预测性来提?安全性,同时这也提?了性能。
1pti=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
1这将导致内核对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配置?件才能应?这些?件。
hidepid
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并添加:
123456789011[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/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/false
17181912345671213141516install 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特别是模糊的?络协议会增加?量的远程攻击?。此?名单:DCCP — Datagram Congestion Control ProtocolSCTP — Stream Control Transmission ProtocolRDS — Reliable Datagram SocketsTIPC — Transparent Inter-process CommunicationHDLC — High-Level Data Link ControlAX25 — Amateur X.25NetRomX25ROSEDECnetEconetaf_802154 — IEEE 802.15.4IPX — Internetwork Packet ExchangeAppleTalkPSNAP — Subnetwork Access Protocolp8023 — Novell raw IEEE 802.3p8022 — IEEE 802.2CAN — Controller Area NetworkATMinstall cramfs /bin/falseinstall freevxfs /bin/falseinstall jffs2 /bin/falseinstall hfs /bin/falseinstall hfsplus /bin/falseinstall squashfs /bin/falseinstall udf /bin/false将各种稀有?件系统列??名单。12345install cifs /bin/trueinstall nfs /bin/trueinstall nfsv3 /bin/trueinstall nfsv4 /bin/trueinstall gfs2 /bin/true
如果不使??络?件系统,也可以将其列??名单。
install vivid /bin/false
vivid driver驱动程序仅?于测试?的,并且是特权提升漏洞的原因,因此应禁?它。
install bluetooth /bin/falseinstall btusb /bin/false
禁?具有安全问题历史记录的蓝?。
install uvcvideo /bin/false
这会禁??络摄像头,以防?其被?来监视您。
您也可以将?克?模块列??名单,但这在系统之间可能会有所不同。要查找模块的名称,请在/proc/asound/modules中查找并将其列??名单。例如,?个这样的模块是snd_hda_intel。
请注意,尽管有时?克?的内核模块与扬声器的模块相同。这意味着像这样禁??克?也可能会?意中禁?任何扬声器,虽然扬声器也有可能变成?克?,所以这不?定是消极的结果。
最好从物理上删除这些设备,或者?少在BIOS/UEFI中禁?它们。禁?内核模块并不总是那么有效。
rfkill
可以通过rfkill将?线设备列??名单,以进?步减少远程攻击?。要将所有?线设备列??名单,请执?:
rfkill block all
WiFi可以通过以下?式解锁:
12rfkill 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的访问
sysfs是伪?件系统,可提供?量的内核和硬件信息。它通常安装在/sys上。 sysfs导致?量信息泄漏,尤其是内核指针泄漏。Whonix的security-misc软件包包括hide-hardware-info脚本,该脚本限制访问此?录以及/proc中的?些脚本,以试图隐藏潜在的硬件标识符并防?内核指针泄漏。该脚本是可配置的,并允许基于组将特定的应?程序列??名单。建议应?此?法,并使其在启动时使?init脚本执?。或者这样做成systemd服务。为了使基本功能在使?systemd的系统上运?,必须将?些系统服务列??名单。这可以通过创建/etc/systemd/system/user@.service.d/sysfs.conf并添加以下内容来完成:
[Service]
SupplementaryGroups=sysfs
但是,这不能解决所有问题。许多应?程序可能仍会中断,您需要将它们正确列??名单。
1Linux强化
某些发?版(例如Arch Linux)包括强化的内核程序包。它包含许多强化补丁程序和更注重安全性的内核配置。如果可能的话,建议安装它。
Grsecurity
Grsecurity是?组内核修补程序,可以??提?内核安全性。这些补丁曾经可以免费获得,但是现在需要购买了。如果可?,则强烈建议您获取它。Grsecurity提供了最新的内核和?户空间保护。
内核运?时防护
Linux Kernel Runtime Guard(LKRG)是?个内核模块,可确保运?时内核的完整性并检测漏洞。它可以杀死整个类别的内核漏洞。但这并不是?个完美的缓解?法,因为LKRG在设计上可以绕开。它仅适?于现成的恶意软件。但是,尽管可能性不?,但LKRG本身可能会像其他任何内核模块?样公开新的漏洞。
?编译内核
建议编译您??的内核,同时启?尽可能少的内核模块和尽可能多的安全性功能,以将内核的受攻击?保持在绝对最低限度。
另外,应?内核强化补丁,例如如上所述的linux-hardened或grsecurity。
发?版编译的内核还具有公共内核指针/符号,这对于漏洞利??常有?。编译??的内核将为您提供独特的内核符号,连同kptr_restrict,dmesg_restrict和其他针对内核指针泄漏的强化措施,将使攻击者更加难以创建依赖于内核指针知识的漏洞利?程序。
您就可以从Whonix的强化内核中汲取灵感或使?它。
强制访问措施
强制访问控制(MAC)系统对程序可以访问的内容进?细粒度的控制。这意味着您的浏览器将?权访问您的整个主?录或类似?录。
最常?的MAC措施是SELinux和AppArmor。SELinux?AppArmor更安全,因为它的粒度更细。例如,它是基于inode?不是基于路径的,允许强制执?明显更严格的限制,可以过滤内核ioctl等。不幸的是,这是以难以使?和难以学习为代价的,因此某些?可能会?选AppArmor。要在内核中启?AppArmor,必须设置以下引导参数:
apparmor=1 security=apparmor
要启?SELinux,请设置以下参数:
1selinux=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。
诸如Docker和LXC之类的容器解决?案经常被误导为沙盒形式。它们太宽松了,?法?泛?持各种应?程序,因此不能认为它们是强?的应?程序沙箱。
常?沙箱逃逸
1234567890111213PulseAudio
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_SERVICEProtectSystem=strictProtectHome=true
ProtectKernelTunables=trueProtectKernelModules=trueProtectControlGroups=trueProtectKernelLogs=trueProtectHostname=trueProtectClock=trueProtectProc=invisibleProcSubset=pidPrivateTmp=true
1920212223242526271415161718PrivateUsers=yesPrivateDevices=trueMemoryDenyWriteExecute=trueNoNewPrivileges=trueLockPersonality=trueRestrictRealtime=trueRestrictSUIDSGID=trueRestrictAddressFamilies=AF_INETRestrictNamespaces=yesSystemCallFilter=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 getrandomSystemCallArchitectures=nativeUMask=0077IPAddressDeny=anyAppArmorProfile=/etc/apparmor.d/usr.bin.example所有选项的说明:CapabilityBoundingSet= — Specifies the capabilities the process is given.ProtectHome=true — Makes all home directories inaccessible.ProtectKernelTunables=true — Mounts kernel tunables such as those modified throughsysctl as 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 /tmp and /var/tmp, therefore hiding theirprevious contents.PrivateUsers=true — Sets up an empty user namespace to hide other user accounts on the system.PrivateDevices=true — Creates a new /dev mount with minimal devices present.MemoryDenyWriteExecute=true — Enforces a memory W^X policy.NoNewPrivileges=true — Prevents escalating privileges.LockPersonality=true — Locks down the personality() syscall to prevent switchingexecution 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'twilling to maintain your own custom seccomp filter, then systemd provides many predefined system callsets that you can use. @system-service will be suitable for many use cases.1SystemCallArchitectures=native — Prevents executing syscalls from other CPU architectures.UMask=0077 — Sets the umask to 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轻松复制所有这些选项。gVisor普通沙箱固有地与主机共享同?内核。您信任我们已经评估为不安全的内核,可以正确限制这些程序。由于主机内核的整个攻击?已完全暴露,因此沙盒中的内核利?程序可以绕过任何限制。已经进?了?些努?来限制使?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=\通过全局预加载该库,也可以在系统范围内使?它,这是使?它的推荐?法。为此,请编辑/etc/ld.so.preload并插?:/usr/lib/libhardened_malloc.so1尽管?多数应?程序都可以正常?作,但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=524240Whonix项?为基于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 但该选项的存在?前正在辩论中。1内存安全语?
?内存安全语?编写的程序会?动受到保护,免受各种安全漏洞的影响,这些安全漏洞包括缓冲区溢出,未初始
化的变量,售后使?等。Microsoft和Google的安全研究?员进?的研究证明,已发现的?多数漏洞都是内存安全问题。这样的内存安全语?的示例包括Rust,Swift和Java,?内存不安全语?的示例包括C和C ++。如果可?,应使?内存安全替代品替换尽可能多的程序。
Root账户
root可以执?任何操作,并且可以访问您的整个系统。因此,应尽可能将其锁定,以使攻击者?法轻松获得root?户访问权限。
/etc/securetty
/etc/securetty?件指定允许您以root?户身份登录的位置。该?件应保留为空,以便任何?都不能从终端上这样做。
限制su
su可让您从终端切换?户。默认情况下,它尝试以root?户身份登录。要将su的使?限制在wheel组中,请编辑/etc/pam.d/su和/etc/pam.d/su-l并添加:
auth required pam_wheel.so use_uid
您应该在wheel组中拥有尽可能少的?户。
锁定root账户
要锁定root帐户以防?任何?以root身份登录,请执?:
passwd -l root
在执?此操作之前,请确保您具有获取根的替代?法(例如,从活动USB引导并更改为?件系统的chroot),以免您?意中将??锁定在系统之外。
拒绝通过SSH的远程root登陆
为了防?某?通过SSH以root身份登录,请编辑/etc/ssh/sshd_config并添加:
PermitRootLogin no
1增加散列回合数
码的安全性。默认情况下,shadow使?5000次回合,但是您可以将其增加到任意数量。尽管配置的回合越多,登录速度就越慢。编辑/etc/pam.d/passwd并添加回合选项。
您可以增加shadow使?的哈希回合数,从?通过迫使攻击者计算更多的哈希值来破解您的密码,从?提?哈希密
password required pam_unix.so sha512 shadow nullok rounds=65536
这使shadow执?65536次散列回合。
应?此设置后,密码不会?动重新加密,因此您需要使?以下?法重置密码:
passwd $username
限制Xorg root访问
默认情况下,某些发?版以root?户身份运?Xorg,这是?个问题,因为Xorg包含?量古???复杂的代码,这增加了巨?的攻击?,并使其更有可能拥有可以获取root特权的漏洞利?程序。要阻?它作为root?户执?,请编辑/etc/X11/Xwrapper.config并添加:
needs_root_rights = no
安全访问root
恶意软件可以使?多种?法来嗅探root帐户的密码。因此,访问根帐户的传统?式是不安全的,最好根本不访问根,但这实际上是不可?的。本节详细介绍了访问根帐户的最安全?法。在安装操作系统后,应?即应?这些说明,以确保该软件不含恶意软件。
您绝对不能使?普通?户帐户访问root,因为root可能已被盗?。您也不能直接登录到根帐户。通过执?以下操作,创建?个单独的“管理员”?户帐户,该帐户仅?于访问root?户,?不能?于访问其他?户:
useradd admin
执?并来设置?个?常强的密码:
passwd admin
仅允许该帐户使?您?选的权限提升机制。例如,如果使?sudo,则通过执?以下命令来添加sudoers异常:
01112131415123456789visudo -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-unreachableCOMMIT
1但是,您不应尝试在实际系统上使?此示例。它仅适?于某些台式机系统。
身份标识
为了保护隐私,最好最?程度地减少可追溯到您的信息量。
主机名和?户名
请勿在主机名或?户名中添加唯?标识的内容。将它们保留为通?名称,例如“host”和“user”,以便它们?法识别您。
Timezones / Locales / Keymaps
如果可能,应将您的时区设置为“ UTC”,将区域设置和键盘映射设置为“ US”。
机器ID
?个独???的机器ID被存储在/var/lib/dbus/machine-id (systemd系统是保存在/etc/machine-id)这些应编辑为通?名称,例如Whonix ID
b08dfa6083e7567a1921a715000001fb
MAC地址欺骗
MAC地址是分配给?络接?控制器(NIC)的唯?标识符。每次您连接到?络时(WIFI或以太?)则您的MAC地址已暴露。这使?们可以使?它来跟踪您并在本地?络上唯?地标识您。
但您不应该完全随机化MAC地址。拥有完全随机的MAC地址是显?易?的,并且会对您脱颖?出的?为产?不利影响。
MAC地址的OUI(组织唯?标识符)部分标识芯?组的制造商。对MAC地址的这?部分进?随机化处理可能会为您提供以前从未使?过的OUI,数?年来从未使?过的OUI或在您所在的地区极为罕?的OUI,因此使您脱颖?出,很明显地表明您在欺骗MAC地址。
MAC地址的末尾标识您的特定设备,并且可以?来跟踪您的设备。仅对MAC地址的这?部分进?随机化可防?您被跟踪,同时仍使MAC地址看起来可信。
要欺骗这些地址,请?先执?以下命令找出您的?络接?名称:
ip a
接下来,安装macchanger并执?:
1234567890111213macchanger -e $network_interface
要在每次引导时随机分配MAC地址,您应该为您的特定初始化系统创建?个初始化脚本。这是systemd的?个示例:
[Unit]
Description=macchanger on eth0Wants=network-pre.targetBefore=network-pre.target
BindsTo=sys-subsystem-net-devices-eth0.deviceAfter=sys-subsystem-net-devices-eth0.device
[Service]
ExecStart=/usr/bin/macchanger -e eth0Type=oneshot
[Install]
WantedBy=multi-user.target
上?的示例在启动时欺骗了eth0接?的MAC地址。将eth0替换为您的?络接?。
时间攻击
?乎每个系统都有不同的时间。这可?于时钟偏斜指纹攻击,?毫秒的差异?以使?户被暴露识别。
ICMP时间戳
忽略ICMP请求。
ICMP时间戳会在查询答复中泄漏系统时间。阻?这些攻击的最简单?法是利?防?墙阻?传?连接,或者使内核
TCP时间戳
TCP时间戳也会泄漏系统时间。内核尝试通过对每个连接使?随机偏移量来解决此问题,但这不?以解决问题。因此应该禁?TCP时间戳,可以通过使?sysctl设置以下内容来完成:
net.ipv4.tcp_timestamps=0
1TCP初始化序号
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会?动应?本节中详细介绍的步骤。
1setuid / setgid
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设置新创建?件的默认?件权限。默认的umask是0022,它不是很安全,因为它为系统上的每个?户提供了对新创建?件的读取访问权限。要使所有者以外的任何?都不可读新?件,请编辑/etc/profile并添加:
umask 0077
21核?转储
核?转储包含特定时间(通常是该程序崩溃时)该程序的已记录内存。它们可能包含敏感信息,例如密码和加密密钥,因此必须将其禁?。
禁?它们的?法主要有三种:sysctl,systemd和ulimit
sysctl
通过sysctl设置以下设置:
kernel.core_pattern=|/bin/false
systemd
创建/etc/systemd/coredump.conf.d/disable.conf并添加如下内容:
[Coredump]Storage=none
ulimit
编辑/etc/security/limits.conf并添加如下内容:
* hard core 0
setuid进程
即使在进?了这些设置之后,以提升的特权运?的进程仍可能会转储其内存。为了防?他们这样做,请通过sysctl设置以下内容:
fs.suid_dumpable=0
21Swap
与核?转储类似,交换或分?将部分内存复制到磁盘,其中可能包含敏感信息。应该将内核配置为仅在绝对必要时进?交换,相应的sysctl设置:
vm.swappiness=1
PAM
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更新
含在其软件仓库中,例如Arch Linux和Debian。
Microcode更新对于修复关键的CPU漏洞(如Meltdown和Spectre等)?关重要。?多数发?版都将这些发?版包
IPv6隐私扩展
IPv6地址是从计算机的MAC地址?成的,从?使您的IPv6地址是唯?的,并直接绑定到计算机。隐私扩展会?成?个随机的IPv6地址,以减轻这种形式的跟踪。请注意,如果您开启了MAC地址欺骗机制或禁?了IPv6,则?需执?这些步骤。
要启?这些功能,请通过sysctl设置以下设置:
12345net.ipv6.conf.all.use_tempaddr=2net.ipv6.conf.default.use_tempaddr=2NetworkManager要为NetworkManager启?隐私扩展,请编辑/etc/NetworkManager/NetworkManager.conf并添加: [connection]ipv6.ip6-privacy=2systemd-networkd要为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。1熵
熵基本上反应操作系统信息收集的随机程度,对于诸如加密之类的事情?关重要。因此,最好通过安装其他随机数?成器(如haveged和jitterentropy)从各种来源收集尽可能多的熵。
为了使jitterentropy正确运?,必须通过创建/usr/lib/modules-load.d/jitterentropy.conf并添加以下内容尽早加载内核模块:
jitterentropy_rng
RDRAND
RDRAN是提供随机数的CPU指令。如果可?,内核会?动将其?作熵源。但是由于它是专有的并且是CPU本身的?部分,因此?法审核和验证其安全性。您甚??法对代码进?反向?程。该RNG以前曾遭受过漏洞的攻击,其中有些可能是后?攻击。通过设置以下引导参数可以不信任此功能:
random.trust_cpu=off
以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中全局设置此环境变量。
1特定发?版的安全强化
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 \
物理安全
全盘加密可确保对驱动器上的所有数据进?加密,并且不会被物理攻击者读取。?多数发?版都?持在安装过程中启?加密,请确保设置了强密码。您也可以使?dm-crypt?动加密驱动器。
请注意,全盘加密不包括/boot,这样仍然可以修改内核、引导加载程序和其他关键?件。为了完全防?篡改,您还必须实施经过验证的引导。
BIOS / UEFI强化
最好启?它并设置?个?常强壮的密码。虽然这是很弱的保护,因为重置密码很简单。它通常存储在易失性内存中,因此攻击者只需要能够卸下CMOS电池?秒钟,或者他们就可以使?某些主板上的跳线将其重置。您还应该禁?所有未使?的设备和引导选项,例如USB引导,以减少攻击?。别忽略BIOS或UEFI的更新,确保将其更新。将其与常规操作系统更新?样重要。此外,请参阅《NSA的硬件和固件安全指南》
如果您仍在使?旧版BIOS,则应迁移到UEFI,以利?较新的安全功能。?多数BIOS或UEFI实现都?持设置密码。
Bootloader密码
引导加载程序会在引导过程的早期执?,并负责加载操作系统。保护它?常重要,否则,它可能会被篡改。例如,本地攻击者可以通过在启动时使?init=/bin/bash作为内核参数来轻松获得root shell,该命令告诉内核执?/bin/bash?不是常规的init系统。您可以通过为引导加载程序设置密码来防?这种情况。仅设置引导程序密码不?以完全保护它。还必须按照以下说明设置经过验证的启动。
12Grub
要为GRUB设置密码,请执?:
grub-mkpasswd-pbkdf2
输?您的密码,该密码将?成?个字符串。它将类似于“ grub.pbkdf2.sha512.10000.C4009... “ 。创建/etc/grub.d/40_password并添加:
set superusers=\
password_pbkdf2 $username $password
?grub-mkpasswd-pbkdf2?成的字符串替换“
。
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”替换为您要设置的密码。
1这些密码可以是纯?本,也可以使?MD5,SHA-1,SHA-256或SHA-512进?散列。建议先使?强哈希算法(例如SHA-256或SHA-512)对密码进?哈希处理,以避免将其存储为明?形式。systemd-bootsystemd-boot具有防?在引导时编辑内核参数的选项。在loader.conf?件中,添加: editor nosystemd-boot并不正式?持保护内核参数编辑器的密码,但是您可以使?systemd-boot-password来实现。验证引导经过验证的引导通过密码验证来确保引导链和基本系统的完整性。这可?于确保物理攻击者?法修改设备上的软件。如果没有经过验证的引导,则?旦获得物理访问权限,就可以轻松绕过上述所有预防措施。经过验证的引导不仅像许多?认为的那样是为了物理安全。它还可以?于防?远程恶意软件持久化——如果攻击者设法破坏了整个系统并获得了很?的特权,则经过验证的引导将在重新引导后还原其更改,并确保它们?法持久化。经过验证的最常?的引导实现是UEFI安全引导,但是它本身并不是?个完整的实现,因为它仅会验证引导加载程序和内核,这意味着可以通过以下?法:仅UEFI安全启动就没有?成不变的信任根,因此物理攻击者仍然可以刷新设备的固件。为了减轻这种情况,请结合使?UEFI安全启动和Intel Boot Guard或AMD Secure Boot。 远程攻击者(或不使?加密的物理攻击者)可以简单地修改操作系统的任何其他特权部分。例如,如果他们有修改内核的特权,那么他们也可以修改/sbin/init来有效地获得相同的结果。因此,仅验证内核和引导加载程序不会对远程攻击者产?任何影响。为了减轻这种情况,您必须使?dm-verity验证基本操作系统,尽管由于传统Linux发?版的布局,这?常困难且笨拙。通常,很难在传统Linux上实现可靠的经过验证的引导实现。USBsUSB设备为物理攻击提供了重要的攻击?。例如BadUSB和Stuxnet是此类攻击的范例。最佳实践是禁?所有新连接的USB且仅将受信任设备列??名单,USBGuard对此?常有?。您也可以将nousb?作内核引导参数,以禁?内核中的所有USB?持。可以sysctl设置kernel.deny_new_usb=1 DMA攻击直接内存访问(DMA)攻击涉及通过插?某些物理设备来完全访问所有系统内存。这可以通过控制设备可访问的内存区域的IOMMU或将特别易受攻击的内核模块列??名单来缓解。要启?IOMMU,请设置以下内核引导参数: 12intel_iommu=on amd_iommu=on
您只需要为特定的CPU制造商启?该选项,但同时启?这两个选项就没有问题。
efi=disable_early_pci_dma
通过在?常早的启动过程中禁?所有PCI桥接器上的busmaster位,此选项可修复上述IOMMU中的漏洞。此外,Thunderbolt和FireWire通常容易受到DMA攻击。要禁?它们,请将这些内核模块列??名单:
install firewire-core /bin/falseinstall thunderbolt /bin/false
冷启动攻击
当攻击者在擦除RAM中的数据之前对其进?分析时,就会发?冷启动攻击。使?现代RAM时,冷启动攻击不太实?,因为RAM通常会在?秒钟或?分钟内清除,除?将其放?冷却液(如液氮或冷冻机)中。攻击者必须在?秒钟内将设备中的RAM棒拔出并将其暴露于液氮中,?且确保?户不会注意到。
如果冷启动攻击是威胁模型的?部分,请在关机后保护计算机?分钟,以确保没有?可以访问您的RAM记忆棒。您也可以将RAM棒焊接到主板上,以使其更难以卡住。如果使?笔记本电脑,请取出电池,然后直接?充电电缆供电。关机后请拔出电缆,以确保RAM彻底断电?法访问。
在内核?我保护启动参数部分中,空闲时内存清零选项将?零覆盖内存中的敏感数据。此外,强化的内存分配器可以通过CONFIG_ZERO_ON_FREE配置选项清除?户空间堆内存中的敏感数据。尽管如此,某些数据仍可能保留在内存中。
此外,现代内核还包括复位攻击缓解措施,该命令可命令固件在关机时擦除数据,尽管这需要固件?持。确保正常关闭计算机,以使上述缓解措施可以开始。
如果以上都不适?您的威胁模型,则可以实施Tails的内存擦除过程,该过程将擦除?部分内存(视频内存除外),并且已被证明是有效的。
1最佳实践?旦对系统进?了尽可能多的加固,就应该遵循良好的隐私和安全性惯例:禁?或删除不需要的东?以最?化攻击?。保持更新。配置cron任务或init脚本以每天更新系统。不要泄漏有关您或您的系统的任何信息,?论它看起来多么渺?。遵循常规的安全和隐私建议尽管已经进?了强化,但您必须记住Linux仍然是?个有缺陷的操作系统,没有任何强化可以完全修复它。 其他指南您应该进?尽可能多的研究,?不要依赖单?的信息来源。最?的安全问题之?就是?户。这些是我认为有价值的其他指南的链接:Arch Linux Security wiki pageWhonix DocumentationNSA RHEL 5 Hardening Guide (稍有过时,但仍包含有?的信息)KSPP recommended kernel settingskconfig-hardened-check 术语您可能需要重新?成GRUB配置,以应?对引导加载程序所做的某些更改。在不同的发?版之间,执?此操作的步骤有时可能会有所不同。例如,在诸如Arch Linux之类的发?版上,应通过执?以下命令来重新?成配置?件: grub-mkconfig -o $path_to_grub_config\取决于您如何设置系统。它通常是/boot/grub/grub.cfg或/boot/EFI/grub/grub.cfg,但是在执?此命令之前,请务必确保正确。另外,在Debian或Ubuntu等发?版上,您应该执?以下命令:update-grub能?
在Linux内核中,“ root特权”分为各种不同的能?(capabilities)。这在应?最?特权原则时很有帮助——可以给它们仅授予特定的?集,?不是授予进程总的root特权。例如,如果程序只需要设置系统时间,则只需要CAP_SYS_TIME?不是root所有能?。这会限制可能造成的损害,但是,您仍必须谨慎授予能?,因为?论如何,其中许多能?可能会被滥?以获取完整的root特权。
Linux系统安全强化指南 - 图文



