包罗cposix服务器的词条

  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()

包含cposix服务器的词条 包罗
cposix服务器的词条 行业资讯

复制一个ACL,并返回指向该ACL的指针

posix_acl_valid()

查抄一个访问控制列表是否有效

包含cposix服务器的词条 包罗
cposix服务器的词条 行业资讯

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相称时,就表现该进程可以访问该文件,从而直接返回。

  赞赏

  人赞赏

客户评论

我要评论