开发安全高可靠系统的几点建议
欢迎大家批评
安全可靠的系统包括软件可靠,硬件可靠和使用人员可靠3方面。这个篇文章主要面向高可靠系统而不是安全系统。最后有一个安全系统的建议。
软件角度
1. 从软件工程的角度软件开发应当可靠
软件开发需要过程控制,开发过程不能出现开发人员中途离职等不确定因素。
需求必须可靠。需求人员能够清楚的获得系统的需求。开发人员能够准确的理解需求。
架构和开发技术可靠。架构和开发所用的技术必须可靠。设计人员能够清楚的了解所用架构和技术的方方面面。使用成熟的技术而不是盲目使用新技术。使用之前经过验证的集成度高的模块和链接库而尽量少的编写新代码。
2.软件开发的技术可靠
开发人员可靠。关键地方的开发人员是熟练工种,能够充分了解开发技术的方方面面。比如C语言开发人员了解内存泄露,缓冲区溢出与野指针等问题。开发网络通讯的人员在网络包传送超时时使用重传或者适度的报错机制。
如果高可靠的系统软件测试必须是白盒测试。关键函数必须采用防御式编程。输出函数必须合法和合理,比如概率计算是0~1以内的数,黄金的质量是精确到毫克的。
具有容错的机制,单独的函数都可能失去功能,系统的稳定性要高。一旦出错可以快速恢复错误。而不影响系统的正常使用。必要情况下可以重传可执行文件(虽然这个和安全是相悖的)。
硬件角度
1. 硬件的使用环境可靠
硬件的使用环境可靠。从力学,环境,生物,电磁的角度生产或者部署系统。比如不能意外中断电源和网络。必要网络设备使用双线接入。使用UPS供电和稳压。必要情况可以使用低电压降速使用。比如战斗机的CPU使用Intel 的EX 486。使用的时候电压降低一半,关键部件双备份使用。能够及时散热。
2. 硬件的保障可靠
选购硬件的时候尽量使用同一个单位的同一批设备。不然换硬件的时候可能引起其他的问题。
使用人员角度
1. 使用人员经过培训
2. 使用审计和和可恢复设置,防止恶意或误操纵
3. 说明文档清晰明了
上面是从可靠性的角度讲的如何开发系统。主要设计的过程还是很麻烦的。可以参考容错计算和可靠性相关的内容。
下面是CISSP 里面介绍如何购买入侵侦测系统所考虑的特征,可以参考它的机制
特征 |
描述 |
基础模块 |
能够从环境中安全和卸载保护机制而不会危及其他机制 |
提供统一的保护 |
同一个安全级别以一种标准化的方式应用于它要保护的所有机制 |
提供重写功能 |
必要情况下管理员可以重写限制 |
默认为最小权限 |
安全之后,默认为缺少许可权限,而不是每个人都能够完全控制它 |
防护措施以及保护的资产相互独立 |
防护措施可以用来保护不同资产,不同资产也可以被不同防护措施所保护 |
灵活性和安全性 |
防护措施提供的功能越多越好。这些功能应该有灵活性,从而我们可以选择不同的功能,而不是必须全选或者都不选 |
用户交互 |
用户不会恐慌 |
用户和管理员之间有清晰的界限 |
当设计到配置或关闭保护机制的时候,用户应该有较少的权限 |
最少的人为干预 |
当不得不需要人为配置或修改控制的时候,就为错误开启了方便之门。防护措施应该能够自己进行设置,能够从环境中提取所需要的信息,并且需要尽可能少的人为输入 |
资产保护 |
及时需要重新设置对策,资产也仍然受到保护 |
容易升级 |
能够方便的升级 |
审计功能 |
防护措施需要包含一个机制,用于提供最少和/或详细的审计 |
最小化对其他组件的依赖 |
防护措施应该具有灵活性,不应该对自己的安装环境有严格的要求 |
容易被职员使用和接受,并能容忍错误 |
如果防护措施对工作效率造成障碍,或是在简单的任务中需要添加额外的步骤,用户就不能容忍它 |
必须产生可用的和可以理解的输入 |
应该给出重要信息,从而让人们能够很容易的理解它,并且将其用于趋势保护 |
必须能够重启防护措施 |
安全机制应该能够重新启动,并在不影响其保护的系统和资产的情况下恢复原有的配置和设置 |
可测试 |
应该能够在各种情况和环境下对防护措施进行测试 |
不引入其他危害 |
防护措施不应该提供隐蔽通道或后门 |
系统和用户性能 |
系统和用户的性能不应该受到很大影响 |
普遍应用 |
在环境中试试保护措施时,不能有许多(甚至一个)例外情况 |
恰当的报警 |
应该能够设定一个阈值,确定什么时候警报相关人员发生了违反安全的行为,这种警报应该是可接受的 |
不影响资产 |
环境中的资产不应该受到防护措施的负面影响 |
资产:信息安全中认为系统和数据都是资产。如果可以需要适度的保护。