Как проверить, существует ли UID в ACL в Linux? - PullRequest
2 голосов
/ 25 сентября 2011

Мне нужно написать программу, часть которой включает проверку того, существует ли идентификатор пользователя, выполняющего программу, в файле ACL файла, который использует программа. То есть эта программа записывает данные в файл, и только пользователям, чьи ID и привилегии введены в ACL, разрешено делать это. Как программа может проверить это? Я знаю, что мне нужно использовать функцию getresid, чтобы получить RUID исполняемого процесса, но как мне проверить это значение по всем значениям, хранящимся в ACL? Пожалуйста, помогите мне!

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

Традиционно программы на linux не выполняют интерпретационный контроль доступа.Есть два случая.

Случай 1, простой случай.Файл имеет ACL (или только режимы).Некоторые пользователи запускают программу под своим набором пользователя / группы, и ядро ​​либо разрешает, либо запрещает, основываясь на режимах / acl.Все сделано.

Дело 2, трудное дело.Программа запускается от имени пользователя root, но хочет работать от имени другого пользователя.Таким образом, он вызывает setuid / setgid, чтобы «стать» этим пользователем, затем выполняет операцию (например, открытие файла), а затем вызывает восстановление себя в root-itude впоследствии.

Однако, основываясь на ваших комментариях кОтвет Чоуна, я думаю, что вы на всякий случай 1. Пользователь foo запускает программу, поэтому kernel сделает всю работу за вас.

1 голос
/ 25 сентября 2011

Если я неправильно понял вопрос, я прошу прощения, но, надеюсь, вы найдете это полезным:

Исключение из некоторой документации 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 представляет собой идентификатор пользователя.

Значение квалификатора для записи ACL_GROUP является идентификатором группы. Значение квалификатора для любой записи * _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::--- 

затем, чтобы получить идентификатор от имени (не проверено, но должно быть близко):

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

Еще несколько ресурсов:

acl / facl примеры и ссылки человек acl

Списки контроля доступа POSIX

statacl

...