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