安全

出自 ArchWiki
(重定向自 强制访问控制

本文包含关于加固 Arch Linux 系统的建议和最佳实践。

概念

  • 确实有可能将安全性加强到系统无法使用的程度。安全性和便利性必须平衡。诀窍是创建一个安全有用的系统。
  • 最大的威胁是,并且永远都是,用户。
  • 最小权限原则:系统中的每个部分都应该只能访问严格要求的资源,不能访问更多。
  • 纵深防御:安全在独立的层中工作得更好。当一层被突破时,另一层应该阻止攻击。
  • 保持一点偏执。并保持怀疑。如果任何事情听起来好得难以置信,那它可能就是真的!
  • 除非您从所有网络上拔下机器插头,将其关闭,将其锁定在保险箱中,用混凝土掩埋并永不使用它,否则您永远无法使系统 100% 安全。
  • 为失败做好准备。提前制定一个计划,以便在您的安全被破坏时遵循。

密码

密码是安全系统的关键。它们保护您的用户账户加密文件系统SSH/GPG 密钥。它们是计算机选择信任使用它的人的主要方式,因此安全性的很大一部分是关于选择安全密码并保护它们。

选择安全密码

密码必须足够复杂,不能轻易从个人信息等中猜出,或者使用诸如社会工程或暴力破解攻击之类的方法破解。强密码的原则基于长度随机性。在密码学中,密码的质量通常被称为其

不安全的密码包括包含以下内容或使用以下内容作为替换/变体基础的密码

  • 个人身份信息(例如,您的狗的名字、出生日期、区号、最喜欢的电子游戏)
  • 单词的简单字符替换(例如,k1araj0hns0n),因为现代字典攻击可以轻松处理这些
  • “词根”或常见字符串,后跟或前跟添加的数字、符号或字符(例如,DG091101%
  • 常用短语或常见字典单词的短字符串(例如 photocopyhauntbranchexpose),包括字符替换(例如 Ph0toc0pyh4uN7br@nch3xp*se)(有关字典单词组合何时安全,请参见下文的 Diceware)
  • 最常用密码列表中的任何密码

密码的最佳选择是长(越长越好)且从随机源生成的内容。使用长密码非常重要。弱哈希算法允许在短短几个小时内破解 8 个字符的密码哈希。

诸如 pwgenapgAUR 之类的工具可以生成随机密码。但是,这些密码可能难以记忆。一种记忆技巧(对于经常键入的密码)是生成一个长密码并记住最少数量的安全字符,暂时写下完整的生成字符串。随着时间的推移,增加键入的字符数 - 直到密码深深印在肌肉记忆中,并且不需要记住。这种技术更困难,但可以确信密码不会出现在单词列表或结合单词和替换字符的“智能”暴力破解攻击中。

除了密码管理之外,keepassxc 还提供密码/密码短语生成。可以在 GUI 中自定义生成。也支持基于字典的密码短语。

一种记忆密码的技术是使用助记短语,其中短语中的每个单词都会提醒您密码中的下一个字符。例如,“the girl is walking down the rainy street” 可以翻译为 t6!WdtR5,或者更简单地说,t&6!RrlW@dtR,57。这种方法可以使记住密码更容易,但请注意,各种字母在单词开头出现的概率差异很大 (Wikipedia:Letter frequency)。

另一种有效的技术是将随机生成的密码写下来,并将它们存储在安全的地方,例如钱包、手提包或文件保险箱中。大多数人在保护其物理贵重物品免受攻击方面做得很好,并且与数字安全实践相比,大多数人更容易理解物理安全最佳实践。

将助记和随机技术结合使用也非常有效,方法是使用密码管理器保存随机生成的长密码,然后使用一个容易记住的“主密码”/主要密码来访问密码管理器,该主密码必须仅用于此目的。主密码必须记住,并且永远不要保存。这需要在一个系统上安装密码管理器才能轻松访问密码(这可能被视为不便或安全功能,具体取决于情况)。一些密码管理器还具有智能手机应用程序,可用于在未安装密码管理器的系统上手动输入密码(如果这是一个常见的用例,您仍然可以使用易于输入但安全的密码来代替完全随机的密码,请参见下文)。请注意,如果您忘记了主密码,密码管理器会引入单点故障。一些密码管理器基于主密码和您要登录的服务名称来计算包含的密码,而不是对其进行加密,从而可以在无需同步任何数据的情况下在新系统上使用它。

使用一系列容易记住的、不相关的单词作为密码可能很有效。其理论是,如果使用足够长的短语,则密码长度获得的熵可以抵消使用字典单词而损失的熵。这个 xkcd 漫画 展示了这种方法的熵权衡,其中考虑了密码短语中每个单词的有限可能单词集。如果您选择的单词集很大(数千个单词),并且您从中选择 5-7 个甚至更多随机单词,则即使假设攻击者知道选择的可能单词集和选择的单词数,此方法也提供了很大的熵。在确定单词集和单词数后,可能的密码短语的数量为:(要从中选择的单词集中的单词数)的(为密码短语选择的单词数)次方。有关更多信息,请参见例如 Diceware

有关更多背景信息,请参见 密码短语常见问题解答Wikipedia:密码强度

密码维护

一旦您选择了强密码,请务必确保其安全。注意 键盘记录器(软件和硬件)、屏幕记录器、社会工程学肩窥,并避免重复使用密码,以防止不安全的服务器泄漏不必要的信息。密码管理器可以帮助管理大量复杂的密码:如果您从管理器复制粘贴存储的密码到需要它们的应用程序,请确保每次都清除复制缓冲区,并确保它们没有保存在任何类型的日志中(例如,不要将它们粘贴到纯文本终端命令中,这会将它们存储在诸如 .bash_history 之类的文件中)。请注意,作为浏览器扩展实现的密码管理器可能容易受到 侧信道攻击。可以通过使用作为独立应用程序运行的密码管理器来缓解这些问题。

作为一项原则,不要仅仅因为安全密码难以记住就选择不安全的密码。密码是一种平衡行为。拥有一个由密钥和一个强主密码保护的加密的安全密码数据库,比拥有许多类似的弱密码要好。将密码写下来可能同样有效 [1],避免了软件解决方案中潜在的漏洞,同时需要物理安全。

密码短语强度的另一个方面是它不能容易地从其他地方恢复。

如果您将相同的密码短语用于磁盘加密和登录密码(例如,在登录时自动挂载加密分区或文件夹很有用),请确保 /etc/shadow 最终位于加密分区上,或者/并且对存储的密码哈希使用强密钥派生函数(即 yescrypt/argon2 或带有 PBKDF2 的 sha512,但不是 md5 或 PBKDF2 中的低迭代次数)(有关更多信息,请参见 SHA 密码哈希)。

提示: Arch Linux 将 默认哈希 算法切换为 yescrypt。如果您没有自定义默认设置,则执行密码更改 passwd 是必要的(并且足够)来应用新的默认设置。

如果您要备份密码数据库,请确保每个副本都没有存储在任何其他密码短语之后,而该密码短语又存储在其中,例如,加密驱动器或经过身份验证的远程存储服务,否则您将在需要时无法访问它;一个有用的技巧是使用主密码的简单密码哈希来保护备份数据库的驱动器或帐户。维护所有备份位置的列表:如果有一天您担心主密码短语已泄露,您将必须立即在所有数据库备份和受从主密码派生的密钥保护的位置上更改它。

以安全的方式对数据库进行版本控制可能非常复杂:如果您选择这样做,则必须有一种更新所有数据库版本的主密码的方法。主密码何时泄露可能并不总是立即清楚:为了降低在您意识到密码泄露之前其他人发现您的密码的风险,您可以选择定期更改密码。如果您担心您已经失去了对数据库副本的控制权,则需要在可能需要暴力破解主密码的时间内更改其中包含的所有密码,具体取决于其熵。

密码哈希

哈希是一种单向函数,即它被设计为在不使用它计算哈希函数的情况下不可能推导出输入(示例:MD5、SHA)。

密码哈希函数旨在使得在不使用它计算哈希函数的情况下不可能推导出用户输入(密码)(示例:bcrypt)。密钥派生函数 (KDF;示例:yescrypt、scrypt、PBKDF2) 是一种密码学算法,旨在从输入(主密钥、密码)派生密钥(例如 AES 密钥、密码哈希)。因此,KDF 可以服务于多种应用,包括密码哈希函数的应用。

默认情况下,Arch 将哈希的用户密码存储在仅 root 用户可读的 /etc/shadow 文件中,与其他用户参数(存储在全局可读的 /etc/passwd 文件中)分开,请参见 用户和组#用户数据库。另请参阅 #限制 root

密码通过 passwd 命令设置,该命令使用系统的 crypt 函数拉伸密码,然后将它们保存在 /etc/shadow 中。密码也经过 加盐 处理,以防御 彩虹表 攻击。另请参阅 密码在 Linux 中是如何存储的(理解使用 shadow-utils 进行哈希处理)

由于密码哈希遵循定义的格式,因此可以为后续新的 passwd 命令调用配置方法和参数。因此,存储在 /etc/shadow 文件中的各个哈希可能是系统支持的哈希函数的异构混合。

有关格式、哈希方法和参数的更多信息,请参见 crypt(5)

/etc/login.defs 文件配置了 默认密码哈希 方法 ENCRYPT_METHOD YESCRYPT 及其参数 YESCRYPT_COST_FACTOR

例如,默认 YESCRYPT_COST_FACTOR 参数的增加将导致从密码推导出哈希所需的计算时间呈对数增长。同样,这也适用于试图获取密码机密的第三方以及系统验证用户登录。

相反,SHA-512 哈希函数的计算时间由一个参数配置,该参数具有线性影响。有关先前 Arch 默认设置的信息,请参见 SHA 密码哈希。请注意,yescrypt 算法在内部使用 SHA-256、HMAC 和 PBKDF2 来计算其密码哈希。主要原因是结合这些广泛使用和测试的功能的积极属性,以增强对攻击的抵抗力。例如,SHA 在各种用途中的可用性导致了对该功能的硬件支持,即计算纯 SHA 哈希的性能已大大提高,使其作为密码哈希函数的应用越来越被废弃。

使用 pam_pwquality 强制执行强密码

pam_pwquality 提供针对 字典攻击 的保护,并帮助配置可在整个系统强制执行的密码策略。它基于 pam_cracklib,因此它向后兼容其选项。

安装 libpwquality 软件包。

警告: 默认情况下,root 帐户不受此策略的影响。
注意
  • 您可以使用 root 帐户为用户设置绕过所需/配置策略的密码。这在设置临时密码时很有用。
  • 当前关于密码的安全指南,例如来自 NIST 以及其他来源的指南,不建议强制使用特殊字符,因为它们通常只会导致可预测的更改。

例如,如果您想强制执行以下策略

  • 错误时提示输入密码 2 次(重试选项)
  • 最小长度 10 个字符(minlen 选项)
  • 输入新密码时,至少 6 个字符应与旧密码不同(difok 选项)
  • 至少 1 个数字(dcredit 选项)
  • 至少 1 个大写字母(ucredit 选项)
  • 至少 1 个小写字母(lcredit 选项)
  • 至少 1 个其他字符(ocredit 选项)
  • 不能包含单词“myservice”和“mydomain”
  • 对 root 强制执行策略

编辑 /etc/pam.d/passwd 文件,使其内容如下

#%PAM-1.0
password required pam_pwquality.so retry=2 minlen=10 difok=6 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1 [badwords=myservice mydomain] enforce_for_root
password required pam_unix.so use_authtok sha512 shadow

password required pam_unix.so use_authtok 指示 pam_unix 模块不要提示输入密码,而是使用 pam_pwquality 提供的密码。

您可以参考 pam_pwquality(8)pam_unix(8) 手册页以获取更多信息。

CPU

微代码

有关如何安装 CPU 微代码的重要安全更新的信息,请参见 微代码

硬件漏洞

某些 CPU 包含硬件漏洞。有关这些漏洞的列表,以及帮助自定义内核以缓解特定使用场景的这些漏洞的缓解选择指南,请参见 内核硬件漏洞文档

要检查您是否受到已知漏洞的影响,请运行以下命令

$ grep -r . /sys/devices/system/cpu/vulnerabilities/

在大多数情况下,更新内核和微代码将缓解漏洞。

同步多线程(超线程)

同步多线程 (SMT),在 Intel CPU 上也称为超线程,是一种硬件功能,可能是 L1 终端故障微架构数据采样 漏洞的来源。Linux 内核和微代码更新包含针对已知漏洞的缓解措施,但如果存在不受信任的虚拟化客户机,在某些 CPU 上可能仍然需要禁用 SMT

注意: 禁用 SMT 主要对虚拟机监控程序有利。[2] 在普通系统上,它几乎没有安全优势。

SMT 通常可以在系统的固件中禁用。有关更多信息,请查阅您的主板或系统文档。您还可以通过添加以下 内核参数 在内核中禁用 SMT

mitigations=auto,nosmt

内存

硬化 malloc

hardened_malloc (hardened_mallocAUR, hardened-malloc-gitAUR) 是 glibc 的 malloc() 的硬化替代品。该项目最初由 GrapheneOS 的 Daniel Micay 开发,用于集成到 Android 的 Bionicmusl 中,但他也内置了对 x86_64 架构上的标准 Linux 发行版的支持。

虽然 hardened_malloc 尚未集成到 glibc 中(欢迎协助和拉取请求),但它可以很容易地与 LD_PRELOAD 一起使用。到目前为止的测试表明,如果在 /etc/ld.so.preload 中全局启用,它只会导致少数应用程序出现问题。由于 hardened_malloc 具有性能成本,因此您可能需要根据攻击面和性能需求来决定在具体情况下使用哪种实现。

本文或本节的事实准确性存在争议。

原因: Firefox 可能需要重新构建才能有效地与 hardened-malloc 一起使用(在 Talk:Security#Use of hardened-malloc with Firefox 中讨论)

要以独立方式试用它,请使用 hardened-malloc-preload 包装器脚本,或使用正确的 preload 值手动启动应用程序

LD_PRELOAD="/usr/lib/libhardened_malloc.so" /usr/bin/firefox

有关在 Firejail 中的正确用法,请参阅其 wiki 页面,有关 hardened_malloc 的一些可配置构建选项,请参阅 github 存储库。

存储

静态数据加密

静态数据加密,最好是使用强密码进行全盘加密,是防止物理恢复数据的唯一方法。这在计算机关闭或相关磁盘卸载时提供数据保密性。

然而,一旦计算机开机并且驱动器被挂载,其数据就会变得与未加密的驱动器一样容易受到攻击。因此,最佳实践是在不再需要数据分区时立即卸载它们。

您也可以使用存储在 TPM 中的密钥加密驱动器,尽管它过去曾存在漏洞,并且密钥可以通过总线嗅探攻击提取。

某些程序,例如 dm-crypt,允许用户将 loop 文件加密为虚拟卷。当只有系统的某些部分需要安全时,这是一个合理的替代全盘加密的方案。

虽然在静态数据加密文章中比较的基于块设备或文件系统的加密类型对于保护物理介质上的数据很有用,但大多数都不能用于保护您无法控制的远程系统(例如云存储)上的数据。 在某些情况下,单个文件加密将非常有用。

以下是一些加密文件的方法

  • 一些归档和压缩工具也提供基本加密。 一些例子是 7-Zip (-p 标志), zip (-e 标志)。 应该特别谨慎地依赖加密,因为这些工具可能使用自定义算法以实现跨平台兼容性。[3]
  • GnuPG 可用于加密文件
  • age 是一个简单易用的文件加密工具。 它还支持多接收者和使用 SSH 密钥进行加密,这对于安全文件共享非常有用。

文件系统

如果启用了 fs.protected_hardlinksfs.protected_symlinks sysctl 开关,内核现在可以防止与硬链接和符号链接相关的安全问题,因此不再需要为了安全而分离全局可写目录。

包含全局可写目录的文件系统仍然可以保持分离,作为限制磁盘空间耗尽造成损害的粗略方法。 然而,填充 /var/tmp 就足以使服务瘫痪。 存在更灵活的机制来处理这种担忧(例如 配额),并且一些文件系统本身包含相关功能(Btrfs 在子卷上具有配额)。

挂载选项

遵循最小权限原则,文件系统应使用尽可能严格的挂载选项进行挂载(在不损失功能的情况下)。

相关的挂载选项有

  • nodev: 不解释文件系统上的字符或块特殊设备。
  • nosuid: 不允许 set-user-identifier 或 set-group-identifier 位生效。
  • noexec: 不允许直接执行已挂载文件系统上的任何二进制文件。
    • /home 上设置 noexec 会禁用可执行脚本,并破坏 WineSteam、PyCharm、.NET 等。
      • Wine 不需要 exec 标志来打开 Windows 二进制文件。 只有当 Wine 本身安装在 /home 中时才需要。
      • 为了保持 Steam 正常工作,您可以通过在 fstab 中添加以下内容将 /home/user/.local/share/Steam 挂载为 exec
        /home/user/.local/share/Steam  /home/user/.local/share/Steam  none defaults,bind,user,exec,nofail  0  0
    • 某些软件包(例如构建 nvidia-dkms)可能需要在 /var 上使用 exec

用于数据的文件系统应始终以 nodevnosuidnoexec 挂载。

要考虑的潜在文件系统挂载点

  • /var
  • /home
  • /dev/shm
  • /tmp
  • /boot
提示: 当使用 GPT 分区自动挂载时,ESP 和 XBOOTLDR 分区始终使用 noexec,nosuid,nodev 进行强化

快照

当使用文件系统快照时,例如使用 BtrfsLVMZFS,务必注意快照可能会保留用户期望删除的敏感信息。 当配置了诸如 Snapper 之类的自动快照工具时尤其如此,因为它们可以定期或响应系统事件捕获快照。 以下是一些 /home/ 中的敏感信息如何在快照中持久存在的示例

  • 已删除的文件和目录:即使文件或目录从文件系统中删除,它们可能仍然存在于较旧的快照中。 这在大多数情况下是预期的,但请考虑是否应保留诸如 .local/share/Trash/.history 等文件和目录。
  • 临时文件和缓存:应用程序生成的临时文件和缓存数据可能包含在快照中。 例如,保存在加密目录中的文件可能会在打开时生成缩略图 (.cache/thumbnails) 或工作副本,这反过来可能会包含在快照中。 这同样适用于例如浏览历史 (.mozilla/, .config/chromium/, 等等),这些历史记录可能在清除之前已包含在快照中。

如果支持,请考虑将此类目录完全从快照中排除。 例如,如果使用 Btrfs,您可以为例如 .cache/.config/.local/.var/ 或任何其他目录创建子卷,具体取决于您的用例。

注意:.local/share/Trash 移动到单独的子卷可能会在某些情况下破坏回收站功能,例如 GNOME/Files

文件访问权限

本文或本节的事实准确性存在争议。

原因: chmod go-r 并非“移除所有权限”,它仅移除读取权限。(在 Talk:Security 中讨论)

默认的文件权限允许几乎所有内容的读取访问权限,更改权限可以隐藏有价值的信息,防止攻击者获得对非 root 帐户(例如 httpnobody 用户)的访问权限。 您可以使用 chmod 移除组和其他用户的全部权限

# chmod go-r path_to_hide
警告: 不要广泛应用此操作。 每次尝试一个配置,确保它值得隐藏,并且不会破坏程序功能。 如果组被依赖,您可能需要从命令中删除 g (或者如果已经运行,则使用 chmod g+r path 重新添加权限)。

要考虑的一些路径是

可以更改默认的 umask 0022 以提高新创建文件的安全性。NSA RHEL5 安全指南 建议 umask 为 0077 以实现最大安全性,这使得新文件除了所有者之外的用户不可读。 要更改此设置,请参阅 Umask#设置掩码值。 如果您使用 sudo,请考虑将其配置为使用默认 root umask

SUID 和 SGID 文件

重要的是要了解任何具有 Setuid 或 Setgid 位的任何文件。 以下是 /usr/bin 中具有 SUID 位设置且归 root 所有的相关文件示例

此类可执行文件的主要风险包括权限提升漏洞,请参阅例如 Wikipedia:Setuid#安全影响[4][5][6]

设置了 SUID 位但非 root 用户拥有的文件,或设置了 SGID 位的的文件通常具有较小的潜在影响,但如果存在漏洞,理论上仍然可能造成相当大的损害。 通常可以通过分配 Capabilities 来避免使用 Setuid 或 Setgid。

提示: 保持及时更新提供 SUID/SGID 可执行文件的软件包至关重要,以防止系统存在漏洞。

要在 /usr/bin 中搜索具有 SUID 或 SGID 位的 文件

$ find /usr/bin -perm "/u=s,g=s"

备份

本文或本节是与 系统备份 合并的候选对象。

注意: 有一个专门用于系统备份的页面。(在 Talk:Security 中讨论)

定期创建重要数据的备份。 定期测试备份的完整性。 定期测试备份是否可以恢复。

确保至少有一个数据副本离线存储,即不以任何方式连接到受威胁的系统。勒索软件和其他破坏性攻击也可能攻击任何连接的备份系统。

SATA SSD 冻结模式

请参阅 固态硬盘#从睡眠状态唤醒后将 SATA SSD 状态设置为冻结模式

用户设置

日常使用不要使用 root 帐户

遵循最小权限原则,日常使用不要使用 root 用户。 为每个使用系统的人创建一个非特权用户帐户。 有关临时获得特权访问权限的方法,请参阅 应用程序列表/安全#权限提升

在登录尝试失败后强制延迟

将以下行添加到 /etc/pam.d/system-login 以在登录尝试失败后添加至少 4 秒的延迟

/etc/pam.d/system-login
auth optional pam_faildelay.so delay=4000000

4000000 是延迟的时间,单位为微秒。

注意: 除了 pam_faildelay 之外的其他 PAM 模块也可能建议这种延迟; 如果多个模块这样做,PAM 将使用最长的延迟。

特别是,pam_unixpam_faillock 默认都设置了 2 秒的最小延迟。 为了完全消除此延迟,您需要将 nodelay 参数添加到这些模块的任何 auth 行,例如

/etc/pam.d/system-auth
auth       [success=1 default=bad]     pam_unix.so          try_first_pass nullok nodelay

在三次登录尝试失败后锁定用户

pambase 20200721.1-2 起,默认启用 pam_faillock.so,在 15 分钟内尝试登录失败 3 次后,将用户锁定 10 分钟(请参阅 FS#67644)。 锁定仅适用于密码身份验证(例如登录和sudo),仍然接受通过 SSH 进行的公钥身份验证。 为了防止完全拒绝服务,默认情况下为 root 用户禁用此锁定。

要解锁用户,请执行

$ faillock --user username --reset

默认情况下,锁定机制是每个用户一个文件,位于 /run/faillock/。 删除或清空该文件会解锁该用户——该目录归 root 所有,但该文件归用户所有,因此 faillock 命令仅清空文件,因此不需要 root 权限。

可以使用文件 /etc/security/faillock.conf 配置模块 pam_faillock.so。 锁定参数包括

  • unlock_time — 锁定时间(以秒为单位,默认为 10 分钟)。
  • fail_interval — 失败登录可能导致锁定的时间(以秒为单位,默认为 15 分钟)。
  • deny — 锁定前的失败登录次数(默认为 3)。
提示: 锁定的主要目的是减缓暴力破解攻击,使其变得不可行。 因此,如果由于密码输入错误而导致锁定过于频繁,则可以优先考虑放宽尝试次数而不是减少锁定时间。
注意: deny = 0 将完全禁用锁定机制。

默认情况下,所有用户锁定在重启后都会丢失。 如果您的攻击者可以重启机器,则持久锁定会更安全。 要使锁定持久化,请将 /etc/security/faillock.conf 中的 dir 参数更改为 /var/lib/faillock

更改无需重启即可生效。 有关更多配置选项,例如为 root 帐户启用锁定、为集中式登录(例如 LDAP)禁用锁定等,请参阅 faillock.conf(5)

限制进程数量

在具有许多或不受信任用户的系统上,限制每个用户一次可以运行的进程数量非常重要,从而防止 fork 炸弹和其他拒绝服务攻击。 /etc/security/limits.conf 配置确定每个用户或组可以打开多少个进程,默认情况下是空的(除了有用的注释)。 将以下行添加到此文件将限制所有用户最多 100 个活动进程,除非他们使用 prlimit 命令将其会话的最大值显式提高到 200。 这些值可以根据用户应该运行的适当进程数或您管理的机器的硬件进行更改。

* soft nproc 100
* hard nproc 200

可以使用 ps --no-headers -Leo user | sort | uniq --count 找到每个用户的当前线程数。 这可能有助于确定用户的适当限制值; 另请参阅 limits.conf

使用 Wayland

优先使用 Wayland 而不是 Xorg。 Xorg 的设计早于现代安全实践,并且被许多人认为是不安全的。 例如,Xorg 应用程序可能会在不活动时记录击键。

如果您必须运行 Xorg,建议避免以 root 身份运行。 在 Wayland 中,Xwayland 兼容层将自动使用无根 Xorg。

限制 root 用户

根据定义,root 用户是系统上最强大的用户。同时,root 用户账户也很难审计。因此,尽可能限制 root 用户账户的使用非常重要。有很多方法可以在限制 root 用户造成危害的能力的同时,保留其权力。

使用 sudo 而不是 su

本文或本章节可能需要与sudo合并。

注意: 有一篇专门的文章。(在Talk:Security中讨论)

出于多种原因,对于特权访问,使用 sudosu 更可取。

  • 它可以记录哪个普通权限用户运行了每个特权命令。
  • 不需要将 root 用户密码告知每个需要 root 访问权限的用户。
  • sudo 阻止用户意外地以 root 身份运行不需要 root 访问权限的命令,因为不会创建完整的 root 终端。这符合最小权限原则
  • 可以为每个用户启用单独的程序,而不是仅为了运行一个命令而提供完整的 root 访问权限。例如,要为用户 alice 提供对特定程序的访问权限
# visudo
/etc/sudoers
alice ALL = NOPASSWD: /path/to/program

或者,可以允许所有用户使用单独的命令。要以普通用户身份挂载来自服务器的 Samba 共享

%users ALL=/sbin/mount.cifs,/sbin/umount.cifs

这允许组成员为 users 的所有用户从任何机器(ALL)运行命令 /sbin/mount.cifs/sbin/umount.cifs

提示: 要使用受限版本的 nano 而不是 vivisudo
/etc/sudoers
Defaults editor=/usr/bin/rnano

导出 EDITOR=nano visudo 被认为是一个严重的安全风险,因为任何东西都可以用作 EDITOR

使用 sudo 编辑文件

请参阅 Sudo#编辑文件。或者,您可以使用像 rvimrnano 这样的编辑器,它们具有受限的功能,以便作为 root 运行时安全。

限制 root 登录

一旦 sudo 配置正确,就可以严格限制或拒绝完全的 root 访问权限,而不会损失太多可用性。要禁用 root,但仍允许使用 sudo,您可以使用 passwd(1)passwd --lock root

仅允许特定用户

PAM pam_wheel.so 允许您仅允许组 wheel 中的用户使用 su 登录。请参阅 su#su 和 wheel

拒绝 SSH 登录

即使您不希望拒绝本地用户的 root 登录,但始终建议拒绝通过 SSH 进行 root 登录。 这样做的目的是在用户可以完全远程入侵您的系统之前,增加额外的安全层。

使用 access.conf 指定可接受的登录组合

当有人尝试使用 PAM 登录时,会检查 /etc/security/access.conf 中是否与他们的登录属性匹配的第一个组合。然后,他们的尝试会根据该组合的规则成功或失败。

+:root:LOCAL
-:root:ALL

可以为特定组和用户设置规则。在此示例中,允许用户 archie 本地登录,wheel 和 adm 组中的所有用户也允许登录。所有其他登录都被拒绝

+:archie:LOCAL
+:(wheel):LOCAL
+:(adm):LOCAL
-:ALL:ALL

access.conf(5) 中阅读更多内容

强制访问控制

强制访问控制 (MAC) 是一种安全策略,它与 Arch 和大多数 Linux 发行版默认使用的自主访问控制 (DAC) 显着不同。 MAC 本质上意味着程序可能执行的任何以任何方式影响系统的操作都会根据安全规则集进行检查。与 DAC 方法相反,此规则集不能由用户修改。使用几乎任何强制访问控制系统都将显着提高您计算机的安全性,尽管其实现方式存在差异。

路径名 MAC

基于路径名的访问控制是一种简单的访问控制形式,它根据给定文件的路径提供权限。这种访问控制方式的缺点是,如果文件在系统周围移动,则权限不会随文件一起移动。 从积极的方面来看,与基于标签的替代方案不同,基于路径名的 MAC 可以应用于更广泛的文件系统。

  • AppArmor 是一个由 Canonical 维护的 MAC 实现,被认为是 SELinux 的 “更简单” 的替代方案。
  • TOMOYO 是另一个简单易用的系统,提供强制访问控制。它旨在在用法和实现上都简单,只需要很少的依赖项。

标签 MAC

基于标签的访问控制意味着文件的扩展属性用于管理其安全权限。虽然该系统在安全功能方面可以说比基于路径名的 MAC 更灵活,但它仅适用于支持这些扩展属性的文件系统。

  • SELinux 基于 NSA 改进 Linux 安全性的项目,实现了与系统用户和角色完全分离的 MAC。它提供了一个极其强大的多级 MAC 策略实现,可以轻松地维护一个增长和更改超出其原始配置的系统的控制。

访问控制列表

访问控制列表 (ACL) 是以某种方式将规则直接附加到文件系统的替代方法。ACL 通过针对允许的行为列表检查程序操作来实现访问控制。

内核强化

内核自我保护 / 漏洞利用缓解

linux-hardened 软件包使用基本的内核强化补丁集,并且比 linux 软件包具有更多以安全性为中心的编译时配置选项。可以进行自定义构建,以选择安全性与性能之间与默认的安全性倾向不同的折衷方案。

但是,应该注意的是,使用此内核时,某些软件包将无法工作。例如 throttled

如果您使用树外驱动程序,例如 NVIDIA,您可能需要切换到其 DKMS 软件包。

用户空间 ASLR 比较

linux-hardened 软件包为用户空间进程提供了改进的地址空间布局随机化实现。paxtest 命令可用于获得提供的熵的估计值

64 位进程
linux-hardened 5.4.21.a-1-hardened
Anonymous mapping randomization test     : 32 quality bits (guessed)
Heap randomization test (ET_EXEC)        : 40 quality bits (guessed)
Heap randomization test (PIE)            : 40 quality bits (guessed)
Main executable randomization (ET_EXEC)  : 32 quality bits (guessed)
Main executable randomization (PIE)      : 32 quality bits (guessed)
Shared library randomization test        : 32 quality bits (guessed)
VDSO randomization test                  : 32 quality bits (guessed)
Stack randomization test (SEGMEXEC)      : 40 quality bits (guessed)
Stack randomization test (PAGEEXEC)      : 40 quality bits (guessed)
Arg/env randomization test (SEGMEXEC)    : 44 quality bits (guessed)
Arg/env randomization test (PAGEEXEC)    : 44 quality bits (guessed)
Offset to library randomisation (ET_EXEC): 34 quality bits (guessed)
Offset to library randomisation (ET_DYN) : 34 quality bits (guessed)
Randomization under memory exhaustion @~0: 32 bits (guessed)
Randomization under memory exhaustion @0 : 32 bits (guessed)
linux 5.5.5-arch1-1
Anonymous mapping randomization test     : 28 quality bits (guessed)
Heap randomization test (ET_EXEC)        : 28 quality bits (guessed)
Heap randomization test (PIE)            : 28 quality bits (guessed)
Main executable randomization (ET_EXEC)  : 28 quality bits (guessed)
Main executable randomization (PIE)      : 28 quality bits (guessed)
Shared library randomization test        : 28 quality bits (guessed)
VDSO randomization test                  : 20 quality bits (guessed)
Stack randomization test (SEGMEXEC)      : 30 quality bits (guessed)
Stack randomization test (PAGEEXEC)      : 30 quality bits (guessed)
Arg/env randomization test (SEGMEXEC)    : 22 quality bits (guessed)
Arg/env randomization test (PAGEEXEC)    : 22 quality bits (guessed)
Offset to library randomisation (ET_EXEC): 28 quality bits (guessed)
Offset to library randomisation (ET_DYN) : 28 quality bits (guessed)
Randomization under memory exhaustion @~0: 29 bits (guessed)
Randomization under memory exhaustion @0 : 29 bits (guessed)
linux-lts 4.19.101-1-lts
Anonymous mapping randomization test     : 28 quality bits (guessed)
Heap randomization test (ET_EXEC)        : 28 quality bits (guessed)
Heap randomization test (PIE)            : 28 quality bits (guessed)
Main executable randomization (ET_EXEC)  : 28 quality bits (guessed)
Main executable randomization (PIE)      : 28 quality bits (guessed)
Shared library randomization test        : 28 quality bits (guessed)
VDSO randomization test                  : 19 quality bits (guessed)
Stack randomization test (SEGMEXEC)      : 30 quality bits (guessed)
Stack randomization test (PAGEEXEC)      : 30 quality bits (guessed)
Arg/env randomization test (SEGMEXEC)    : 22 quality bits (guessed)
Arg/env randomization test (PAGEEXEC)    : 22 quality bits (guessed)
Offset to library randomisation (ET_EXEC): 28 quality bits (guessed)
Offset to library randomisation (ET_DYN) : 28 quality bits (guessed)
Randomization under memory exhaustion @~0: 28 bits (guessed)
Randomization under memory exhaustion @0 : 28 bits (guessed)
32 位进程(在 x86_64 内核上)
linux-hardened
Anonymous mapping randomization test     : 16 quality bits (guessed)
Heap randomization test (ET_EXEC)        : 22 quality bits (guessed)
Heap randomization test (PIE)            : 27 quality bits (guessed)
Main executable randomization (ET_EXEC)  : No randomization
Main executable randomization (PIE)      : 18 quality bits (guessed)
Shared library randomization test        : 16 quality bits (guessed)
VDSO randomization test                  : 16 quality bits (guessed)
Stack randomization test (SEGMEXEC)      : 24 quality bits (guessed)
Stack randomization test (PAGEEXEC)      : 24 quality bits (guessed)
Arg/env randomization test (SEGMEXEC)    : 28 quality bits (guessed)
Arg/env randomization test (PAGEEXEC)    : 28 quality bits (guessed)
Offset to library randomisation (ET_EXEC): 18 quality bits (guessed)
Offset to library randomisation (ET_DYN) : 16 quality bits (guessed)
Randomization under memory exhaustion @~0: 18 bits (guessed)
Randomization under memory exhaustion @0 : 18 bits (guessed)
linux
Anonymous mapping randomization test     : 8 quality bits (guessed)
Heap randomization test (ET_EXEC)        : 13 quality bits (guessed)
Heap randomization test (PIE)            : 13 quality bits (guessed)
Main executable randomization (ET_EXEC)  : No randomization
Main executable randomization (PIE)      : 8 quality bits (guessed)
Shared library randomization test        : 8 quality bits (guessed)
VDSO randomization test                  : 8 quality bits (guessed)
Stack randomization test (SEGMEXEC)      : 19 quality bits (guessed)
Stack randomization test (PAGEEXEC)      : 19 quality bits (guessed)
Arg/env randomization test (SEGMEXEC)    : 11 quality bits (guessed)
Arg/env randomization test (PAGEEXEC)    : 11 quality bits (guessed)
Offset to library randomisation (ET_EXEC): 8 quality bits (guessed)
Offset to library randomisation (ET_DYN) : 13 quality bits (guessed)
Randomization under memory exhaustion @~0: No randomization
Randomization under memory exhaustion @0 : No randomization

限制对 proc 文件系统中内核指针的访问

kernel.kptr_restrict 设置为 1 将在 /proc/kallsyms 中隐藏没有 CAP_SYSLOG 的常规用户的内核符号地址,从而使内核漏洞利用程序更难以动态解析地址/符号。这对于预编译的 Arch Linux 内核没有太大帮助,因为坚定的攻击者可以只下载内核软件包并从那里手动获取符号,但是如果您正在编译自己的内核,这可以帮助缓解本地 root 漏洞利用。当非 root 用户使用某些 perf 命令时,这将破坏它们(但是许多 perf 功能无论如何都需要 root 访问权限)。 有关更多信息,请参见 FS#34323

kernel.kptr_restrict 设置为 2 将在 /proc/kallsyms 中隐藏内核符号地址,而与权限无关。

/etc/sysctl.d/51-kptr-restrict.conf
kernel.kptr_restrict = 1
注意: linux-hardened 默认设置 kptr_restrict=2 而不是 0

BPF 强化

BPF 是一个用于在运行时动态加载和执行内核中字节码的系统。它用于许多 Linux 内核子系统,例如网络 (例如 XDP、tc)、跟踪 (例如 kprobes、uprobes、tracepoints) 和安全性 (例如 seccomp)。它对于高级网络安全、性能分析和动态跟踪也很有用。

BPF 最初是 Berkeley Packet Filter 的首字母缩写,因为原始的经典 BPF 用于 BSD 的数据包捕获工具。 这最终演变为扩展 BPF (eBPF),此后不久更名为 BPF(不是首字母缩写)。BPF 不应与 iptables 或 netfilter 等数据包过滤工具混淆,尽管 BPF 可用于实现数据包过滤工具。

BPF 代码可以被解释或使用 即时 (JIT) 编译器编译。Arch 内核是使用 CONFIG_BPF_JIT_ALWAYS_ON 构建的,它禁用 BPF 解释器并强制所有 BPF 使用 JIT 编译。这使得攻击者更难以使用 BPF 来升级利用 SPECTRE 风格漏洞的攻击。有关更多详细信息,请参阅 引入 CONFIG_BPF_JIT_ALWAYS_ON 的内核补丁

内核包括 JIT 编译的 BPF 的强化功能,它可以缓解某些类型的 JIT 喷射攻击,但会牺牲性能以及跟踪和调试许多 BPF 程序的能力。可以通过将 net.core.bpf_jit_harden 设置为 1(启用非特权代码的强化)或 2(启用所有代码的强化)来启用它。

有关更多详细信息,请参阅 内核文档中的 net.core.bpf_* 设置。

提示
  • linux-hardened 默认设置 net.core.bpf_jit_harden=2 而不是 0
  • 默认情况下,即使是非特权用户也可以运行 BPF 程序。要更改该行为,请设置 kernel.unprivileged_bpf_disabled=1[7]

ptrace 作用域

ptrace(2) 系统调用提供了一种方法,使一个进程(“tracer”)可以观察和控制另一个进程(“tracee”)的执行,并检查和更改 tracee 的内存和寄存器。 ptrace 通常被调试工具使用,包括 gdbstraceperfreptyr 和其他调试器。但是,它也提供了一种恶意进程可以从中读取数据并控制其他进程的方法。

Arch 默认启用 Yama LSM,它提供了 kernel.yama.ptrace_scope 内核参数。此参数默认设置为 1(受限),除非跟踪器具有特权或具有 CAP_SYS_PTRACE capability,否则阻止跟踪器对受限作用域之外的跟踪执行 ptrace 调用。 与经典权限相比,这是一个显着的安全改进。 如果没有此模块,则在同一用户下运行的进程之间没有隔离(在没有其他安全层的情况下,例如 pid_namespaces(7))。

注意: 默认情况下,您仍然可以通过以特权进程身份运行需要 ptrace 的工具来使用它们,例如使用 sudo

如果您不需要使用调试工具,请考虑将 kernel.yama.ptrace_scope 设置为 2(仅限管理员)或 3(禁止 ptrace)以强化系统。

hidepid

本文或本章节需要扩充。

原因: Linux 5.8 实现了私有实例hidepid= 的新值。(在 Talk:Security 中讨论)

本文或本节的事实准确性存在争议。

原因: 全局启用 hidepid 不是 systemd 支持的操作方式,并且当 systemd 作为服务管理器运行时,它在安全性方面没有任何实际改进。[8] (在 Talk:Security 中讨论)
警告
  • 这可能会导致某些应用程序出现问题,例如在沙箱中运行的应用程序和 Xorg(请参阅解决方法)。
  • 当使用 systemd > 237.64-1 时,这会导致 D-BusPolkitPulseAudiobluetooth 出现问题。

内核具有隐藏其他用户进程的能力,通常可以通过 /proc 访问,方法是以 https://docs.linuxkernel.org.cn/filesystems/proc.html 中记录的 hidepid=gid= 选项挂载 proc 文件系统。

这大大复杂化了入侵者收集有关正在运行的进程的信息的任务,无论某些守护程序是否以提升的权限运行,其他用户是否运行某些敏感程序,其他用户是否运行任何程序,使得不可能了解任何用户是否运行特定程序(假设程序没有通过其行为透露自己),并且,作为额外的奖励,通过程序参数传递敏感信息的编写不佳的程序现在受到保护,免受本地窃听者的侵害。

filesystem 软件包提供的 proc 充当授权用户了解其他用户进程信息的白名单。如果用户或服务需要访问超出其自身的 /proc/<pid> 目录,请将他们添加到该组

例如,要隐藏其他用户的进程信息,但 proc 组中的用户除外

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

为了使用户会话正常工作,需要为 systemd-logind 添加例外

/etc/systemd/system/systemd-logind.service.d/hidepid.conf
[Service]
SupplementaryGroups=proc

限制模块加载

默认的 Arch 内核启用了 CONFIG_MODULE_SIG_ALL,它对作为 linux 软件包一部分构建的所有内核模块进行签名。这允许内核仅加载使用有效密钥签名的模块,即无法加载本地编译的树外模块或由 virtualbox-host-modules-arch 等软件包提供的模块。

可以通过设置 module.sig_enforce=1 内核参数来限制内核模块的加载。更多信息请参考内核文档

此外,不需要的独立模块可以被列入黑名单,例如 secureblue 中给出的示例。

禁用 kexec

Kexec 允许替换当前运行的内核。

/etc/sysctl.d/51-kexec-restrict.conf
kernel.kexec_load_disabled = 1
提示: kexec 在 linux-hardened 中默认禁用。

内核锁定模式

自 Linux 5.4 起,内核增加了一个可选的锁定功能,旨在加强 UID 0 (root) 和内核之间的边界。启用后,某些依赖于对硬件或内核的底层访问的应用程序可能会停止工作。

要使用锁定模式,必须初始化其 LSM,并且必须设置锁定模式。

所有官方支持的内核都初始化了 LSM,但它们都没有强制执行任何锁定模式。

提示: 可以通过运行 cat /sys/kernel/security/lsm 来验证已初始化的 LSM。

锁定模式有两种操作模式

  • integrity:禁用允许用户空间修改正在运行的内核的内核功能(kexec、bpf)。
  • confidentiality:还禁用允许用户空间从内核中提取机密信息的内核功能。

建议使用 integrity,除非您的特定威胁模型另有要求。

要在运行时启用内核锁定,请运行

# echo mode > /sys/kernel/security/lockdown

要在启动时启用内核锁定,请使用内核参数 lockdown=mode

注意
  • 内核锁定在运行时无法禁用。
  • 内核锁定禁用休眠

另请参阅 kernel_lockdown(7)

Linux 内核运行时保护 (LKRG)

LKRG (lkrg-dkmsAUR) 是一个内核模块,它执行内核的完整性检查和漏洞利用尝试的检测。

禁用紧急 Shell

本文或本节的事实准确性存在争议。

原因: 屏蔽 emergency.targetemergency.service 对这些单元被添加到 initramfs 并在早期用户空间中运行没有影响。即使它们在 initramfs 中,mkinitcpio 的 systemd 钩子也会出于“安全原因”锁定 root 账户[9][10](参见 FS#70408)。如果需要,链接文章中问题的解决方案是阻止 rescue.targetrescue.serviceemergency.targetemergency.service 被添加到 initramfs 镜像中。(在 Talk:Security 中讨论)

紧急 Shell 用于在启动过程中交互式地对机器进行故障排除。但是,它也是攻击者可以用来访问安全资源(如 TPM)的小工具。有关实际示例,请参阅这篇文章。可以通过禁用紧急 Shell 来增加攻击的难度,但代价是移除了一个用于排除早期启动故障的工具。

要禁用紧急 Shell,请参阅Systemd#禁用远程机器上的紧急模式

应用程序沙盒

另请参阅 Wikipedia:沙箱 (计算机安全)

注意: 用户命名空间配置项 CONFIG_USER_NS 目前在 linuxlinux-ltslinux-zenlinux-hardened 中已启用。缺少它可能会阻止某些沙箱功能提供给应用程序。
警告: 未授权用户命名空间使用 (CONFIG_USER_NS_UNPRIVILEGED) 在 linuxlinux-ltslinux-zen 中默认启用,这大大增加了本地权限提升的攻击面(参见 AppArmor 的 WikiFS#36969)。

为了缓解这种情况,可以

  • 使用具有安全默认设置的 linux-hardened 内核,或者
  • kernel.unprivileged_userns_clone sysctl 设置为 0

请注意,这可能会破坏诸如 Zoomnsjail 等应用程序。如果您的系统上安装了 bubblewrap,您还需要将其替换为 bubblewrap-suid。请参阅 Bubblewrap#安装

Firejail

Firejail 是一个易于使用的工具,用于沙盒化应用程序和服务器。它最初是为浏览器和面向互联网的应用程序创建的,但现在支持大量的应用程序。为了建立具有各种功能的沙盒环境,它作为 suid 二进制文件安装,并基于黑名单和白名单为目标应用程序构建沙盒运行时环境。

bubblewrap

bubblewrap 是一个为非特权容器工具(如 Flatpak)开发的沙箱应用程序,与 Firejail 相比,资源占用和复杂性都显著降低。虽然它缺少某些功能(如文件路径白名单),但 bubblewrap 确实提供绑定挂载以及用户/IPC/PID/网络/cgroup 命名空间的创建,并且可以支持简单和复杂的沙箱。

Bubblejail 沙箱基于 bubblewrap,并提供面向资源的权限模型,以及用于调整权限的图形界面。

chroots

手动 chroot 监狱也可以构建沙盒化进程环境。它比其他沙盒技术更受限制;其沙盒的范围是文件路径隔离。

Linux 容器

Linux 容器是另一种不错的选择,当您需要比其他选项(低于完全虚拟化选项)提供的隔离性更强时。LXC 在现有内核之上以伪 chroot 方式运行,并具有自己的虚拟硬件。

完全虚拟化选项

使用完全虚拟化选项,如 VirtualBoxKVMXenQubes OS(基于 Xen)也可以提高隔离性和安全性,如果您计划运行有风险的应用程序或浏览危险的网站。

网络和防火墙

防火墙

虽然标准的 Arch 内核能够使用 Netfilteriptablesnftables,但这些服务默认情况下未启用。强烈建议设置某种形式的防火墙来保护系统上运行的服务。许多资源(包括 ArchWiki)没有明确说明哪些服务值得保护,因此启用防火墙是一个很好的预防措施。

  • 有关一般信息,请参阅 iptablesnftables
  • 有关设置 iptables 防火墙的指南,请参阅 简单有状态防火墙
  • 有关设置 netfilter 的其他方法,请参阅 Category:防火墙
  • 有关阻止 IP 地址列表(例如来自 Bluetack 的列表),请参阅 Ipset
  • opensnitch 是一个可配置的入站和出站防火墙,支持按应用程序、端口、主机等配置规则。

开放端口

本文或本节需要语言、wiki 语法或风格改进。请参阅 Help:风格 以获取参考。

原因: “开放端口”不是一个好的标题,因为它忽略了应用程序可能绑定到的接口和地址。从防火墙的角度来看,即使当前没有应用程序在监听,端口也可能是“开放的”。(在 Talk:Security 中讨论)

某些服务监听开放网络端口上的入站流量。重要的是仅将这些服务绑定到严格必要的地址和接口。远程攻击者可能利用有缺陷的网络协议来访问暴露的服务。即使是绑定到 localhost 的进程也可能发生这种情况。

一般来说,如果一个服务只需要本地系统访问,则绑定到 Unix 域套接字 (unix(7)) 或环回地址(如 localhost),而不是非环回地址(如 0.0.0.0/0)。

如果一个服务需要通过网络被其他系统访问,请使用严格的防火墙规则控制访问,并在可能的情况下配置身份验证、授权和加密。

您可以使用 ss -l 列出所有当前开放的端口。要显示所有侦听进程及其数字 tcpudp 端口号

# ss -lpntu

有关更多选项,请参阅 ss(8)

内核参数

可以使用 Sysctl 设置影响网络的内核参数。有关如何执行此操作,请参阅 Sysctl#TCP/IP 堆栈加固

SSH

为了缓解暴力破解攻击,建议强制执行基于密钥的身份验证。有关 OpenSSH 的更多建议,请参阅 OpenSSH#保护。或者,Fail2banSshguard 通过监控日志和编写防火墙规则来提供较弱形式的保护,但会带来拒绝服务的可能性,因为攻击者可以欺骗数据包,使其看起来像是来自管理员(在识别其地址之后)。欺骗 IP 有多道防线,例如通过反向路径过滤禁用 ICMP 重定向

您可能希望通过使用双因素身份验证来进一步加强身份验证。Google Authenticator 提供使用一次性密码 (OTP) 的两步身份验证程序。

拒绝 root 登录也是一个好的做法,既可以跟踪入侵,又可以在 root 访问之前增加额外的安全层。对于 OpenSSH,请参阅 OpenSSH#拒绝

Mozilla 发布了一个 OpenSSH 配置指南,其中配置了更详细的审计日志记录并限制了密码套件。

DNS

默认域名解析 (DNS) 配置具有很高的兼容性,但存在安全漏洞。有关更多信息,请参阅 DNS 隐私和安全

代理

代理通常用作应用程序和网络之间的额外层,用于清理来自不受信任来源的数据。以较低权限运行的小型代理的攻击面远小于以最终用户权限运行的复杂应用程序。

例如,DNS 解析器在与应用程序链接的 glibc 中实现(该应用程序可能以 root 身份运行),因此 DNS 解析器中的错误可能会导致远程代码执行。可以通过安装 DNS 缓存服务器(如 dnsmasq)来防止这种情况,dnsmasq 充当代理。[11]

管理 TLS 证书

请参阅 TLS#信任管理

物理安全

只要有足够的时间和资源,物理访问计算机就等于 root 访问权限。但是,通过设置足够的障碍,可以获得较高的实际安全级别。

攻击者只需连接恶意的 IEEE 1394 (火线), Thunderbolt 或 PCI Express 设备,即可在下次启动时完全控制您的计算机,因为默认情况下这些设备被赋予完全的内存访问权限。[12] 对于 Thunderbolt,您可以完全限制直接内存访问,或将其限制为已知设备,请参阅 Thunderbolt#用户设备授权。对于火线和 PCI Express,您几乎无法阻止这种情况,或者硬件本身的修改——例如将恶意固件刷入驱动器。但是,绝大多数攻击者不会如此知识渊博和决心坚定。

#静态数据加密 将防止计算机被盗时您的数据被访问,但是,如果攻击者资源充足,则可以安装恶意固件以在您下次登录时获取这些数据。

锁定 BIOS

在 BIOS 中添加密码可以防止他人启动到可移动介质,这基本上等同于拥有您计算机的 root 访问权限。您应该确保您的驱动器在启动顺序中是第一个,并尽可能禁用其他驱动器的启动能力。

引导加载程序

保护您的 引导加载程序 非常重要。未受保护的引导加载程序可以绕过任何登录限制,例如,通过设置 init=/bin/sh 内核参数 直接启动到 shell。

Syslinux

Syslinux 支持 密码保护您的引导加载程序。它允许您设置每个菜单项密码或全局引导加载程序密码。

GRUB

GRUB 也支持引导加载程序密码。有关详细信息,请参阅 GRUB/技巧和窍门#GRUB 菜单的密码保护。它还支持 加密 /boot,这仅使引导加载程序代码的某些部分未加密。GRUB 的配置、内核initramfs 已加密。

systemd-boot

systemd-boot 在启用 #安全启动 时禁用内核参数的编辑。或者,有关更传统的基于密码的选项,请参阅 systemd-boot#带密码保护的内核参数编辑器

安全启动

安全启动UEFI 的一项功能,允许对计算机启动的文件进行身份验证。这有助于防止一些 邪恶女仆攻击,例如替换启动分区内的文件。通常,计算机附带由供应商 (OEM) 注册的密钥。但是,这些密钥可以被删除,并允许计算机进入设置模式,用户可以在其中注册和管理自己的密钥。

安全启动页面指导您如何通过 使用您自己的密钥 来设置安全启动。

可信平台模块 (TPM)

TPM 是嵌入了加密密钥的硬件微处理器。这构成了大多数现代计算机的基本信任根,并允许对启动链进行端到端验证。它们可以用作内部智能卡,证明计算机上运行的固件,并允许用户将秘密插入到防篡改和抗暴力破解的存储中。

可移动闪存驱动器上的启动分区

一个流行的想法是将启动分区放在闪存驱动器上,以便在没有闪存驱动器的情况下使系统无法启动。这个想法的支持者经常同时使用 全盘加密,有些人还使用放置在启动分区上的 分离的加密标头

此方法也可以与 加密 /boot 合并。

自动注销

如果您正在使用 BashZsh,您可以设置 TMOUT 以在超时后自动从 shell 注销。

例如,以下操作将自动从虚拟控制台(但不是 X11 中的终端模拟器)注销

/etc/profile.d/shell-timeout.sh
TMOUT="$(( 60*10 ))";
[ -z "$DISPLAY" ] && export TMOUT;
case $( /usr/bin/tty ) in
	/dev/tty[0-9]*) export TMOUT;;
esac

如果您真的想让每个 Bash/Zsh 提示符(即使在 X 中)都超时,请使用

$ export TMOUT="$(( 60*10 ))";

请注意,如果 shell 中正在运行某些命令(例如:SSH 会话或其他没有 TMOUT 支持的 shell),这将不起作用。但是,如果您主要将 VC 用于以 root 身份重启冻结的 GDM/Xorg,那么这将非常有用。

防止恶意 USB 设备

内核具有 停用 USB 端口的设置,以保护您的计算机免受恶意 USB 设备(又名 BadUSBPoisonTapLanTurtle)的侵害。它们可以在运行时设置,并通过 sysctl 自动化。

为了获得更多控制,请安装 USBGuard,这是一个软件框架,实现了基于设备属性的基本白名单和黑名单功能。

易失性数据收集

已开机的计算机可能容易受到 易失性数据收集 的攻击。最佳实践是在不需要计算机开机时,或者在计算机的物理安全暂时受到威胁时(例如,通过安全检查站时),完全关闭计算机。

软件包

身份验证

如果不正确使用软件包签名,可能会发生 对软件包管理器的攻击,即使是具有 正确签名系统 的软件包管理器也会受到影响。Arch 默认使用软件包签名,并依赖于来自 5 个受信任主密钥的信任网络。有关详细信息,请参阅 Pacman-key

升级

定期 升级系统 非常重要。

关注漏洞警报

订阅由国家漏洞数据库提供的通用漏洞和披露 (CVE) 安全警报更新,可在 NVD 下载网页 上找到。Arch Linux 安全跟踪器 是一个特别有用的资源,因为它以表格格式组合了 Arch Linux 安全公告 (ASA)、Arch Linux 漏洞组 (AVG) 和 CVE 数据集。工具 arch-audit 可用于检查影响正在运行的系统的漏洞。图形系统托盘 arch-audit-gtk 也可以使用。另请参阅 Arch Linux 安全团队

您还应该考虑订阅您使用的软件的发布通知,特别是如果您通过主要存储库或 AUR 以外的方式安装软件。某些软件具有您可以订阅以获取安全通知的邮件列表。源代码托管站点通常为新版本提供 RSS 提要。

重建软件包

可以重建软件包并剥离不需要的功能和特性,以此作为减少攻击面的手段。例如,可以重建 bzip2 而不包含 bzip2recover,以尝试规避 CVE-2016-3189。自定义强化标志也可以手动或通过包装器应用。

本文或本节是与 Arch 软件包指南/安全 合并的候选对象。

注意: 安全相关的构建标志有其自己的文章。(在 Talk:Security 中讨论)

本文或本节的事实准确性存在争议。

原因: 从 3 年前的博客文章复制粘贴而来。编译器标志特定于 GCC,有些与安全几乎无关(例如 -O2-g-Wall)。(在 Talk:Security 中讨论)
标志 目的
-D_FORTIFY_SOURCE=2 运行时缓冲区溢出检测
-D_GLIBCXX_ASSERTIONS C++ 字符串和容器的运行时边界检查
-fasynchronous-unwind-tables 提高回溯的可靠性
-fexceptions 启用基于表的线程取消
-fpie -Wl,-pie 可执行文件的完整 ASLR
-fpic -shared 共享库没有文本重定位
-fplugin=annobin 生成用于强化质量控制的数据
-fstack-clash-protection 提高堆栈溢出检测的可靠性
-fstack-protector 或 -fstack-protector-all 堆栈粉碎保护器
-fstack-protector-strong 同样
-g 生成调试信息
-grecord-gcc-switches 在调试信息中存储编译器标志
-mcet -fcf-protection 控制流完整性保护
-O2 推荐的优化
-pipe 避免临时文件,加快构建速度
-Wall 推荐的编译器警告
-Werror=format-security 拒绝潜在的不安全格式字符串参数
-Werror=implicit-function-declaration 拒绝缺少函数原型
-Wl,-z,defs 检测并拒绝欠链接
-Wl,-z,now 禁用惰性绑定
-Wl,-z,relro 重定位后的只读段

另请参阅