DAC Discretionary Access Control
传统的Linux安全就是DAC,
Traditional Linux security is based on a Discretionary Access Control (DAC) policy,
Linux文件系统权限检查就是这个DAC。通过uid/gid,文件系统的UGO来检查。
Linux上还有另外一个权限检查,就是Mandatory Access Control (MAC)
LSM Linux Security Modules是的MAC的一个实现。
MAC位于DAC之后,DAC检查通过后,在进行MAC的检查。
SELinux和AppArmor是基于LSM框架实现的一套MAC。
LSM通过一些列内核hook点,来实现功能。比如
int inode_permission(struct mnt_idmap *idmap, struct inode *inode, int mask) { retval = do_inode_permission(idmap, inode, mask); if (retval) return retval; return security_inode_permission(inode, mask); }
security_inode_permission这个就是LSM的一个入口。
static inline int do_inode_permission(struct mnt_idmap *idmap, struct inode *inode, int mask) { if (unlikely(!(inode->i_opflags & IOP_FASTPERM))) { if (likely(inode->i_op->permission)) return inode->i_op->permission(idmap, inode, mask); /* This gets set once for the inode lifetime */ spin_lock(&inode->i_lock); inode->i_opflags |= IOP_FASTPERM; spin_unlock(&inode->i_lock); } return generic_permission(idmap, inode, mask); } int generic_permission(struct mnt_idmap *idmap, struct inode *inode, int mask) { int ret; /* * Do the basic permission checks. */ ret = acl_permission_check(idmap, inode, mask); if (ret != -EACCES) return ret; if (S_ISDIR(inode->i_mode)) { /* DACs are overridable for directories */ if (!(mask & MAY_WRITE)) if (capable_wrt_inode_uidgid(idmap, inode, CAP_DAC_READ_SEARCH))
这个genric_permission,就是属于DAC。
LSM的代码全部位于security下面。
参考:
Linux DAC 权限管理详解
https://blog.csdn.net/pwl999/article/details/110878563
7.3 About Discretionary and Mandatory Access Control Policies
https://docs.oracle.com/en/operating-systems/oracle-linux/6/porting/section_jsf_zpm_wm.html
Linux Security Modules
https://en.wikipedia.org/wiki/Linux_Security_Modules