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。这些原因具有历史性,并基于开销、复杂性和性能考量。