2.3.2ACL在VFS中的实现
在Linux中,ACL是根据POSIX标准实现的,其数据布局和POSIX标准规定的数据布局雷同,而且界说了多少与ACL相干的操纵,下面分别举行先容。
2.3.2.1POSIX标准中的ACL
在POSIX标准中,用posix_acl布局体来表现一个文件的ACL属性,其界说在include/linux/posix_acl.h中,具体界说如下所示:
对于该布局体,各紧张字段寄义如表2-3所示:
表2-3posix_acl中紧张字段的寄义
范例
字段
寄义
atomic_t
a_refcount
表现该ACL的引用计数
unsignedint
a_count
访问控制列表中的访问控制列表项的数量
structposix_acl_entry
a_entries
指向具体访问控制列表项的数组
如上表所示,a_entries变量存放了ACL中的表项,在POSIX标准中,访问控制列表表项用posix_acl_entry布局体表现,具体界说如下所示:
对于该布局体,其各字段如下表2-4所示:
表2-4posix_acl_entry中紧张字段的寄义
范例
字段
寄义
short
e_tag
要限定的实体的范例
unsignedshort
e_perm
授予该实体的访问权限,在posix中界说了三个宏:ACL_READ、ACL_WRITE、ACL_EXECUTE分别表现读、写、实行
unsignedint
e_id
相应的实体的id,假如e_tag为user,则该id表现uid,假如e_tag为group,则其表现gid
对于e_tag字段,POSIX标准预界说了六种实体范例:
表2-5posix标准中实体范例
实体范例
寄义
ACL_USER_OBJ
代表文件属主的ACL表项
ACL_USER
代表文件属主之外的其他单个用户的ACL表项
ACL_GROUP_OBJ
代表文件所属用户组的ACL表项
ACL_GROUP
代表其他用户组的ACL表项
ACL_OTHER
代表除了上述各项之外的其他用户的ACL表项
ACL_MASK
代表除了ACL_USER_OBJ和ACL_OTHER之外的ACL表项所答应的最大权限
2.3.2.2ACL在VFS中的相干操纵
对于Linux,着实现的POSIX标准中界说的ACL相干的操纵如表2-6所示:
表2-6POSIX标准规定的ACL相干的操纵
函数所属文件
函数名称
函数功能
posix_acl.h
posix_acl_dup()
将访问控制列表的引用计数加1
posix_acl_release()
开释ACL所占据的空间
acl_by_type()
根据ACL的范例得到文件相应的ACL属性。POSIX标准界说了两种范例:ACL_TYPE_ACCESS表现用于访问控制的ACL;ACL_TYPE_DEFAULT只能由于目次,表现目次的默认ACL
get_cached_acl()
根据指定的范例得到文件的ACL属性,并将ACL的引用计数加1
get_cached_acl_rcu()
通过调用rcu_dereference()获取受RCU掩护的指向ACL的指针
set_cached_acl()
通过调用rcu_assign_pointer()函数来设置文件的ACL属性,并开释原来的ACL所占据的空间
forget_cached_acl()
假如指定文件的指定范例的ACL属性位于高速缓存,则开释它
forget_all_cached_acl()
开释文件全部的ACL属性
cache_no_acl()
用于将文件对应的inode中的ACL属性字段清空
posix_acl.c
posix_acl_init()
根据指定的参数初始化ACL
posix_acl_alloc()
根据参数为ACL分配相应的存储空间,并举行初始化
posix_acl_clone()
复制一个ACL,并返回指向该ACL的指针
posix_acl_valid()
查抄一个访问控制列表是否有效
posix_acl_equiv_mode()
判定ACL是否可以被传统的文件模式权限位所更换
posix_acl_from_mode()
创建一个代表文件权限模式位的ACL
posix_acl_permission()
根据ACL判定当进步程是否具有对指定节点的指定权限
posix_acl_create_masq()
根据创建文件时指定的文件权限去修改相应的ACL表项
posix_acl_chmod_masq()
该函数用于在调用chmod()时修改ACL
posix_acl_create()
该函数用于根据指定文件的权限和ACL属性来创建一个新的ACL,并开释原来的ACL
posix_acl_chmod()
在调用chmod()时,为文件创建一个新的ACL
如表2-6所示,此中最紧张的函数为posix_acl_permission()函数,该函数用来查抄当进步程是否具有对指定文件的访问权限,如有则返回0,反之返回错误码。下面重要针对该函数从源码上举行分析,其函数头如下所示:
该函数包罗三个参数:inode参数指定了该函数要查抄的目标文件;acl参数指定了该目标文件的访问控制列表;want参数指定了要查抄的权限。
图2-15posix_acl_permission()函数调用流程图
如图2-15所示,posix_acl_permission()函数实际上是通过FOREACH_ACL_ENTRY()宏来遍历ACL的列表项,并根据列表项中指定的ACL的实体范例举行差别的处理惩罚。在对进程组举行操纵时,调用了in_group_p()函数,该函数用于判定组id是否便是当进步程的fsgid,假如不等,接着判定该gid是否位于进程的附加组中。
图2-16in_group_p()函数调用流程图
如图2-16所示,in_group_p()函数依次调用了三个函数:current_cred()宏用于获取当进步程的cred;gid_eq()函数用于判定两个gid是否相称,这里用于判定当进步程的fsgid和指定ACL表项中的gid是否相称,假如相称,则直接返回,反之调用groups_search()函数,该函数采取折半查找法在当进步程的fsgid附加组中查找指定的组。in_group_p()函数在乐成实行时返回1,反之返回0。为什么当指定ACL表项中gid和进程的fsuid相称时,就返回真呢?究竟上,在Linux中,每个进程都有四种范例的ID:真实的用户/组id,该ID标识了进程的真正全部者;有效的用户/组ID,该ID用于判定进程实行各种操纵的权限;文件体系用户/组ID,该ID用于标识对文件体系举行访问查抄的用户或组,从而将对文件体系的权限限定在指定的ID上;生存的设置用户/组ID,该ID用于还原有效用户。以是在in_group_p()函数中,当gid与当进步程的fsuid相称时,就表现该进程可以访问该文件,从而直接返回。
赞赏
人赞赏
我要评论