Права доступа к файлам в 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, уникальный идентификатор группы
Пользователь #
- Каждому пользователю обязательно назначается его уникальный идентификатор, который не может быть передан другим пользователям
- Каждому пользователю обязательно назначается «группа по умолчанию»
- Пользователь также может входить в произвольное количество групп
Файл на жёстком диске #
- Файл принадлежит конкретному пользователю, его уникальному идентификатору
- Файл относится к конкретной группе, её уникальному идентификатору
Процессы #
- Каждый процесс, запущенный в рамках GNU/Linux, запускается от имени конкретного пользователя
- Процесс обладает теми же возможностями, что и обычный пользователь
- Де-факто человек всегда запускает новые процессы, чтобы реализовать возможности компьютерного пользователя, с правами конкретной учётной записи (account)
- Процесс может взаимодействовать только с теми файлами, для которых есть доступ у соответствующего пользователя
Права текущего пользователя #
Для определения прав пользователя можно использовать приложение 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 у пользователя и файла совпадают, тогда применяются права владельца
- Если пользователь принадлежит к группе, к которой принадлежит и файл, то применяются права группы
- Если ничего выше не сработало, то применяются права для остальных
Изменение прав доступа #
- Для изменения прав доступа к файлу или каталогу применяется приложение 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 минут или до истечения сессии
  Подсистема control в ALT Linux
  #
В ALT Linux предприняты дополнительные защитные меры от доступа к критичным службам, это реализовано в подсистеме control
По умолчанию для доступа к приложениям, повышающим привилегии пользователя, необходимо входить в группу wheel
Суперпользователь может просматривать политики и настраивать их
  Настройка sudo в ALT Linux
  #
В ALT Linux создаваемый пользователь не указан в конфигурации sudo и не может ей пользоваться, однако там находится группа wheel
Для добавления вашего пользователя в группу wheel выполните
- Зайдите в интерактивную сессию под пользователем root
- Выполните добавление: usermod -a -G wheel USER, гдеUSER— имя вашей учётной записи
- Закройте сессии от имени суперпользователя и пользователя, затем подключитесь заново. При следующем входе пользователю присвоятся корректные группы
Дополнительно подумайте как можно было бы сделать это действие без интерактивной сессии
После такой конфигурации пользователь сможет с помощью 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
$ 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— управление списком прав доступа