第 3 章. Linux 和 Unix 安全特性概述

 

谨慎能保护你,悟性能保守你。

 箴言 2:11 (NIV)
目录
3.1. 进程
3.1.1. 进程属性
3.1.2. POSIX 功能
3.1.3. 进程创建和操作
3.2. 文件
3.2.1. 文件系统对象属性
3.2.2. 创建时间初始值
3.2.3. 更改访问控制属性
3.2.4. 使用访问控制属性
3.2.5. 文件系统层次结构
3.3. System V IPC
3.4. 套接字和网络连接
3.5. 信号
3.6. 配额和限制
3.7. 动态链接库
3.8. 审计
3.9. PAM
3.10. 类 Unix 系统的专用安全扩展

在讨论如何使用 Linux 或 Unix 安全特性的指南之前,了解程序员视角的这些特性是什么是很有用的。本节简要描述了几乎所有类 Unix 系统上广泛可用的那些特性。然而,请注意,不同版本的类 Unix 系统之间存在相当大的差异,并非所有系统都具有此处描述的功能。本章还注意到一些 Linux 特有的扩展或特性;从安全编程的角度来看,Linux 发行版往往彼此非常相似,因为它们都使用基本相同的内核和 C 库(并且基于 GPL 的许可证鼓励任何创新的快速传播)。它还注意到不同 Unix 实现之间一些与安全相关的差异,但请注意,这不是一个详尽的列表。本章不讨论强制访问控制 (MAC) 的实现等问题,许多类 Unix 系统并未实现强制访问控制。如果您已经了解这些特性,请随意跳过本节。

许多编程指南只是简要地略过 Linux 或 Unix 中与安全相关的部分,并跳过重要的信息。特别是,它们通常以一般术语讨论“如何使用”某些东西,但忽略了影响其使用的安全属性。相反,手册页中有很多关于各个函数的详细信息,但手册页有时会用关于如何使用每个单独函数的详细讨论来掩盖关键的安全问题。本节试图弥合这一差距;它概述了程序员可能在 Linux 中使用的安全机制,但特别关注安全影响。本节比典型的编程指南更深入,专门关注与安全相关的事项,并指向您可以获得更多详细信息的参考资料。

首先,基础知识。Linux 和 Unix 从根本上分为两个部分:内核和“用户空间”。大多数程序在用户空间(内核之上)执行。Linux 支持“内核模块”的概念,这只是将代码动态加载到内核的能力,但请注意,它仍然具有这种基本划分。一些其他系统(例如 HURD)是基于“微内核”的系统;它们有一个功能更有限的小内核,以及一组“用户”程序,用于实现传统上由内核实现的较低级别的功能。

一些类 Unix 系统已经过大量修改以支持强大的安全性,特别是为了支持美国国防部对强制访问控制(B1 级或更高)的要求。本书的这个版本不涵盖这些系统或问题;我希望在未来的版本中扩展到这一点。有关其中一些系统的更多详细信息可在其他地方获得,例如,有关 SGI 的“Trusted IRIX/B”的详细信息可在 NSA 的 最终评估报告 (FER) 中找到。

当用户登录时,他们的用户名被映射到整数,这些整数标记他们的 “UID”(“用户 ID”)和他们所属的 “GID”(“组 ID”)。UID 0 是一个特殊的特权用户(角色),传统上称为 “root”;在大多数类 Unix 系统(包括 Unix)上,root 可以否决大多数安全检查,并用于管理系统。在某些 Unix 系统上,GID 0 也很特殊,允许在组级别无限制地访问资源 [Gay 2000, 228];这在其他系统(例如 Linux)上不是真的,但即使在这些系统中,组 0 本质上也是全能的,因为许多特殊的系统文件都归组 0 所有。就安全性而言,进程是唯一的“主体”(也就是说,只有进程是活动对象)。进程可以访问各种数据对象,特别是文件系统对象 (FSO)、System V 进程间通信 (IPC) 对象和网络端口。进程还可以设置信号。其他与安全相关的主题包括配额和限制、库、审计和 PAM。接下来的几个小节将详细介绍这一点。