- PVSM.RU - https://www.pvsm.ru -
Помню когда тема о правах доступа в linux (chmod) была для меня незнакомой, я находил разные статьи, которые очень сильно раздражали пробелами в объяснениях, давали рваные фрагменты понимания ситуации и оставляли больше вопросов чем ответов.
Целью этой статьи является создание памятки по правам доступа в linux, которые дадут максимально доступную, понятную информацию, с визуализацией и короткими подсказками. Материал описан таким образом, чтобы после прочтения можно было быстро вернуться и освежить знания. Надеюсь, опытные админы найдут что-то интересное и полезное, но в основном материал ориентирован на тех, кто только начинает свое погружение в системное администрирование, безопасность, DevOps и разработку ПО.
Вступление
Какие есть системы контроля доступами
Какие системы контроля доступа используют разные дистрибутивы
Таблица по популярным дистрибутивам Linux
Краткая справка по реализациям MAC
Что общее у всех
Расшифровка таблицы прав (символьная нотация, восьмеричная, SELinux контекст)
Шпаргалка: Символьная нотация (rwx)
Шпаргалка: Символьная нотация (symbolic notation) для директорий
Шпаргалка: Символьная нотация (symbolic notation) для файлов
Восьмеричная нотация
Шпаргалка: Восьмеричная, Бинарная, Символьная
Шпаргалка: Восьмеричная (Популярные комбинации)
Специальные биты
Шпаргалка: Специальные биты
SELinux контекст
Команды и утилиты
ls
stat
chown
chgrp
chmod
ps
id
find
Немного о безопасности (чем опасен 777)
В статье затронуты, но не полностью раскрыты темы: ACL setfacl/getacl, AppArmor и некоторые другие. Если есть запрос на такой же формат, но с упором на конкретные темы — пишите в комментарии.
Современному пользователю интуитивно кажется что в системе назначения прав, должна быть возможность указывать права отдельным пользователям, например:
user1 может читать/писать/выполнять
user2 может читать
user3 может выполнять
user4 вообще не имеет прав
и так далее для остальных пользователей.
Но базовая система UNIX-прав использует не такой подход, у нее есть понятие “владелец” и только 3 слота для указания прав:
слот пользователя (подразумеваются права пользователя-владельца)
слот группы (подразумевается группа-владелец)
слот для всех остальных (все кто не является владельцем)
Таким образом базовая система прав linux позволяет задавать права только относительно пользователя-владельца, группы-владельца и общего множества остальных пользователей. Итого 3 слота для указания прав: user, group, other. Сокращенно — ugo.
Для просмотра прав используется команда ls -l, которая отображает список файлов/директорий и таблицу прав.
gtosss@laptop-dc:~/example$ ls -l
total 4
drwxr-xr-x. 1 gtosss gtosss 0 Apr 21 13:52 first-dir
-rw-r--r--. 1 gtosss gtosss 13 Apr 21 13:57 first.txt
drwxr-xr-x. 1 gtosss gtosss 0 Apr 21 13:53 second-dir
-rw-r--r--. 1 gtosss gtosss 0 Apr 21 13:52 second.text
Что значат строки такого вида drwxr-xr-x. — объясняется далее в соответствующих разделах о символьной нотации. На данном этапе достаточно знать — эта строка хранит информацию о правах доступа для пользователя-владельца, группы-владельца и всех остальных.
Назначения прав индивидуально каждому пользователю, как было мной описано в самом начале, тоже поддерживается, но это расширенная система доступов, она реализован по стандарту POSIX [1], называется POSIX ACL (Access Control Lists) [2] и управляется командами: setfacl, getfacl.
Чтобы лучше понять как работают системы контроля доступами, классифицируем их, это поможет упорядочить знания.
В этом разделе речь идет не о конкретных реализациях или технологиях, а именно об абстрактных паттернах, по которым реализуются конкретные системы. Например, если вы FE/BE разработчик, вы наверняка реализовывали что-то из списка ниже в своих проектах.
Всего можно выделить следующие абстракции для классификации систем доступов:
DAC (Discretionary Access Control, Избирательная система доступа) [3] — Технически реализуется так: есть владелец и/или суперпользователь — он назначает права для всех остальных или передает “владение” другому. Как раз это используется в основе базовых UNIX-прав — эта модель лежит практических во всех linux дистрибутивах, но некоторые дополняют ее более расширенными реализациями.
MAC (Mandatory Access Control, Мандатная система доступа) [4] — Это аналог иерархии доступов из реальной жизни, который практикуется в спецслужбах имеющих доступ к государственной тайне или иным доступам секретности. Технически реализуется меткой к файлу которая назначает уровень “секретности”. Пользователи в свою очередь имеют разные уровни доступа секретности. Этот подход поддерживает: Astra Linux, SELinux (Security-Enhanced).
RBAC (Role Based Access Control, Ролевая система доступа) [5] — Многим знакомая простая модель основанная на ролях. Суть в том, чтобы создать роли: администратор, пользователь, читатель и другие, затем выдавать доступ к файлам основываясь на ролевой модели и соответственно раздавать роли пользователям.
ABAC (Attribute-Based Access Control, Атрибутная система доступа) [6] — Наиболее гибкая и современная модель, в которой решение о предоставлении доступа принимается на основе атрибутов — произвольных свойств, привязанных к четырём категориям:
Субъект (кто запрашивает): должность, отдел, уровень допуска, стаж и т.д.
Объект (к чему запрашивается): тип документа, метка конфиденциальности, владелец.
Действие: чтение, запись, удаление, пересылка.
Контекст (окружение): время суток, IP-адрес, геолокация, тип устройства.
На основе комбинации этих атрибутов формируются политики (policies), например:
Сотрудник отдела финансов может читать бухгалтерские отчёты только в рабочее время и только из корпоративной сети
PBAC (Policy-Based Access Control) — Иногда выделяют отдельно, но по сути является ABAC.
Все эти абстракции не являются взаимоисключающими, они часто комбинируются. Например, SELinux (Security-Enhanced) сочетают в себе DAC и MAC (базовые UNIX-права и мандатные политики).
В этом разделе собраны популярные дистрибутивы и реализованные в них механизмы доступов. Я недостаточно хорошо погружен во все особенности всех дистрибутивов, поэтому таблицу мне помогал составить Cloud 4.6
Могут быть ошибки, стоит перепроверять информацию.
|
Дистрибутив |
DAC |
MAC |
RBAC |
Примечания |
|---|---|---|---|---|
|
RHEL |
UNIX-права, POSIX ACL |
SELinux (enforcing по умолчанию) |
SELinux Roles |
Эталонная реализация SELinux; политика |
|
CentOS / CentOS Stream |
UNIX-права, POSIX ACL |
SELinux (enforcing по умолчанию) |
SELinux Roles |
Наследует от RHEL |
|
Fedora |
UNIX-права, POSIX ACL |
SELinux (enforcing по умолчанию) |
SELinux Roles |
Площадка для обкатки новых политик SELinux до попадания в RHEL |
|
Oracle Linux |
UNIX-права, POSIX ACL |
SELinux (enforcing по умолчанию) |
SELinux Roles |
Бинарно совместим с RHEL |
|
Amazon Linux |
UNIX-права, POSIX ACL |
SELinux (enforcing, AL2023+) |
SELinux Roles |
В AL2 использовался permissive; AL2023 — enforcing |
|
Ubuntu |
UNIX-права, POSIX ACL |
AppArmor (enforcing по умолчанию) |
— |
SELinux доступен из репозиториев, но не рекомендован |
|
Debian |
UNIX-права, POSIX ACL |
AppArmor (по умолчанию с Debian 10 Buster) |
— |
SELinux и TOMOYO доступны опционально |
|
Linux Mint |
UNIX-права, POSIX ACL |
AppArmor (наследует от Ubuntu) |
— |
|
|
openSUSE / SLES |
UNIX-права, POSIX ACL |
AppArmor (enforcing по умолчанию) |
— |
SUSE — исторический разработчик AppArmor; SELinux опционален |
|
Arch Linux |
UNIX-права, POSIX ACL |
Нет по умолчанию |
— |
AppArmor и SELinux ставятся вручную из AUR/репозиториев |
|
Manjaro |
UNIX-права, POSIX ACL |
AppArmor (предустановлен, но часто не enforcing) |
— |
|
|
Gentoo |
UNIX-права, POSIX ACL |
Опционально: SELinux, AppArmor, TOMOYO, Smack |
SELinux Roles (при выборе SELinux) |
Специальные SELinux-профили ( |
|
Alpine Linux |
UNIX-права, POSIX ACL |
Нет по умолчанию |
— |
Минималистичный; ядро собрано без LSM-модулей из коробки |
|
Slackware |
UNIX-права, POSIX ACL |
Нет по умолчанию |
— |
Философия минимализма; всё ставится руками |
|
Astra Linux (Special Edition) |
UNIX-права, POSIX ACL |
Parsec (собственная мандатная система) |
Parsec Roles |
Сертифицирован ФСТЭК/ФСБ; иерархические метки конфиденциальности (до 256 уровней) |
|
ALT Linux (СПО) |
UNIX-права, POSIX ACL |
Опционально: SELinux |
— |
Некоторые сертифицированные сборки включают MAC |
|
РЕД ОС |
UNIX-права, POSIX ACL |
SELinux |
SELinux Roles |
Российский, на базе RPM-экосистемы |
|
Tizen (Samsung) |
UNIX-права, POSIX ACL |
Smack (Simplified MAC Kernel) |
— |
Используется в IoT / Smart TV |
|
Android (AOSP) |
UNIX-права (UID per app), POSIX ACL |
SELinux (enforcing с Android 5.0+) |
— |
Каждому приложению — свой UID (песочница на уровне DAC + SELinux) |
|
ChromeOS |
UNIX-права, POSIX ACL |
SELinux + minijail (песочница) |
— |
Сильно заблокированная система; верифицированная загрузка |
|
Реализация |
Тип модели |
Принцип |
Где используется |
|---|---|---|---|
|
SELinux |
MAC + RBAC + MLS/MCS |
Каждому процессу и файлу — метка вида |
RHEL, Fedora, CentOS, Android, ChromeOS |
|
AppArmor |
MAC (path-based) |
Профиль привязан к пути исполняемого файла; проще в настройке, чем SELinux |
Ubuntu, Debian, openSUSE/SLES |
|
Smack |
MAC (label-based) |
Упрощённые метки без ролей и type enforcement; лёгкий для встраиваемых систем |
Tizen, IoT-устройства |
|
TOMOYO |
MAC (path-based) |
Похож на AppArmor; акцент на «обучение» — система сама собирает профиль при первом запуске |
Доступен в ядре mainline; нет крупных дистрибутивов по умолчанию |
|
Parsec |
MAC (мандатная, MLS) |
Иерархические уровни секретности + категории; ориентирован на российские стандарты ИБ |
Astra Linux Special Edition |
DAC (UNIX-права rwx + POSIX ACL) присутствует во всех дистрибутивах — это часть ядра Linux и стандарта POSIX.
ABAC как отдельная встроенная подсистема не реализована ни в одном дистрибутиве «из коробки». Однако SELinux с MLS/MCS-политиками и контекстными модулями (время, сеть) может приближаться к ABAC. Полноценный ABAC обычно реализуют на уровне приложений (XACML, Open Policy Agent и т.д.).
RBAC в чистом виде на уровне ОС представлен только через SELinux Roles и Parsec. Привычные sudo / polkit — это скорее механизмы делегирования привилегий, хотя их часто относят к элементам RBAC.
Перед тем как знакомиться с командами изменения/просмотра прав, для начала научимся их читать.
Что значит rwx:
|
буква |
значение |
цифрой |
|---|---|---|
|
r |
read — чтение |
4 |
|
w |
write — запись |
2 |
|
x |
execute — выполнение / вход в директорию |
1 |
|
- |
отсутствие прав |
|
По поводу разделение прав на запись и чтение, при погружении в тему может возникнуть когнитивный диссонанс: “Как так? Мы можем писать, но не можем читать?” Интуитивно кажется, что запись — более привилегированная операция, чем чтение. Но это нормально — мы можем разрешать запись, не разрешая чтение. Это позволяет сказать процессу: “ты можешь сюда писать логи, но читать их — нельзя”. Таким образом мы можем создать директорию, в которую разные процессы отправляют данные “в один конец”. Похоже на то, как мы можем отправить сообщение на адрес тех-поддержки, но подсмотреть, какие письма туда пришли помимо нашего, не можем.
Важное замечание: r, w, x для файлов и директорий может иметь разное значение, опишу разницу в таблице:
|
буква |
файл |
директория |
|---|---|---|
|
- |
отсутствие прав |
отсутствие прав |
|
r |
чтение файла |
только чтение имен файлов |
|
w |
запись в файл |
изменение содержимого директории (создание, удаление, переименование) |
|
x |
права на выполнение |
доступ к содержимому (подробнее ниже) |
x для директории разрешает:
Входить в директорию (cd dir-name) или проходить сквозь нее к внутренним путям.
Обращаться к файлам и поддиректориям по имени (только если оно известно). Например cat dir-name/file-name.txt (если у самого файла это не запрещено).
Чтобы к директории был полноценный доступ на чтение — нужно одновременно иметь x и r. Если r есть, а x отсутствует, то останется только возможность узнать имена внутренних файлов, но не их содержимое.
Для создания/удаления/переименования файлов внутри директории нужны одновременно w + x:
wбезx— бесполезен (вы не можете обратиться к директории, чтобы что-то в ней изменить)
xбезw— можно входить и читать файлы, но нельзя создавать/удалять
|
Права |
Что можно |
|---|---|
|
|
ничего |
|
|
только увидеть имена файлов (без деталей) |
|
|
войти ( |
|
|
полноценное чтение: |
|
|
создавать/удалять файлы (по известному имени), но не видеть список |
|
|
полный доступ: просмотр, чтение, создание, удаление |
|
Права |
Что можно |
|---|---|
|
|
ничего |
|
|
только чтение |
|
|
только запись (перезаписать/дополнить), но не прочитать содержимое |
|
|
только выполнение |
|
|
чтение и запись (типичный набор для обычных файлов) |
|
|
чтение и выполнение (типичный набор для программ/скриптов) |
|
|
запись и выполнение, но нельзя прочитать |
|
|
полный доступ |
Права могут отображаться в числовом формате (восьмеричном).
Восьмеричная система счисления выбрана не случайно. У нас есть 3 флага rwx: чтение, запись, выполнения. Каждый из них может быть “вкл” или “выкл”, что на языке информатики можно представить как 0 или 1. Итого потребуется 3 бита, чтобы покрыть все комбинации.
В двоичной системе получается так:
|
r |
w |
x |
комментарий |
восьме-ричное |
|---|---|---|---|---|
|
0 |
0 |
0 |
все “выкл” |
0 |
|
0 |
0 |
1 |
“вкл”: выполнение |
1 |
|
0 |
1 |
0 |
“вкл”: запись |
2 |
|
0 |
1 |
1 |
“вкл”: запись, чтение |
3 |
|
1 |
0 |
0 |
“вкл”: чтение |
4 |
|
1 |
0 |
1 |
“вкл”: чтение, выполнение |
5 |
|
1 |
1 |
0 |
“вкл”: чтение, запись |
6 |
|
1 |
1 |
1 |
“вкл”: чтение, запись, выполнение |
7 |
Таким образом, в восьмеричном представлении достаточно запомнить только:
|
|
|
|---|---|
|
4 |
r — чтение |
|
2 |
w — запись |
|
1 |
x — выполнение |
А остальные числа, это результат логического ИЛИ (сумма в восьмеричной системе счисления):
|
Число |
Сумма |
Флаги |
Описание |
|---|---|---|---|
|
3 |
2 + 1 |
|
запись + выполнение |
|
5 |
4 + 1 |
|
чтение + выполнение |
|
6 |
4 + 2 |
|
чтение + запись |
|
7 |
4 + 2 + 1 |
|
чтение + запись + выполнение |
Но 3 бита хватит, только чтобы обозначить права для пользователя, а еще есть группа и “остальные”. По этому потребуется 9 бит = восьмеричное число из 3 цифр. Несколько случайных примеров:
777 (все права = все 9 бит в состоянии “вкл” = 111 111 111)
400 (права на чтение только у владельца = в битах 100 000 000)
444 (права на чтение у всех = в битах 100 100 100)
440 (права на чтение только у владельца = в битах 100 100 000)
112 (выполнение, выполнение, запись = в битах 001 001 010)
Восьмеричное представление прав самое компактное, по этому оно часто используется.
Пояснение к заголовкам таблицы:
Octal — восьмеричная система счисления
Binary — двоичная система счисления
Права — символьная нотация
|
Octal |
Binary |
Права |
Описание |
|---|---|---|---|
|
|
|
|
Нет прав |
|
|
|
|
Только выполнение |
|
|
|
|
Только запись |
|
|
|
|
Запись + выполнение |
|
|
|
|
Только чтение |
|
|
|
|
Чтение + выполнение |
|
|
|
|
Чтение + запись |
|
|
|
|
Все права |
|
Octal |
Права |
Описание |
|---|---|---|
|
|
|
Все права для всех |
|
|
|
Владелец — всё; остальные — чтение и запуск |
|
|
|
Владелец — всё; группа — чтение и запуск |
|
|
|
Все права только владельцу |
|
|
|
Владелец — чтение/запись; остальные — чтение |
|
|
|
Владелец — чтение/запись; группа — чтение |
|
|
|
Чтение/запись только владельцу |
|
|
|
Только чтение только владельцу |
Этот раздел для более подготовленных и уверенных пользователей linux, у новичков останутся вопросы. Описываю его в формате памятки. Если есть запрос на более детальное объяснение, дайте знать в комментах — в планах отдельная статья.
Выше мы рассмотрели стандартную модель прав в которых используется 9 бит для назначения прав. Но есть ситуации когда их не хватает. Для таких ситуаций предусмотрены 3 дополнительных (специальных) бита, у каждого свое название и особенности:
SUID (от анг. Set User ID) — предназначен для исполняемых файлов, если установлен, процесс будет запущен от имени пользователя-владельца файла (а не от имени запускающего как в случае с x). Это полезно когда нужно позволить временно выполнить процесс от имени супер-пользователя, но вместе с тем опасно с точки зрения безопасности.
SGID (от анг. Set Group ID) — для исполняемых файлов работает аналогично SUID, но устанавливает группу-владельца. Для директорий — новые файлы наследуют группу директории.
Sticky — для директорий: запрещает удаление и переименование чужих файлов. Удалить/переименовать файл может только его владелец, владелец директории или root.
|
Octal |
Бит |
Описание |
|---|---|---|
|
|
SUID |
Запуск от имени владельца файла |
|
|
SGID |
Запуск от имени группы / наследование группы |
|
|
Sticky |
Удалять файлы в каталоге может только владелец |
|
Octal |
Символьная |
Пример использования |
|---|---|---|
|
|
|
|
|
|
|
Каталог с SGID |
|
|
|
|
gtosss@laptop-dc:~/example$ ls -lZ
total 4
drwxr-xr-x. 1 gtosss gtosss unconfined_u:object_r:user_home_t:s0 0 Apr 21 13:52 first-dir
-rw-r--r--. 1 gtosss gtosss unconfined_u:object_r:user_home_t:s0 13 Apr 21 13:57 first.txt
drwxr-xr-x. 1 gtosss gtosss unconfined_u:object_r:user_home_t:s0 0 Apr 21 13:53 second-dir
-rw-r--r--. 1 gtosss gtosss unconfined_u:object_r:user_home_t:s0 0 Apr 21 13:52 second.text
Пример как выглядит SELinux контекст: unconfined_u:object_r:user_home_t:s0. Здесь 4 значения разделенных двоеточием. Соответствует такому шаблону:
user : role : type : level
user
unconfined_u — это не пользователь из linux (gtosss), а отдельная сущность SELinux. Она значит что на пользователя не наложены строгие SELinux ограничения.
role
Для данных файлов назначена object_r — SELinux роль, как раз механизм RBAC о котором говорилось в разделе “Какие есть системы контроля доступами”. Эта роль назначается файлам по умолчанию, есть такие варианты стандартных ролей:
unconfined_r — Неограниченная роль.
user_r — Роль обычного пользователя для доступа к пользовательским приложениям и другим непривилегированным доменам.
staff_r — Похоже на роль пользователя, но более привилегированная. Есть больше доступа к системной информации чем у обычного пользователя.
sysadm_r — Как следует из названия, роль системного администратора. Имеет почти все привилегии.
system_r — Системная роль для процессов, не предназначена для переключения на нее пользователем.
Подробнее о ролях в англоязычном туториале [7].
type
В нашем случае у файлов тип user_home_t — значит что файл находиться в домашней директории пользователя. На основе типа принимается решение о доступе, этот механизм называется TE (Type Enforcement) он является частью MAC (Mandatory Access Control) о котором мы говорили в разделе “Какие есть системы контроля доступами”.
level
У нас s0 — что значит самый низкий уровень секретности. Всего их 15:
s0, s1, …, s15 — где s15 совершенно секретно. Это механизм MLS (Multi-Level Security, уровни доступа)
В совокупности TE и MLS образуют MAC (Mandatory Access Control), а он уже образует часть механизма ABAC (Attribute-Based Access Control) позволяя сформировать сложные политики доступов.
Статья получилась довольно большой, по этому постараюсь кратко пройтись по основным утилитам которые связаны с правами.
Просмотр списка файлов и директорий с правами:
ls -l
gtosss@laptop-dc:~/example$ ls -l
total 4
drwxr-xr-x. 1 gtosss gtosss 0 Apr 21 13:52 first-dir
-rw-r--r--. 1 gtosss gtosss 13 Apr 21 13:57 first.txt
drwxr-xr-x. 1 gtosss gtosss 0 Apr 21 13:53 second-dir
-rw-r--r--. 1 gtosss gtosss 0 Apr 21 13:52 second.text
Если нужно увидеть так же скрытые:
ls -la
Тип (так же часто называют флагом) может быть одним из:
- — файл
d — директория (directory)
l — символическая ссылка [8] (symbolic link)
b — блочное устройство [9] (block device); например жесткий диск
c — символьное устройство (character device); например динамик. Довольно подробно описывается в англоязычной википедии [10].
p — канал, устройство fifo [11] (fifo device)
s — Unix сокет [12] (unix domain socket)
Пользователь/группа/остальные — подразумевается имя пользователя/группы который является владельцем файла. По умолчанию владелец это тот кто создал файл, но его можно изменить командой chwon. Остальные, это все кто не является владельцем файла.
SELinux [13] индикатор — на этом месте может быть 3 варианта:
. — Файл имеет SELinux-контекст
+ — Файл имеет ACL (Access Control List)
(пусто) — Ни SELinux-контекста, ни ACL
Если подсмотреть исходный код [14] команды ls в репозитории GNU coreutils, можно увидеть в каких случаях выводиться точка или какой-то еще символ:
if (! any_has_acl)
modebuf[10] = '';
else if (f->acl_type == ACL_T_SELINUX_ONLY)
modebuf[10] = '.';
else if (f->acl_type == ACL_T_YES)
modebuf[10] = '+';
Массив modebuf это как раз строка которая выводиться в результате ls -l:
- r w x r - x r - x .
↑
0 1 2 3 4 5 6 7 8 9 10
По индексу 10 будет назначено:
пустота — если нет никакого ACL
. — если отработала проверка на равенство ACL_T_SELINUX_ONLY, то есть файл имеет SELinux-контекст
+ — если отработала проверка на равенство ACL_T_YES, то есть файл имеет POSIX ACL (выставленный командой setfacl)
Просмотр UID/GID (User/Group ID) числами
ls -ln
Показать SELinux-контекст
ls -lZ
Команда stat возвращает подробную информацию о файле/директории, в нем можно увидеть: UNIX-права (все 9 бит + 3 специальных), SELinux контекст и другие данные.
Рассмотрим сразу на примере:
stat example
gtosss@laptop-dc:~$ stat example
File: example
Size: 78 Blocks: 0 IO Block: 4096 directory
Device: 0,44 Inode: 3243310 Links: 1
Access: (0755/drwxr-xr-x) Uid: ( 1000/ gtosss) Gid: ( 1000/ gtosss)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2026-04-23 19:24:34.852196358 -0400
Modify: 2026-04-21 13:53:02.703032629 -0400
Change: 2026-04-21 13:53:02.703032629 -0400
Birth: 2026-04-21 13:52:34.648258436 -0400
Здесь к правам относиться:
Access: (0755/drwxr-xr-x) Uid: ( 1000/ gtosss) Gid: ( 1000/ gtosss)
Context: unconfined_u:object_r:user_home_t:s0
В текущей статье уже был разбор всех обозначений, по этому коротко:
0755/drwxr-xr-x — отображает сначала восьмеричную нотацию (с отображением специального бита), затем символьную.
Uid: ( 1000/ gtosss) Gid: ( 1000/ gtosss) — пользователь и группа с их ID.
unconfined_u:object_r:user_home_t:s0 — SELinux контекст.
Название команды chwon происходит от английского change owner. Шаблон команды выглядит так:
chown [опции] владелец[:группа] файл
Смена пользователя-владельца и группы-владельца.
chwon username:groupname directory-or-file
Данная команда установит в качестве владельца пользователя username и группу groupname для директории или файла directory-or-file.
Смена только пользователя-владельца:
chown username file.txt
Смена только группы-владельца:
chown :group file.txt
Рекурсивная для директорий. Сменить владельца для директории и всего содержимого:
chown -R username dirname
По аналогии с chown меняет группу. Эквивалент chown :groupname somefile.txt = chgrp groupname somefile.txt.
Название команды chmod происходит от английского change mod. Шаблон команды выглядит так:
chmod [options] mode[,mode] file1 [file2 ...]
Команда очень гибкая и имеет много разных вариантов работы. Все их разбирать не буду, вместо этого оставлю ссылки, которые делают разбор этой темы более ёмко.
Оставлю только самый короткий и универсальный пример в формате с восьмеричной нотацией (см “Шпаргалка: Восьмеричная, Бинарная, Символьная”).
Рекурсивно раздать чтение и запись пользователю и группе. Чтение всем остальным.
chmod -R 664 somedir
Выдать все права только пользователю-владельцу.
chmod 700 somefile
И на всякий случай относительный режим. Тут нужно вспомнить про сокращение ugo:
u — user
g — group
o — other
Дать юзеру и группе права на чтение:
chmod u+r g+r
В целом если вы прочитали статью вы полностью готовы к любой заметке по использованию команды, вот несколько полезных
Показывает текущие процессы, но в контексте данной стать имеет смысл обратить внимание на флаг -Z:
ps -Z
Отобразит список процессов и SELinux контекст.
gtosss@laptop-dc:~$ ps
PID TTY TIME CMD
2873 pts/0 00:00:00 bash
3191 pts/0 00:00:00 ps
gtosss@laptop-dc:~$ ps -Z
LABEL PID TTY TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2873 pts/0 00:00:00 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3200 pts/0 00:00:00 ps
Вывод информации об учетной записи пользователя, так же поддерживает флаг -Z:
id -Z
gtosss@laptop-dc:~$ id
uid=1000(gtosss) gid=1000(gtosss) groups=1000(gtosss),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
gtosss@laptop-dc:~$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Команда поиска. По шаблону: find path [expression]. Данная команда умеет осуществлять поиск по правам или владельцу:
Ищем в директории /temp файлы принадлежащие пользователю alice:
find /tmp -type f -user alice
Ищем во всей системе файлы со специальным битом SUID:
find / -perm -4000
Минус в -4000 — значит что поиск не строго соответствует критерию, то есть будут найдены права: 4755, 4777 и тд.
Ищем файлы у которых назначены все права всем.
find / -perm 777
Совсем немного расскажу, в чём главная опасность файлов, которым назначены все права (777). Такой файл любой желающий может изменить и выполнить. А если он ещё и автоматически выполняется каким-то системным процессом, это приведёт к полному захвату сервера злоумышленником. Если злоумышленник смог перебором (брутфорсом) или как-то ещё получить SSH-доступ к серверу, при этом не имея прав суперпользователя, самый простой путь атаки будет выглядеть следующим образом:
echo ' /* код злоумышленника */ ' > /path/to/script.sh
Но также в вопросах безопасности важную роль играет защита от самого же себя. Очень часто аварии и инциденты происходят вовсе не по вине злоумышленников, а по неосторожности или из-за ошибки. Человеческий фактор главная угроза любой системе. Человек может сам того не заметив, случайно выполнить скрипт злоумышленника. Правильно назначенные привилегии и права не позволят скрипту, в котором есть ошибка или вредоносный код, удалить или сломать что-то, что ему не положено. Отсюда и возникает принцип наименьших привилегий.
Спасибо всем кто подписывается в телеге — это очень мотивирует делиться своим опытом и мнением. Помимо технических статей я так же высказываюсь на актуальные темы [24].
Автор: gtosss
Источник [25]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/450551
Ссылки в тексте:
[1] POSIX: https://ru.wikipedia.org/wiki/POSIX
[2] POSIX ACL (Access Control Lists): https://docs.redhat.com/en/documentation/red_hat_gluster_storage/3/html/administration_guide/sect-posix_access_control_lists
[3] DAC (Discretionary Access Control, Избирательная система доступа): https://ru.wikipedia.org/wiki/%D0%98%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%BC
[4] MAC (Mandatory Access Control, Мандатная система доступа): https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%BD%D0%B4%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%BC
[5] RBAC (Role Based Access Control, Ролевая система доступа): https://ru.wikipedia.org/wiki/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BE%D0%BC_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D1%80%D0%BE%D0%BB%D0%B5%D0%B9
[6] ABAC (Attribute-Based Access Control, Атрибутная система доступа): https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%B0%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D0%BE%D0%B2
[7] англоязычном туториале: https://wiki.gentoo.org/wiki/SELinux/Tutorials/The_purpose_of_SELinux_roles
[8] символическая ссылка: https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0
[9] блочное устройство: https://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE
[10] англоязычной википедии: https://en.wikipedia.org/wiki/Device_file
[11] канал, устройство fifo: https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB
[12] Unix сокет: https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BA%D0%B5%D1%82_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%D0%B0_Unix
[13] SELinux: https://ru.wikipedia.org/wiki/SELinux
[14] исходный код: https://cgit.git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c?id=v8.21#n3785
[15] Документация о выводе утилиты ls (англ.): https://www.gnu.org/software/coreutils/manual/html_node/What-information-is-listed.html#What-information-is-listed
[16] Вопрос на superuser.com о точке (англ.): https://superuser.com/questions/230559/what-does-the-dot-mean-at-the-end-of-rw-r-r-how-do-you-set-it-with-chmod
[17] Википедия: chmod: https://ru.wikipedia.org/wiki/Chmod
[18] Права в Linux (chown, chmod, SUID, GUID, sticky bit, ACL, umask): https://habr.com/ru/articles/469667/
[19] help.ubuntu: ACL (Access Control List) - списки контроля доступа: https://help.ubuntu.ru/wiki/access_control_list
[20] help.ubuntu: Права доступа Unix, SUID, SGID, Sticky биты: https://help.ubuntu.ru/wiki/%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%B0%D0%B2%D0%B0_unix
[21] Хабр: SELinux – описание и особенности работы с системой: https://habr.com/ru/companies/kingservers/articles/209644/
[22] Bog BOS: Механизмы доступа DAC и MAC, SELinux в RHEL: http://bog.pp.ru/work/SELinux.html
[23] Linux permissions: SUID, SGID, and sticky bit: https://www.redhat.com/en/blog/suid-sgid-sticky-bit
[24] актуальные темы: https://t.me/gtosss_group
[25] Источник: https://habr.com/ru/articles/1027674/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1027674
Нажмите здесь для печати.