您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 40Linux+和Unix+安全编程HOWTO
Linux和Unix安全编程HOWTODavidA.WheelerCopyright©1999,2000byDavidA.Wheeler本文对在Linux和Unix系统下编写安全程序给出了一组设计和实现的指导原则。这样的程序包括用来浏览远端数据的应用程序、CGI脚本程序、网络服务器和setuid/setgid程序。本文还包含了针对C、C++、Java、Perl、Python和Ada95的特别指导。TableofContents1.导言2.背景知识Unix、Linux与开放源码软件的历史Unix自由软件基金会Linux开放源码软件Linux与Unix的比较安全准则安全程序的类型多疑症是个优点为什么要编写本文档?设计和实现原则的来源文档习语3.Linux和Unix安全特性概要进程进程属性POSIX能力进程创建与操作文件文件系统对象的属性创建时的初始值改变存取控制属性使用存取控制属性文件系统分级结构SystemV的IPC套接字和网络连接信号配额与限制动态连接库审核PAM4.证实所有的输入命令行环境变量有些环境变量是危险的环境变量的存储格式是危险的解决方案--提取和清除文件描述符文件内容CGI输入其它输入字符编码限制合法的输入时间和负载水平5.避免缓存溢出C/C++中的危险C/C++中库的解决方案标准C库的解决方案静态和动态分配缓存strlcpy和strlcatlibmibLibsafe其它库C/C++的编译解决方案其它语言6.程序内部结构与解决方案保证接口的安全特权昀小化昀小化授予的特权昀小化可以使用特权的时间昀小化特权有效的时间昀小化获得特权的模块考虑用FSUID来限制特权考虑使用chroot来昀小化可用文件避免创建Setuid/Setgid脚本安全地配置并使用安全的缺省值安全地失败避免竞争状态次序问题锁定只信任值得信任的通道使用内部一致性检查代码自我限制资源7.小心对其它资源的调用出口限制调用出口为合法值检查系统调用的所有返回值8.明断地发回信息昀小化反馈处理完整的/不响应的输出9.特定语言的问题C/C++PerlPythonShell脚本语言(sh及csh的变种)AdaJava10.专题密码随机数加密算法与协议PAM其它事项11.结论12.参考文献A.历史回顾B.感谢C.关于文档许可D.GNU自由文档许可证(原文)E.关于作者ListofTables4-1.非法UTF-8初始序列Chapter1.导言Awisemanattacksthecityofthemightyandpullsdownthestrongholdinwhichtheytrust.Proverbs21:22(NIV)本文对在Linux和Unix系统下编写安全程序提出了一组设计和实现的指导原则。在本文中,“安全程序”是指一个位于安全区域内的程序,要从不具有与该程序相同访问权限的信息源获取输入数据。这样的程序包括用来浏览远端数据的应用程序、CGI脚本程序、网络服务器和setuid/setgid程序。本文不涉及对操作系统内核本身的修改,虽然这里讨论的许多原则可以应用到操作系统内核上。这些指导原则来源于对许多创建安全程序的“教训”的调查(加上作者的观察),并重新组织成一组更普遍的原则。本文还包含了针对C、C++、Java、Perl、Python和Ada95等一些编程语言的特别指导。本文不包括保证测量、软件工程的步骤和质量保证手段,这些确实很重要,但在其它地方有更为广泛的讨论。保证测量包括测试、仔细检阅、配置管理和正规化方法。对安全问题的保证测量开发进行专门阐述的文献包括CommonCriteria[CC1999]和SystemSecurityEngineeringCapabilityMaturityModel[SSE-CMM1999]。更普遍的软件工程方法或步骤在诸如SoftwareEngineeringInstitute的CapabilityMaturityModelforSoftware(SE-CMM)、ISO9000(以及ISO9001和ISO9001-3)和ISO12207等文献中有详尽的定义。本文不讨论在一个给定的环境下如何配置一个安全的系统(或网络)。很明显这对安全使用一个给定程序是必要的,但已经有太多的其它文献讨论了安全配置。Garfinkel[1996]是一本优秀的有关配置安全的类Unix系统的一般性书籍。其它有关类Unix系统安全的书籍包括Anonymous[1998]。还可以在诸如的站点上找到配置类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%)[Shankland2000]。另外,本文的初始版本只讨论了Linux,所以虽然其范围扩展了,有关Linux的信息还是明显占主要部分的。如果你了解本文没有包含的有关信息,请告诉我。你可以在找到本文的主拷贝。本文也是Linux文档计划(LDP)的一部分。它在其它几处也有镜象。请注意,这些镜象,包括LDP的拷贝和(或)你所用发行版中的拷贝,可能要比主拷贝陈旧。我很欢迎对本文提出意见,但希望在提意见之前你能确定所用版本为昀新的文档。本文版权属于(C)1999-2000DavidA.Wheeler,受GNU自由文档许可证(GFDL)保护;参见昀后一节以了解更多信息。本文首先讨论了Unix、Linux和安全性的背景知识。下一节描述了一般的Unix和Linux安全模型,概述了进程、文件系统对象等等的安全属性与操作。接下来就是本文的实质内容,在Linux和Unix系统上开发应用程序的一组设计与实现指导原则。本文末尾给出了结论、大量参考文献和附录。设计与实现的指导原则按照我所认为该强调的程序员角度进行了分类。程序接受输入、处理数据、调用其它资源和产生输出;所有安全性指导原则在概念上都可归入其中某一类。我把处理数据又进一步划分为:避免缓存溢出(在某些情况下可以认为是输入问题)、程序内部与过程的结构化、特定语言信息和若干专题。实际的章节编排稍微做了些调整以便于阅读。因此,本文的指导原则章节讨论了证实所有输入的合法性、避免缓存溢出、程序内部与过程的结构化、小心地调用其它的资源、明断地发回信息、特定语言信息和若干专题(比如如何获得随机数)。Chapter2.背景知识Iissuedanorderandasearchwasmade,anditwasfoundthatthiscityhasalonghistoryofrevoltagainstkingsandhasbeenaplaceofrebellionandsedition.Ezra4:19(NIV)TableofContentsUnix、Linux与开放源码软件的历史安全准则安全程序的类型多疑症是个优点为什么要编写本文档?设计和实现原则的来源文档习语Unix、Linux与开放源码软件的历史Unix1969-1970年,AT&T贝尔实验室的KennethThompson、DennisRitchie和其他人开始在一台较老的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的变种。Unix的BSD分支中有三个版本成为开放源码软件:FreeBSD(注重在PC类硬件上安装简便)、NetBSD(注重于很多不同的CPU结构)和NetBSD的一个变种,OpenBSD(注重于安全性)。更多有关的一般信息可以在上找到。更多有关BSD历史的信息可以在[McKusick1999]和上找到。有兴趣阅读目前使用类Unix系统的辩护言论的读者可以看看。自由软件基金会1984年,RichardStallman的自由软件基金会(FSF)启动了GNU计划,以创建一个UNIX操作系统的自由版本。Stallman所指自由的含义是软件可以被自由使用、阅读、修改和再次发行。FSF成功地创建了许多有用的软件,包括一个C编译器(gcc)、一个给人留下深刻印象的文本编辑器(emacs)和一大批基本的工具软件。但是在九十年代,FSF在开发操作系统内核上遇到了麻烦[FSF1998];而没有内核,他们的其它软件就无法应用。Linux1991年,LinusTorvalds开始开发一个他称为“Linux”的操作系统内核[Torvalds1999]。这个内核可以同FSF的资料和其它软件(特别是某些BSD软件和MIT的X-windows软件)结合起来构成一个可以自由修改而且非常有用的操作系统。本文把内核本身称为“Linux内核”,而把该完整的结合体称为“Linux”。注意,很多人使用术语“GNU/Linux”来称呼该结合体。在Linux社团中,不同的组织以不同的方式结合可用软件。每一种结合被称为一个“发行版”,而开发发行版的组织就被称为“发行商”。普通的发行版包括RedHat、Mandrake、SuSE、Caldera、Corel和Debian。各种发行版间存在差异,但所有的发行版都基于同一个基础:Linux内核与GNU的glibc库。由于这两者都是受“copyleft”类型许可证保护的,对它们的修改一般也必须提供给所有人,这是BSD和源于AT&T的Unix系统之间所不存在的统一力量,使不同Linux发行版统一在同一个基础之上。本文不针对任何特定的发行版;但在讨论时,假设使用的Linux内核版本是2.2以上,C库为glibc2.1或更高版本,基本上这一假设对当前所有的主要Linux发行版
本文标题:40Linux+和Unix+安全编程HOWTO
链接地址:https://www.777doc.com/doc-4177949 .html