嵌入式 Linux 设备的安全要点

信息安全 linux 硬化 核心 嵌入式系统
2021-09-03 09:13:25

我们正在使用 Raspberry Pi 3 作为硬件平台对安全摄像头产品进行原型设计。摄像机能够通过互联网连接到云端,以及在互联网中断时进行离线处理。

目前,为了安全起见,我们在强制模式下启用了 SELinux,并考虑以下几点:

  • dm-真实性
  • eCryptFS 用于基于文件的加密

在快速阅读了一些与 Linux 安全相关的文章后,我们遇到了一些正在谈论的关键字:

  • 内核硬化
  • 网络加固

加固内核和网络是什么意思?是否有某些内核配置有助于实现内核强化?是否有指导方针应该在网络侧阻止什么?

与 Android 不同,我们不打算在我们的 Linux 系统上安装和运行大量应用程序。我们很少有应用程序可以运行并完成所需的工作。事实上,任何其他以某种方式获得访问权限的应用程序都应该被阻止运行。

1个回答

您的考虑

使用 dm-verity 是一个非常好的主意,特别是如果您能够在硬件中融合密钥以进一步减少 TCB。这可以极大地帮助防止系统受到持续损害,并确保完整性,使篡改变得非常明显。快速的网络搜索显示了 Raspberry Pi 的几个 TPM 实现,这将允许您在设备上实现 SRTM(用于测量的静态信任根),使您能够执行测量的启动和远程证明,将 dm-verity 增强到增加设备的完整性。

文件系统级加密可能很有用,但如果您要将数据上传到云,您也必须意识到该行为带来的风险。文件系统级加密不会保护已上传到不安全“云”主机的数据。理想情况下,您将改用客户端加密。如果您只上传视频文件等内容,您可以使用易于使用且流行的库(如 NaCl/libsodium)对它们进行加密,然后再将它们加密后上传到远程服务器。还要记住,密码必须来自某个地方。除非您的用户自己选择密码,否则您将不会提供任何机密性(对于设备上的数据)。将密码存储在设备上是个坏主意。

比这更重要的事情以及即将发生的事情是开发正式的威胁模型你需要知道你的对手是谁,你的用户的资产是什么以及它们的价值,并将它们放在上下文中。编写攻击树,并使用它。风险评估和威胁建模通常对您的产品安全极为重要。

内核硬化

这是指任何增加内核安全性以降低被利用风险的操作。这是一类广泛的技术,从使用面向安全的补丁修补内核到简单地调整 sysctl 以减少攻击面。

  • grsecurity等内核补丁大大增加了利用内核的难度。目前,除付费客户外,grsecurity 已自行关闭,因此可能超出您的预算范围。如果您能够使用它,或者它的转发端口,您将获得大量内核强化功能,这比仅通过配置所能提供的要多得多。
  • 自定义内核配置允许您从内核中删除不必要的代码和功能,以及破解库存漏洞。例如,许多内核漏洞利用需要使用晦涩或复杂的驱动程序。由于您正在为嵌入式系统进行开发,因此您很可能已经在使用自定义内核配置。您应该将其剥离为仅您需要的驱动程序,并禁用一些特别有问题的功能,例如用户命名空间、vsyscall 和非特权 eBPF。这是强化内核的最重要方法之一。
  • 如果您浏览整个 sysctl 列表,您会看到许多与安全相关但具有不理想的默认值。通过调整 sysctls,您可以禁用非特权用户命名空间、eBPF、JIT 等。您还可以通过增加 sysctls 来增加 ASLR 提供的随机性vm.mmap_rnd_bits此外,启用 sysctls 在诸如 oopses 等各种事件时使内核恐慌也可以大大提高安全性,因为许多内核漏洞会触发 oops 或内核警告,但默认情况下内核将继续运行,就好像什么都没发生一样,可能会允许漏洞利用成功. 由于这是一款嵌入式设备,因此最好立即恐慌并重新启动。
  • 内核模块签名用于防止加载未签名的模块(尽管理想情况下,您将构建一个仅包含您需要的驱动程序的非模块化内核,因为您控制硬件)。可以在编译内核时离线创建签名密钥。这可以与其他安全功能(例如 grsecurity 提供的安全功能)一起使用,以防止甚至 root 用户破坏系统。从 root 保护内核很难,但并非不可能。

使用 grsecurity 是迄今为止最有效的内核强化形式,但根据您的产品线的预算,它可能具有成本效益,也可能不具有成本效益。自定义内核配置是第二有效的,但需要对内核配置有充分的了解。我强烈建议聘请安全专家来完成所有这些工作,否则您可能会无意中禁用重要的安全功能或启用不安全的选项。Kconfig 帮助部分并不总是足以理解给定选项的安全含义。例如,许多“调试”功能实际上对安全性非常有用,例如各种健全性检查。熟悉 Linux 内核及其各种子系统。这将使您大大提高设备的安全性。

网络加固

网络强化是指增加网络利用向量和横向移动的难度。究竟什么构成适当的网络强化很大程度上取决于特定的设置和网络拓扑。在最简单的情况下,它涉及基本的防火墙规则,但可以更广泛。

  • 将传入连接列入白名单对于保护可能不安全的服务非常重要。将传出连接列入白名单对于阻止恶意软件或其他行为不端的软件也很有用,从而使通过 C2 控制设备变得更加困难。
  • 与内核强化一样,您可以调整各种 sysctl 以提高网络安全性。确切的调整在很大程度上取决于您的用例。例如,禁用 IPv6 可以在不必要时减少攻击面。禁用仅对路由有用的功能可以减少您的设备被滥用以重定向数据包的机会。其他调整可以提高性能并增加对 DoS 攻击的抵抗力。
  • 应该禁用不必要的协议。这对于针对远程攻击者的内核加固尤其重要,因为许多协议(例如 DCCP)都有漏洞历史,但默认情况下是启用的。理想情况下,您的内核应该只支持 TCP、UDP 和 ICMP,除非其他协议对于您的设备的正确操作是绝对必要的。

网络强化通常与具有多个互连组件的整个基础架构更相关。对于仅与服务器建立连接以远程上传文件的单个设备,网络加固更接近内核加固,即消除不必要的攻击面。