安全性现在已经成为嵌入式开发人员最优先考虑的方面,因为他们创建的系统能够并且很可能被用于一些重要的基础设施,而这些基础设施的自动化程度正越来越高,而且通常是联网工作的,在某些情况下还可能与外部世界相连。
安全性对嵌入式开发人员来说已经提升到最重要的位置。而本文主要讨论在嵌入式系统设计中需要注意的一些最佳安全保护措施,特别是那些在任务中需要使用的实时嵌入式操作系统(RTOS)和常用于工业与医疗设备中的安全关键系统(SCS)。
最佳安全措施
下面是应用于嵌入式开发的最佳安全措施清单:(来源:由Michael Howard和David LeBlanc编写安全代码,2004年)
* 尽量减小攻击面:减少进入系统的攻击向量数量。关闭对大多数用户来说不必要的功能、服务和访问。
* 最小权限:只给应用程序、任务或进程分配刚好够完成当前工作的权限。权限太高会发生不必要的访问或行为。
* 纵深防御:利用不止一个防护层,不要指望一层防护就能提供完整的保护。
* 多样性防御:使用不同类型的防护设备、软件或供应商。
* 保护最薄弱环节:保护最不安全的组件、接口或应用程序,这是最可能受到攻击的地方。因为任何系统的安全性水平只能以最薄弱的组件为准(木桶理论)。
* 错误保护状态:期待发现易受攻击点;时刻准备接受对系统的物理和远程攻击。
* 关于外部系统的假设:不要指望与你的产品连接的其它设备。你不能假设外部设备是安全的,并且要明白你的设备可能被连接到完全开放的网络。
* 默认安全性:将系统的默认配置和行为设置成尽可能安全。关闭对大多数用户来说不必要的功能、服务和访问。
* 简单性和可用性:使用更加简单的设计,这些设计具有可能更少的安全漏洞和易受攻击点,并且更加容易理解、检查和测试。
虽然说,没有系统是绝对安全的。但是,遵循一些实用方法可以极大地提高嵌入式系统的安全性。在一些情况下,这些技术可以应用于现有系统;在其它情况下,它们可以成为未来系统设计的建议。
对您的嵌入式系统应用最优方法
(1)安全的网络通信。现有嵌入式系统的许多安全性问题源自通过开放给大众(企业网络)甚至直接与互联网相连接的网络和访问。
* 激活并充分利用RTOS网络堆栈的通信安全功能。
* 激活网络防火墙;只允许通过指定的TCP/IP端口进行通信。
* 激活安全通信通道:IPsec,SSH,SSL或VPN访问。
* 禁止诸如Telnet等不安全的服务。
* 如果可能的话禁止调试服务。如果不能禁止,要确保这些服务是安全的。
* 设备到设备以及设备到控制的通信要尽量考虑使用基于VPN的基础设施。
(2) 实现更加安全的配置。尽管嵌入式安全性得到了大肆宣传,但许多基于这些系统的运行平台可以通过正确的配置实现更高的安全性。
嵌入式操作系统的默认配置通常针对性能和内存容量做过调整,并且默认情况下有许多功能被关闭了。遵循制造商指南激活安全功能,包括:
激活授权和权限等级。任何访问必须得到授权。用户访问必须具有对所有服务来说必要的最低权限。
* 激活网络防火墙。现代实时操作系统(RTOS)都具有网络防火墙功能,而具有网络连接的任何设备在运行时都应启用防火墙。
* 禁用所有不重要的服务。只激活对设备工作来说基本的服务。
* 需要时激活或包括含强大的加密函式库。
* 通过内存管理单元(MMU)激活内存保护;利用实时进程(RTP)代替内核等级。
* 除非绝对必要,否则应以用户权限执行。
* 通过选择更加安全的配置,可以删除许多瞄向设备的攻击向量。最好是假设设备随时会受到攻击,并确保用户接收到的配置本身具有更高的安全性。
(3) 划分系统进行保护。将系统中不同的主要组件划分为多个部分是一种有效的安全技术。在许多情况下,这些分割是物理性的。如今借助虚拟化技术还可以实现虚拟化分割,即在相同设备或处理器上通过软件进行分割。
同样,GUI和和对设备的远程访问可以划分在一起,把控制系统单独划分出来。这样,拒绝服务或破坏GUI部分的远程攻击就不会影响控制系统。这种系统组合的优势是非常显著的,因为它能极大地降低硬件复杂性和成本。
借助虚拟化技术和最新的多核处理器,这种组合现在已经非常实用,并且极具成本效益。另外,关键和非关键任务的分开有利于提高这些设备的安全和保险系数。