安全
本文包含关于强化 Arch Linux 系统的建议和最佳实践。
概念
- 确实有可能将安全性提升到系统无法使用的地步。安全性和便利性必须平衡。诀窍是创建一个安全且有用的系统。
- 最大的威胁始终并将永远是用户。
- 最小权限原则:系统的每个部分都应该只能访问严格要求的内容,不能访问更多。
- 纵深防御:安全在独立的层中工作得更好。当一层被突破时,另一层应该阻止攻击。
- 稍微保持偏执。并保持怀疑。如果任何事情听起来好得令人难以置信,那它可能就是真的!
- 除非您将机器从所有网络中拔出,关掉电源,锁在保险箱中,用混凝土覆盖并永远不使用它,否则您永远无法使系统达到 100% 安全。
- 为失败做好准备。提前制定一个计划,以便在您的安全被破坏时遵循。
密码
密码是安全系统的关键。它们保护您的用户账户、加密文件系统和 SSH/GPG 密钥。它们是计算机选择信任使用它的人的主要方式,因此安全性的很大一部分只是关于选择安全密码并保护它们。
选择安全密码
密码必须足够复杂,以至于不容易从个人信息等中猜到,或者使用诸如社会工程或暴力破解攻击之类的方法进行破解。强密码的原则基于长度和随机性。在密码学中,密码的质量通常被称为其熵。
不安全的密码包括包含或使用以下内容作为替换/变体基础的密码
- 个人身份信息(例如,您的狗的名字、出生日期、区号、最喜欢的电子游戏)
- 单词的简单字符替换(例如,
k1araj0hns0n
),因为现代字典攻击可以轻松处理这些 - 根“单词”或常用字符串,后跟或前跟添加的数字、符号或字符(例如,
DG091101%
) - 常用短语或常用词的短字符串(例如
photocopyhauntbranchexpose
),包括字符替换(例如Ph0toc0pyh4uN7br@nch3xp*se
)(有关字典单词组合何时安全的,请参见下文的 Diceware) - 任何最常用密码列表中的密码
密码的最佳选择是长(越长越好)且从随机源生成的东西。使用长密码非常重要。弱哈希算法允许在短短几个小时内破解 8 个字符的密码哈希。
pwgen 或 apgAUR 等工具可以生成随机密码。但是,这些密码可能难以记住。一种记忆技巧(对于经常输入的密码)是生成一个长密码并记住最少数量的安全字符,暂时写下完整的生成字符串。随着时间的推移,增加输入的字符数 - 直到密码深深地印在肌肉记忆中,并且不再需要记住。这种技术更困难,但可以提供信心,密码不会出现在单词列表或“智能”暴力破解攻击中,这些攻击会组合单词和替换字符。
除了密码管理之外,keepassxc 还提供密码/密码短语生成。可以在 GUI 中自定义生成。也支持基于字典的密码短语。
一种记忆密码的技术是使用助记短语,其中短语中的每个单词都提醒您密码中的下一个字符。例如,“the girl is walking down the rainy street”可以翻译为 t6!WdtR5
,或者不那么简单地翻译为 t&6!RrlW@dtR,57
。这种方法可以使记住密码更容易,但请注意,各种字母在单词开头出现的概率非常不同(Wikipedia:字母频率)。
另一种有效的技术是将随机生成的密码写下来,并将它们存储在安全的地方,例如钱包、手提包或文件保险箱中。大多数人在保护其有形贵重物品免受攻击方面做得很好,并且与数字安全实践相比,大多数人更容易理解物理安全最佳实践。
将助记和随机技术结合起来也非常有效,方法是将长随机生成的密码与 密码管理器 一起保存,密码管理器将通过可记忆的“主密码”/主要密码访问,该密码必须仅用于该目的。主密码必须记住,并且永远不要保存。这要求在系统上安装密码管理器才能轻松访问密码(这可能被视为不便或安全功能,具体取决于情况)。一些密码管理器还具有智能手机应用程序,可用于在未安装该密码管理器的系统上显示密码以进行手动输入(如果这是一个常见的用例,您仍然可以为每个服务使用易于输入但安全的密码,而不是完全随机的密码,请参见下文)。请注意,如果您忘记主密码,密码管理器会引入单点故障。一些密码管理器基于主密码和您要登录的服务名称计算包含的密码,而不是加密它们,从而可以在新系统上使用它,而无需同步任何数据。
使用一长串令人难忘的不相关单词作为密码可能是有效的。理论是,如果使用足够长的短语,则从密码长度获得的熵可以抵消使用字典单词而损失的熵。这个 xkcd 漫画 展示了这种方法的熵权衡,考虑了密码短语中每个单词的有限可能单词集。如果您选择的单词集很大(数千个单词),并且您从中选择 5-7 个甚至更多随机单词,则此方法提供了很大的熵,即使假设攻击者知道从中选择的可能单词集和选择的单词数也是如此。在确定单词集和单词数后,可能的密码短语的数量为:(要从中选择的单词集中的单词数)的(为密码短语选择的单词数)次方。有关更多信息,请参见例如 Diceware。
有关更多背景信息,请参见 密码短语常见问题解答 或 Wikipedia:密码强度。
维护密码
一旦您选择了强密码,请务必确保其安全。注意 键盘记录器(软件和硬件)、屏幕记录器、社会工程学、肩窥,并避免重用密码,以免不安全的服务器泄漏超出必要范围的信息。密码管理器 可以帮助管理大量复杂密码:如果您从管理器复制粘贴存储的密码到需要它们的应用程序,请确保每次都清除复制缓冲区,并确保它们未保存在任何类型的日志中(例如,不要将它们粘贴到纯终端命令中,这会将它们存储在诸如 .bash_history
之类的文件中)。请注意,作为浏览器扩展程序实现的密码管理器可能容易受到 侧信道攻击 的攻击。这些可以通过使用作为单独应用程序运行的密码管理器来缓解。
作为规则,不要仅仅因为安全密码更难记住而选择不安全密码。密码是一种平衡行为。最好拥有一个加密的安全密码数据库,由密钥和一个强主密码保护,而不是拥有许多类似的弱密码。写下密码可能同样有效 [1],在需要物理安全的同时避免软件解决方案中的潜在漏洞。
密码短语强度的另一个方面是它不能容易地从其他地方恢复。
如果您将用于磁盘加密的密码短语与用于登录密码的密码短语相同(例如,在登录时自动挂载加密分区或文件夹很有用),请确保 /etc/shadow
最终位于加密分区上,或者/并且对存储的密码哈希使用强密钥派生函数(即 yescrypt/argon2 或带有 PBKDF2 的 sha512,但不是 md5 或 PBKDF2 中的低迭代次数)(有关更多信息,请参见 SHA 密码哈希)。
passwd
执行密码更改以应用新的默认值。如果您要备份密码数据库,请确保每个副本都不是存储在任何其他密码短语后面的,而这些密码短语又存储在其中,例如加密驱动器或经过身份验证的远程存储服务,否则您将无法在需要时访问它;一个有用的技巧是使用主密码的简单加密哈希来保护备份数据库的驱动器或帐户。维护所有备份位置的列表:如果有一天您担心主密码短语已被泄露,您将必须立即在所有数据库备份以及受主密码派生的密钥保护的位置更改它。
以安全的方式对数据库进行版本控制可能非常复杂:如果您选择这样做,则必须有一种更新所有数据库版本的主密码的方法。主密码何时泄漏可能并不总是立即清楚:为了降低在您意识到密码泄漏之前其他人发现您的密码的风险,您可以选择定期更改它。如果您担心您已失去对数据库副本的控制权,则需要在根据其熵,可能需要暴力破解主密码的时间内更改其中包含的所有密码。
密码哈希
哈希是一个单向函数,即,它的设计目的是使在不使用它计算哈希函数的情况下不可能推导出输入(示例:MD5、SHA)。
密码哈希函数旨在使在不使用它计算哈希函数的情况下不可能推导出用户输入(密码)(示例:bcrypt)。密钥派生函数(KDF;示例:yescrypt、scrypt、PBKDF2)是一种加密算法,旨在从输入(主密钥、密码)派生密钥(例如 AES 密钥、密码哈希)。因此,KDF 可以服务于多种应用,包括密码哈希函数的应用。
默认情况下,Arch 将哈希的用户密码存储在仅 root 可读的 /etc/shadow
文件中,与存储在世界可读的 /etc/passwd
文件中的其他用户参数分开,请参见 用户和组#用户数据库。另请参见 #限制 root。
密码使用 passwd 命令设置,该命令使用系统的加密函数拉伸密码,然后将它们保存在 /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 账户为用户设置绕过所需/配置策略的密码。这在设置临时密码时很有用。
- 当前关于密码的安全指南,例如来自 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 通常可以在系统的固件中禁用。有关更多信息,请查阅您的主板或系统文档。您还可以通过添加以下 内核参数 在内核中禁用 SMT
mitigations=auto,nosmt
内存
强化的 malloc
hardened_malloc (hardened_mallocAUR, hardened-malloc-gitAUR) 是 glibc 的 malloc() 的强化替代品。该项目最初由 GrapheneOS 的 Daniel Micay 开发,用于集成到 Android 的 Bionic 和 musl 中,但他也内置了对 x86_64 架构上标准 Linux 发行版的支持。
虽然 hardened_malloc 尚未集成到 glibc 中(欢迎提供帮助和拉取请求),但它可以轻松地与 LD_PRELOAD 一起使用。到目前为止的测试表明,如果全局在 /etc/ld.so.preload
中启用,它只会导致少数应用程序出现问题。由于 hardened_malloc 具有性能成本,您可能需要根据攻击面和性能需求来决定在个案中使用哪个实现。
要以独立方式试用它,请使用 hardened-malloc-preload 包装器脚本,或使用正确的 preload 值手动启动应用程序
LD_PRELOAD="/usr/lib/libhardened_malloc.so" /usr/bin/firefox
在 Firejail 的 wiki 页面上可以找到与 Firejail 的正确用法,并且可以在 github 仓库中找到 hardened_malloc 的一些可配置构建选项。
存储
静态数据加密
静态数据加密,最好是使用强密码短语的全盘加密,是保护数据免受物理恢复的唯一方法。这在计算机关闭或相关磁盘卸载时提供数据机密性。
但是,一旦计算机开机并挂载驱动器,其数据就会像未加密的驱动器一样容易受到攻击。因此,最佳实践是在不再需要数据分区时立即卸载它们。
您也可以使用存储在 TPM 中的密钥加密驱动器,尽管它过去存在漏洞,并且密钥可以通过 总线嗅探攻击 提取。
某些程序(如 dm-crypt)允许用户将循环文件加密为虚拟卷。当只有系统的某些部分需要安全时,这是全盘加密的合理替代方案。
虽然在 静态数据加密 文章中比较的基于块设备或文件系统的加密类型对于保护物理介质上的数据很有用,但大多数都不能用于保护您无法控制的远程系统上的数据(例如 云存储)。在某些情况下,单独的文件加密将很有用。
以下是一些加密文件的方法
- 一些归档和压缩工具也提供基本加密。一些示例是 7-Zip (
-p
标志),zip (-e
标志)。应该仅在特别注意的情况下依赖加密,因为这些工具可能会使用自定义算法来实现跨平台兼容性。[3] - GnuPG 可用于加密文件。
- age 是一个简单易用的文件加密工具。它还支持多收件人以及使用 SSH 密钥进行加密,这对于安全文件共享非常有用。
文件系统
如果启用了 fs.protected_hardlinks
和 fs.protected_symlinks
sysctl 开关,内核现在可以防止与硬链接和符号链接相关的安全问题,因此不再需要将全局可写目录分离出来以获得主要的安全性优势。
包含全局可写目录的文件系统仍然可以保持分离状态,作为限制磁盘空间耗尽造成的损害的粗略方法。但是,填充 /var
或 /tmp
就足以使服务崩溃。存在更灵活的机制来处理此问题(如 配额),并且某些 文件系统 本身包含相关功能(Btrfs 在子卷上具有配额)。
挂载选项
遵循最小权限原则,应使用尽可能严格的挂载选项来挂载文件系统(在不损失功能的情况下)。
相关的挂载选项是
nodev
:不要解释文件系统上的字符或块特殊设备。nosuid
:不允许 set-user-identifier 或 set-group-identifier 位生效。noexec
:不允许直接执行挂载文件系统上的任何二进制文件。- 在
/home
上设置noexec
会禁用可执行脚本并破坏 Wine、Steam、PyCharm、.NET 等。 - 某些软件包(例如构建 nvidia-dkms)可能需要在
/var
上使用exec
。
- 在
用于数据的文件系统应始终使用 nodev
、nosuid
和 noexec
挂载。
要考虑的潜在文件系统挂载
/var
/home
/dev/shm
/tmp
/boot
noexec,nosuid,nodev
进行硬化处理。快照
当使用文件系统快照时,例如使用 Btrfs、LVM 或 ZFS,务必注意快照可能会保留用户期望被删除的敏感信息。当配置了诸如 Snapper 之类的自动快照工具时尤其如此,因为它们可以在常规时间间隔或响应系统事件时捕获快照。以下是一些关于 /home/
中的敏感信息如何在快照中持久存在的示例
- 已删除的文件和目录:即使文件或目录已从文件系统中删除,它们仍可能存在于较旧的快照中。这在大多数情况下是预期的,但请考虑是否应保留诸如
.local/share/Trash/
、.history
等文件和目录。 - 临时文件和缓存:应用程序生成的临时文件和缓存数据可能包含在快照中。例如,保存在加密目录中的文件可能会在打开时生成缩略图 (
.cache/thumbnails
) 或工作副本,这些副本可能会包含在快照中。例如,浏览历史记录(.mozilla/
、.config/chromium/
等)也是如此,这些记录可能在清除之前已包含在快照中。
如果支持此功能,请考虑将此类目录完全从快照中排除。例如,如果使用 Btrfs,您可以为例如 .cache/
、.config/
、.local/
、.var/
或任何其他目录创建子卷,具体取决于您的用例。
.local/share/Trash
移动到单独的子卷可能会在某些情况下破坏回收站功能,例如使用 GNOME/Files。文件访问权限
默认的 文件权限 允许几乎所有内容的读取访问权限,更改权限可以隐藏有价值的信息,使其免受获得非 root 帐户(例如 http
或 nobody
用户)访问权限的攻击者的侵害。您可以使用 chmod 移除组和其他用户的全部权限
# chmod go-r path_to_hide
g
(或者如果已经运行,则使用 chmod g+r path
重新添加权限)。一些需要考虑的路径是
/boot
:启动目录,其中可能包括传统的 vmlinuz 和 initramfs 镜像,或者 统一内核镜像。请注意,当使用 Systemd#GPT 分区自动挂载时,默认使用安全权限。/etc/nftables.conf
:nftables 配置,适用于 nftables 和 iptables-nft。/etc/iptables
:旧版 iptables 配置,适用于 iptables。
默认的 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。
要在 /usr/bin
中搜索具有 SUID 或 SGID 位的文件的命令
$ find /usr/bin -perm "/u=s,g=s"
备份
定期创建重要数据的备份。定期测试备份的完整性。定期测试备份是否可以恢复。
确保至少有一个数据副本离线存储,即不以任何方式连接到受威胁的系统。勒索软件 和其他破坏性攻击也可能攻击任何连接的备份系统。
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_unix
和 pam_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
将完全禁用锁定机制。默认情况下,所有用户锁定在重启后都会丢失。如果您的攻击者可以重启机器,则持久锁定会更安全。要使锁定持久存在,请将 /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 兼容层将自动使用无 root Xorg。
限制 root 权限
根据定义,root 用户是系统上最强大的用户。审计 root 用户帐户也很困难。因此,尽可能限制 root 用户帐户的使用非常重要。有许多方法可以在保持 root 用户权力的同时限制其造成危害的能力。
使用 sudo 而不是 su
出于多种原因,使用 sudo 进行特权访问比 su 更可取。
- 它可以记录哪个普通特权用户运行了每个特权命令。
- 无需将 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
而不是 vi
与 visudo
一起使用,/etc/sudoers
Defaults editor=/usr/bin/rnano
导出 EDITOR=nano visudo
被认为是一个严重的安全风险,因为任何东西都可以用作 EDITOR
。
使用 sudo 编辑文件
请参阅 Sudo#编辑文件。或者,您可以使用像 rvim
或 rnano
这样的编辑器,它们具有受限的功能,以便可以安全地以 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
BPF 硬化
BPF 是一个用于在运行时在内核中动态加载和执行字节码的系统。它用于许多 Linux 内核子系统,例如网络(例如 XDP、tc)、跟踪(例如 kprobes、uprobes、tracepoints)和安全(例如 seccomp)。它对于高级网络安全、性能分析和动态跟踪也很有用。
BPF 最初是 伯克利数据包过滤器 的首字母缩写,因为最初的经典 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
通常被调试工具使用,包括 gdb、strace、perf、reptyr 和其他调试器。但是,它也提供了一种恶意进程可以从中读取数据并控制其他进程的方法。
Arch 默认启用 Yama LSM,它提供了一个 kernel.yama.ptrace_scope
内核参数。此参数默认设置为 1
(受限),这会阻止 tracer 对受限作用域之外的 tracee 执行 ptrace
调用,除非 tracer 具有特权或具有 CAP_SYS_PTRACE
capability。与经典权限相比,这是一个显着的安全改进。如果没有此模块,则在以同一用户身份运行的进程之间没有隔离(在没有其他安全层(例如 pid_namespaces(7))的情况下)。
ptrace
的工具,方法是以特权进程身份运行它们,例如使用 sudo。如果您不需要使用调试工具,请考虑将 kernel.yama.ptrace_scope
设置为 2
(仅限管理员)或 3
(不可能使用 ptrace
)以加强系统。
hidepid
内核能够隐藏其他用户的进程,这些进程通常可以通过 /proc
访问,方法是使用 https://docs.linuxkernel.org.cn/filesystems/proc.html 中记录的 hidepid=
和 gid=
选项挂载 proc
文件系统。
这大大复杂化了入侵者收集有关正在运行的进程的信息的任务,无论某些守护程序是否以提升的权限运行,其他用户是否运行某些敏感程序,其他用户是否运行任何程序,使得无法了解是否有任何用户运行特定程序(假设该程序不会通过其行为公开自身),并且,作为额外的奖励,通过程序参数传递敏感信息的编写不良的程序现在受到保护,免受本地窃听者的侵害。
proc
组(由 filesystem 软件包提供)充当授权用户学习其他用户进程信息的白名单。如果用户或服务需要访问超出其自身范围的 /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
内核锁定模式
自 Linux 5.4 版本起,内核增加了一个可选的锁定功能,旨在加强 UID 0(root)和内核之间的边界。启用后,某些依赖于对硬件或内核的底层访问的应用程序可能无法工作。
要使用锁定功能,必须初始化其 LSM 并设置锁定模式。
所有官方支持的内核都初始化了 LSM,但它们都没有强制执行任何锁定模式。
cat /sys/kernel/security/lsm
来验证已初始化的 LSM。锁定功能有两种操作模式
完整性
:允许用户空间修改正在运行的内核的内核功能被禁用(kexec、bpf)。机密性
:允许用户空间从内核提取机密信息的内核功能也被禁用。
建议使用 完整性
模式,除非您的特定威胁模型另有要求。
要在运行时启用内核锁定,请运行
# echo mode > /sys/kernel/security/lockdown
要在启动时启用内核锁定,请使用内核参数 lockdown=模式
。
- 内核锁定在运行时无法禁用。
- 内核锁定禁用休眠。
另请参阅 kernel_lockdown(7)。
Linux 内核运行时保护 (LKRG)
LKRG (lkrg-dkmsAUR) 是一个内核模块,用于执行内核的完整性检查和检测利用尝试。
禁用紧急 Shell
紧急 shell 用于在启动过程中交互式地排除机器故障。但是,它也是攻击者可以用来访问安全资源(如 TPM)的工具。有关实际示例,请参阅这篇文章。禁用紧急 shell 可以增加攻击的难度,但代价是移除了一个用于排除早期启动故障的工具。
要禁用紧急 shell,请参阅 Systemd#禁用远程机器上的紧急模式。
沙盒化应用程序
另请参阅 Wikipedia:Sandbox (计算机安全)。
CONFIG_USER_NS
当前在 linux、linux-lts、linux-zen 和 linux-hardened 中已启用。缺少它可能会阻止某些沙盒功能提供给应用程序。为了缓解这种情况,可以
- 使用具有安全默认值的 linux-hardened 内核,或者
- 将 `kernel.unprivileged_userns_clone` sysctl 设置为 `0`。
请注意,这可能会破坏诸如 Zoom 或 nsjail 之类的应用程序。如果您的系统上安装了 bubblewrap,您还需要将其替换为 bubblewrap-suid。请参阅 Bubblewrap#安装。
Firejail
Firejail 是一款易于使用的工具,用于沙盒化应用程序和服务器。它最初是为浏览器和面向互联网的应用程序创建的,但现在支持大量的应用程序。为了建立具有各种功能的沙盒环境,它以 suid 二进制文件安装,并基于黑名单和白名单为目标应用程序构建沙盒运行时环境。
bubblewrap
bubblewrap 是一款沙盒应用程序,专为像 Flatpak 这样的非特权容器工具开发,与 Firejail 相比,资源占用和复杂性都显著降低。虽然它缺乏某些功能(如文件路径白名单),但 bubblewrap 确实提供了绑定挂载以及用户/IPC/PID/网络/cgroup 命名空间的创建,并且可以支持简单和复杂的沙盒。
Bubblejail 沙盒基于 bubblewrap,并提供面向资源的权限模型,以及用于调整权限的图形界面。
chroots
也可以手动构建 chroot 监狱来构建沙盒化进程环境。它比其他沙盒技术受到的限制更多;其沙盒化的范围是文件路径隔离。
Linux 容器
当您需要比其他选项(不足以达到完全系统虚拟化)提供的隔离级别更高的隔离时,Linux 容器是另一个不错的选择。LXC 在现有内核之上以伪 chroot 运行,并带有自己的虚拟硬件。
完全虚拟化选项
如果您计划运行有风险的应用程序或浏览危险的网站,使用完全虚拟化选项(如 VirtualBox、KVM、Xen 或 Qubes OS (基于 Xen))也可以提高隔离性和安全性。
网络和防火墙
防火墙
虽然默认的 Arch 内核能够使用 Netfilter 的 iptables 和 nftables,但这些服务默认情况下未启用。强烈建议设置某种形式的防火墙来保护系统上运行的服务。许多资源(包括 ArchWiki)没有明确说明哪些服务值得保护,因此启用防火墙是一个很好的预防措施。
- 有关一般信息,请参阅 iptables 和 nftables。
- 有关设置 iptables 防火墙的指南,请参阅 简单有状态防火墙。
- 有关设置 netfilter 的其他方法,请参阅 Category:防火墙。
- 有关阻止 IP 地址列表(例如来自 Bluetack 的列表),请参阅 Ipset。
- opensnitch 是一款可配置的入站和出站防火墙,支持按应用程序、端口、主机等配置规则。
开放端口
某些服务在开放的网络端口上监听入站流量。重要的是仅将这些服务绑定到绝对必要的地址和接口。远程攻击者有可能利用有缺陷的网络协议来访问暴露的服务。即使是绑定到 localhost 的进程也可能发生这种情况。
一般来说,如果服务只需要本地系统访问,则绑定到 Unix 域套接字 (unix(7)) 或环回地址(如 localhost),而不是非环回地址(如 0.0.0.0/0)。
如果服务需要通过网络被其他系统访问,请使用严格的防火墙规则控制访问,并在可能的情况下配置身份验证、授权和加密。
您可以使用 `ss -l` 列出所有当前开放的端口。要显示所有监听的进程及其数字 tcp 和 udp 端口号
# ss -lpntu
有关更多选项,请参阅 ss(8)。
内核参数
影响网络的内核参数可以使用 Sysctl 设置。有关如何执行此操作,请参阅 Sysctl#TCP/IP 堆栈强化。
SSH
为了缓解暴力攻击,建议强制执行基于密钥的身份验证。对于 OpenSSH,有关更多建议,请参阅 OpenSSH#保护。或者,Fail2ban 或 Sshguard 通过监控日志和编写防火墙规则来提供较弱形式的保护,但这会带来拒绝服务的可能性,因为攻击者在识别管理员地址后可以欺骗数据包,使其看起来像是来自管理员。欺骗 IP 有多道防线,例如通过反向路径过滤和禁用 ICMP 重定向。
您可能希望通过使用双因素身份验证来进一步强化身份验证。Google Authenticator 提供了一个使用一次性密码 (OTP) 的两步身份验证程序。
拒绝 root 登录也是一个好的做法,无论是为了跟踪入侵还是在 root 访问之前添加额外的安全层。对于 OpenSSH,请参阅 OpenSSH#拒绝。
Mozilla 发布了一个 OpenSSH 配置指南,该指南配置了更详细的审计日志记录并限制了密码。
DNS
默认域名解析 (DNS) 配置具有很高的兼容性,但存在安全漏洞。有关更多信息,请参阅 DNS 隐私和安全。
代理
代理通常用作应用程序和网络之间的额外层,用于清理来自不受信任来源的数据。以较低权限运行的小型代理的攻击面远小于以最终用户权限运行的复杂应用程序。
例如,DNS 解析器是在 glibc 中实现的,它与应用程序(可能以 root 身份运行)链接,因此 DNS 解析器中的错误可能会导致远程代码执行。可以通过安装 DNS 缓存服务器(如 dnsmasq,它充当代理)来防止这种情况。
管理 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 合并。
自动注销
如果您正在使用 Bash 或 Zsh,您可以设置 `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 设备(又名 BadUSB、PoisonTap 或 LanTurtle)的侵害。它们可以在运行时设置,并通过 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 订阅。
重建软件包
可以重建软件包并剥离不需要的功能和特性,以此来减少攻击面。例如,可以重建 bzip2,而不包含 bzip2recover,以尝试规避 CVE-2016-3189。也可以手动或通过包装器应用自定义强化标志。
标志 | 目的 |
---|---|
-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 or -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 | 重定位后的只读段 |