如何检查Linux中的ACL是否存在UID?

时间:2011-09-24 21:16:52

标签: linux acl uid

我需要编写一个程序,其中一部分涉及检查执行程序的人的用户ID是否存在于程序使用的文件的ACL文件中。也就是说,该程序写入文件,只允许在ACL中输入ID和权限的用户这样做。该程序如何检查这个?我知道我需要使用getresid函数来获取执行进程的RUID,但是如何针对存储在ACL中的所有值检查此值?请帮帮我!

2 个答案:

答案 0 :(得分:2)

传统上,linux程序不会非常依赖解释性访问控制。有两种情况。

案例1,案例简单。一个文件有一个acl(或只是模式)。一些用户在他的用户/组集下运行程序,并且内核基于modes / acl允许或拒绝。一切都完成了。

案例2,案例难题。程序以root身份运行,但希望代表其他用户运行。因此,它调用setuid / setgid来“成为”该用户,然后执行操作(比如打开文件),然后调用以将其自身恢复为root-itude。

但是,根据您对chown答案的评论,我认为您只是以防万一。用户foo运行该程序,因此内核为您完成所有工作。

答案 1 :(得分:1)

如果我误解了我道歉的问题,但希望你会发现这有用:

某些 acl documentation

以下函数检索和操作ACL条目:

acl_copy_entry()
acl_create_entry()
acl_delete_entry()
acl_first_entry()
acl_get_entry()

以下函数检索和操作ACL条目中的字段:

acl_add_perm() 
acl_clear_perm()
alc_delete_perm() 
acl_get_permset() 
acl_get_qualifier() 
acl_get_tag_type() 
acl_set_permset() 
acl_set_qualifier() 
acl_set_tag_type()

...

  

ACL条目

     

ACL条目包含以下字段:

     

标记类型(在acl.h头文件中定义):

     

ACL_USER_OBJ - 拥有用户条目。

     

ACL_GROUP_OBJ - 拥有组条目。

     

ACL_USER - 其他用户的条目。

     

ACL_GROUP - 其他组的条目。

     

ACL_OTHER_OBJ - 未包含在其他条目中的所有用户和组的条目。

     

标记限定符 - ACL_USER条目的限定符值是用户标识。

     

ACL_GROUP条目的限定符值是组ID。    任何* _OBJ条目的限定符值为NULL。

来自acl_update.c

/* 
Find the the ACL entry in 'acl' corresponding to the tag type and
   qualifier in 'tag' and 'id'. Return the matching entry, or NULL
   if no entry was found. */

static acl_entry_t
findEntry(acl_t acl, acl_tag_t tag, id_t qaul)
{
    acl_entry_t entry;
    acl_tag_t entryTag;
    uid_t *uidp;
    gid_t *gidp;
    int ent, s;

    for (ent = ACL_FIRST_ENTRY; ; ent = ACL_NEXT_ENTRY) {
        s = acl_get_entry(acl, ent, &entry);
        if (s == -1)
            errExit("acl_get_entry");

        if (s == 0)
            return NULL;

        if (acl_get_tag_type(entry, &entryTag) == -1)
            errExit("acl_get_tag_type");

        if (tag == entryTag) {
            if (tag == ACL_USER) {
                uidp = acl_get_qualifier(entry);
                if (uidp == NULL)
                    errExit("acl_get_qualifier");

                if (qaul == *uidp) {
                    if (acl_free(uidp) == -1)
                        errExit("acl_free");
                    return entry;
                } else {
                    if (acl_free(uidp) == -1)
                        errExit("acl_free");
                }

            } else if (tag == ACL_GROUP) {
                gidp = acl_get_qualifier(entry);
                if (gidp == NULL)
                    errExit("acl_get_qualifier");

                if (qaul == *gidp) {
                    if (acl_free(gidp) == -1)
                        errExit("acl_free");
                    return entry;
                } else {
                    if (acl_free(gidp) == -1)
                        errExit("acl_free");
                }

            } else {
                return entry;
            }
        }
    }
}

我认为你不需要检查特定文件的ACL,但如果我错了,这里有一些信息:

$ getfacl myFile 
# file: myFile
# owner: jon
# group: people
user::rwx
user:foo:rwx
group::rwx
mask::rwx
other::--- 

然后从名称中获取一个uid(未经测试但应该关闭):

$ grep /etc/passwd `getfacl myFile | grep owner | split -d":" -f2` | egrep -o "[0-9]+"

更多资源:

acl/facl examples and reference man acl

POSIX Access Control Lists

statacl