Linux和Unix安全编程HOWTO David A. Wheeler
Copyright © 1999, 2000 by David A. Wheeler
本文对在Linux和Unix系统下编写安全程序给出了一组设计和实现的指导原则。这样的程序包括用来浏览远端数据的应用程序、CGI脚本程序、网络服务器和setuid/setgid程序。本文还包含了针对C、C++、Java、Perl、Python和Ada95的特别指导。
Table of Contents
1. 导言
2. 背景知识
Unix、Linux与开放源码软件的历史
Unix
自由软件基金会
Linux
开放源码软件
Linux与Unix的比较
安全准则
安全程序的类型
多疑症是个优点
为什么要编写本文档?
设计和实现原则的来源
文档习语
3. Linux和Unix安全特性概要
进程
进程属性
POSIX能力
进程创建与操作
文件
文件系统对象的属性
创建时的初始值
改变存取控制属性
使用存取控制属性
文件系统分级结构
System V的IPC
套接字和网络连接
信号
配额与限制
动态连接库
审核
PAM
4. 证实所有的输入
命令行
环境变量
有些环境变量是危险的
环境变量的存储格式是危险的
解决方案 -- 提取和清除
文件描述符
文件内容
CGI输入
其它输入
字符编码
限制合法的输入时间和负载水平5. 避免缓存溢出
C/C++中的危险
C/C++中库的解决方案
标准C库的解决方案
静态和动态分配缓存
strlcpy和strlcat
libmib
Libsafe
其它库
C/C++的编译解决方案
其它语言
6. 程序内部结构与解决方案
保证接口的安全
特权最小化
最小化授予的特权
最小化可以使用特权的时间
最小化特权有效的时间
>最小化获得特权的模块
考虑用FSUID来限制特权
考虑使用chroot来最小化可用文件
避免创建Setuid/Setgid脚本
安全地配置并使用安全的缺省值
安全地失败
避免竞争状态
次序问题
锁定
只信任值得信任的通道
使用内部一致性检查代码
自我限制资源
7. 小心对其它资源的调用出口
限制调用出口为合法值
检查系统调用的所有返回值
8. 明断地发回信息
最小化反馈
处理完整的/不响应的输出
9. 特定语言的问题
C/C++
Perl
Python
Shell脚本语言(sh及csh的变种)
Ada
Java
10. 专题
密码
随机数
加密算法与协议
vs编程软件PAM
其它事项
11. 结论
12. 参考文献
A. 历史回顾
B. 感谢
C. 关于文档许可
D. GNU自由文档许可证(原文)
E. 关于作者
List of Tables
4-1. 非法UTF-8初始序列
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]。还可以在诸如
www.unixtools/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的信息还是明显占主要部分的。如果你了解本文没有包含的有关信息,请告诉我。
你可以在www.dwheeler/secure-programs到本文的主拷贝。本文也是Linux文档计划(LDP) 的一部分。它在其它几处也有镜象。请注意,这些镜象,包括LDP的拷贝和(或)你所用发行版中的拷贝,可能要比主拷贝陈旧。我很欢迎对本文提出意见,但希望在提意
见之前你能确定所用版本为最新的文档。
本文版权属于(C) 1999-2000 David A. Wheeler,受GNU自由文档许可证(GFDL)保护;参见最后一节以了解更多信息。
本文首先讨论了Unix、Linux和安全性的背景知识。下一节描述了一般的Unix 和Linux安全模型,概述了进程、文件系统对象等等的安全属性与操作。接下来就是本文的实质内容,在Linux和Unix系统上开发应用程序的一组设计与实现指导原则。本文末尾给出了结论、大量参考文献和附录。
设计与实现的指导原则按照我所认为该强调的程序员角度进行了分类。程序接受输入、处理数据、调用其它资源和产生输出;所有安全性指导原则在概念上都可归入其中某一类。我把处理数据又进一步划分为:避免缓存溢出(在某些情况下可以认为是输入问题)、程序内部与过程的结构化、特定语言信息和若干专题。实际的章节编排稍微做了些调整以便于阅读。因此,本文的指导原则章节讨论了证实所有输入的合法性、避免缓存溢出、程序内部与过程的结构化、小心地调用其它的资源、明断地发回信息、特定语言信息和若干专题(比如如何获得随机数)。
Chapter 2. 背景知识
I issued an order and a search was
made, and it was found that this city
has a long history of revolt against
kings and has been a place of rebellion
and sedition.
Ezra 4:19 (NIV) Table of Contents
Unix、Linux与开放源码软件的历史
安全准则
安全程序的类型
多疑症是个优点
为什么要编写本文档?
设计和实现原则的来源
文档习语
Unix、Linux与开放源码软件的历史Unix
1969-1970年,AT&T贝尔实验室的Kenneth Thompson、Dennis Ritchie和其他人开始在一台较老的PDP-7上开发一个小型的操作系统。不久这个操作系统被命名为Unix,是对此前一个叫做MULTICS的操作系统项目的双关语。在1972-1973年,系统被重新用C语言改写了,这是一个很有眼光的不寻常的举动:这个决定使Unix成为第一个可以脱离其原始硬件而存在的被广泛应用的操作系统。其它的新方法也不断被加入Unix,一部分原因是贝尔实验室与学术界的良好协作。1979年,Unix的“第七版”(V7)发布了,它是所有现存Unix系统的鼻祖。
从此,Unix的历史开始变得错综复杂。由Berkeley领导的学术界开发了被称为Berkeley软件发行版(BSD)的变种,而AT&T继续在“系统III”和随后的“系统V”的名义下开发Unix。在八十年代后期到九十年代早期,这两个主要分支间的“战争”激化了。经过多年开发,每个变种都采用了其它变种的许多关键特性。在商业上,系统V赢得了“标准之战”(使其绝大部分接口进入了正式标准),而且绝大多数硬件厂商都切换到AT&T的系统V。但是,系统V包含了许多BSD的革新,使该系统更像是两大分支的融合。BSD分支并未消失,而是广泛应用在研究、PC硬件和目的单一的服务器上(例如许多WEB站点都使用某个BSD变种)。
最终结果是有很多不同版本的Unix,都来源于原先的第七版。绝大多数版本的Unix都是私有的,由其相应的硬件厂商维护,例如,Sun的Solaris就是系统V

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。