当我年轻的时候,Paul Simon 发布了他的热门歌曲 离开爱人的 50 种方法。受这首歌的启发,我收集了系统管理员和普通人可以避免被黑客入侵的 50 种方法。
“你只需从后门溜走,杰克”
1. 备份你的数据。如果你受到勒索软件的攻击,如果你有备份,你就不必支付赎金。
2. 当你需要在公共场所为手机充电时,使用 syncstop,或者自带移动电源。
3. 充分利用审计子系统。有很多很棒的工具可以帮助监控你的系统。如果你确实遭受了入侵,审计系统很可能能够告诉你发生了什么以及攻击者做了什么。
4. 说到日志,将日志卸载到中央服务器总是一个好主意,因为如果黑客侵入你的系统,他要攻击的第一件事就是日志系统,以掩盖他的踪迹。拥有一个良好的入侵系统来监视日志也有帮助。
“制定新计划,斯坦”
5. 以强制模式运行 SELinux(参见 stopdisablingselinux.com)。没想到我这么久才提到这一点吧?SELinux 可以防止零日漏洞的升级。当 Shell Shock 出现时,SELinux 是唯一的防御手段。
6. 尽可能在 SELinux 沙箱中运行应用程序——在容器流行之前,它就已经是一个容器了。同时关注 Flatpack 的开发,它很快就应该会开发出沙箱功能。
7. 不要安装或使用 Flash。Firefox 不再支持它,希望大多数 Web 服务器也在逐渐放弃它。
8. 使用 受限的 SELinux 用户 来控制用户在你的系统中的行为。如果你正在运行共享登录系统,请将用户设置为 guest_t。
“你不需要害羞,罗伊”
9. 利用 systemd 工具 来帮助保护你的服务。大多数系统攻击都将通过在网络上监听的服务来进行。Systemd 提供了很棒的方法来锁定服务。例如,使用 PrivateTmp=yes。PrivateTmp 利用挂载命名空间为服务器的 /tmp 设置一个私有的 tmpfs 挂载。这可以防止被黑客入侵的服务访问主机 /tmp 中的内容,并可能根据监听 /tmp 的服务来攻击系统的其余部分。
10. InaccessibleDirectories=/home 是一个 systemd 单元标志,它使用挂载命名空间从服务视图中删除 /home(或任何其他目录),这使得被黑客入侵的服务更难攻击该内容。
11. ReadOnlyDirectories=/var 是另一个 systemd 单元标志,它使用挂载命名空间将目录内容转换为只读模式。你可能应该始终以 ReadOnlyMode 运行 /usr。这将防止被黑客入侵的应用程序重写二进制文件,因此下次启动服务时,你可能已经被入侵了。
12. 从服务中删除 capability (CapabilityBoundingSet=CAP_CHOWN CAP_KILL)。在内核中,特权进程被分解为一系列不同的 capability。大多数服务不需要很多(如果有的话),并且 systemd 提供了一个简单的开关来从服务中删除它们。
13. 如果你的服务不打算使用网络,那么你可以使用 PrivateNetwork=yes 为该服务关闭网络。只需在服务单元文件中打开此选项,就可以利用网络命名空间并关闭该服务可用的所有网络。通常,黑客实际上并不想侵入你的机器——他只想将其用作攻击服务器来攻击其他机器。如果服务看不到网络,它就无法攻击它。
14. 控制你的服务可用的设备。Systemd 提供了 DeviceAllow 指令,该指令控制服务可用的设备。DeviceAllow=/dev/null rw 将限制对 /dev/null 的访问,并且仅限于此设备节点,不允许访问任何其他设备节点。该功能是在设备的 cgroup 控制器之上实现的。
15. 即将推出的 systemd 系统中有一个新功能,ProtectSystem Strict,它可以打开所有这些命名空间以完全锁定服务运行的环境。
“让自己自由”
16. 不要使用没有 SELinux (SEAndroid) 且处于强制模式的手机。幸运的是,我听说超过 90% 的 Android 手机现在都以强制模式运行 SEAndroid。这让我很高兴。现在,如果我们能让那些 Apple 员工使用 SELinux 就好了。
17. 只从可信来源安装软件。不要安装你在互联网上找到的可疑的东西。这适用于你的手机、计算机系统、虚拟机、容器等等。
18. 我不在手机上进行网上银行操作——只在我的 Linux 电脑上进行。如果黑客偷了我的信用卡,我就会损失 50 美元;如果他进入我的银行账户,我就会损失更多。我想我已经老了。(别烦我。)
19. 我用我的手机做的一件很酷的事情是设置我的信用卡公司,以便每次我的信用卡被收费时都给我发短信。这样,如果号码被盗,我会更快地知道。
20. 当你需要安全地通信时,使用 Signal 安全消息应用程序。
“跳上巴士,格斯”
21. 在你的系统上运行 Linux。当我第一次为我父亲连接计算机系统时,我还没到家,他的系统就被病毒感染了。我回去在他的系统上安装了 Linux,此后他一直在运行它。我认为 Linux 通常是一个更安全的系统,因为它在设计方式上就是这样,但我也相信桌面不太可能被黑客入侵,因为用户群较小。有些人可能会争辩说 Windows 多年来已经有了很大的改进,但对我来说,我仍然坚持我所知道的。
22. 只运行具有 安全响应团队 监视发行版安全性的发行版。企业软件很重要。
23. 运行企业级内核。在容器中,单点故障是内核。如果你想保持它的安全,请使用企业级内核,这意味着它具有最新的安全修复程序,但不是最前沿的。请记住,最新的内核带有最新的安全修复程序,但它也带有大量可能存在漏洞的新代码。
“你不需要讨论太多”
24. 大多数黑客攻击都是社会工程攻击——例如,电子邮件链接、Web 浏览器攻击和电话。最好的选择是接受教育并保持怀疑。没有人从尼日利亚给你钱。美国国税局不会打电话到你家要钱。如果你从你的银行收到一封包含网站链接的电子邮件,请不要使用该链接。直接在 Web 浏览器上输入地址。
25. 始终使用最新的安全修复程序保持你的系统完全更新。过时且存在已知安全漏洞的系统数量令人恐惧。脚本小子依赖于你不更新你的系统。
26. 在网络上连接到服务时,始终使用 HTTPS。Chrome 和 Firefox 现在具有强制执行此操作的模式。如果一个网站到 2016 年还不支持安全通信,那可能不值得你访问。
27. 在你的容器中使用 seccomp。这限制了内核上的攻击面,内核是单点故障。限制进程可以讨论的内容。
“只需放下钥匙,李”
28. 使用 YubiKey 来存储私钥。
29. 加密系统上的数据。至少对于笔记本电脑,保持你的 homedir 和你的其他数据目录加密。几年前我在伦敦乘坐地铁,我的笔记本电脑被“偷”了——火车车厢的门关上了,我注意到我的笔记本电脑不见了,火车正在驶离车站。幸运的是,磁盘已加密。
30. 为你的所有网站使用 Let's Encrypt。没有理由不再运行 HTTPS。
31. 永远不要在不同的 Web 服务器上使用相同的密码。这一点很难不陷入陷阱。像 Let's Encrypt 这样的工具帮助很大。如果你使用 ssh 密钥登录系统,那就更好了。
32. 使用双因素认证 (2FA)。密码几乎已经变得毫无用处。使用 YubiKey 之类的工具可以使双因素认证变得容易。我们都有手机。在你的大脑中记住一个秘密,然后在手机上生成一个秘密,总是比密码更好。
33. 没有什么比网站总是要求我设置账户更让我恼火了——我们难道不能做得更好吗?始终为你的网站密码使用密码生成工具。我是老派:我使用 Password Safe,然后剪切并粘贴到 Web 浏览器中。我听说其他人使用 LastPass 和其他将你的手机和 Web 服务集成的工具也效果不错。
34. 设置像 FreeIPA 这样的服务用于身份验证服务。使用像 Kerberos 这样的工具进行身份验证和授权,可以更容易地跟踪员工及其对系统的访问权限(并且它具有很棒的加密服务)。使用 Active Directory 也可以,但我有点偏见。
35. 当必须使用经常需要输入的密码时,使用容易记住的句子,而不是一个单词。我首选的记住密码的方法是使用一个由几个单词组成的、易于输入的短语。
“让自己自由”
36. 使用 USBGuard 来保护你的系统免受恶意 USB 设备的侵害。
37. 在过去的几年里,我一直在研究容器,所以现在让我们深入了解容器的安全性。首先,在强制模式下启用 SELinux 的系统上运行它们。如果你的系统不支持 SELinux,请将发行版切换到支持 SELinux 的发行版。SELinux 是防止使用文件系统突破容器的最佳工具。
38. 尽可能在容器内运行你的服务。我相信这就是未来——使用 OCI 镜像格式 和 Linux 容器技术的应用程序。使用 Docker、runC、OCID、RKT、Systemd-nspawn 等启动这些容器。尽管我经常说“容器不包含任何东西”,但它们确实比不在容器内运行更好。
39. 在 VM 中运行你的容器。虚拟机提供比容器更好的隔离。像在虚拟机上运行容器一样,可以为你提供可扩展性和彼此隔离。
40. 在不同的虚拟机上运行具有不同安全需求的容器化应用程序。在 DMZ 中的虚拟机上运行你的 Web 服务容器,但在 DMZ 之外的虚拟机上运行数据库容器。
41. 还要记住,在不同的物理机器上,在容器内的不同虚拟机上(即深度防御)运行需要最高安全性的虚拟机。
42. 在只读模式下运行你的容器。开发中的容器需要能够写入 /usr,但生产中的容器应该只能写入 tmpfs 和挂载到容器中的卷。
43. 从你的容器中删除 capabilities。我们在容器内外运行的进程具有比它们需要的更多的“capabilties”。你可以通过删除 capabilties 来使你的进程更安全。
44. 不要以 root 身份在容器中运行你的进程。大多数服务永远不需要 root 权限,或者它们需要它来绑定到端口 < 1024,然后切换到非 root 用户。我建议始终以非 root 身份运行应用程序。
45. 使用最新的 CVE 修复程序更新你的容器。使用像 OpenShift 这样的系统来构建和维护你的容器镜像是一个好主意,因为它会在出现新的安全修复程序时自动重建容器镜像。
46. 我的一个同事说:“Docker 就是在你的主机上以 root 身份运行来自 Internet 的随机代码”。从可信来源获取你的软件。不要在 docker.io 上获取你找到的第一个 Apache 应用程序。操作系统很重要。
47. 在有限的容器优化主机上运行你的生产环境容器,例如 Atomic Host,它具有所有启用的安全性,针对运行容器进行了优化,具有有限的攻击面和原子更新。那里有什么不喜欢的地方?
48. 使用像 OpenScap 这样的工具来扫描你的系统是否存在漏洞。可悲的是,新的漏洞总是不断涌现,因此你必须保持你的扫描程序是最新的。(请查看 atomic scan 来扫描你的容器。)
49. OpenScap 还具有扫描 安全配置(例如 STIG(安全技术实施指南))的功能。
50. 为你的孩子收到的所有圣诞节 IoT 设备设置一个特殊的访客网络。我喜欢我的 Amazon Echo 和自动灯和电源开关(“Alexa,打开圣诞彩灯”),但这些中的每一个都是具有可疑安全性的 Linux 操作系统。
“一定还有 50 多种避免被黑客入侵的方法”
你会将什么添加到列表中?请在评论中告诉我们。
Josh Bressers 为本文做出了贡献。
15 条评论