Помню когда тема о правах доступа в 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, которая отображает список файлов/директорий и таблицу прав.
Пример вывода `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, называется POSIX ACL (Access Control Lists) и управляется командами: setfacl, getfacl.
Чтобы лучше понять как работают системы контроля доступами, классифицируем их, это поможет упорядочить знания.
Какие есть системы контроля доступами
В этом разделе речь идет не о конкретных реализациях или технологиях, а именно об абстрактных паттернах, по которым реализуются конкретные системы. Например, если вы FE/BE разработчик, вы наверняка реализовывали что-то из списка ниже в своих проектах.
Всего можно выделить следующие абстракции для классификации систем доступов:
-
DAC (Discretionary Access Control, Избирательная система доступа) — Технически реализуется так: есть владелец и/или суперпользователь — он назначает права для всех остальных или передает “владение” другому. Как раз это используется в основе базовых UNIX-прав — эта модель лежит практических во всех linux дистрибутивах, но некоторые дополняют ее более расширенными реализациями.
-
MAC (Mandatory Access Control, Мандатная система доступа) — Это аналог иерархии доступов из реальной жизни, который практикуется в спецслужбах имеющих доступ к государственной тайне или иным доступам секретности. Технически реализуется меткой к файлу которая назначает уровень “секретности”. Пользователи в свою очередь имеют разные уровни доступа секретности. Этот подход поддерживает: Astra Linux, SELinux (Security-Enhanced).
-
RBAC (Role Based Access Control, Ролевая система доступа) — Многим знакомая простая модель основанная на ролях. Суть в том, чтобы создать роли: администратор, пользователь, читатель и другие, затем выдавать доступ к файлам основываясь на ролевой модели и соответственно раздавать роли пользователям.
-
ABAC (Attribute-Based Access Control, Атрибутная система доступа) — Наиболее гибкая и современная модель, в которой решение о предоставлении доступа принимается на основе атрибутов — произвольных свойств, привязанных к четырём категориям:
-
Субъект (кто запрашивает): должность, отдел, уровень допуска, стаж и т.д.
-
Объект (к чему запрашивается): тип документа, метка конфиденциальности, владелец.
-
Действие: чтение, запись, удаление, пересылка.
-
Контекст (окружение): время суток, IP-адрес, геолокация, тип устройства.
На основе комбинации этих атрибутов формируются политики (policies), например:
Сотрудник отдела финансов может читать бухгалтерские отчёты только в рабочее время и только из корпоративной сети
-
-
PBAC (Policy-Based Access Control) — Иногда выделяют отдельно, но по сути является ABAC.
Все эти абстракции не являются взаимоисключающими, они часто комбинируются. Например, SELinux (Security-Enhanced) сочетают в себе DAC и MAC (базовые UNIX-права и мандатные политики).
Какие системы контроля доступа используют разные дистрибутивы
В этом разделе собраны популярные дистрибутивы и реализованные в них механизмы доступов. Я недостаточно хорошо погружен во все особенности всех дистрибутивов, поэтому таблицу мне помогал составить Cloud 4.6
Могут быть ошибки, стоит перепроверять информацию.
Таблица систем контроля доступа по популярным дистрибутивам Linux
|
Дистрибутив |
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 (песочница) |
— |
Сильно заблокированная система; верифицированная загрузка |
Краткая справка по реализациям MAC
|
Реализация |
Тип модели |
Принцип |
Где используется |
|---|---|---|---|
|
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)
Что значит rwx:
|
буква |
значение |
цифрой |
|---|---|---|
|
r |
read — чтение |
4 |
|
w |
write — запись |
2 |
|
x |
execute — выполнение / вход в директорию |
1 |
|
- |
отсутствие прав |
|
По поводу разделение прав на запись и чтение, при погружении в тему может возникнуть когнитивный диссонанс: “Как так? Мы можем писать, но не можем читать?” Интуитивно кажется, что запись — более привилегированная операция, чем чтение. Но это нормально — мы можем разрешать запись, не разрешая чтение. Это позволяет сказать процессу: “ты можешь сюда писать логи, но читать их — нельзя”. Таким образом мы можем создать директорию, в которую разные процессы отправляют данные “в один конец”. Похоже на то, как мы можем отправить сообщение на адрес тех-поддержки, но подсмотреть, какие письма туда пришли помимо нашего, не можем.
Важное замечание: r, w, x для файлов и директорий может иметь разное значение, опишу разницу в таблице:
|
буква |
файл |
директория |
|---|---|---|
|
- |
отсутствие прав |
отсутствие прав |
|
r |
чтение файла |
только чтение имен файлов |
|
w |
запись в файл |
изменение содержимого директории (создание, удаление, переименование) |
|
x |
права на выполнение |
доступ к содержимому (подробнее ниже) |
Подробнее про `x` для директории
x для директории разрешает:
-
Входить в директорию (
cd dir-name) или проходить сквозь нее к внутренним путям. -
Обращаться к файлам и поддиректориям по имени (только если оно известно). Например
cat dir-name/file-name.txt(если у самого файла это не запрещено).
Чтобы к директории был полноценный доступ на чтение — нужно одновременно иметь x и r. Если r есть, а x отсутствует, то останется только возможность узнать имена внутренних файлов, но не их содержимое.
Для создания/удаления/переименования файлов внутри директории нужны одновременно w + x:
wбезx— бесполезен (вы не можете обратиться к директории, чтобы что-то в ней изменить)
xбезw— можно входить и читать файлы, но нельзя создавать/удалять
Шпаргалка: Символьная нотация (symbolic notation) для директорий
|
Права |
Что можно |
|---|---|
|
|
ничего |
|
|
только увидеть имена файлов (без деталей) |
|
|
войти ( |
|
|
полноценное чтение: |
|
|
создавать/удалять файлы (по известному имени), но не видеть список |
|
|
полный доступ: просмотр, чтение, создание, удаление |
Шпаргалка: Символьная нотация (symbolic notation) для файлов
|
Права |
Что можно |
|---|---|
|
|
ничего |
|
|
только чтение |
|
|
только запись (перезаписать/дополнить), но не прочитать содержимое |
|
|
только выполнение |
|
|
чтение и запись (типичный набор для обычных файлов) |
|
|
чтение и выполнение (типичный набор для программ/скриптов) |
|
|
запись и выполнение, но нельзя прочитать |
|
|
полный доступ |
Восьмеричная нотация
Права могут отображаться в числовом формате (восьмеричном).
Для тех, кому нужно полное понимание
Восьмеричная система счисления выбрана не случайно. У нас есть 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 |
|
|
|
|
SELinux контекст
Пример вывода при команде ls -lZ
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— Системная роль для процессов, не предназначена для переключения на нее пользователем.
Подробнее о ролях в англоязычном туториале.
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
Просмотр списка файлов и директорий с правами:
ls -l
Пример вывода `ls -l` в Fedora Linux
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— символическая ссылка (symbolic link) -
b— блочное устройство (block device); например жесткий диск -
c— символьное устройство (character device); например динамик. Довольно подробно описывается в англоязычной википедии. -
p— канал, устройство fifo (fifo device) -
s— Unix сокет (unix domain socket)
Пользователь/группа/остальные — подразумевается имя пользователя/группы который является владельцем файла. По умолчанию владелец это тот кто создал файл, но его можно изменить командой chwon. Остальные, это все кто не является владельцем файла.
SELinux индикатор — на этом месте может быть 3 варианта:
-
.— Файл имеет SELinux-контекст -
+— Файл имеет ACL (Access Control List) -
(пусто) — Ни SELinux-контекста, ни ACL
Кто хочет копнуть глубже
Если подсмотреть исходный код команды 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
Команда 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 контекст.
chown
Название команды 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
chgrp
По аналогии с chown меняет группу. Эквивалент chown :groupname somefile.txt = chgrp groupname somefile.txt.
chmod
Название команды 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
Ссылки где больше информации по `chmod`
В целом если вы прочитали статью вы полностью готовы к любой заметке по использованию команды, вот несколько полезных
ps
Показывает текущие процессы, но в контексте данной стать имеет смысл обратить внимание на флаг -Z:
ps -Z
Отобразит список процессов и SELinux контекст.
Сравнение `ps` и `ps -Z`
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
id
Вывод информации об учетной записи пользователя, так же поддерживает флаг -Z:
id -Z
Сравнение `id` и `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
Команда поиска. По шаблону: find path [expression]. Данная команда умеет осуществлять поиск по правам или владельцу:
Ищем в директории /temp файлы принадлежащие пользователю alice:
find /tmp -type f -user alice
Ищем во всей системе файлы со специальным битом SUID:
find / -perm -4000
Минус в -4000 — значит что поиск не строго соответствует критерию, то есть будут найдены права: 4755, 4777 и тд.
Ищем файлы у которых назначены все права всем.
find / -perm 777
Немного о безопасности (чем опасен 777)
Совсем немного расскажу, в чём главная опасность файлов, которым назначены все права (777). Такой файл любой желающий может изменить и выполнить. А если он ещё и автоматически выполняется каким-то системным процессом, это приведёт к полному захвату сервера злоумышленником. Если злоумышленник смог перебором (брутфорсом) или как-то ещё получить SSH-доступ к серверу, при этом не имея прав суперпользователя, самый простой путь атаки будет выглядеть следующим образом:
echo ' /* код злоумышленника */ ' > /path/to/script.sh
Но также в вопросах безопасности важную роль играет защита от самого же себя. Очень часто аварии и инциденты происходят вовсе не по вине злоумышленников, а по неосторожности или из-за ошибки. Человеческий фактор главная угроза любой системе. Человек может сам того не заметив, случайно выполнить скрипт злоумышленника. Правильно назначенные привилегии и права не позволят скрипту, в котором есть ошибка или вредоносный код, удалить или сломать что-то, что ему не положено. Отсюда и возникает принцип наименьших привилегий.
Полезные ссылки
Спасибо всем кто подписывается в телеге — это очень мотивирует делиться своим опытом и мнением. Помимо технических статей я так же высказываюсь на актуальные темы.
Автор: gtosss
