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