logo资料库

SELinux源码分析.doc

第1页 / 共96页
第2页 / 共96页
第3页 / 共96页
第4页 / 共96页
第5页 / 共96页
第6页 / 共96页
第7页 / 共96页
第8页 / 共96页
资料共96页,剩余部分请下载后查看
SELinux源码分析(Federa Core 8)
第一章 SELinux(Security Enhance Linux,简称SELinux)简介
1.1 SELinux的起源
1.2
1.3 Linux安全模块(Linux Security Module,简称LSM)
1.4接口说明:给内核开发人员和安全研究人员使用的钩子
1.5模块说明:给普通用户使用的现成的安全功能
第二章 LSM安全架构启动
2.1 LSM的注册层次
2.2LSM Hooks
2.3相关的内核数据结构
2.3.1 Task_struct(进程结构)
2.3.2 Linux_binprm
2.3.3 Super_block(超级块)
2.3.4 Inode(索引节点)
2.3.5 File(文件)
2.3.6 dentry(目录项)(《深入理解LINUX内核》第474页)
2.3.7 Sk_buff(套接字缓冲区)
2.3.8 Net_device
2.3.9 Kern_ipc_perm(《深入理解LINUX内核》第783页)
2.3.10 Msg_msg(《深入理解LINUX内核》第791页)
2.4安全结构
2.5Hooks函数
2.5.1 Task Hooks
2.5.2 Program Loading Hooks
2.5.3 IPC Hooks
2.5.4 File System Hooks
Super Block Hooks
Inode Hooks
File Hooks
2.5.5 Network Hooks
2.5.6 Other Hooks
2.6SELinux 初始化
第三章 AVC
3.1 设计目标
3.2 数据结构
3.3 重要的操作
3.4 接口
第四章 SELinux安全策略
4.1 访问控制简介
4.1.1自主访问控制
4.1.2 Capability
4.1.3强制访问控制
4.1.4基于角色的访问控制
4.2 相关的数据结构
4.2.1 数据结构基础
4.2.2 策略库Policydb
4.2.3 Sid table
4.2.4主客体类别class type
4.2.5 策略决策avd
4.2.6 avtab(访问控制向量表)
4.3 策略的加载
4.4 策略文件存储的信息
4.5 策略文件的组成
4.6 接口
第五章 SELinux源码文件
5.1 独立的安全模块
5.2 Hook函数
5.3 访问向量缓存
5.4 安全服务器
5.5 二进制策略文件
第六章 Userspace
6.1 checkpolicy
6.2 libselinux
6.3 libsemanage
6.4 libsepol
6.5 policycoreutils
6.6 sepolgen
6.7 SELinuxfs
第七章 附录
Security_operations结构
第八章 参考文献
SELinux 源码分析(Federa Core 8) 第一章 SELinux(Security Enhance Linux,简称 SELinux)简介 1.1 SELinux 的起源 SELinux 是一个面向政府和行业的产品,由 NSA、Network Associates、Tresys 以及其他组 织设计和开发。尽管 NSA 将其作为一个补丁集引入,但从 2.6 版开始,它就被加入到 Linux 内核中。 GUN/Linux 非常安全,但它也非常动态:所做的更改会为操作系统带来新的漏洞,这些 漏洞可能被攻击者利用,尽管人们都非常关心阻止授权访问,但是发生入侵后会发生什么 呢? 1.2 访问控制 删除[kygle]: 方法 大多数操作系统使用访问控制来判断一个实体(用户或程序)是否能够访问给定资源。基 于 UNIX 的系统使用一种自主访问控制(Discretionary Access Control,简称 DAC)的形式。此方 法通常根据对象所属的分组来限制对对象的访问。例如,GNU/Linux 中的文件有一个所有者、 一个分组和一个权限集。 权限定义谁可以访问给定文件、谁可以读取它、谁可 以向其写入,以及谁可以执行它。这些权限被划分到三个用户集中,分别表示用户(文件所 有者)、分组(一个用户组的所有成员)和其他(既不是文件所有者,又不是该分组的成员的所 有用户)。 很多这样的访问控制都会带来一个问题,因为所利用的程序能够继承用户的访问控制。 这样,该程序就可以在用户的访问层进行操作。与通过这种方式定义约束相比,使用最小特 权原则更安全,程序只能执行完成任务所需的操作。例如,如果一个程序用于响应 socket 请 求,但不需要访问文件系统,那么该程序应该能够监听给定的 socket,但是不能访问文件系 统。通过这种方式,如果该程序被攻击者利用,其访问权限显然是最小的。这种控制类型称 为强制访问控制(MAC)。 另一种控制访问的方法是基于角色的访问控制(RBAC)。在 RBAC 中,权限是根据安全系 统所授予的角色来提供的。角色的概念与传统的分组概念不同,因为一个分组代表一个或多 个用户。一个角色可以代表多个用户,但它也代表一个用户集可以执行的权限。 SELinux 将 MAC 和 RBAC 都添加到了 GNU/Linux 操作系统中。下一节将探讨 SELinux 实现,以及如何将安全增强透明地添加到 Linux 内核中。 1.3 Linux 安全模块(Linux Security Module,简称 LSM) Linux 安全模块(LSM)提供了两类对安全钩子函数的调用:一类管理内核对象的安全 域,另一类仲裁对这些内核对象的访问。对安全钩子函数的调用通过钩子来实现,钩子是全 局表 security_ops 中的函数指针,这个全局表的类型是 security_operations 结构,这个结
构定义在 include/linux/security.h 这个头文件中,这个结构中包含了按照内核对象或内核子 系统分组的钩子组成的子结构,以及一些用于系统操作的顶层钩子。在内核源代码中很容易 找到对钩子函数的调用:其前缀是 security_ops->。对钩子函数(Hooks)的详细说明留到 后面。 在内核引导的过程中,Linux 安全模块(LSM)框架被初始化为一系列的虚拟钩子函数, 以实现传统的 UNIX 超级用户机制。当加载一个安全模块时,必须使用 register_security() (在 linux/security.h 中声明,security.c 中定义)函数向 Linux 安全模块(LSM)框架注册 这个安全模块:这个函数将设置全局表 security_ops,使其指向这个安全模块的钩子函数指 针,从而使内核向这个安全模块询问访问控制决策。一旦一个安全模块被加载,就成为系统 的安全策略决策中心,而不会被后面的 register_security()函数覆盖,直到这个安全模块被 使用 unregister_security()函数向框架注销:这简单的将钩子函数替换为缺省值,即 Dummy.c 中的 Dummy 函数,系统回到 UNIX 超级用户机制。另外,Linux 安全模块(LSM) 框架还提供了函数 mod_reg_security()和函数 mod_unreg_security(),使其后的安全模块可 以向已经第一个注册的主模块注册和注销,但其策略实现由主模块决定:是提供某种策略来 实现模块堆栈从而支持模块功能合成,还是简单的返回错误值以忽略其后的安全模块。(需 要主模块进行调用)这些函数都提供在内核源代码文件 security/security.c 中。这种方式的 设计主要为了实现模块的叠加,实现多种模块对系统的安全进行检查。目前该功能主要是实 现,capability 和 SELinux 的叠加。 Linux 内核现在对 POSIX.1e capabilities 的一个子集(提供一部分钩子函数)提供支持。 Linux 安全模块(LSM)设计的一个需求就是把这个功能移植为一个可选的安全模块。 POSIX.1e capabilities 提供了划分传统超级用户特权并赋给特定的进程的功能,即传统超级 用户不允许的权限,可以通过 POSIX.1e capabilities 授予,大大提高了系统安全的灵活性。 Linux 安全模块(LSM)保留了用来在内核中执行 capability 检查的现存的 capable()接口, 但把 capable()函数简化为一个 Linux 安全模块(LSM)钩子函数的包装(secondary_ops), 从而允许在安全模块中实现任何需要的逻辑。Linux 安全模块(LSM)还保留了 task_struck 结构中的进程 capability 集(一个简单的位向量),而并没有把它移到安全域中去。Linux 内核对 capabilities 的支持还包括两个系统调用:capset()和 capget()。Linux 安全模块(LSM) 同样保留了这些系统调用但将其替换为对钩子函数的调用,使其基本上可以通过 security() 系统调用来重新实现。Linux 安全模块(LSM)已经开发并且移植了相当部分的 capabilities 逻辑到一个 capabilities 安全模块中,但内核中仍然保留了很多原有 capabilities 的残余。这 些实现方法都最大程度的减少了对 Linux 内核的修改影响,并且最大程度保留了对原有使用 capabilities 的应用程序的支持,同时满足了设计的功能需求。以后要使 capabilities 模块完 全独立,剩下要做的主要步骤是:把位向量移到 task_struct 结构中合适的安全域中,以及 重新定位系统调用接口。目前的操作系统中还没有在这方面做改进,为了减少 LSM 架构对 原内核的影响,这部分暂且不懂。 1.4 接口说明:给内核开发人员和安全研究人员使用的钩子 Linux 安全模块(LSM)对于内核开发人员和安全研究人员的价值就在于:可以使用其 提供的接口将现存的安全增强系统移植到这一框架上,从而能够以可加载内核模块的形式提 供给用户使用;或者甚至可以直接编写适合自己需要的安全模块。Linux 安全模块(LSM) 提供的接口就是钩子,其初始化时所指向的虚拟函数实现了缺省的传统 UNIX 超级用户机 制,模块编写者必须重新实现这些钩子函数来满足自己的安全策略。下面简要介绍 Linux 安 全模块(LSM)提供的钩子,详细情况请参考源代码,特别是 include/linux/security.h 头文
件中 security_operations 结构的定义。至于具体如何根据自己需要的安全策略编写安全模 块,可以参考 SELinux,DTE,LIDS 等系统的安全模块实现。 首先是任务钩子,Linux 安全模块(LSM)提供了一系列的任务钩子使得安全模块可以 管理进程的安全信息并且控制进程的操作。模块可以使用 task_struct 结构中的安全域来维 护进程安全信息;任务钩子提供了控制进程间通信的钩子,例如 kill();还提供了控制对当 前进程进行特权操作的钩子,例如 setuid();还提供了对资源管理操作进行细粒度控制的钩 子,例如 setrlimit()和 nice()。 int (*task_create) (unsigned long clone_flags); int (*task_alloc_security) (struct task_struct * p); void (*task_free_security) (struct task_struct * p); int (*task_setuid) (uid_t id0, uid_t id1, uid_t id2, int flags);//特权操作的 Hook int (*task_post_setuid) (uid_t old_ruid /* or fsuid */ , uid_t old_euid, uid_t old_suid, int flags); int (*task_setgid) (gid_t id0, gid_t id1, gid_t id2, int flags); int (*task_setpgid) (struct task_struct * p, pid_t pgid); int (*task_getpgid) (struct task_struct * p); int (*task_getsid) (struct task_struct * p); void (*task_getsecid) (struct task_struct * p, u32 * secid); int (*task_setgroups) (struct group_info *group_info); int (*task_setnice) (struct task_struct * p, int nice);//资源管理的 Hook int (*task_setioprio) (struct task_struct * p, int ioprio); int (*task_getioprio) (struct task_struct * p); int (*task_setrlimit) (unsigned int resource, struct rlimit * new_rlim);//资源管理的 int (*task_setscheduler) (struct task_struct * p, int policy, struct sched_param * lp); int (*task_getscheduler) (struct task_struct * p); int (*task_movememory) (struct task_struct * p); int (*task_kill) (struct task_struct * p, struct siginfo * info, int sig, u32 secid);//控制进程间通信的 Hook int (*task_wait) (struct task_struct * p); int (*task_prctl) (int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5); void (*task_reparent_to_init) (struct task_struct * p); void (*task_to_inode)(struct task_struct *p, struct inode *inode); 图 1.1 任务钩子 Hook 其次是程序装载钩子。很多安全模块,包括 Linux capabilities,SELinux,DTE 都需要 有在一个新程序执行时改变特权的能力。因此 Linux 安全模块(LSM)提供了一系列程序装 载钩子,用在一个 execve()操作执行过程的关键点上。linux_binprm 结构中的安全域允许安 全模块维护程序装载过程中的安全信息;提供了钩子用于允许安全模块在装载程序前初始化 安全信息和执行访问控制;还提供了钩子允许模块在新程序成功装载后更新任务的安全信
息;还提供了钩子用来控制程序执行过程中的状态继承,例如确认打开的文件描述符。(不 是可信启动) int (*bprm_alloc_security) (struct linux_binprm * bprm); void (*bprm_free_security) (struct linux_binprm * bprm); void (*bprm_apply_creds) (struct linux_binprm * bprm, int unsafe); void (*bprm_post_apply_creds) (struct linux_binprm * bprm); int (*bprm_set_security) (struct linux_binprm * bprm); int (*bprm_check_security) (struct linux_binprm * bprm); int (*bprm_secureexec) (struct linux_binprm * bprm); 图 1.2 程序装载钩子 再次是进程间通信 IPC 钩子。安全模块可以使用进程间通信 IPC 钩子来对 System V IPC 的安全信息进行管理,以及执行访问控制。IPC 对象数据结构共享一个子结构 kern_ipc_perm,并且这个子结构中只有一个指针传给现存的 ipcperms()函数进行权限检查, 因此 Linux 安全模块(LSM)在这个共享子结构中加入了一个安全域。为了支持单个消息的 安全信息,Linux 安全模块(LSM)还在 msg_msg 结构中加入了一个安全域。Linux 安全 模块(LSM)在现存的 ipcperms()函数中插入了一个钩子,使得安全模块可以对每个现存的 Linux IPC 权限执行检查。由于对于某些安全模块,这样的检查是不足够的,Linux 安全模 块(LSM)也在单个的 IPC 操作中插入了钩子。另外还有钩子支持对通过 System V 消息队 列发送的单个消息进行细粒度的访问控制。 int (*ipc_permission) (struct kern_ipc_perm * ipcp, short flag); int (*msg_msg_alloc_security) (struct msg_msg * msg); void (*msg_msg_free_security) (struct msg_msg * msg); int (*msg_queue_alloc_security) (struct msg_queue * msq); void (*msg_queue_free_security) (struct msg_queue * msq); int (*msg_queue_associate) (struct msg_queue * msq, int msqflg); int (*msg_queue_msgctl) (struct msg_queue * msq, int cmd); int (*msg_queue_msgsnd) (struct msg_queue * msq, struct msg_msg * msg, int msqflg); int (*msg_queue_msgrcv) (struct msg_queue * msq, struct msg_msg * msg, struct task_struct * target, long type, int mode); 图 1.3 进程通信 IPC 钩子 下面是文件系统钩子。对于文件操作,定义了三种钩子:文件系统钩子,inode 结点钩 子,以及文件钩子。Linux 安全模块(LSM)在对应的三个内核数据结构中加入了安全域, 分别是:super_block 结构,inode 结构,file 结构。超级块文件系统钩子使得安全模块能够 控制对整个文件系统进行的操作,例如挂载,卸载,还有 statfs()。Linux 安全模块(LSM) 在 permission()函数中插入了钩子,从而保留了这个函数,但是也提供了很多其他 inode 结
点钩子来对单个 inode 结点操作进行细粒度访问控制。文件钩子中的一些允许安全模块对 read()和 write()这样的文件操作进行额外的检查;还有文件钩子允许安全模块控制通过 socket IPC 接收打开文件描述符;其他的文件钩子对像 fcntl()和 ioctl()这样的操作提供细粒 度访问控制。 int (*sb_alloc_security) (struct super_block * sb); void (*sb_free_security) (struct super_block * sb); int (*sb_copy_data)(struct file_system_type *type, void *orig, void *copy); int (*sb_kern_mount) (struct super_block *sb, void *data); int (*sb_statfs) (struct dentry *dentry); int (*sb_mount) (char *dev_name, struct nameidata * nd, char *type, unsigned long flags, void *data); int (*sb_check_sb) (struct vfsmount * mnt, struct nameidata * nd); int (*sb_umount) (struct vfsmount * mnt, int flags); void (*sb_umount_close) (struct vfsmount * mnt); void (*sb_umount_busy) (struct vfsmount * mnt); void (*sb_post_remount) (struct vfsmount * mnt, unsigned long flags, void *data); void (*sb_post_mountroot) (void); void (*sb_post_addmount) (struct vfsmount * mnt, struct nameidata * mountpoint_nd); int (*sb_pivotroot) (struct nameidata * old_nd, struct nameidata * new_nd); void (*sb_post_pivotroot) (struct nameidata * old_nd, struct nameidata * new_nd); 图 1.4 super_block 文件系统钩子 int (*inode_alloc_security) (struct inode *inode); void (*inode_free_security) (struct inode *inode); int (*inode_init_security) (struct inode *inode, struct inode *dir, char **name, void **value, size_t *len); int (*inode_create) (struct inode *dir, struct dentry *dentry, int mode); int (*inode_link) (struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry); int (*inode_unlink) (struct inode *dir, struct dentry *dentry); int (*inode_symlink) (struct inode *dir, struct dentry *dentry, const char *old_name); int (*inode_mkdir) (struct inode *dir, struct dentry *dentry, int mode); int (*inode_rmdir) (struct inode *dir, struct dentry *dentry); int (*inode_mknod) (struct inode *dir, struct dentry *dentry, int mode, dev_t dev); int (*inode_rename) (struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry);
int (*inode_readlink) (struct dentry *dentry); int (*inode_follow_link) (struct dentry *dentry, struct nameidata *nd); int (*inode_permission) (struct inode *inode, int mask, struct nameidata *nd); int (*inode_setattr) int (*inode_getattr) (struct vfsmount *mnt, struct dentry *dentry); (struct dentry *dentry, struct iattr *attr); void (*inode_delete) (struct inode *inode); int (*inode_setxattr) (struct dentry *dentry, char *name, void *value, size_t size, int flags); void (*inode_post_setxattr) (struct dentry *dentry, char *name, void *value, size_t size, int flags); int (*inode_getxattr) (struct dentry *dentry, char *name); int (*inode_listxattr) (struct dentry *dentry); int (*inode_removexattr) (struct dentry *dentry, char *name); const char *(*inode_xattr_getsuffix) (void); int (*inode_getsecurity)(const struct inode *inode, const char *name, void *buffer, size_t size, int err); int (*inode_setsecurity)(struct inode *inode, const char *name, const void *value, size_t size, int flags); int (*inode_listsecurity)(struct inode *inode, char *buffer, size_t buffer_size); 图 1.5 inode 节点钩子 int (*file_permission) (struct file * file, int mask); int (*file_alloc_security) (struct file * file); void (*file_free_security) (struct file * file); int (*file_ioctl) (struct file * file, unsigned int cmd, unsigned long arg); int (*file_mmap) (struct file * file, unsigned long reqprot, unsigned long prot, unsigned long flags, unsigned long addr, unsigned long addr_only); int (*file_mprotect) (struct vm_area_struct * vma, unsigned long reqprot, unsigned long prot); int (*file_lock) (struct file * file, unsigned int cmd); int (*file_fcntl) (struct file * file, unsigned int cmd, unsigned long arg); int (*file_set_fowner) (struct file * file); int (*file_send_sigiotask) (struct task_struct * tsk, struct fown_struct * fown, int sig); int (*file_receive) (struct file * file); 图 1.6 文件钩子 接下来是网络钩子。对网络的应用层访问使用一系列的 socket 套接字钩子来进行仲裁, 这些钩子基本覆盖了所有基于 socket 套接字的协议。由于每个激活的用户 socket 套接字有
伴随有一个 inode 结构,所以在 socket 结构或是更底层的 sock 结构中都没有加入安全域。 socket 套接字钩子对有关进程的网络访问提供了一个通用的仲裁,从而显著扩展了内核的 网络访问控制框架(这在网络层是已经由 Linux 内核防火墙 netfilter 进行处理的)。例如 sock_rcv_skb 钩子允许在进入内核的包排队到相应的用户空间 socket 套接字之前,按照其 目的应用来对其进行仲裁。另外 Linux 安全模块(LSM)也为 IPv4,UNIX 域,以及 Netlink 协议实现了细粒度的钩子,以后还可能实现其他协议的钩子。网络数据以包的形式被封装在 sk_buff 结构(socket 套接字缓冲区)中游历协议栈,Linux 安全模块(LSM)在 sk_buff 结构中加入了一个安全域,使得能够在包的层次上对通过网络层的数据的安全信息进行管 理,并提供了一系列的 sk_buff 钩子用于维护这个安全域的整个生命周期。硬件和软件网络 设备被封装在一个 net_device 结构中,一个安全域被加到这个结构中,使得能够在设备的 层次上维护安全信息。 int (*unix_stream_connect) (struct socket * sock, struct socket * other, struct sock * newsk); int (*unix_may_send) (struct socket * sock, struct socket * other); int (*socket_create) (int family, int type, int protocol, int kern); int (*socket_post_create) (struct socket * sock, int family, int type, int protocol, int kern); int (*socket_bind) (struct socket * sock, struct sockaddr * address, int addrlen); int (*socket_connect) (struct socket * sock, struct sockaddr * address, int addrlen); int (*socket_listen) (struct socket * sock, int backlog); int (*socket_accept) (struct socket * sock, struct socket * newsock); void (*socket_post_accept) (struct socket * sock, struct socket * newsock); int (*socket_sendmsg) (struct socket * sock, struct msghdr * msg, int size); int (*socket_recvmsg) (struct socket * sock, struct msghdr * msg, int size, int flags); int (*socket_getsockname) (struct socket * sock); int (*socket_getpeername) (struct socket * sock); int (*socket_getsockopt) (struct socket * sock, int level, int optname); int (*socket_setsockopt) (struct socket * sock, int level, int optname); int (*socket_shutdown) (struct socket * sock, int how); int (*socket_sock_rcv_skb) (struct sock * sk, struct sk_buff * skb); int (*socket_getpeersec_stream) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len); int (*socket_getpeersec_dgram) (struct socket *sock, struct sk_buff *skb, u32 *secid); int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority); void (*sk_free_security) (struct sock *sk); void (*sk_clone_security) (const struct sock *sk, struct sock *newsk);
void (*sk_getsecid) (struct sock *sk, u32 *secid); void (*sock_graft)(struct sock* sk, struct socket *parent); int (*inet_conn_request)(struct sock *sk, struct sk_buff *skb, struct request_sock *req); void (*inet_csk_clone)(struct sock *newsk, const struct request_sock *req); void (*inet_conn_established)(struct sock *sk, struct sk_buff *skb); void (*req_classify_flow)(const struct request_sock *req, struct flowi *fl); 图 1.7 网络钩子 最后是其他的钩子。Linux 安全模块(LSM)提供了两种其他系列的钩子:模块钩子和 顶层的系统钩子。模块钩子用来控制创建,初始化,清除内核模块的内核操作。系统钩子用 来控制系统操作,例如设置主机名,访问 I/O 端口,以及配置进程记帐。虽然现在的 Linux 内核通过使用 capability 检查对这些系统操作提供了一些支持,但是这些检查对于不同操作 差别很大并且没有提供任何参数信息。 1.5 模块说明:给普通用户使用的现成的安全功能 Linux 安全模块(LSM)对于普通用户的价值就在于:可以提供各种安全模块,由用户 选择适合自己需要加载到内核,满足特定的安全功能。Linux 安全模块(LSM)本身只提供 增强访问控制策略的机制(只提供机制,策略由用户层提供),而由各个安全模块实现具体 特定的安全策略。下面简要介绍一些已经实现的安全模块。 SELinux,这是一个 Flask 灵活访问控制体系在 Linux 上的实现,并且提供了类型增强, 基于角色的访问控制,以及可选的多级安全策略。SELinux 原来是作为一个内核补丁实现的, 现在已经使用 Linux 安全模块(LSM)重新实现为一个安全模块。SELinux 可以被用来限制 进程为最小特权,保护进程和数据的完整性和机密性,并且支持应用安全需求。(内核补丁 和编译入内核模块,都是需要重新编译内核,是需要对内核进行修改,不是在内核启动后, 采用动态可加载的方式进行处理的) DTE Linux。这是一个域和类型增强在 Linux 上的实现。就像 SELinux 一样,DTE Linux 原来是作为一个内核补丁实现的,现在已经使用 Linux 安全模块(LSM)重新实现为一个安 全模块。当这个安全模块被加载到内核上时,类型被赋给对象,域被赋给进程。DTE 策略 限制域之间和从域到类型的访问。 Openwall 内核补丁的 LSM 移植。Openwall 内核补丁提供了一系列的安全特性集合来 保护系统免受例如缓冲区溢出和临时文件竞争这样的攻击。有安全模块正在被开发出来以支 持 Openwall 补丁的一个子集。 POSIX.1e capabilities。Linux 内核中已经存在有 POSIX.1e capabilities 逻辑,但是 Linux 安全模块(LSM)把这个逻辑划分到了一个安全模块中。这样的修改使得不需要的用 户可以从他们的内核中把这个功能略去;也使得 capabilities 逻辑的开发可以脱离内核开发 获得更大的独立性。 LIDS。这是中国人谢华刚发起的项目。开始时作为一个入侵检测系统开发,后来逐渐 演变为使用访问控制系统的形式来进行入侵预防,它通过描述一个给定的程序可以访问哪些 文件来进行访问控制。同样的,LIDS 原来是作为一个内核补丁实现的并附带了一些管理工 具,现在已经使用 Linux 安全模块(LSM)重新实现为一个安全模块。(安全模块的方式是 可加载的??)
分享到:
收藏