独立型系统正濒于灭绝,这一趋势使得开发人员在安全性问题上面临越来越大的压力。这个问题涉及手机、具有Wi-Fi功能的数码相框等几乎所有电子产品。使用防火墙或加密几个数据文件是远远不够的,系统安全性就像最脆弱的链路一样需要受到保护。
基本的安全性概念
信息能够以明文、认证或加密方式进行传输(图1)。认证是指那些可读懂的文字信息,但它也经常用来指没有签名或加密信息。经鉴定的信息是经过数字签名的信息。修改信息将使签名失效,藉此可以判断信息是否被篡改。这时信息仍是可以访问的,这点与加密信息不同,加密信息在解密之前是无法辨认的。
图1:通信链路突出了不同类型的数据交换,包括从认证的数据交换到加密的数据交换。
数字签名通常是使用被称为消息的相关信息来加密附属于这个信息的标签,也称为消息摘要或简称摘要。如果签名是在信息被修改后创建的,那么两个标签将不再匹配。发现修改通常并不能提供谁修改、怎样修改或修改了什么的信息。数字签名可以使用加密,但更多的是使用哈希函数。哈希函数和加密之间的区别在于哈希函数是单向操作,而加密通常是双向过程,因为原始明文可以用正确的密钥和算法重新构建。
一般来说,哈希函数比加密快,它们用于从口令存储到通信握手的广泛应用领域。例如,Linux将用户名和口令存储在“passwd”文件中。这是一个明文文件,但访问这个文件只能得到用户名和经过哈希算法处理过的口令。
可以使用这个信息对用户进行认证,方法是使用口令产生一个新的哈希值,然后将结果与passwd文件中的内容进行比较。当然,泄露 passwd文件将形成安全漏洞。实际上大多数Linux实现将哈希过的口令保存在影子文件中,passwd文件只是减去哈希口令后的镜像文件。
加密通常会使用一个或两个密钥。单个密钥用在对称加密算法中,即加密和解密使用相同的密钥。对称加密速度一般要比非对称或两个密钥的系统快。非对称系统中加密用一个密钥,解密用另一个相关密钥。在这种双密钥案例中,其中一个密钥不能用另一个密钥重建。
大多数公开密钥系统采用两个密钥(一个公钥,一个私钥)进行双向数据交换,这意味着一个密钥的主人加密的信息可以被另一个密钥的主人解密。单向系统允许一个密钥用于加密,另一个密钥用于解密。而在双向系统中,同一密钥不能用于加密同时又用于解密加密过的数据。如果两个密钥都保密,那么在信息交换时这两个密钥可以用来识别主人。
RSA公钥算法是MIT的Ron Rivest、Adi Shamir和Leonard Adleman在1978年提出的。这种算法基于两个大的素数以及分解大素数非常耗时的事实,从而使得强力攻击非常困难。在公钥环境中,通常有一个密钥可提供给感兴趣方。同样,每一方通常都有自己的密钥(后面的密钥交换中会用到多个密钥)。
目前流行的一些哈希算法包括MD4、MD5、SHA-1和SHA-256。普通加密系统包括DES(数据加密标准)、RSA和AES(高级加密标准)。DES加密密钥长度为56位,对于目前处理器性能而言强力攻击并不容易。在DES发布的20世纪70年代这种算法还是相当安全的。三倍 DES(3DES)同样使用DES算法和密钥,但弥补了DES的缺点。3DES使用三个密钥,数据要被加密三次。
AES密钥可以是128位、192位或256位长。目前AES已经成为微控制器上的标准配置。AES在ZigBee等无线标准中被广泛采用,能用于全盘加密和大量其它应用。
还有一种方法叫椭圆曲线加密(ECC)法,它能使用很小的密钥达到与使用大型密钥的其它技术相同的安全性。这种高效算法可以用硬件轻松实现。安全软件通常支持一种或一种以上的加密和哈希算法,同时许多通信标准允许使用不同的算法和密钥长度。这些参数一般在初始握手期间选择。
安全要从最基本的做起
安全需要从最基本的做起。如果任何一层不安全,那么它上面的所有层都将变得不安全。这也是安全深度之所以重要的原因。同样,划分可以隔离问题,但前提条件是划分机制没有被攻破。破坏性攻击经常是通过寻找安全机制中的漏洞进行的,这正是蠕虫和病毒利用操作系统、应用软件或系统配置中的缺陷攻击系统的做法。
对大多数计算机系统来说,物理安全和启动过程是起点。保证系统安全的方法之一是使用Trusted Computing Group公司(TCG)的可信平台模块(TPM)启动系统。TPM包含个人电脑中常见的安全微控制器和存储器(图2)。防篡改硬件可以从物理上保护器件,破坏性地打开器件将导致存储的安全密钥丢失。TPM会在系统启动时自检,然后完成系统剩余部分的启动,包括处理用户输入的PIN码、认证通常存储在另一个器件中并经数字签名或加密的启动程序。
图2:可信平台模块(TPM)被设计用于提供安全启动环境。
一般情况下,TPM会将安全控制权转交给主机,但也可以用于与安全有关的其它操作。TPM还包含一个唯一的RSA私钥用于TPM的识别。TPM允许系统对信息进行数字签名,从而实现其它系统对它自身的认证。
此外,TPM可以用来对机器上的器件进行远程认证或识别,方法是获得硬件和软件的数字特征,然后签名这些信息。签名过的信息随后即可发往第三方。这种方法一般可以用来确保使用的是特定版本的音乐播放程序。
为了解决基本远程认证缺少匿名的问题,TCG开发出了一种稍有不同的方法,叫做直接匿名认证(DAA)。DAA执行类似的过程,但结果只验证目标硬件或软件的状态,它不识别TPM模块本身。
TPM也能提供安全密钥存储以及执行加密和数字签名工作。密钥不需要存储在TPM上,因为加密版本可以存储在其它系统存储器中。TPM可以利用这个信息提取和解密密钥以供使用。
TPM功能可以被集成进微控制器,而不仅是个人电脑,从而打开了更为广泛的消费设备市场。许多TPM功能可以使用带I2C/SMBus接口的安全串行存储器进行访问。这些存储器通常是TPM中常见的功能类子集,但具有更低的功耗要求和更简单的接口。
保证节点安全
安全启动是起点,而安全通信可以从通过CA认证的密钥开始实现。对于嵌入式微控制器而言,下一步也许直接是应用程序,但对大多数应用来说,两者之间至少还有一个操作系统。在最简单的情况下,还有存储器保护,更进一步还包括虚拟存储器支持。理论上讲,一个安全的操作系统可以使应用程序完全隔离于这种存储器保护支持。当然,操作系统架构和规模可能为那些寻求绕过这种安全机制的攻击者提供大量漏洞。
另一个可能的步骤是虚拟机支持。这种虚拟机支持使用额外的硬件,可提供与存储器保护或虚拟存储器支持相同类型的保护,但它更详细,因为它模拟了所有的硬件。
管理程序本质上是一种管理虚拟机环境的操作系统,这种方法用于管理多个系统,但也能提供额外的安全性。其方法是隔离操作系统,并进一步隔离应用程序。一个“瘦”的管理程序通常比传统的操作系统或实时操作系统(RTOS)简单得多,因此缺陷较少,在应用正式方法时也更容易验证。
一些虚拟机系统使用主机操作系统,如Linux,使得这类验证非常困难。另外一种方法是建立一个虚拟机,用它来处理到虚拟机系统的用户接口。虚拟机通过与管理程序通信来控制基础系统。理论上讲这种方法可以提供更好的隔离性能。
制定安全策略
管理程序为系统提供独立多层次安全性(MILS)或域分离功能。MILS可以是多层安全(MLS)系统的一个组件,然而,MLS的实现不需要虚拟机支持,前提是系统(包括安全启动过程)可以得到安全保护。
像SELinux等操作系统使用MLS安全模型,这种模型可以提供比单独Linux更细颗粒的访问控制。一般来说,Linux使用 Linux安全模块(LSM)框架。LSM可以支持包括SELinux在内的多种安全模型,另外一个是Smack(简化的强制访问控制内核)。
基本的Linux安全模块提供基于用户/组模型的认证和访问控制,并且它是围绕文件系统搭建而成的。文件可以从组、用户或匿名的角度进行操作,并且读、写和执行属性是单独可控的。访问控制继承了目录树的概念。
SELinux更像是一种面向功能的系统,其策略可以变得相当复杂。这种强制访问控制系统将策略和执行分开来,不仅控制对文件和目录的访问,而且控制对网络接口和消息的访问。
访问可以关联到应用程序,而不仅是用户。例如,文件服务器可以只提供对那些正确标示为共享的文件或目录进行访问。它能跟踪应用程序以及由这些应用程序之一产生的任何子程序。这样,策略可以防止信息从较高安全层次流向较低安全层次。没有正确的允许,更高层次的应用程序不能简单地提供对较低层次的访问。
这种复杂性带来的一个问题是如何正确地使用。较差的策略可能开启漏洞,允许数据或控制移动到不应被允许的地方。这正是大多数系统开始时使用一种或多种基本策略定义、然后逐步修改以满足系统要求的原因。
显示系统的安全
安全操作系统的安全启动对某些环境来说是足够的,但与用户的交互带来了对识别以及用户相关I/O的需求。安全显示器是军用安全系统中常见的一个特色功能(图3)。显示系统的安全性可以用软件或硬件实现。例如,可以设置安全设备驱动程序只在显示器底部显示来自安全应用程序的显示信息。采用全屏显示的应用软件不会覆盖这个安全区域,其它技巧包括用显示硬件执行相同的操作。
图3:在屏幕上留出安全区域非常重要,这种方法通常与其它形式的安全基础架构组合在一起。
人们经常使用的ctrl-alt-delete也是一个相关接口项。理论上,这个组合键应该只是调用系统应用程序。在使用Windows操作系统时,按下这个组合键将弹出一个对话框,其中有任务管理器等启动选项。使用安全显示器后,反馈信息可以通过安全显示区显示,使得任何应用程序无法模拟响应。