一种新型的USB存储设备访问控制方案

2011-07-26 11:03熊聪聪
自动化仪表 2011年12期
关键词:存储设备访问控制内核

熊聪聪 汪 鹏

(天津科技大学计算机科学与信息工程学院,天津 300222)

0 引言

USB存储设备的广泛应用在给用户带来便利的同时也带来了很大的信息安全隐患,各种针对USB存储设备的木马、病毒以及非授权用户的使用都造成了严重的信息安全问题。目前,针对USB存储设备的安全防护机制大多是在应用层上实现,且主要是对主机端系统的防护。在这种防护方式下,当主机系统受到攻击和破坏时,信息的安全性不能得到保证;同时由于应用层的权限较低,使得访问控制机制容易遭到破坏。

对此,本文提出的解决方案是增加一个运行Linux系统的嵌入式平台(ARM S3C2410)作为安全终端,将访问控制机制放在此嵌入式平台中。这种设计方案不仅可以很好地防范针对USB存储设备的攻击,而且克服了传统防护方式的固有缺陷,保障了用户的信息安全。

1 系统总体设计

1.1 硬件结构设计

嵌入式系统平台硬件部分采用ARM9系列的S3C2410,它包含 ARM处理器、Flash存储芯片、SDRAM、LCD、USB主机接口和 USB从设备接口等。USB主机接口与USB从设备接口支持USB1.1协议标准。USB从设备接口负责与主机系统的USB主口进行通信,ARM板上的USB主设备接口负责与外围USB存储设备通信。系统硬件结构如图1所示。

图1 系统硬件结构图Fig.1 Structure of system hardware

1.2 软件结构设计

根据嵌入式Linux平台的特点和功能实现的需要,设计的系统软件结构如图2所示。USB存储设备访问控制机制在嵌入式Linux中实现,其中Mass Storage Gadget驱动模块用来实现访问控制功能,认证驱动模块负责接收应用程序发送来的数据并根据预先存储的账户信息进行认证,USB从设备端控制器驱动负责与主机间的底层通信。系统中只有用户认证应用程序在应用层运行,负责接收用户输入的信息。所有的访问机制和口令都在驱动层中实现,提高了访问控制机制的安全性。

图2 系统软件结构图Fig.2 Structure of system software

2 USB存储设备功能的实现

在实现控制器驱动后,可利用Linux Gadget子系统实现对各种USB设备端的应用,如存储设备、USB转网口和USB转串口等。这里通过加载Mass Storage Gadget驱动模块在S3C2410上实现存储设备功能,使得ARM板连接到主机时自动识别为USB移动存储设备。

2.1 Linux Gadget系统结构

运行于一个USB外设的系统在Linux内核中被称为Gadget子系统,分为USB设备控制(USB device control,UDC)层、设备驱动层(Gadget驱动)和 Gadget应用程序接口(Gadget application program interface,Gadget API)层[1]。Linux Gradget系统框架如图3 所示。

图3 Linux Gadget系统框架Fig.3 System framework of Linux Gadget

UDC驱动是Gadget子系统中最底层的软件层,也是硬件相关层。UDC驱动负责控制USB设备和主机间的底层通信,向上层提供与硬件相关操作的回调函数[1]。Gadget API是UDC驱动程序回调函数的简单包装,功能为向上提供编程接口。Linux USB设备侧驱动程序使用 struct USB_gadget描述 UDC,使用 struct USB_ep表示端点。Gadget API通过这两个结构对下层硬件进行管理。Gadget驱动层是Linux Gadget子系统中的高层驱动,负责实现struct USB_gadget_driver结构,并调用UDC驱动提供的Gadget API函数usb_gadget_register_driver()和usb_gadget_unregister_driver()在内核中进行注册和注销操作[2]。硬件细节隐藏在不同的UDC驱动中,所以Gadget驱动是硬件不相关的,只负责具体设备功能的实现。

2.2 Mass Storage Gadget驱动模块设计

Mass Storage Gadget驱动是Gadget子系统中的最高层,使ARM S3C2410连接主机时表现为一个移动存储设备[3],并使用双缓冲技术来提高数据吞吐量。

驱动模块的init()函数使用usb_gadget_register_driver(&fsg_driver)函数完成驱动模块的注册,当设备连接时,调用fsg_bind()函数。fsg_bind()函数负责Gadget驱动和下层设备控制器的关联、分配Mass Storage设备需要的端点以及传送数据所需的数据缓冲区,其中最主要的功能是创建处理线程函数fsg_main_thread()。线程函数fsg_main_thread()是Gadget设备操作的主要处理函数,负责处理设备的各种操作及事件[4],通过调用 get_next_command()函数不断读取主机端的命令,并将之发送给do_scsi_command()函数进行处理[8]。处理线程的生命周期在Gadget设备的fsg_bind()函数回调期间开始,在fsg_unbind()函数调用期间结束。

2.3 Mass Storage Gadget驱动模块的移植

在Linux Kernel 2.6版本中,USB Gadget子系统的驱动代码在/kernel/drivers/usb/gadget目录下。配置好内核中所需的USB Gadget功能,执行make modules SUBDIRS=/drivers/usb/gadget命令,则在Gadget目录下生成g_file_storage.ko文件,此时驱动模块已经可以使用。在加载驱动之前,必须根据硬件设计在内核中添加设备插入通知函数。此外,由于USB主机和设备接口均需要48 MHz的时钟,而ARM S3C2410中使用USB锁相环(USB phase locked loop,UPLL)为 USB产生时钟,所以还需向UPLLCON(UPLL控制寄存器)中写入相应值,以提供USB所需的时钟。

修改 arch/arm/mach-s3c2410/mach-smdk2410.c添加内核通知函数的主要代码如下。

设备上电启动后加载驱动,在终端输入insmod g_file_storage_ko file=/dev/sda removable=1命令即可挂载驱动模块,其中参数file=/dev/sda表示将插入的USB存储设备在/dev目录下生成的设备文件用于数据交互,removable参数表示是否为可移除设备。加载完毕后,将S3C2410设备的USB Device接口与主机系统的USB主机接口使用USB线连接,主机将其识别为USB存储设备。

3 访问控制功能的实现

访问控制是为了限制访问用户对于关键资源(处理器、路由器、应用程序、数据文档和系统文档)的访问,防止用户的非授权操作所造成的信息安全问题[5]。用户只有在经过身份认证并得到授权后,才能根据访问控制机制预先设定的规则对资源进行访问。

本方案采用基于角色的访问控制机制,通过定义不同角色权限并为访问用户分配角色实现访问控制,具有实现简单、责任独立和节约管理开销等优点[6]。在系统中,认证驱动模块负责用户角色的分配并输出认证结果,Mass Storage Gadget驱动模块则根据认证结果分配权限实现访问控制。

3.1 访问控制模型设计

本方案采用基于角色的访问控制方式,将用户角色分为角色A(读权限)、角色B(写权限)、角色C(读写权限)和角色D(无权限)。用户通过应用程序与认证驱动模块交互,获取角色并得到相应的访问权限。在Mass Storage Gadget驱动中,do_scsi_command()函数负责对命令进行解析并做出相应处理,修改此函数中对于读写命令的处理可实现预先的规则设定。如角色A读权限设定可通过修改SC_READ_10命令的处理实现,主要代码如下。

3.2 认证模块的设计与实现

认证模块负责接收用户登录信息并分配相应角色。由于Linux系统中用户一般只能在用户态执行,因此不具有访问内核层中的数据结构和程序的权限;而对于存储设备的访问控制又在驱动模块中也就是内核层实现,所以必需解决用户态和内核态的转换问题,才能进行相应的权限控制。在Linux中,可通过系统调用处理程序、调度程序和中断处理程序三种方式实现用户态和内核态的转换[7]。以下采用驱动模块引用机制也就是系统调用处理程序的方式设计和实现认证模块。

3.2.1 Linux 驱动模块引用机制

在Linux模块机制中,用户可以把新的功能作为一个模块动态地加入内核。一般使用insmod命令装载模块,然后使用内核的符号表解析模块中未解析的符号。modprobe命令与insmod命令类似,它也可以将模块装载到内核,另外会在当前模块搜索路径中查找依赖模块,并按一定的顺序装载到内核中。Linux内核中的公共内核符号表保存了所有的全局内核项,包括模块访问的符号和相应地址。驱动模块被装入内核时可以利用EXPORT_SYMBOL和EXPORT_SYMBOL_GPL宏导出符号到公共内核符号表中,同时可以被其他模块引用,引用模块依赖于导出符号模块[8]。

3.2.2 认证模块的实现

根据Linux的驱动模块引用机制,通过添加认证驱动模块实现认证过程。系统认证流程如图4所示。

图4 系统认证流程图Fig.4 Flowchart of system certification

设计方法是将认证驱动模块实现为字符驱动,提供open、write、read操作并导出表示角色的符号(User)。同时设定Mass Storage Gadget驱动模块引用认证模块导出的符号,并使用modprobe命令加载各驱动模块。认证时首先由认证驱动模块从应用程序中接收信息,并根据Flash中预先存放的口令信息对用户身份进行认证;然后认证驱动模块根据认证结果导出符号并向应用程序返回状态信息;最后由Mass Storage Gadget驱动模块根据不同的符号值赋予用户相应的访问权限。

3.3 用户认证应用程序设计

认证应用程序的作用是接收用户信息并与认证模块交互。系统中应用程序使用QT4编写,采用多线程编程方式。主线程负责接收用户输入的口令信息并将其传递给认证模块,然后阻塞等待认证模块的反馈,子线程负责加载设备。通过用户认证应用程序,用户可以方便地选择加载USB存储设备并输入口令,在获取反馈信息后进行相应权限的访问。

3.4 访问控制功能测试

用户打开认证应用程序,输入口令进行认证,获取角色权限对设备进行访问,如发生越权访问,则发出警告信息。经过测试证明,系统可以有效地对USB存储设备进行访问控制,用户只能在认证授权后按照相应权限进行访问。

4 结束语

本文提出了一种利用嵌入式平台实现USB存储设备访问控制的方案,以运行Linux的ARM S3C2410为例给出了详细的设计和实现方法。该方案将访问控制机制放在嵌入式平台中,实现主机系统与外围USB存储设备物理上的隔离;同时,所有对USB存储设备的访问均由嵌入式平台进行安全控制。试验证明,此方案克服了传统防护方式过于依赖主机系统的缺陷,很好地解决了使用USB存储设备所引起的信息安全隐患,所涉及的软件模块和访问控制机制的设计可以方便地应用于其他的嵌入式Linux平台,具有很好的移植性和参考价值。

[1]Linux-USB Community.Linux-USB Gadget API framework[EB/OL].[2005 -06 -08].http://www.linux - usb.org/gadget/.

[2]李传伟,胡金春.嵌入式Linux下USB Gadget驱动框架研究[J].航天控制,2006,24(6):51 -55.

[3]Xu Zhe,Liu Zhuo,Zhang Hua,et al.Development of Linux based USB device driver for portable spectrometer[C]//Proceedings of the 21st Annual International Conference on Chinese Control and Decision Conference,2009:5125 -5128.

[4]刘超.Linux平台下USB大容量存储设备驱动程序的改进与优化[D].北京:北京交通大学,2008.

[5]段云所,魏仕民,唐礼勇,等.信息安全概论[M].北京:高等教育出版社,2003:114-126.

[6]韩若飞,汪厚祥.基于任务-角色的访问控制模型研究[J].计算机工程与设计,2007,28(4):800 -802.

[7]Bovet D P,Cesati M.深入理解 LINUX 内核[M].3版.陈莉君,冯锐,牛欣源,译.北京:中国电力出版社,2007.

[8]Corbet J,Rubinia A,Kroah-Hartman G.Linux设备驱动程序[M].2版.魏永明,耿岳,钟书毅,译.北京:中国电力出版社,2006.

猜你喜欢
存储设备访问控制内核
一种跨策略域的林业资源访问控制模型设计
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
ONVIF的全新主张:一致性及最访问控制的Profile A
SKEE—— 针对ARM架构的轻量级Linux内核安全执行环境
动态自适应访问控制模型
浅析铁路视频监控存储设备设计
从操作系统层面谈信息安全与自主访问控制
Windows环境下禁用USB存储设备程序设计与实现