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

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

2020

Истоки требований 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, уникальный идентификатор группы

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

  • Каждому пользователю обязательно назначается его уникальный идентификатор, который не может быть передан другим пользователям
  • Каждому пользователю обязательно назначается «группа по умолчанию»
  • Пользователь также может входить в произвольное количество групп

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

  • Файл принадлежит конкретному пользователю, его уникальному идентификатору
  • Файл относится к конкретной группе, её уникальному идентификатору

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

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

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

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

Система получает информацию о пользователях через подсистему PAM: Pluggable Authencitation Modules

С её помощью система может получать информацию

  • Из локальных файлов
  • Из сетевых каталогов NIS или AD

Локальная конфигурация

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

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

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

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

$ 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-- — владелец может читать и записывать в файл, группа может считывать из файла, все остальные могут считывать из файла
  • -rwx------ — владелец может выполнять любые операции, все остальные, включая группу не могут ничего делать с файлом
  • lrwxrwxrwx — файл является ссылкой, которую могут прочитать все, но работа с файлом будет происходит по его эффективным разрешениям

Применение прав

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

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

  • Для изменения прав доступа к файлу или каталогу применяется приложение 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

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

setuid bit, 4000, u+s

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

setgit bit, 2000, g+s

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

sticky bit, 1000, +t

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

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

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

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

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

Приложение su

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

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

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

$ su -
Пароль:
#

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

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

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

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

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

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

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

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

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

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

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

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

Настройка sudo в GNU/Debian

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

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

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

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

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

Использование 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
$ sudo cp source destination
[sudo] пароль для andrey:
$ ls -l destination
-rw-r--r-- 1 root root 0 окт  6 17:38 destination
$ sudo chown nobody: destination
$ ls -l destination
-rw-r--r-- 1 nobody nogroup 0 окт  6 17:38 destination

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

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

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

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

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

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

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

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