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

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

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-мире для формирования модели безопасности используются

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

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

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

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

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

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

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

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

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

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

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

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

$ touch test
$ ls -l test
-rw-r--r-- 1 andrey andrey 0 окт  5 14:55 test

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

Типы файлов

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

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

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

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

Порядок прав

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

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

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

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

Восьмеричное Бинарное Режим
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

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

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

setuid bit, 4000, u+s

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

setgit bit, 2000, g+s

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

sticky bit, 1000, +t

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

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

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

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

Приложение su

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

$ su --help
Usage:
 su [options] [-] [<user> [<argument>...]]

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

$ su -
Пароль:
#

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

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

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

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

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

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

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

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

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

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

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

Настройка 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

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

Для изменения владельца и группы для файлов используется приложение 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 [параметры] [ПОЛЬЗОВАТЕЛЬ]

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

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

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

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