Linux 安全模块:Linux 的通用安全钩子

作者:

Stephen Smalley

作者:

Timothy Fraser

作者:

Chris Vance

注意

本书中描述的 API 已过时。

介绍

在 2001 年 3 月,国家安全局(NSA)在 2.5 Linux 内核峰会上做了一个关于安全增强 Linux(SELinux)的演示。SELinux 是在 Linux 内核中实现灵活且细粒度的非强制访问控制的一种实现,最初是作为其自己的特定内核补丁来实现的。其他几个安全项目(例如 RSBAC、Medusa)也为 Linux 内核开发了灵活的访问控制架构,并且各种项目为 Linux 开发了特定的访问控制模型(例如 LIDS、DTE、SubDomain)。每个项目都开发并维护自己的内核补丁以支持其安全需求。

在对 NSA 的演示做出回应时,Linus Torvalds 发表了一系列评论,描述了他愿意考虑包含在主流 Linux 内核中的安全框架。他描述了一个通用框架,该框架将提供一组安全钩子来控制对内核对象的操作,并在内核数据结构中提供一组不透明的安全字段来维护安全属性。然后,可加载的内核模块可以使用此框架来实现任何所需的安全模型。Linus 还建议将 Linux 功能代码迁移到此类模块的可能性。

Linux 安全模块(LSM)项目由 WireX 发起,旨在开发这样的框架。LSM 是由包括 Immunix、SELinux、SGI 和 Janus 在内的多个安全项目以及包括 Greg Kroah-Hartman 和 James Morris 在内的多个人员共同开发的,旨在开发实现此框架的 Linux 内核补丁。该工作于 2003 年 12 月被纳入主流。本技术报告概述了该框架和功能安全模块。

LSM 框架

LSM 框架提供了一个通用的内核框架来支持安全模块。特别是,LSM 框架主要侧重于支持访问控制模块,尽管未来的开发可能会解决其他安全需求,例如沙箱。该框架本身不提供任何额外的安全性;它仅提供支持安全模块的基础设施。LSM 框架是可选的,需要启用 CONFIG_SECURITY。功能逻辑是作为安全模块实现的。此功能模块在 LSM 功能模块中进一步讨论。

LSM 框架在内核数据结构中包含安全字段,并在内核代码的关键点调用钩子函数以管理安全字段并执行访问控制。它还添加了用于注册安全模块的函数。接口 /sys/kernel/security/lsm 报告系统中处于活动状态的安全模块的逗号分隔列表。

LSM 安全字段只是 void* 指针。该数据称为 blob,可以由框架或使用它的各个安全模块管理。被多个安全模块使用的安全 blob 通常由框架管理。对于进程和程序执行安全信息,安全字段包含在 struct task_structstruct cred 中。对于文件系统安全信息,安全字段包含在 struct super_block 中。对于管道、文件和套接字安全信息,安全字段包含在 struct inodestruct file 中。对于 System V IPC 安全信息,安全字段已添加到 struct kern_ipc_permstruct msg_msg 中;此外,struct msg_msg、struct msg_queue 和 struct shmid_kernel 的定义已移动到头文件(include/linux/msg.hinclude/linux/shm.h,视情况而定),以允许安全模块使用这些定义。

对于数据包和网络设备安全信息,安全字段已添加到 struct sk_buffstruct scm_cookie 中。与其他安全模块数据不同,此处使用的数据是一个 32 位整数。安全模块需要将这些值映射或以其他方式与实际安全属性关联。

LSM 钩子保存在列表中。为每个钩子维护一个列表,并且钩子按照 CONFIG_LSM 指定的顺序调用。每个钩子的详细文档都包含在 security/security.c 源文件中。

LSM 框架提供了对通用安全模块堆叠的近似。它定义了 security_add_hooks(),每个安全模块将一个 struct security_hooks_list 传递给该函数,这些结构被添加到列表中。LSM 框架没有提供删除已注册的钩子的机制。SELinux 安全模块已实现一种自我删除的方法,但该功能已被弃用。

这些钩子可以看作属于两大类:用于管理安全字段的钩子和用于执行访问控制的钩子。第一类钩子的示例包括 security_inode_alloc()security_inode_free()。这些钩子用于为 inode 对象分配和释放安全结构。第二类钩子的一个示例是 security_inode_permission() 钩子。此钩子在访问 inode 时检查权限。

LSM 功能模块

POSIX.1e 功能逻辑作为存储在文件 security/commoncap.c 中的安全模块维护。功能模块使用 lsm_info 描述的 order 字段将其标识为要注册的第一个安全模块。与其他模块不同,功能安全模块不使用通用安全 blob。原因在于历史原因,并且基于开销、复杂性和性能方面的考虑。