Права доступа к файлам в GNU/Linux #

Васильев Андрей Михайлович, 2022

Версии презентации

Истоки требований UNIX #

Первоначально UNIX разрабатывался для больших мейнфремов:

  • Большой и мощный вычислитель располагался в выделенном здании
  • Пользователи получали доступ к нему с помощью небольших клиентов — терминалов

Необходимо было обеспечить, чтобы большое количество пользователей одновременно могли выполнять свои задачи

Истоки DOS #

DOS разрабатывался как ОС для использования на персональном компьютере, для которого не нужны сложности, связанные с поддержкой работы нескольких пользователей одновременно, да и центральный процессор был упрощён

Многозадачная многопользовательская ОС #

Многопользовательская ОС #

Позволяет запускать процессы нескольким пользователям одновременно

  • Локальный пользователь с графическим интерфейсом
  • Удалённые пользователи с текстовым интерфейсом
  • Системные пользователи для работы служб

Многозадачная ОС #

ОС позволяет выполнять или эмитировать выполнение нескольких задач одновременно с помощью одного процессора

  • Достигается за счёт переключения процессора между активными задачами, быстрее чем человек может воспринять
  • У задач может быть приоритет в зависимости от которого происходит выбор очередной задачи для исполнения
  • Переключение контекста между задачами де-факто снижает эффективность работы вычислительной системы

Требования к многопользовательской ОС #

В многопользовательской среде необходимо решить следующие задачи

  • Каждый пользователь должен управлять своими данными, другие пользователи по умолчанию не должны иметь возможность их изменять
  • Данные пользователя в оперативной памяти также должны быть защищены от стороннего наблюдателя
  • Обычный пользователь не должен иметь возможности влиять на настройку системы, т.к. это может повредить другим пользователям этой системы
  • Пользователи должны иметь возможность работать над общими данными
  • В современном мире добавляется задача по защите данных в оперативной памяти от других процессов

Сфера разграничения прав #

Требования необходимо обеспечить для:

  • Файлов на файловой системе
  • Данных процессов в оперативной памяти

Проверка прав доступа обычного пользователя #

Проверка возможности чтения данных из файла

$ file /etc/shadow
/etc/shadow: regular file, no read permission
$ file /etc/passwd
/etc/passwd: ASCII text

Проверка возможности изменения содержимого файла

$ touch /etc/shadow
touch: невозможно выполнить touch для '/etc/shadow': Отказано в доступе
$ touch /tmp/data

Модель безопасности файлов #

В UNIX-мире для формирования модели безопасности используются

  • User ID, уникальный идентификатор пользователя
  • Group ID, уникальный идентификатор группы

Пользователь #

  • Каждому пользователю обязательно назначается его уникальный идентификатор, который не может быть передан другим пользователям
  • Каждому пользователю обязательно назначается «группа по умолчанию»
  • Пользователь также может входить в произвольное количество групп
flowchart LR user(Пользователь) uid[UID пользователя] gid[GID пользователя] groups[Группы пользователя] agroup[Audio GID, ...] user --> uid user --> gid user --> groups groups --> agroup groups --> gid

Файл на жёстком диске #

  • Файл принадлежит конкретному пользователю, его уникальному идентификатору
  • Файл относится к конкретной группе, её уникальному идентификатору
flowchart TB file[(Файл на жёстком диске)] fuid[UID владельца] fgid[GID владельца] file --> fuid file --> fgid user(Пользователь) uid[UID пользователя] gid[GID пользователя] groups[Группы пользователя] agroup[Audio GID, ...] user --> uid user --> gid user --> groups groups --> agroup groups --> gid

Процессы #

  • Каждый процесс, запущенный в рамках GNU/Linux, запускается от имени конкретного пользователя
  • Процесс обладает теми же возможностями, что и обычный пользователь
  • Де-факто человек всегда запускает новые процессы, чтобы реализовать возможности компьютерного пользователя, с правами конкретной учётной записи (account)
  • Процесс может взаимодействовать только с теми файлами, для которых есть доступ у соответствующего пользователя
flowchart TB process[Процесс] pid[PID идентификатор] user(Пользователь) uid[UID пользователя] gid[GID пользователя] groups[Группы пользователя] process --> user process --> pid user --> uid user --> gid user --> groups

Права текущего пользователя #

Для определения прав пользователя можно использовать приложение id

$ id --help
Использование: id [КЛЮЧ]… [ПОЛЬЗОВАТЕЛЬ]
Выводит информацию о пользователе и группе для заданного
ПОЛЬЗОВАТЕЛЯ, или о текущем пользователе (если ничего не указано).
$ id
uid=1001(andrey) gid=1001(andrey) группы=1001(andrey),27(sudo)
  • uid — уникальный идентификатор текущего пользователя и назначенное ему имя
  • gid — уникальный идентификатор основной группы пользователя и её имя
  • groups — список дополнительных групп, которым принадлежит пользователь

Информация о пользователях #

Система получает информацию о пользователях через подсистемы NSS (Name Service Switch) и PAM (Pluggable Authencitation Modules). Первый описывает источники данных для имён (пользователей, групп, доменных имён и т.д.), а второй предоставляет инфраструктуру для авторизации пользователей

Настройка источников данных для NSS находится в файле /etc/nsswitch.conf

Информация о пользователях для локальной установки содержится в файлах

  • /etc/passwd содержит описание локальных пользователей
  • /etc/group содержит список групп и входящих в них пользователей
  • /etc/shadow содержит пароли локальных пользователей

Для наполнения информационных баз могут быть использованы сетевые службы, например LDAP (Lightweight Directory Access Protocol), NIS (Network Information Services) или AD (Active Directory)

Права доступа к файлам #

Создадим файл и проверим права доступа

$ touch test
$ ls -l test
-rw-r--r-- 1 andrey andrey 0 окт  5 14:55 test
  • первый столбец описывает атрибуты файла
  • второй столбец — количество физических ссылок
  • третий столбец — владелец файла
  • четвёртый столбец — группа файла

Атрибуты файлов #

  • первый элемент описывает тип файлов
  • далее группами по 3 символа описываются права доступа к файлу

Типы файлов #

  • - — обыкновенный файл
  • b — специальный файл блочного устройства, например жёсткого диска
  • c — специальный файл символьного устройства, например клавиатуры или терминала
  • d — каталог
  • l — символическая ссылка, не имеет собственных прав доступа
  • n — сетевой файл
  • p — файл FIFO для организации взаимодействия потоков
  • s — файл socket для организации псевдосетевого взаимодействия

Права доступа #

Последняя часть атрибутов описывает права доступа

Права для файлов #

  • r позволяет читать содержимое файлов
  • w позволяет переписывать содержимое файлов, но не позволяет их удалять или переименовывать
  • x позволяет выполнять запуск файла, скриптовые файлы должны быть также доступны на чтение

Права для каталогов #

  • r просматривать содержимое каталогов, если ещё установлен флаг x
  • w позволяет создавать, удалять, переименовывать файлы в каталоге, если ещё установлен флаг x
  • x позволяет пользователю заходить внутрь каталога

Порядок прав #

Права записываются в порядке: владелец-группа-остальные

  • -rw-r--r--
    • rw-, владелец может читать и записывать в файл
    • r--, группа может считывать из файла
    • r--, все остальные могут считывать из файла
  • -rwx------
    • rwx, владелец может выполнять любые операции
    • ---, все остальные, включая группу не могут ничего делать с файлом
  • lrwxrwxrwx — файл является ссылкой, которую могут прочитать все, но работа с файлом будет происходит по его эффективным разрешениям

Вычисление конкретных прав #

  • Если UID у пользователя и файла совпадают, тогда применяются права владельца
  • Если пользователь принадлежит к группе, к которой принадлежит и файл, то применяются права группы
  • Если ничего выше не сработало, то применяются права для остальных
flowchart TB file[(Файл на жёстком диске)] fuid[UID владельца] fgid[GID владельца] file --> fuid file --> fgid user(Пользователь) uid[UID пользователя] gid[GID пользователя] groups[Группы пользователя] agroup[Audio GID, ...] user --> uid user --> gid user --> groups groups --> agroup groups --> gid

Изменение прав доступа #

  • Для изменения прав доступа к файлу или каталогу применяется приложение chmod
  • Изменить права на файл может только его владелец
  • Для описания прав можно воспользоваться цифровой или буквенной нотацией

Использование цифровой нотации #

Восьмеричное Бинарное Режим
0 000
1 001 –x
2 010 -w-
3 011 -wx
4 100 r–
5 101 r-x
6 110 rw-
7 111 rwx

Применение восьмеричных чисел #

С помощью трёх восьмеричных чисел можно описать права для владельца, группы и остальных

$ > test
$ ls -l test
-rw-r--r-- 1 andrey andrey 0 окт  5 15:46 test
$ chmod 600 test
$ ls -l test
-rw------- 1 andrey andrey 0 окт  5 15:46 test

С помощью одной команды мы забрали права у группы и остальных, а также удостоверились, что владелец может читать и записывать в файл

Наиболее часто используемые цифры: 7, 6, 5, 4 и 0

Буквенная нотация #

При описании буквенной нотации надо придерживаться следующего формата:

[ugoa...][[-+=][perms...]...
  • На первом месте указывается для кого надо применить права. Если не указать, то применяется для всех
  • Затем указывается что мы хотим сделать с правами
    • - убрать права
    • + выдать права
    • = установить права
  • В конце указывается список разрешений
  • Можно указать несколько изменений через запятую

Изменение прав с буквенной нотацией #

$ > words
$ ls -l words
-rw-r--r-- 1 andrey andrey 0 окт  5 16:03 words
$ chmod u+x words
$ ls -l words
-rwxr--r-- 1 andrey andrey 0 окт  5 16:03 words
$ chmod go-r words
$ ls -l words
-rwx------ 1 andrey andrey 0 окт  5 16:03 words
  • Числовая нотация обычно короче
  • Числовая нотация непонятна «неинициированным»
  • Буквенная нотация позволяет изменять только лишь нужные части прав доступа, не изменяя остальные

Права файлов по умолчанию #

Пользователь и владелец #

Создаваемому файлу присваивается UID пользователя, от имени которого была создан данный файл

Группой создаваемого файла становится GID группы пользователя по умолчанию

Права по умолчанию #

Права файла зависят от режима, который контролируется с помощью umask

$ help umask
umask: umask [-p] [-S] [режим]
    Отображение или указание маски режима для файлов.

Режим описывается с помощью четырёх восьмибитных цифр

Формат режима umask #

  • Первая цифра описывает специальные права
  • Вторая по четвёртую цифру описывает права для владельца, группы и остальных
$ umask
0022
$ > test
$ ls -l test
-rw-r--r-- 1 andrey andrey 0 окт  5 16:24 test
$ umask 0002
$ > test-two
$ ls -l test-two
-rw-rw-r-- 1 andrey andrey 0 окт  5 16:24 test-two

Режим де-факто описывает битовую маску, которая указывает какие биты следует отбросить из режимов

  • Для файла базовым режимом является 666
  • Для каталогов базовым режимом является 777

Создание нового файла по шагам #

Предположим, что пользователь выполняет команду на создание нового файла

  • По умолчанию базовый режим для файла 666 или 110110110 в битовом представлении
  • К режиму применяется маска пользователя 0022 или 000000010010 в битовом представлении
  • Все биты, равные 1 в базовом режиме заменяются на 0, если в маске тоже стоит 1:
       110110110
    000000010010
    =  110100100
  • Результирующий режим 110100100 или 644 в восьмеричном представлении.

Специальные права umask #

setuid bit, 4000, u+s #

Если он установлен у исполняемого файла, тогда при запуске процесса из этого файла, он будет запущен с правами пользователя, которому принадлежит исполняемый файл. Обычно применяется для небольшого количества программ, которые должен запускать обычный пользователь, но для её работы нужны повышенные привилегии

setgit bit, 2000, g+s #

Если флаг установлен у каталога, то новые файлы созданные в этом каталоге будут принадлежать к группе данного каталога, а не основной группе пользователя её создавшей. Применяется для создания общих каталогов между пользователями

sticky bit, 1000, +t #

Если флаг установлен у каталога, то препятствует переменованию или удалению файлов в каталоге, если пользователь не является их владельцем или владельцем каталога

Смена активного пользователя #

Для выполнения различных команд необходимо иметь возможность выполнять команды от имени другого пользователя, например суперпользователя

  • Открыть новую сессию от имени нового пользователя
  • Воспользоваться приложениями su или sudo

Первая опция почти никогда не используется, т.к. последние две позволяют выполнять действия удобным образом

Приложение su #

Приложение позволяет либо выполнить одну команду от имени другого пользователя, либо открыть интерактивную оболочку с его правами

$ su --help
Usage:
 su [options] [-] [<user> [<argument>...]]
  • -, -l, --login указывает, что необходимо заново инициализировать окружение для целевого пользователя
  • user имя целевого пользователя, root если не было указано

Получение прав суперпользователя:

$ su -
Пароль:
#

Необходимо интерактивно ввести пароль суперпользователя

Работа от имени суперпользователя #

Работать с правами суперпользователя удобно: система не мешает своими сообщениями, если что-то пошло не так, все команды завершаются успешно

Однако при таком подходе снимаются все защитные механизмы, которые нужны, чтобы предотвратить необдуманные изменения

Запуск одной команды #

С помощью флага -c можно передать нужную команду на исполнение

$ su -c 'ls /root/*'
Пароль:
/root/empty-file
$

Расширение пути будет выполнено с правами суперпользователя

Использование sudo #

Приложение sudo работает во многих аспектах как команда su, однако отличается наличием конфигурационного файла

  • Для каждого пользователя может быть указан список команд, которые он может выполнить от имени другого пользователя
  • Для части команд запрос пароля может быть отключён
  • Для запуска команды может потребоваться как пароль текущего пользователя, так и пароль целевого пользователя
  • Конфигурация находится в файле /etc/sudoers/ и каталоге /etc/sudoers.d
  • Если для выполнения команд требуется ввод пароля суперпользователя, тогда его необходимо будет ввести 1 раз в 5 минут или до истечения сессии

Настройка sudo в ALT Linux #

В ALT Linux создаваемый пользователь не указан в конфигурации sudo и не может ей пользоваться, однако там находится группа wheel

Для добавления вашего пользователя в группу wheel выполните

  1. Зайдите в интерактивную сессию под пользователем root
  2. Выполните добавление: usermod -a -G wheel USER, где USER — имя вашей учётной записи
  3. Закройте сессии от имени суперпользователя и пользователя, затем подключитесь заново. При следующем входе пользователю присвоятся корректные группы

Дополнительно подумайте как можно было бы сделать это действие без интерактивной сессии

После такой конфигурации пользователь сможет с помощью sudo выполнять любые команды

Подсистема control в ALT Linux #

В ALT Linux предприняты дополнительные защитные меры от доступа к критичным службам, это реализовано в подсистеме control

По умолчанию для доступа к приложениям, повышающим привилегии пользователя, необходимо входить в группу wheel

Суперпользователь может изменить данную политику

Использование sudo #

$ sudo ls /root
[sudo] пароль для andrey:
empty-file
$ sudo ls /root
empty-file
  • sudo ls /root — запустить ls с правами root для просмотра каталога /root
  • sudo -l — узнать какие привилегии доступны текущему пользователю
  • sudo -i [-u user] — запустить интерактивную сессию под целевым пользователем
  • sudo -K — завершить сессию

Изменение владельцев файлов #

Для изменения владельца и группы для файлов используется приложение chown

> chown --help
Использование: chown [ПАРАМЕТР]… [ВЛАДЕЛЕЦ][:[ГРУППА]] ФАЙЛ…
       или:    chown [ПАРАМЕТР]… --reference=ОФАЙЛ ФАЙЛ…
Смена владельца и группы указанного ФАЙЛА на ВЛАДЕЛЬЦА и/или ГРУППУ.

Примеры указания нового владельца

Аргумент Результат
bob изменить только владельца у целевого файла на пользователя bob
bob:users изменить владельца на bob, изменить группу на users
:admins изменить только группу на admin, владелец не меняется
bob: изменить владельца на bob, изменить группу на группу по умолчанию пользователя bob

Примеры изменения владельца #

Рассмотрим следующую ситуацию

$ touch source
$ ls -l source
-rw-r--r-- 1 andrey andrey 0 окт  6 17:38 source
$ su
Password:
# cp source destination
# exit
$ ls -l destination
-rw-r--r-- 1 root root 0 окт  6 17:38 destination
$ su
Password:
# chown nobody: destination
# exit
$ ls -l destination
-rw-r--r-- 1 nobody nobody 0 окт  6 17:38 destination

Смена пароля пользователя #

Для смены пароля пользователя можно воспользоваться приложением passwd

$ passwd --help
Использование: passwd [параметры] [ПОЛЬЗОВАТЕЛЬ]

Обычный пользователь может сменить только свой пароль

Суперпользователь может изменить пароль любого пользователя

Управление списком пользователей #

Для управления пользователями и группами можно воспользоваться следующими приложениями

  • useradd, приложение для добавления пользователя в систему
  • userdel, приложение для удаления пользователя из системы
  • usermod, приложение для настройки пользователя
  • groupadd, приложение для добавления групп
  • groupdel, приложение для удаления групп
  • groupmod, приложение для настройки групп

Списки прав доступа #

Access Control Lists, ACLs, — расширенные списки доступа к файлам

Иногда прав доступа в классической схеме недостаточно, в этом случае можно применить расширенные списки прав доступа

  • getfactl — приложение для получение текущего списка прав
  • setfactl — управление списком прав доступа