2

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

4

2 回答 2

2

传统上,Linux 程序不太做解释性访问控制。有两种情况。

案例1,简单案例。一个文件有一个 acl(或只是模式)。某些用户在他的用户/组集下运行程序,内核根据模式/acl 允许或拒绝。全部做完。

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

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

于 2011-09-24T22:44:49.157 回答
1

如果我误解了这个问题,我深表歉意,但希望您会发现这对您有所帮助:

一些acl 文档除外:

以下函数检索和操作 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 条目的限定符值是用户 ID。

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 示例和参考 man acl

POSIX 访问控制列表

statacl

于 2011-09-24T22:20:15.970 回答