<< Back to man.ChinaUnix.net

Chapter 1. 导言

 

A wise man attacks the city of the mighty and pulls down the stronghold in which they trust.

 Proverbs 21:22 (NIV)

本文对在Linux和Unix系统下编写安全程序提出了一组设计和实现的指导原则。在本文中,“安全程序”是指一个位于安全区域内的程序,要从不具有与该程序相同访问权限的信息源获取输入数据。这样的程序包括用来浏览远端数据的应用程序、CGI脚本程序、网络服务器和setuid/setgid程序。本文不涉及对操作系统内核本身的修改,虽然这里讨论的许多原则可以应用到操作系统内核上。这些指导原则来源于对许多创建安全程序的“教训”的调查(加上作者的观察),并重新组织成一组更普遍的原则。 本文还包含了针对C、C++、Java、Perl、Python和Ada95等一些编程语言的特别指导。

本文不包括保证测量、软件工程的步骤和质量保证手段,这些确实很重要,但在其它地方有更为广泛的讨论。保证测量包括测试、仔细检阅、配置管理和正规化方法。对安全问题的保证测量开发进行专门阐述的文献包括Common Criteria [CC 1999]和System Security Engineering Capability Maturity Model [SSE-CMM 1999]。更普遍的软件工程方法或步骤在诸如Software Engineering Institute的Capability Maturity Model for Software (SE-CMM)、ISO 9000(以及ISO 9001和ISO 9001-3)和ISO 12207等文献中有详尽的定义。

本文不讨论在一个给定的环境下如何配置一个安全的系统(或网络)。很明显这对安全使用一个给定程序是必要的,但已经有太多的其它文献讨论了安全配置。 Garfinkel [1996]是一本优秀的有关配置安全的类Unix系统的一般性书籍。其它有关类Unix系统安全的书籍包括Anonymous [1998]。还可以在诸如http://www.unixtools.com/security.html 的站点上找到配置类Unix系统的信息。配置安全Linux系统的信息可以从包括Fenzi [1999]、Seifried [1999]、Wreski [1998]和Anonymous [1999]在内的各种各样文献中得到。

本文假设读者了解一般性的计算机安全问题、类UNIX系统的一般安全模型和C编程语言。本文还包括了Linux和Unix安全编程模型的一些资料。

尽管本文覆盖了所有类Unix系统,包括Linux和各种Unix分支,但对Linux给予了特别的关注,并提供了有关Linux特性的细节。这是出于以下几个理由。最简单的理由就是Linux的普及:按照一项调查,1999年安装Linux的服务器超过了所有Unix操作系统的总合(Linux占25%,而所有的Unix系统一共占15%)[Shankland 2000]。另外,本文的初始版本只讨论了Linux,所以虽然其范围扩展了,有关Linux的信息还是明显占主要部分的。如果你了解本文没有包含的有关信息,请告诉我。

你可以在 http://www.dwheeler.com/secure-programs 找到本文的主拷贝。本文也是Linux文档计划(LDP) http://www.linuxdoc.org 的一部分。它在其它几处也有镜象。请注意,这些镜象,包括LDP的拷贝和(或)你所用发行版中的拷贝,可能要比主拷贝陈旧。我很欢迎对本文提出意见,但希望在提意见之前你能确定所用版本为最新的文档。

本文版权属于 (C) 1999-2000 David A. Wheeler,受GNU自由文档许可证(GFDL)保护;参见最后一节以了解更多信息。

本文首先讨论了Unix、Linux和安全性的背景知识。下一节描述了一般的Unix和Linux安全模型,概述了进程、文件系统对象等等的安全属性与操作。接下来就是本文的实质内容,在Linux和Unix系统上开发应用程序的一组设计与实现指导原则。本文末尾给出了结论、大量参考文献和附录。

设计与实现的指导原则按照我所认为该强调的程序员角度进行了分类。程序接受输入、处理数据、调用其它资源和产生输出;所有安全性指导原则在概念上都可归入其中某一类。我把处理数据又进一步划分为: 避免缓存溢出(在某些情况下可以认为是输入问题)、程序内部与过程的结构化、特定语言信息和若干专题。实际的章节编排稍微做了些调整以便于阅读。因此,本文的指导原则章节讨论了证实所有输入的合法性、避免缓存溢出、程序内部与过程的结构化、小心地调用其它的资源、明断地发回信息、特定语言信息和若干专题(比如如何获得随机数)。