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