安全
本文包含关于强化 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 命令设置,该命令使用系统的 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 账户为用户设置密码,该密码会绕过所需/配置的策略。这在设置临时密码时很有用。
- 当前关于密码的安全指南,例如来自 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
内存
Hardened malloc
hardened_malloc (hardened_mallocAUR, hardened-malloc-gitAUR) 是 glibc 的 malloc() 的强化替代品。该项目最初是为了集成到 Android 的 Bionic 和 musl 中而由 GrapheneOS 的 Daniel Micay 开发的,但他也为 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 页面,有关 hardened_malloc 的一些可配置构建选项,请参见 github 仓库。
存储
静态数据加密
静态数据加密,最好是使用强密码短语的全盘加密,是保护数据免受物理恢复的唯一方法。这在计算机关闭或相关磁盘卸载时提供数据保密性。
但是,一旦计算机通电并挂载驱动器,其数据就会变得与未加密驱动器一样容易受到攻击。因此,最佳实践是在不再需要数据分区时立即卸载它们。
您也可以使用存储在 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 安全指南 建议使用 0077
的 umask 以获得最大安全性,这使得新文件对于所有者以外的用户不可读。要更改此设置,请参阅 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 秒的最小延迟。为了完全消除此延迟,您需要在这些模块的任何 auth
行中添加 nodelay
参数,例如
/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
- 它保留了哪个普通特权用户运行了每个特权命令的日志。
- 无需将 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 最初是 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
设置为1
[7]。
ptrace 作用域
ptrace(2) 系统调用提供了一种方法,使一个进程(“tracer”)可以观察和控制另一个进程(“tracee”)的执行,并检查和更改 tracee 的内存和寄存器。gdb、strace、perf、reptyr 和其他调试器等调试工具通常使用 ptrace
。但是,它也提供了一种恶意进程可以从中读取数据并控制其他进程的方法。
Arch 默认启用 Yama LSM,它提供了 kernel.yama.ptrace_scope
内核参数。此参数默认设置为 1
(受限),这会阻止 tracer 在受限作用域之外的 traces 上执行 ptrace
调用,除非 tracer 是特权用户或具有 CAP_SYS_PTRACE
capability。与经典权限相比,这是安全性方面的重大改进。如果没有此模块,则在以同一用户身份运行的进程之间没有隔离(在没有其他安全层(例如 pid_namespaces(7))的情况下)。
ptrace
的工具,例如使用 sudo。如果您不需要使用调试工具,请考虑将 kernel.yama.ptrace_scope
设置为 2
(仅限管理员)或 3
(不可能进行 ptrace
)以加固系统。
hidepid
内核具有隐藏其他用户进程的能力,这些进程通常可以通过 /proc
访问,通过挂载 proc
文件系统并使用 https://docs.linuxkernel.org.cn/filesystems/proc.html 中记录的 hidepid=
和 gid=
选项,可以对非特权用户隐藏这些进程。
这大大增加了入侵者收集有关正在运行进程信息的难度,无论是守护进程是否以提升的权限运行,其他用户是否运行某些敏感程序,其他用户是否运行任何程序,都使得无法了解任何用户是否运行特定程序(假设该程序不会通过其行为暴露自身),并且,额外的好处是,编写不佳的程序通过程序参数传递敏感信息现在可以防止本地窃听者。
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。锁定有两种操作模式
integrity
:禁用允许用户空间修改正在运行内核的内核功能(kexec、bpf)。confidentiality
:还禁用允许用户空间从内核提取机密信息的内核功能。
建议使用 integrity
,除非您的特定威胁模型另有规定。
要在运行时启用内核锁定,请运行
# echo mode > /sys/kernel/security/lockdown
要在启动时启用内核锁定,请使用 内核参数 lockdown=mode
。
- 内核锁定在运行时无法禁用。
- 内核锁定禁用休眠。
另请参见 kernel_lockdown(7)。
Linux 内核运行时保护 (LKRG)
LKRG (lkrg-dkmsAUR) 是一个内核模块,用于执行内核的完整性检查和检测利用尝试。
禁用紧急 Shell
紧急 Shell 用于在启动过程中交互式地排除机器故障。但是,它也是攻击者可以用来访问安全资源(如 TPM)的小工具。有关实际示例,请参见 这篇文章。可以通过禁用紧急 Shell 来增加攻击的难度,但代价是删除了一个用于排除早期启动故障的工具。
要禁用紧急 Shell,请参见 Systemd#禁用远程机器上的紧急模式。
沙箱化应用程序
另请参见 Wikipedia:沙箱 (计算机安全)。
CONFIG_USER_NS
当前在 linux、linux-lts、linux-zen 和 linux-hardened 中启用。缺少它可能会阻止某些沙箱功能提供给应用程序。CONFIG_USER_NS_UNPRIVILEGED
) 默认在 linux、linux-lts 和 linux-zen 中启用,这大大增加了本地权限提升的攻击面(参见 AppArmor 的 Wiki 和 FS#36969)。为了缓解这个问题,可以
- 使用 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)也可以提高隔离性和安全性,如果您计划运行有风险的应用程序或浏览危险的网站。
网络和防火墙
防火墙
虽然 stock 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
列出所有当前开放端口。要显示所有listening(监听)processes(进程)及其numeric(数字)tcp 和 udp 端口号
# ss -lpntu
有关更多选项,请参见 ss(8)。
内核参数
可以使用 Sysctl 设置影响网络的内核参数。有关如何执行此操作,请参见 Sysctl#TCP/IP 协议栈强化。
SSH
为了缓解 暴力破解攻击,建议强制执行基于密钥的身份验证。对于 OpenSSH,有关更多建议,请参见 OpenSSH#保护。或者,Fail2ban 或 Sshguard 通过监控日志和编写 防火墙 规则来提供较弱形式的保护,但会带来拒绝服务的潜在风险,因为攻击者可以 欺骗 数据包,使其看起来像是来自管理员(在识别出其地址之后)。欺骗 IP 有多道防线,例如通过 反向路径过滤 和 禁用 ICMP 重定向。
您可能希望通过使用双因素身份验证来进一步加强身份验证。Google 身份验证器 提供使用一次性密码 (OTP) 的两步身份验证程序。
拒绝 root 登录也是一个好的做法,既可以追踪入侵,又可以在 root 访问之前增加额外的安全层。对于 OpenSSH,请参见 OpenSSH#拒绝。
Mozilla 发布了一个 OpenSSH 配置指南,该指南配置了更详细的审计日志记录并限制了密码。
DNS
默认域名解析 (DNS) 配置具有高度的兼容性,但存在安全漏洞。有关更多信息,请参见 DNS 隐私和安全。
代理
代理通常用作应用程序和网络之间的额外层,用于清理来自不受信任来源的数据。以较低权限运行的小型代理的攻击面明显小于以最终用户权限运行的复杂应用程序。
例如,DNS 解析器在 glibc 中实现,它与应用程序(可能以 root 身份运行)链接,因此 DNS 解析器中的错误可能导致远程代码执行。可以通过安装 DNS 缓存服务器(例如 dnsmasq,它充当代理)来防止这种情况。[11]
管理 TLS 证书
请参见 TLS#信任管理。
物理安全
如果有足够的时间和资源,物理访问计算机就等于 root 访问权限。但是,通过设置足够的障碍,可以获得很高的实际安全级别。
攻击者可以通过简单地连接恶意 IEEE 1394 (FireWire)、Thunderbolt 或 PCI Express 设备来在下次启动时获得对您计算机的完全控制,因为默认情况下它们被赋予完全内存访问权限。[12] 对于 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 合并。
自动注销
如果您正在使用 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 重新启动冻结的 GDM/Xorg 作为 root,那么这非常有用。
防止恶意 USB 设备
内核具有 停用 USB 端口的设置,以保护您的计算机免受恶意 USB 设备(又名 BadUSB、PoisonTap 或 LanTurtle)的侵害。它们可以在运行时设置,并通过 sysctl 自动化。
为了获得更多控制,请安装 USBGuard,它是一个软件框架,基于设备属性实现基本的白名单和黑名单功能。
易失性数据收集
通电的计算机可能容易受到 易失性数据收集 的攻击。最佳实践是在不需要计算机开机时,或者当计算机的物理安全性暂时受损时(例如,通过安全检查站时),完全关闭计算机。
软件包
身份验证
对软件包管理器的攻击 在没有正确使用软件包签名的情况下是可能的,甚至可能影响具有 正确签名系统 的软件包管理器。Arch 默认使用软件包签名,并依赖于来自 5 个可信主密钥的信任网络。有关详细信息,请参见 Pacman-key。
升级
定期升级系统非常重要。
关注漏洞警报
订阅 Common Vulnerabilities and Exposure (CVE) 安全警报更新,这些更新由 National Vulnerability Database 提供,并在 NVD 下载网页 上找到。Arch Linux 安全跟踪器 是一个特别有用的资源,因为它以表格格式组合了 Arch Linux Security Advisory (ASA)、Arch Linux Vulnerability Group (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 或 -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 | 重定位后的只读段 |