=Start=
缘由:
我对LSM的学习,主要是通过Chris Wright和Crispin Cowan在2002年左右发表的一篇「Linux Security Modules: General Security Support for the Linux Kernel」文档来进行的,在此过程中也参考了「Linux LSM(Linux Security Modules) Hook Technology」和「如何增强 Linux 系统的安全性,第一部分: Linux 安全模块(LSM)简介」的内容,较为深入的学习了一下LSM,在此记录一下,方便以后参考。
正文:
参考解答:
1.LSM相关背景介绍:为什么和是什么
近年来Linux系统由于其出色的性能和稳定性,开放源代码特性带来的灵活性和可扩展性,以及较低廉的成本,而受到计算机工业界的广泛关注和应用。但在安全性方面,Linux内核只提供了经典的UNIX自主访问控制(root用户,用户ID,模式位安全机制),以及部分的支持了POSIX.1e标准草案中的capabilities安全机制,这对于Linux系统的安全性是不足够的,影响了Linux系统的进一步发展和更广泛的应用。即:现有Linux系统的安全机制存在不足。
有很多安全访问控制模型和框架已经被研究和开发出来,用以增强Linux系统的安全性,比较知名的 SELinux,DTE,以及 LIDS 等等。但是由于没有一个系统能够获得统治性的地位而进入Linux内核成为标准;并且这些系统都大多以各种不同的内核补丁的形式提供,使用这些系统需要有编译和定制内核的能力,对于没有内核开发经验的普通用户,获得并使用这些系统是有难度的。在2001年的Linux内核峰会上,美国国家安全局(NSA)介绍了他们关于 SELinux 的工作,这是一个灵活的访问控制体系Flask在Linux中的实现,当时Linux内核的创始人Linus Torvalds同意Linux内核确实需要一个通用的安全访问控制框架,但他指出最好是通过可加载内核模块的方法,这样可以支持现存的各种不同的安全访问控制系统。因此,LSM应运而生。即:Linus也同意Linux内核需要有一个通用的安全访问控制框架。
LSM)是Linux内核的一个轻量级通用访问控制框架。它使得各种不同的安全访问控制模型能够以Linux可加载内核模块的形式实现出来,用户可以根据其需求选择适合的安全模块加载到Linux内核中,从而大大提高了Linux安全访问控制机制的灵活性和易用性。目前已经有很多著名的增强访问控制系统移植到LSM)上实现,包括POSIX.1e capabilities、SELinux、DTE,以及 LIDS 等等。即:LSM只是一个框架,用户可根据实际需要动态加载各种具体的安全增强功能模块。
2.LSM设计思想介绍:得让两方面都满意
LSM的设计必须尽量满足两方面人的要求:让不需要它的人尽可能少的因此受到影响;同时让需要它的人因此得到有用和高效的功能。
一方面,以Linus Torvalds为代表的内核开发人员对LSM提出了三点要求:
- 真正的通用,当使用一个不同的安全模型的时候,只需要加载一个不同的内核模块
- 概念上简单,对Linux内核影响最小,高效
- 能够支持现有的POSIX.1e capabilities逻辑,作为一个可选的安全模块
另一方面,各种不同的Linux安全增强系统对LSM提出的要求是:能够允许它们以可加载内核模块的形式重新实现其安全功能,并且不会在安全性方面带来明显的损失,也不会带来额外的系统开销。
为了满足这些设计目标,LSM采用了通过在内核源代码中放置钩子的方法,来仲裁对内核内部对象进行的访问,这些对象有:任务,inode结点,打开的文件等等。用户进程执行系统调用(open system call),首先通过Linux内核原有的逻辑找到并分配资源(look up inode),进行错误检查(error checks),并经过经典的UNIX自主访问控制(DAC checks),「恰好」在Linux内核试图对内部对象进行访问之前,一个LSM的钩子(LSM hook)对安全模块所必须提供的函数进行一个调用,并对安全模块提出这样的问题”是否允许访问执行?”,安全模块根据其安全策略进行决策,作出回答:允许,或者拒绝进而返回一个错误。
为了满足大多数现存Linux安全增强系统的需要,LSM采取了简化设计的决策。LSM现在主要支持大多数现存安全增强系统的核心功能:访问控制;而对一些安全增强系统要求的其他安全功能,比如安全审计,只提供了的少量的支持。这样做的目的是为了减少对Linux内核的修改和影响,使得LSM进入Linux内核成为安全机制标准的可能性大大提高;等成为标准后,再根据情况来改变决策——增加功能和灵活性。
3.LSM实现方法介绍:对Linux内核的修改
LSM本身不提供任何具体的安全策略,而是提供了一个通用的基础体系给安全模块,由安全模块来实现具体的安全策略。其主要在五个方面对Linux内核进行了修改:
- 在特定的内核数据结构中加入了安全域(Opaque Security Fields)
- 在内核源代码中不同的关键点插入了对安全钩子函数的调用(Calls to Security Hook Functions)
- 加入了一个通用的安全系统调用(Security System Call)
- 提供了函数允许内核模块注册为安全模块或者注销(Registering Security Modules)
- 将capabilities逻辑的大部分移植为一个可选的安全模块(Capabilities)
4.LSM接口说明:给内核开发人员和安全研究人员使用的钩子
LSM对于内核开发人员和安全研究人员的价值就在于:可以使用其提供的接口将现存的安全增强系统移植到这一框架上,从而能够以可加载内核模块的形式提供给用户使用;或者甚至可以直接编写适合自己需要的安全模块。LSM提供的接口就是钩子,其初始化时所指向的虚拟函数实现了缺省的传统UNIX超级用户机制,模块编写者必须重新实现这些钩子函数来满足自己的安全策略。下面简要介绍LSM提供的钩子,详细情况请参考源代码,特别是include/linux/security.h头文件中security_operations结构的定义。至于具体如何根据自己需要的安全策略编写安全模块,可以参考SELinux,DTE,LIDS等系统的安全模块实现。
- 任务钩子(Task Hooks)
- 程序加载钩子(Program Loading Hooks)
- 进程间通信钩子(IPC Hooks)
- 文件系统钩子(Filesystem Hooks)
- 网络钩子(Network Hooks)
- 其它钩子(Other Hooks)
5.LSM模块说明:给普通用户使用的现成的安全功能
LSM对于普通用户的价值就在于:可以提供各种安全模块,由用户选择适合自己需要的加载到内核,满足特定的安全功能。LSM本身只提供增强访问控制策略的机制,而由各个安全模块实现具体特定的安全策略。下面简要介绍一些已经实现的安全模块:
- SELinux。这是一个Flask灵活访问控制体系在Linux上的实现,并且提供了类型增强,基于角色的访问控制,以及可选的多级安全策略。SELinux原来是作为一个内核补丁实现的,现在已经使用LSM重新实现为一个安全模块。SELinux可以被用来限制进程为最小特权,保护进程和数据的完整性和机密性,并且支持应用安全需求。
- DTE Linux。这是一个域和类型增强在Linux上的实现。就像SELinux一样,DTE Linux原来是作为一个内核补丁实现的,现在已经使用LSM重新实现为一个安全模块。当这个安全模块被加载到内核上时,类型被赋给对象,域被赋给进程。DTE策略限制域之间和从域到类型的访问。
- Openwall 内核补丁的LSM移植。Openwall内核补丁提供了一系列的安全特性集合来保护系统免受例如缓冲区溢出和临时文件竞争这样的攻击。有安全模块正在被开发出来以支持Openwall补丁的一个子集。
- POSIX.1e capabilities。Linux内核中已经存在有POSIX.1e capabilities逻辑,但是LSM把这个逻辑划分到了一个安全模块中。这样的修改使得不需要的用户可以从他们的内核中把这个功能略去;也使得capabilities逻辑的开发可以脱离内核开发获得更大的独立性。
- LIDS。这是由国人谢华刚发起的项目。开始时作为一个入侵检测系统开发,后来逐渐演变为使用访问控制系统的形式来进行入侵预防,它通过描述一个给定的程序可以访问哪些文件来进行访问控制。同样的,LIDS原来是作为一个内核补丁实现的并附带了一些管理工具,现在已经使用LSM重新实现为一个安全模块。
当然还有缺省的传统超级用户机制。这个安全模块是LSM默认的,实现了传统的UNIX超级用户特权机制。
6.LSM具体使用方法说明:step by step
LSM之前是作为一个Linux内核补丁的形式实现的。但是现在(从2007.10.26开始)应该是已经加入了Linux内核了,所以可以通过查看内核的编译选项来看是否已启用LSM以及使用了哪个或哪些安全模块:
# CentOS 6 # grep --color "CONFIG_SECURITY" /boot/config-$(uname -r) |
常见的LSM安全模块有:
AppArmor SELinux Smack TOMOYO |
6.LSM之外
当然,除了LSM这种安全机制之外,Linux还可以通过 grsecurity 这种给内核打补丁的方式来提供Linux系统的安全性。
参考链接:
Linux LSM(Linux Security Modules) Hook Technology #nice
http://www.cnblogs.com/LittleHann/p/4134939.html
Linux Security Module Framework
http://namei.org/lsm-ols2002-html/lsm.html
http://namei.org/presentations/lsm-usenix.pdf
Linux Security Modules: General Security Support for the Linux Kernel
https://www.usenix.org/legacy/event/sec02/full_papers/wright/wright_html/index.html
http://www.kroah.com/linux/talks/ols_2002_lsm_paper/lsm.pdf
Section 3.1. The Kernel Architecture
http://flylib.com/books/en/2.803.1.24/1/
http://courses.cs.vt.edu/cs5204/fall10-kafura-BB/Papers/TPM/LSM-System-Monitoring-Kernel.pdf
Linux下如何知道当前是否已引入LSM框架?以及使用的是哪个LSM模块?
https://unix.stackexchange.com/questions/117782/how-to-determine-if-and-which-linux-security-module-lsm-is-available
https://unix.stackexchange.com/questions/106951/are-there-other-lsm-linux-security-modules-in-addition-to-selinux-and-apparmor
https://www.kernel.org/doc/Documentation/security/00-INDEX
https://www.kernel.org/doc/Documentation/security/LSM.txt
如何增强 Linux 系统的安全性,第一部分: Linux 安全模块(LSM)简介 #nice
https://www.ibm.com/developerworks/cn/linux/l-lsm/part1/index.html
https://www.ibm.com/support/knowledgecenter/linuxonibm/liaav/P14-LSM.pdf
linux内核数据结构学习总结
http://www.cnblogs.com/LittleHann/p/3865490.html
SELinux源码分析_1.31
https://wenku.baidu.com/view/df89fe235901020207409c49
=END=
《 “LSM学习” 》 有 9 条评论
LSM在某些内核数据结构中添加了一些不透明的安全字段(LSM adds opaque security fields to certain kernel data structures):`
1) task_struct: Task(Process) 任务(进程)
2) linux_binprm: Program 程序
3) super_block: Filesystem 文件系统
4) inode: Pipe、File,、or Socket 管道、文件、套接字
5) file: Open File 打开的文件
6) sk_buff: Network Buffer(Packet) 网络缓冲区(包)
7) net_device: Network Device 网络设备
8) kern_ipc_perm: Semaphore、Shared Memory Segment、Message Queue 信号量、共享内存段、消息队列
9) msg_msg: Individual Message 单个的消息
`
cn_proc可以被认为是一个针对进程的inotify,其中用 proc_event 结构体表示进程的各个状态——fork/exec/exit/…
https://sites.uclouvain.be/SystInfo/usr/include/linux/cn_proc.h.html
https://github.com/torvalds/linux/blob/master/include/uapi/linux/cn_proc.h
`
PROC_EVENT_NONE = 0x00000000,
PROC_EVENT_FORK = 0x00000001,
PROC_EVENT_EXEC = 0x00000002,
PROC_EVENT_UID = 0x00000004,
PROC_EVENT_GID = 0x00000040,
PROC_EVENT_SID = 0x00000080,
PROC_EVENT_PTRACE = 0x00000100,
PROC_EVENT_COMM = 0x00000200,
PROC_EVENT_COREDUMP = 0x40000000,
PROC_EVENT_EXIT = 0x80000000
`
https://stackoverflow.com/questions/6075013/detect-launching-of-programs-on-linux-platform
http://bewareofgeek.livejournal.com/2945.html
https://github.com/draios/sysdig
https://sysdig.com/blog/linux-troubleshooting-cheatsheet/
https://people.redhat.com/sgrubb/audit/
https://github.com/linux-audit/audit-userspace
Syscall Auditing at Scale
https://news.ycombinator.com/item?id=13010544
https://slack.engineering/syscall-auditing-at-scale-e6a3ca8ac1b8
strace/ptrace
https://security.stackexchange.com/questions/8485/monitoring-system-calls-in-a-reliable-and-secure-way
http://www.brendangregg.com/Perf/linux_observability_tools.png
use LD_PRELOAD hook fork/execve
https://github.com/a2o/snoopy
http://hbprotoss.github.io/posts/li-yong-ld_preloadjin-xing-hook.html
https://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick
http://0cx.cc/linux_ld_preload.jspx
https://jvns.ca/blog/2014/11/27/ld-preload-is-super-fun-and-easy/
https://lwn.net/Articles/276782/
想实现一个linux内核安全功能模块的技术思路是怎样的?
https://www.zhihu.com/question/21637060
Green Hills的Dan O’Dowd于2004年发表的名为Linux in Defense的系列文章通过一系列的分析试图向公众解释为什么Linux内核不适合一些场景特别是国家防御。
http://weibo.com/5654890146/FfnMWoK3v
Part I: FAA Certified Operating Systems Deliver the Reliability & Security Defense Systems Require; Linux Does Not
https://www.ghs.com/linux/security.html
Part II: “Many Eyes” – No Assurance Against Many Spies
https://www.ghs.com/linux/manyeyes.html
Part III: Linux Security: Unfit for Retrofit
https://www.ghs.com/linux/unfit.html
Part IV: Linux in Defense: Free Software is Just Too Expensive
https://www.ghs.com/linux/expensive.html
Part V: Linux in Defense: An Urgent Threat to National Security
https://www.ghs.com/linux/threat.html
grsecurity-101-tutorials – PaX/Grsecurity 新手教程
https://github.com/hardenedlinux/grsecurity-101-tutorials
SELinux初学者指南
http://www.4hou.com/technology/9481.html
http://linuxtechlab.com/beginners-guide-to-selinux/
Linux 内核函数 Hook 系列教程
Part 1: https://www.apriorit.com/dev-blog/544-hooking-linux-functions-1
Part 2: https://www.apriorit.com/dev-blog/546-hooking-linux-functions-2
Part 3: https://www.apriorit.com/dev-blog/547-hooking-linux-functions-3
Linux 内核安全开发经验分享
https://schd.ws/hosted_files/osseu18/27/KSPP_lessons.pdf