В данном случае можно отобразить содержимое файла и запустить его на выполнение (файл является простейшим командным сценарием), но осуществить перезапись файла невозможно. Доступ для записи разрешен только владельцу файла (пользователь 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.

Листинг 10.2. (stat-perm.c) Проверка того, имеет ли владелец право записи в файл

#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 (его идентификатор равен нулю), всегда получают доступ к требуемым файлам независимо от их атрибутов.

<p>10.3.1. Проблема безопасности: программы без права выполнения</p>

Есть один хороший пример того, как обмануть неопытного пользователя, пытающегося защитить свои программы от несанкционированного запуска. Сброс бита выполнения файла еще не означает, что файл нельзя будет запустить. Дело в том, что при копировании файла копия переходит в распоряжение нового владельца. Как вы понимаете, ему не составляет никакого труда изменить права доступа к скопированному файлу и снова сделать его исполняемым. Вывод: защищайте программы не от несанкционированного запуска, а от несанкционированного копирования!

<p>10.3.2. Sticky-бит</p>
Перейти на страницу:

Похожие книги