安全
本文包含关于强化 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() 的强化替代品。该项目最初是为了集成到 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 页面上可以找到与 Firejail 的正确用法,并且可以在 github 存储库中找到 hardened_malloc 的一些可配置构建选项。
存储
静态数据加密
静态数据加密,最好是使用强密码短语的全盘加密,是保护数据免受物理恢复的唯一方法。这在计算机关闭或相关磁盘卸载时提供数据机密性。
但是,一旦计算机通电并且驱动器已挂载,其数据就会变得与未加密驱动器一样容易受到攻击。因此,最佳实践是尽快卸载不再需要的数据分区。
您也可以使用存储在 TPM 中的密钥加密驱动器,尽管它过去存在漏洞,并且可以通过 总线嗅探攻击提取密钥。
某些程序(如 dm-crypt)允许用户将循环文件加密为虚拟卷。当只有系统的某些部分需要安全时,这是全盘加密的合理替代方案。
虽然 静态数据加密 文章中比较的基于块设备或文件系统的加密类型在保护物理介质上的数据方面很有用,但大多数不能用于保护您无法控制的远程系统上的数据(例如 云存储)。在某些情况下,单独的文件加密将很有用。
以下是一些加密文件的方法
- 一些 归档和压缩 工具也提供基本的加密功能。一些例子包括 7-Zip (
-p
标志), zip (-e
标志)。加密功能应谨慎使用,因为这些工具可能使用自定义算法以实现跨平台兼容性。[3] - GnuPG 可以用来 加密文件。
- age 是一个简单易用的文件加密工具。它还支持多 recipients 和使用 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 秒的最小延迟。为了完全消除此延迟,您需要在这些模块的任何 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 bombs 和其他拒绝服务攻击。/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
- 它保留了哪个普通权限用户运行了每个特权命令的日志。
- 无需将 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 更灵活,但它仅适用于支持这些扩展属性的文件系统。
访问控制列表
访问控制列表 (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
[7]。
ptrace 范围
ptrace(2) 系统调用提供了一种方法,通过该方法,一个进程(“tracer”)可以观察和控制另一个进程(“tracee”)的执行,并检查和更改 tracee 的内存和寄存器。gdb、strace、perf、reptyr 和其他调试器等调试工具通常使用 ptrace
。但是,它也提供了一种恶意进程可以从中读取数据并控制其他进程的方法。
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。锁定有两种操作模式
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#禁用远程机器上的紧急模式。
沙盒化应用程序
另请参阅 维基百科:沙盒(计算机安全)。
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 jails 也可以构建以构建沙盒化进程环境。它比其他沙盒技术更受限制;其沙盒化的范围是文件路径隔离。
Linux 容器
Linux 容器 是另一种很好的选择,当您需要比其他选项(低于 完整系统虚拟化)提供的隔离更多时。LXC 在现有内核之上以伪 chroot 形式运行,并具有自己的虚拟硬件。
完整虚拟化选项
使用完整的虚拟化选项,例如 VirtualBox、KVM、Xen 或 Qubes OS (基于 Xen) 也可以提高隔离性和安全性,如果您计划运行高风险应用程序或浏览危险网站。
网络和防火墙
防火墙
虽然标准的 Arch 内核能够使用 Netfilter 的 iptables 和 nftables,但这些服务默认情况下未启用。强烈建议设置某种形式的防火墙来保护系统上运行的服务。许多资源(包括 ArchWiki)没有明确说明哪些服务值得保护,因此启用防火墙是一个很好的预防措施。
- 有关一般信息,请参阅 iptables 和 nftables。
- 有关设置 iptables 防火墙的指南,请参阅 简单状态防火墙。
- 有关设置 netfilter 的其他方法,请参阅 Category:Firewalls。
- 有关阻止 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 Authenticator 提供使用一次性密码 (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。
升级
定期升级系统非常重要。
关注漏洞警报
订阅由国家漏洞数据库提供的通用漏洞和暴露 (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 或 -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 | 重定位后只读段 |