Книга: Операционная система UNIX
Права доступа
Права доступа
Как уже обсуждалось в предыдущей главе, каждый процесс имеет четыре пользовательских идентификатора — UID, GID, EUID и EGID. В то время как UID и GID определяют реального владельца процесса, EUID и EGID определяют права доступа процесса к файлам в процессе выполнения. В общем случае реальные и эффективные идентификаторы эквивалентны. Это значит, что процесс имеет те же привилегии, что и пользователь, запустивший его. Однако, как уже обсуждалось выше, возникают ситуации, когда процесс должен получить дополнительные привилегии, чаще всего — привилегии суперпользователя. Это достигается установкой битов SUID и SGID. Примером такого процесса может служить утилита passwd(1), изменяющая пароль пользователя.
Права доступа к файлу могут быть изменены с помощью системных вызовов chmod(2) и fchmod(2):
#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fildes, mode_t mode);
Значение аргумента mode определяет устанавливаемые права доступа и дополнительные атрибуты (такие как SUID, SGID и Sticky bit), и создается путем логического объединения различных флагов, представленных в табл. 2.14. Вторая колонка таблицы содержит восьмеричные значения для девяти битов прав доступа (чтение, запись и выполнение для трех классов доступа) и трех битов дополнительных атрибутов.
Таблица 2.14. Флаги аргумента mode
Флаг | Биты | Значение |
---|---|---|
S_ISUID |
04000 |
Установить бит SUID |
S_ISGID |
020#0 |
Установить бит SGID, если # равно 7, 5, 3 или 1. Установить обязательное блокирование файла, если # равно 6, 4, 2 или 0 |
S_ISVTX |
01000 |
Установить Sticky bit |
S_IRWXU |
00700 |
Установить право на чтение, запись и выполнение для владельца-пользователя |
S_IRUSR |
00400 |
Установить право на чтение для владельца-пользователя |
S_IWUSR |
00200 |
Установить право на запись для владельца-пользователя |
S_IXUSR |
00100 |
Установить право на выполнение для владельца-пользователя |
S_IRWXG |
00070 |
Установить право на чтение, запись и выполнение для владельца-группы |
S_IRGRP |
00040 |
Установить право на чтение для владельца-группы |
S_IWGRP |
00020 |
Установить право на запись для владельца-группы |
S_IXGRP |
00010 |
Установить право на выполнение для владельца-группы |
S_IRWXO |
00007 |
Установить право на чтение, запись и выполнение для остальных пользователей |
S_IROTH |
00004 |
Установить право на чтение для остальных пользователей |
S_IWOTH |
00002 |
Установить право на запись для остальных пользователей |
S_IXOTH |
00001 |
Установить право на выполнение для остальных пользователей |
Некоторые флаги, представленные в таблице, уже являются объединением нескольких флагов. Так, например, флаг S_RWXU
эквивалентен S_IRUSR | S_IWUSR | S_IXUSR
. Значение флага S_ISGID зависит от того, установлено или нет право на выполнение для группы (S_IXGRP). В первом случае, он будет означать установку SGID, а во втором — обязательное блокирование файла.
Для иллюстрации приведем небольшую программу, создающую файл с полными правами доступа для владельца, а затем изменяющую их. После каждой установки прав доступа в программе вызывается библиотечная функция system(3S), позволяющая запустить утилиту ls(1) и отобразить изменение прав доступа и дополнительных атрибутов.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
main() {
int fd;
/* Создадим файл с правами rwx------ */
fd = creat("my_file", S_IRUSR | S_IWUSR | S_IXUSR);
system("ls -l my_file");
/*Добавим флаг SUID */
fchmod(fd, S_IRWXU | S_ISUID);
/* Установим блокирование записей файла */
fchmod(fd, S_IRWXU | S_ISUID | S_ISGID);
system("ls -l my_file");
/* Теперь установим флаг SGID */
fchmod(fd, S_IRWXU | S_ISUID | S_ISGID | S_IXGRP);
system("ls -l my_file");
}
В результате запуска программы на выполнение, получим следующий вывод:
$ a.out
-rwx------ 1 andy user 0 Jan 6 19:28 my_file
-rws------ 1 andy user 0 Jan 6 19:28 my_file
-rws--1--- 1 andy user 0 Jan 6 19:28 my_file
-rws--s--- 1 andy user 0 Jan 6 19:28 my_file
- Права для выполнения резервного копирования
- 9.4. Права доступа к squid
- Как не запутаться в разрешениях доступа к файлам?
- Можно ли копировать права доступа вместе с данными?
- Как узнать, есть ли у меня права администратора?
- 4.1. Права доступа
- 4.1.5. Права доступа к ссылкам
- 7.3. Права доступа
- 8.4.3. Права доступа
- Глава 11 Права доступа и ID пользователей и групп
- 1.1.1. Файлы и права доступа
- Владелец файла и права доступа