Linux

Права доступа Linux: полное руководство по chmod, ACL и атрибутам

В этом гайде вы узнаете, как правильно настраивать права доступа к файлам и каталогам в Linux с помощью chmod, ACL и специальных атрибутов, чтобы обеспечить безопасность и стабильность системы.

Средняя

Введение / Зачем это нужно

Права доступа в Linux — это фундаментальный механизм безопасности, который определяет, кто (какой пользователь или группа) может что делать с файлами и каталогами. Неправильная настройка прав — одна из частых причин уязвимостей, сбоев в работе сервисов и ошибок "Permission denied". Этот гайд поможет вам уверенно управлять правами, использовать как базовые (chmod, chown), так и расширенные инструменты (ACL, chattr), и понимать логику системы Linux. После его выполнения вы сможете грамотно настраивать доступ для веб-серверов, shared-каталогов, скриптов и системных файлов.

Требования / Подготовка

  • Доступ к терминалу Linux (Ubuntu, CentOS, Debian, Arch или любая другая дистрибутив).
  • Права суперпользователя (sudo) для изменения прав системных файлов и использования chattr.
  • Базовое понимание командной строки: ls, cd, cat.
  • Установленный пакет acl (для работы с расширенными ACL) в дистрибутивах на базе RPM/Deb:
    # Для Debian/Ubuntu
    sudo apt update && sudo apt install acl
    
    # Для RHEL/CentOS/Fedora
    sudo yum install acl
    
  • Знание, что вы делаете. Изменение прав на системные файлы (/etc, /bin, /usr) может привести к неработоспособности системы.

Пошаговая инструкция

Шаг 1: Изучите текущие права файла

Перед любым изменением всегда проверяйте текущие права. Команда ls -l — ваш основной инструмент.

ls -l /etc/passwd /home/user/documents

Пример вывода:

-rw-r--r-- 1 root root  1234 Feb 17 10:00 /etc/passwd
drwxr-xr-x 2 user user  4096 Feb 17 10:05 /home/user/documents

Как читать:

  • Первый символ: - — обычный файл, d — каталог, l — символьная ссылка.
  • Следующие 9 символов: три группы по три.
    • rw- (владелец): чтение (r), запись (w), нет исполнения (x).
    • r-- (группа): только чтение.
    • r-- (остальные): только чтение.
  • Владелец: root, Группа: root (для первого файла).

Шаг 2: Измените права числовым методом (chmod)

Это самый быстрый и распространённый способ. Каждому типу доступа (владелец, группа, другие) соответствует своя цифра в восьмеричной системе.

Логика:

  • 4 = чтение (read)
  • 2 = запись (write)
  • 1 = исполнение (execute)
  • Сумма: 7 = 4+2+1 (rwx), 6 = 4+2 (rw-), 5 = 4+1 (r-x), 0 = ---

Примеры:

# Дать владельцу все права (rwx), группе и другим только чтение и исполнение (r-x)
chmod 755 script.sh

# Разрешить владельцу чтение/запись, группе — только чтение, другим — никаких прав
chmod 640 config.conf

# Рекурсивно (включая все вложенные файлы и каталоги) установить права 755 для каталога project/
chmod -R 755 project/

⚠️ Важно: Использование chmod -R требует осторожности. Для каталогов обычно нужен x (доступ к содержимому), а для файлов он не всегда требуется. Команда chmod -R 755 /some/path установит x для всех файлов, что может быть небезопасно.

Шаг 3: Измените права символьным методом (chmod)

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

Синтаксис: chmod [ugoa][+-=][rwx] <файл>

  • Кто: u (user/владелец), g (group/группа), o (others/остальные), a (all/все, по умолчанию).
  • Оператор: + (добавить), - (удалить), = (установить точно).
  • Права: r, w, x.

Примеры:

# Добавить право на выполнение (x) для владельца файла
chmod u+x /usr/local/bin/myscript

# Удалить право на запись (w) для группы и остальных
chmod go-w sensitive_data.txt

# Владелец: rwx, Группа: rwx, Остальные: --- (полная изоляция)
chmod 770 private_folder/
# Или символьно: chmod u=rwx,g=rwx,o= private_folder/

# Дать группе те же права, что и владельцу (часто используется для совместной работы)
chmod g=u shared_file.log

Шаг 4: Настройте расширенные ACL (setfacl)

Стандартная модель (владелец/группа/остальные) часто недостаточна. ACL (Access Control Lists) позволяют задавать права для конкретного пользователя или группы, не меняя владельца или основную группу файла.

Установка прав:

# Дать пользователю ivan полный доступ (rwx) к файлу report.pdf
sudo setfacl -m u:ivan:rwx report.pdf

# Дать группе developers права на чтение и запись (rw-) к каталогу src/
sudo setfacl -m g:developers:rw- src/

# Удалить ACL-запись для пользователя ivan
sudo setfacl -x u:ivan report.pdf

Просмотр ACL:

# Показать стандартные и расширенные права
getfacl report.pdf

Пример вывода getfacl:

# file: report.pdf
# owner: user
# group: staff
user::rw-
group::r--
mask::rwx
other::r--
user:ivan:rwx        # <- наша ACL-запись
group:developers:rw- # <- ещё одна ACL-запись

Примечание: mask — это маска для ACL-записей. Обычно она совпадает с максимальными правами из всех ACL-записей для группы/остальных. Устанавливается автоматически, но может быть изменена через setfacl -m m::rwx.

Рекурсивная настройка ACL для каталога:

# Установить ACL по умолчанию для новых файлов в каталоге (важно для shared-папок)
sudo setfacl -d -m g:developers:rwx /projects/shared/
# Теперь все новые файлы, созданные в /projects/shared/, унаследуют эти права.

Шаг 5: Установите специальные атрибуты (chattr)

Атрибуты, управляемые командой chattr, работают на уровне файловой системы (ext3/ext4, XFS) и не могут быть изменены обычными средствами, даже root'ом, пока установлены. Это мощный инструмент для защиты критичных файлов.

Основные флаги:

  • i (immutable) — файл нельзя изменять, удалять, переименовывать, создавать на его месте ссылки.
  • a (append-only) — файл можно только дописывать в конец (например, для логов).
  • s (secure deletion) — при удалении файла блоки диска обнуляются (медленно).
  • u (undelete) — при удалении сохраняется возможность восстановления.

Примеры:

# Сделать файл неизменяемым (защита от случайного удаления/изменения)
sudo chattr +i /etc/nginx/nginx.conf
# Проверить атрибуты: lsattr /etc/nginx/nginx.conf

# Разрешить изменения (снять защиту)
sudo chattr -i /etc/nginx/nginx.conf

# Установить режим "дозапись" для лог-файла (защита от подмены)
sudo chattr +a /var/log/application.log

Важно: Для каталогов флаг i блокирует создание/удаление файлов внутри него.

Шаг 6: Работа с setuid, setgid и sticky bit

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

  • setuid (4000 / s для владельца): Когда исполняемый файл имеет этот бит, он запускается с правами владельца файла, а не того, кто его запустил. Классический пример — passwd (владелец root).
    ls -l /usr/bin/passwd
    # -rwsr-xr-x 1 root root ... /usr/bin/passwd
    # Обратите внимание на 's' вместо 'x' у владельца.
    

    ⚠️ Осторожно! Не устанавливайте setuid на скрипты (обходка через интерпретатор) или ненадёжные программы.

  • setgid (2000 / s для группы): Два эффекта:
    1. Для исполняемого файла: запускается с правами группы-владельца.
    2. Для каталога: все новые файлы, созданные внутри, наследуют группу-владельца каталога, а не основную группу пользователя, их создавшего. Незаменимо для общих каталогов.
    # Установить setgid для каталога shared (чтобы новые файлы принадлежали группе 'devs')
    chmod 2775 /shared/
    # Или символьно: chmod g+s /shared/
    
  • sticky bit (1000 / t для остальных): В каталоге с sticky bit пользователь может удалять/переименовывать только свои файлы, даже если имеет право на запись в каталог. Классический пример — /tmp.
    ls -ld /tmp
    # drwxrwxrwt 10 root root ... /tmp
    # Обратите внимание на 't' вместо 'x' у остальных.
    

Шаг 7: Управление владельцем и группой (chown, chgrp)

Иногда нужно сменить не права, а собственника файла.

# Изменить владельца файла
sudo chown alice:developers config.yml
# Эквивалентно: sudo chown alice config.yml && sudo chgrp developers config.yml

# Рекурсивно сменить владельца всего каталога project и его содержимого
sudo chown -R www-data:www-data /var/www/project/

# Изменить только группу (chgrp)
sudo chgrp -R staff /opt/scripts/

Проверка результата

После внесения изменений обязательно проверьте их:

  1. Для стандартных прав: ls -l <файл/каталог>
  2. Для ACL: getfacl <файл/каталог>
  3. Для атрибутов chattr: lsattr <файл/каталог>
  4. Практический тест: Попробуйте выполнить действие от имени другого пользователя (с помощью sudo -u <user> <command> или переключившись в его сессию), чтобы убедиться, что доступ работает так, как задумано.

Возможные проблемы

  • "Permission denied" при выполнении скрипта: Проверьте, есть ли у владельца файла и текущего пользователя право на выполнение (x). Также проверьте, не установлен ли атрибут i через chattr.
  • Потеря доступа после chmod 777 или chmod 000: Если вы случайно установили слишком строгие или слишком общие права, верните нужные значения через sudo chmod (если у вас ещё есть права sudo) или загрузитесь в режиме восстановления (recovery mode).
  • ACL не работают: Убедитесь, что файловая система смонтирована с опцией acl (обычно в современных дистрибутивах это по умолчанию). Проверьте /etc/fstab. Для применения изменений в fstab可能需要 перемонтировать раздел.
  • Setuid на скрипте не работает: Это особенность ядра Linux. Setuid работает только с бинарными исполняемыми файлами. Для скриптов используйте sudo с настройкой в /etc/sudoers или setgid на каталоге с wrapper-скриптом.
  • Не удаётся удалить файл в каталоге с setgid: Убедитесь, что у вас есть право на запись (w) в сам каталог, а не только на файл. Удаление файла — это изменение содержимого каталога.

Хотите углубиться в управление привилегиями? Ознакомьтесь с нашим подробным гайдом по настройке sudoers для безопасного делегирования прав: /guides/linux/linux-sudoers-config

Заключение и лучшие практики

  1. Принцип наименьших привилегий: Давайте только те права, которые необходимы для работы. Избегайте 777 и 666.
  2. Используйте группы для совместного доступа: Создавайте группы (groupadd devs), добавляйте пользователей (usermod -aG devs alice) и давайте права группе (chmod 770 /project).
  3. Для сложных сценариев — ACL: Если модели "владелец/группа/остальные" недостаточно, сразу переходите на ACL.
  4. Защищайте критические файлы: Используйте chattr +i для конфигурационных файлов ядра, системных утилит или важных скриптов.
  5. Setuid/setgid — с умом: Устанавливайте только на проверенные, доверенные бинарные файлы. Никогда — на скрипты.
  6. Всегда проверяйте: После настройки прав протестируйте доступ от имени нужных пользователей.

Права доступа — это мощный, но требующий аккуратности инструмент. Освойте его, и ваша Linux-система станет значительно надёжнее и безопаснее.

Часто задаваемые вопросы

Что такое umask и как он влияет на права новых файлов?
Чем опасен chmod 777 и когда его можно использовать?
Как отличить chown от chmod?

Полезное

Изучите текущие права файла
Измените права числовым методом (chmod)
Измените права символьным методом (chmod)
Настройте расширенные ACL (setfacl)
Установите специальные атрибуты (chattr)