当前位置:首页 期刊杂志

作战控制终端软件系统安全性提升设计与实现

时间:2024-09-03

◆孙涛

(北京无线电测量研究所 北京 100854)

1 引言

现代作战系统的控制终端一般采用基于通用操作系统开发显控软件的形式。Windows 由于开发资源丰富,在以前较长的时间内是主流选用的操作系统。Linux 作为Windows 的竞争者,由于其开源、自主可控等优势,已成为现阶段作战系统控制终端指定选用的操作系统。但Linux 作为通用桌面系统而非嵌入式领域专用的操作系统,因此易感染病毒、不能抵抗异常断电的冲击。作战系统终端往往还有直接断电关机和随时可进行硬复位操作的需求,就更无法满足。

此外,作战系统终端软件往往需要存储武器系统很多配置参数,而文件的写入操作如果不进行专门设计,也存在较大风险。这是在常用操作系统Windows、Linux、VxWorks 下都存在的问题。

上述两类问题涉及了系统级安全性和数据级安全性两大范畴,无论系统崩溃或配置文件损坏,都是作战控制系统所不能允许的。通过研究可知,系统级安全性问题主要是因为系统区庞大并长期处于可写状态,易因异常掉电导致配置单元处于不一致状态,重启时发现其中具有无法解释的数据,从而启动失败[1],或出现因网络病毒导致系统文件被感染的情况;而数据级安全性不强的主要原因则是文件系统以异步方式工作[2],这种非立即写入的方式可引起文件损坏或数据丢失。

2 系统级安全性提升设计

与Windows 相比,Linux 提供了内核支持压缩文件系统映像、内存盘(即RamDisk)和初始化内存盘(即ⅠnitRD)这三项专有的技术。本方案通过结合使用这三项技术,可使Linux 的启动基于初始化内存盘,并可将一块内存用作根文件系统,即:将Linux 完全放到内存里然后再运行,运行时无须访问硬盘。它的主要思想是构建一个虚拟操作平台,所有针对磁盘的操作都只针对内存盘。本方案可以很好地预防Linux 系统文件被损坏或病毒感染的问题。

2.1 添加RamDisk 和ⅠnitRD 支持

RamDisk的概念是将一部分系统内存模拟为硬盘来使用,在其上像使用硬盘一样来存放文件,其设计初衷是因为访问内存的速度要远快于硬盘,从而能够以此来提升性能;为了保护系统,采用将Linux的根文件系统在RamDisk中进行建立的方法[3],把生成文件系统所需的文件、库文件、shell及基本命令和内核等使用频繁且必需的系统文件制作生成为压缩的文件系统,并制作成镜像。以后每当开机启动时,镜像均解压缩到RamDisk,形成Linux操作系统的根文件系统。

为使RamDisk功能可用,需要通过make menuconfig命令,进入到配置Linux内核的状态。检查Block Device中的RamDisk选项和General Setup中的ⅠnitRD支持选项,如果没有选中,需要选中后重新编译生成内核。

2.2 创建压缩的文件系统映像和ⅠnitRD 映像

应按照具体应用的需要,建立功能最小化的文件系统。例如要实现的功能是雷达终端软件,就只需保留使Linux启动和后期维护所需的库文件、配置文件、脚本和基本命令,以及运行终端软件本身所需的文件即可。

创建一个名为/radarLinux的目录,在其下建立文件系统。在bin下存放原系统同一目录下的维护用工具;在sbin下存放原系统同目录下的常用命令;在usr/bin下存放其他工具和终端软件的可执行程序。lib目录下的内容则由可执行程序所需的动态链接库确定。凡所需的原etc目录下存放的配置文件及dev目录下存放的设备文件都应保留[4]。然后,即可向RamDisk中拷入文件系统, 再将RamDisk生成为映像,

并生成压缩的文件系统映像ram.img.gz。

建立文件系统映像的过程可以总结为:

(1)建立文件目录并将考入所需要的文件;

(2)将大小适宜的EXT 相关类型文件系统建立于RamDisk;

(3)向本地硬盘挂载已完成格式化的RamDisk;

(4)将已建立的文件目录拷贝至RamDisk;

(5)将RamDisk 从本地硬盘卸载;

(6)将RamDisk 中的文件写成映像文件;

(7)生成压缩的映像文件。

2.3 创建压缩的ⅠnitRD 映像和定制启动配置文件

接下来仿照建立文件系统映像,建立一个与应用无关的,放置系统启动文件和用于引导RamDisk可执行脚本文件的目录,生成压缩的ⅠnitRD映像initrd.img.gz。

最后,将两个映像文件拷入Linux所在盘以外的盘,修改

GRUB(GRand Unified Bootloader) 的配置文件grub.conf,通过GRUB把系统启动信息写入该盘主引导区MBR,重启时即实现了ⅠnitRD方式的系统加载。

3 数据级安全性提升设计

对于需要用户动态写入的数据文件,一方面由于存放在非保护分区,另一方面由于操作系统的异步写入策略和对FLASH 介质的磨损均衡策略,所以正常或非正常的断电及复位都有可能使其损坏。这些文件往往非常重要并且数据项目繁多,例如作战系统配置参数表。如果损坏将极大影响作战任务,必须采取有效的预防措施,使损坏不发生或影响降到最低。有人在实践中总结出关机前一次写入法,为需要写入的文件设置专用分区,仅在关机前加载该分区,写操作限制在收到关机指令的时候[5]。这种方法虽然可大大减少故障点,但不允许直接断电关机和随时硬复位,而本文方案则能够满足,简述如下。

3.1 使数据实时写入

现代操作系统对磁盘写入均提供了内存缓冲机制,分为直写和回写两种方式。直写是操作系统确保数据写到磁盘中才返回;回写是数据写到内存磁盘缓冲中即返回,由操作系统决定在合适的时间写到磁盘上,方式为系统的一个守护进程定时清空块缓冲并写入磁盘。操作系统为不同类型、不同属性的存储介质分配了不同的写入周期,一般为几秒至几十秒,如VxWorks5.5 默认最长为15 秒,并可进行修改。

虽然回写是操作系统对文件写入操作的默认策略,但在各平台下均能够找到磁盘直写的方法,对于任务相对单一的雷达应用,直写使操作系统损失的效率可忽略不计,却对文件安全性带来了极大好处。除适用于雷达配置参数文件外,直写还很适用于写日志类文件,日志类文件写操作较为频繁,文件需要一直处于打开状态,断电或复位会使日志丢失。采用直写方法后,文件一直处于打开状态也能使日志全部保存。

不同平台直写的APⅠ有所不同。对于Linux 平台,实现代码为:

其中,O_SYNC 选项使数据部分实时写入,fsync 函数(需要包含fcntl.h)使文件的属性也同步更新。使用Qt 自带类实现时,可使用system(sync)取代fsync(fd),即相当于在Shell 下执行Linux专用系统命令sync 来清空内存缓冲。

其他平台下也具有类似的实现接口,如Windows 下使用CreateFile 时注意使用FⅠLE_FLAG_WRⅠTE_THROUGH 选项(使数据部分实时写入),然后再使用FlushFileBuffers()函数(使文件的属性也同步更新);而VxWorks 下只需在write 操作后增加ioctl(fd,FⅠOFLUSH,0)即可。

3.2 采用双缓存思想,使数据交替写入

将初始的雷达配置参数文件设置为双份(文件a 和文件b),放置于不同分区,以后有数据更新需求时,交替写入其中一个文件,除了写入数据外,还在文件头中写入更新序号,以使下次访问时能够确定最新文件。由于每次只同时对其中一个文件进行写入,且写入完成前不接受下一次写入,所以确保了每次写入至少有一个文件是安全的。写入操作流程如图1 所示。

文件中的参数只在终端软件启动后读取一次,读取时做异常处理,首先通过比较文件头,读取最新文件中的参数,如果访问参数表发现异常(如:参数有残缺或超值域),说明文件被损坏,此时加载另一个文件,并在界面中给出“已恢复最近一次正确配置”提示。此外,应在只读分区内放置文件的初始副本,如果文件a、b 被其他原因破坏,将加载初始副本,并给出“已恢复出厂参数”提示。选取文件及读取操作的流程如图2 所示。

通过综合使用上述两类措施,在系统文件受到保护的基础上,使软件动态存储的数据文件也得到了有效保护。

图1 文件写入操作流程

4 结束语

通过对系统级安全性范畴和数据级安全性范畴的改进设计,真正提升了作战控制终端软件系统的安全性,并且满足了随时可进行系统硬复位及直接断电关机的严苛需求。某系列作战系统控制终端研制初期未采用本文系统级和数据级安全性提升方案时,经常出现病毒感染、系统崩溃和参数文件损坏情况,采取本文设计方案后,经过了大量的试验和军方用户的验证,没有再出现过同类问题。本文方案对于作战系统控制终端及其他类型的控制终端均具有广泛的实用价值。

图2 选取文件及读取操作流程

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!