跳转至内容

安全

来自 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。这种方法可以使密码更容易记住,但请注意,不同字母出现在单词开头的概率差异很大(维基百科:字母频率)。

另一个有效的方法是将随机生成的密码写下来并存放在一个“安全”的地方,例如钱包、手提包或文件保险柜中。大多数人都能很好地保护他们的贵重物品免受攻击,而且大多数人比数字安全实践更容易理解物理安全最佳实践。

将助记和随机技术结合起来也很有效果,即使用 密码管理器 保存长随机生成的密码,而密码管理器又由一个令人难忘的“主密码”/主要密码保护,这个密码只能用于此目的。主密码必须记住,且绝不保存。这要求密码管理器安装在系统上才能方便地访问密码(这可能被视为不便或安全特性,取决于具体情况)。一些密码管理器还带有智能手机应用程序,可以用来显示密码以便在没有安装该密码管理器的系统上手动输入(如果这是常见用例,您仍然可以为每个服务使用易于键入但安全的密码,而不是完全随机的密码,见下文)。请注意,如果您忘记了主密码,密码管理器将引入单点故障。一些密码管理器会根据主密码和您要登录的服务名称来计算包含的密码,而不是加密它们,从而可以在新系统上使用它而无需同步任何数据。

使用令人难忘的长串不相关单词作为密码可能很有效。理论是,如果使用足够长的短语,从密码长度获得的熵可以抵消使用字典单词造成的熵损失。这个 xkcd 漫画 展示了这种方法的熵权衡,它考虑了每个单词短语的可能单词集合有限。如果您选择的单词集合很大(数千个单词),并且从中选择 5-7 个甚至更多的随机单词,那么这种方法将提供很大的熵,即使攻击者知道所选单词集合和所选单词的数量。在确定了单词集和单词数量后,可能的密码短语数量是:(用于选择的单词集中的单词数)的(为密码短语选择的单词数)次方。例如,请参见 Diceware 以获取更多信息。

有关其他背景信息,请参阅 The passphrase FAQ维基百科:密码强度

维护密码

一旦您选择了一个强密码,请务必妥善保管。注意 键盘记录器 (软件和硬件)、屏幕记录器、社交工程肩部窥探,并避免重复使用密码,以免不安全的服务器泄露比必要更多的信息。 密码管理器 可以帮助管理大量复杂的密码:如果您从管理器复制粘贴存储的密码到需要它们的应用程序中,请确保每次都清除复制缓冲区,并确保它们未保存在任何日志中 (例如,不要在纯终端命令中粘贴它们,这会将它们保存在 .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 文件中的其他用户参数分开,请参阅 Users and groups#User database。另请参阅 #Restricting root

密码使用 passwd 命令设置,该命令使用系统的 crypt 函数 拉伸 它们,然后将它们保存在 /etc/shadow 中。密码还会被 加盐,以防御 彩虹表 攻击。另请参阅 How are passwords stored in Linux (Understanding hashing with 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 的指南,以及来自其他方面的指南,都不建议强制要求特殊字符,因为它们通常只会导致可预测的改动。

例如,如果您想强制执行此策略:

  • 如果出现错误,提示两次输入密码 (retry 选项)
  • 最小长度为 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

微代码 (Microcode)

有关如何为 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_mallocAURglibc 的 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,允许用户将循环文件加密为虚拟卷。当只需要保护系统某些部分的安全时,这是全盘加密的一个合理替代方案。

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

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

  • 一些 归档和压缩 工具也提供基本加密功能。例如 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 打开 Windows 二进制文件不需要 exec 标志。仅当 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[链接已损坏: 被 nvidia-open-dkms 替换])可能需要在 /var 上使用 exec

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

考虑可能的文件系统挂载点

  • /var
  • /home
  • /dev/shm
  • /tmp
  • /boot
提示 使用 Systemd 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 安全指南建议使用 0077 的 umask 以获得最大安全性,这使得除了所有者之外的用户无法读取新文件。要更改此设置,请参阅 Umask#设置掩码值。如果您使用 sudo,请考虑将其配置为使用 默认 root umask

SUID 和 SGID 文件

了解任何带有 Setuid 或 Setgid 位的文件非常重要。带有 SUID 位设置的相关文件示例

此类可执行文件的主要风险包括特权升级漏洞,例如参见 Wikipedia:Setuid#Security impact[5][6][7]

设置了 SUID 位且不属于 root 的文件,或设置了 SGID 位的文件通常影响较小,但如果存在漏洞,理论上仍可能造成相当大的损害。通常可以通过分配 Capabilities 来避免使用 SUID 或 SGID。

提示 及时更新提供 SUID/SGID 可执行文件的软件包至关重要,以防止系统受到漏洞攻击。

搜索具有 SUID 或 SGID 位的文件

$ find / -perm "/u=s,g=s" -type f 2>/dev/null

备份

本文档或部分是合并到 System backup 的候选。

注意:有关于系统备份的专用页面。(请参阅 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 权限。

模块 pam_faillock.so 可以通过文件 /etc/security/faillock.conf 进行配置。锁定参数

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

默认情况下,所有用户锁定在重启后都会丢失。如果攻击者可以重启机器,则锁定持久化更安全。要使锁定持久化,请将 dir 参数在 /etc/security/faillock.conf 中更改为 /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 兼容层将自动使用无 root Xorg。

限制 root

root 用户,顾名思义,是系统中功能最强大的用户。同时,审计 root 用户账户也很困难。因此,限制 root 用户账户的使用至关重要。有多种方法可以在限制其造成损害的能力的同时,保持 root 用户的功能。

使用 sudo 而不是 su

本文档或部分是合并到 sudo 的候选。

注意:有相应的专用文章。(请参阅 Talk:Security 讨论)

出于多种原因,使用 sudo 进行特权访问比 su 更可取。

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

或者,可以为所有用户允许单独的命令。以普通用户身份挂载 Samba 共享

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

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

提示 要使用受限版本的 nano 而不是 vi 来编辑 visudo
/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

仅允许特定用户

PAMpam_wheel.so 允许您仅允许 wheel 组的用户使用 su 登录。参见 su#su 和 wheel

拒绝 SSH 登录

即使您不希望拒绝本地用户的 root 登录,但 拒绝通过 SSH 进行 root 登录始终是最佳实践。目的是在用户能够完全远程危害您的系统之前增加一层额外的安全。

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

警告 如果您使用 GNOME 49 或更高版本,应确保 gdm 组可以本地登录。这可以通过 +:(gdm):LOCAL 规则来实现。[8]

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

+:root:LOCAL
-:root:ALL

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

+: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 的数据包捕获工具。这最终发展为 Extended 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[9]

ptrace 范围

ptrace(2) 系统调用提供了一种方式,允许一个进程(“跟踪器”)观察和控制另一个进程(“被跟踪进程”)的执行,并检查和更改被跟踪进程的内存和寄存器。ptrace 常用于调试工具,包括 gdbstraceperfreptyr 等调试器。然而,它也提供了一种恶意进程从其他进程读取数据并控制它们的方式。

Arch 默认启用 Yama LSM,它提供了一个 kernel.yama.ptrace_scope 内核参数。此参数默认设置为 1(受限),它阻止跟踪器对超出受限范围的被跟踪进程执行 ptrace 调用,除非跟踪器具有特权或具有 CAP_SYS_PTRACE 能力。与传统的权限相比,这是一个重大的安全改进。没有此模块,在同一用户下运行的进程之间就没有隔离(在没有额外安全层的情况下,如 pid_namespaces(7))。

注意 默认情况下,您仍然可以使用需要 ptrace 的工具,方法是作为特权进程运行它们,例如使用 sudo

如果您不需要使用调试工具,请考虑将 kernel.yama.ptrace_scope 设置为 2(仅限管理员)或 3(无法进行 ptrace)以加固系统。

hidepid

本文章或章节需要扩充。

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

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

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

内核可以通过使用 hidepid=gid= 选项挂载 proc 文件系统来阻止未授权用户访问其他用户进程(通常可以通过 /proc 访问),具体信息请参见 https://docs.linuxkernel.org.cn/filesystems/proc.html

这极大地增加了入侵者收集运行进程信息的难度,例如:是否存在以特权运行的守护进程、其他用户是否运行敏感程序、其他用户是否运行任何程序、是否运行特定程序(鉴于程序不会通过其行为暴露自己),并且作为一个额外的好处,那些通过程序参数传递敏感信息的不良程序现在也得到了本地窃听者的保护。

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 等包提供的非树外模块无法加载。您可以使用 modinfo 来验证当前加载的模块是否带有签名;手动验证签名会稍微复杂一些 [11]

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

此外,可以 黑名单 掉不需要的单个模块,请参见 secureblue 中的示例。

禁用 kexec

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

/etc/sysctl.d/51-kexec-restrict.conf
kernel.kexec_load_disabled = 1
提示 kexeclinux-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) man 页错误地指出“如果系统以 EFI Secure Boot 模式启动,则会自动启用锁定”。这既不是上游内核的行为,也不是 Arch 打包的 内核 的行为。

另请参见 kernel_lockdown(7)

Linux Kernel Runtime Guard (LKRG)

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

禁用紧急 shell

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

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

紧急 shell 用于在启动过程中与机器进行交互式故障排除。然而,它也是攻击者可以用来访问安全资源(如 TPM)的工具。有关实际示例,请参阅 本文。通过禁用紧急 shell 可以增加攻击的难度,但代价是移除用于故障排除早期启动失败的工具。

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

沙盒化应用程序

另请参阅 Wikipedia:Sandbox (computer security)

要提高 systemd 服务单元的安全性,请参阅 systemd/沙盒化

注意 用户命名空间配置项 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

请注意,这可能会破坏诸如 nsjail 等应用程序。基于 Chromium 的应用程序需要 chrome-sandbox 的 SUID 位才能在此设置下工作。

Firejail

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

bubblewrap

bubblewrap 是一个为像 Flatpak 这样的非特权容器工具开发的沙盒应用程序,其资源占用和复杂性远低于 Firejail。虽然它缺少文件路径白名单等某些功能,但 bubblewrap 提供绑定挂载以及用户/IPC/PID/网络/cgroup 命名空间的创建,并且可以支持简单和复杂的沙盒。对于 linux-hardened 内核,您需要使用 bubblewrap-suid

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

Portable

Portable 是一个沙盒框架,它利用 bubblewrap 和许多其他工具来锁定正在运行的应用程序。它旨在为打包者提供简单性,为用户提供高效性,并且默认情况下可以修复安全漏洞并监控后台进程。

请参阅 portable-arch,其中包含由 portable 沙盒化的应用程序的仓库。

如果沙盒化的应用程序不使用 Portal 文件选择器,portable 可以将文件传递给沙盒(通过传递 --actions share-files)。

Portable 在 GNOME 上功能齐全,而其他桌面环境可能缺少少量功能,例如高级后台监控和屏幕截图 Portal。

Chroots

还可以构建手动 chroot 监狱来构建沙盒进程环境。它比其他沙盒技术的功能要有限得多;其沙盒化的程度仅限于文件路径隔离。

Linux 容器

Linux 容器 是一个不错的选择,当您需要比其他选项(短于 完全系统虚拟化)提供的更多隔离时。LXC 在现有内核之上运行,在一个伪 chroot 中,拥有自己的虚拟硬件。

完全虚拟化选项

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

网络和防火墙

防火墙

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

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

开放端口

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

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

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

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

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

您可以使用 ss -l 列出所有当前打开的端口。要显示所有 **l**istening **p**rocesses 及其 **n**umeric **t**cp 和 **u**dp 端口号

# ss -lpntu

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

内核参数

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

SSH

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

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

拒绝 root 登录也是一个好习惯,这有助于跟踪入侵并增加 root 访问之前的安全层。对于 OpenSSH,请参阅 OpenSSH#拒绝

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

DNS

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

代理

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

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

管理 TLS 证书

请参阅 TLS#信任管理

物理安全

只要有足够的时间和资源,对计算机的物理访问就相当于 root 访问。然而,通过设置足够的障碍,可以获得很高的“实际”安全水平。

攻击者可以通过简单地连接恶意的 IEEE 1394 (FireWire)、Thunderbolt 或 PCI Express 设备来在下次启动时获得对您计算机的完全控制,因为它们默认情况下会获得完全内存访问权限。[15] 对于 Thunderbolt,您可以将直接内存访问限制为完全禁用或限制为已知设备,请参阅 Thunderbolt#用户设备授权。对于 Firewire 和 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 安全团队

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

重新构建包

可以通过重新构建包并剥离不必要的功能来减小攻击面。例如,可以 bzip2 在不带 bzip2recover 的情况下重新构建,以规避 CVE-2016-3189。也可以手动或通过包装器应用自定义加固标志。

本文档或章节可以合并到 Arch 包指南/安全

注意: 安全相关的构建标志有自己的文章。(讨论请见 Talk:Security

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

原因: 从 3 年前的一篇博客文章复制粘贴而来。编译器标志特定于 GCC,其中一些几乎与安全无关。(讨论请见 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 or -fstack-protector-strong 堆栈溢出保护器
-grecord-gcc-switches 将编译器标志存储在调试信息中
-mcet -fcf-protection 控制流完整性保护
-Werror=format-security 拒绝潜在不安全的格式字符串参数
-Werror=implicit-function-declaration 拒绝缺失的函数原型
-Wl,-z,defs 检测并拒绝链接不足
-Wl,-z,now 禁用延迟绑定
-Wl,-z,relro 重定位后只读段

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.