В данном случае можно отобразить содержимое файла и запустить его на выполнение (файл является простейшим командным сценарием), но осуществить перезапись файла невозможно. Доступ для записи разрешен только владельцу файла (пользователь samuel
):
% id
uid=502(samuel) gid=502(samuel) groups=502(samuel),503(csl)
% echo hi > hello
% cat hello
hi
Менять режим доступа к файлу может только его владелец, а также суперпользователь. Если требуется разрешить всем пользователям запускать файл на выполнение, то это делается так:
% chmod o+k hello
% ls -l hello
-rwxr-x--x 1 samuel csl 3 Jan 22 16:38 hello
Обратите внимание на появление буквы x
в конце строки режима. Флаг о+x
команды chmod
означает добавление (+
) права выполнения (x
) для остальных пользователей (о
). Если требуется, к примеру, отнять право записи у группы, следует задать такой флаг: g-w.
Функция stat()
позволяет определить режим доступа к файлу программным путем. Она принимает два аргумента: имя файла и адрес структуры, заполняемой информацией о файле. Подробнее функция stat()
описана в приложении Б, "Низкоуровневый ввод-вывод". Пример ее использования показан в листинге 10.2.
#include
#include
int main(int argc, char* argv[]) {
const char* const filename = argv[1];
struct stat buf;
/* Получение информации о файле. */
stat(filename, &buf);
/* Если владельцу разрешена запись в файл,
отображаем сообщение. */
if (buf.st_mode & S_IWUSR)
printf("Owning user can write '%s'.\n", filename);
return 0;
}
Если запустить программу с файлом hello
, будет выдано следующее:
% ./stat-perm hello
Owning user can write 'hello'.
Константа S_IWUSR
соответствует праву записи для владельца. Для каждого бита в строке режима существует своя константа. Например, константа S_IRGRP
обозначает право чтения для группы, а константа S_IXOTH
— право выполнения для остальных пользователей. Если невозможно получить информацию о файле, функция stat()
возвращает -1 и помещает код ошибки в переменную errno
.
С помощью функции chmod()
можно менять режим доступа к существующему файлу. Функции передаётся имя файла и набор флагов, соответствующих устанавливаемым битам доступа. Например, в следующей строке файл hello
делается доступным для чтения и выполнения владельцу, а права группы и остальных пользователей отменяются:
chmod("hello", S_IRUSR | S_IXUSR);
Те же самые права доступа действуют и в отношении каталогов, но имеют несколько иной смысл. Если у пользователя есть право чтения каталога, то это означает разрешение на получение списка содержимого каталога. Право записи означает возможность добавлять и удалять файлы в каталоге. Пользователь, которому разрешена запись в каталог, может удалять из него файлы даже в том случае, когда у него нет права доступа к этим файлам. Право выполнения применительно к каталогам называется правом поиска. Пользователю. имеющему это право, разрешается входить в каталог и обращаться к его файлам. Если пользователь не может перейти в каталог, то ему не удастся получить доступ к находящимся в нем файлам независимо от их собственных прав доступа.
Подводя итог, рассмотрим, как ядро определяет, имеет ли процесс право обратиться к заданному файлу. Сначала выясняется, кем является пользователь, запустивший процесс: владельцем файла, членом его группы или кем-то другим. В зависимости от категории пользователя проверяется соответствующий набор битов чтения/записи/выполнения и на его основании принимается окончательное решение.[32]
Есть, правда, одно важное исключение: процессы, запускаемые пользователем root (его идентификатор равен нулю), всегда получают доступ к требуемым файлам независимо от их атрибутов.
10.3.1. Проблема безопасности: программы без права выполнения
Есть один хороший пример того, как обмануть неопытного пользователя, пытающегося защитить свои программы от несанкционированного запуска. Сброс бита выполнения файла еще не означает, что файл нельзя будет запустить. Дело в том, что при копировании файла копия переходит в распоряжение нового владельца. Как вы понимаете, ему не составляет никакого труда изменить права доступа к скопированному файлу и снова сделать его исполняемым. Вывод: защищайте программы не от несанкционированного запуска, а от несанкционированного копирования!
10.3.2. Sticky-бит