Введение / Зачем это нужно
Система прав доступа в Linux — фундамент безопасности сервера и рабочей станции. Без её понимания легко столкнуться с ошибкой Permission denied или случайно открыть доступ к конфигурационным файлам всему серверу. После выполнения этого гайда вы сможете точно управлять тем, кто может читать, изменять или запускать ваши файлы, используя терминал без сторонних утилит. Вы научитесь читать разрешения, применять их массово и автоматизировать создание защищённых объектов.
Требования / Подготовка
- Доступ к терминалу (локально или по SSH).
- Права суперпользователя (
sudo) для изменения прав системных файлов или смены владельца. - Базовое понимание структуры файловой системы Linux. Все команды проверены на современных дистрибутивах на базе ядра 5.15+.
Шаг 1: Анализируем текущие права доступа
Перед изменениями нужно понять текущее состояние. Выполните команду ls -la в нужной директории. Вы увидите вывод вроде:
-rwxr-xr-- 1 admin users 4096 апр 5 14:20 report.txt
Разберём структуру:
- Первый символ:
-(файл),d(директория) илиl(символическая ссылка). - Следующие 9 символов делятся на три тройки: права владельца, группы и всех остальных.
r— чтение,w— запись,x— выполнение,-— отсутствие права. - Далее идут имя владельца, имя группы, размер и дата изменения.
Запомните: система проверяет права строго слева направо. Совпадение идёт по цепочке: владелец → группа → остальные. Если вы владелец, права для группы и остальных игнорируются.
Шаг 2: Настраиваем разрешения через chmod
Для изменения разрешений используется утилита chmod. Работать можно в символьном или числовом режиме. Числовой точнее и быстрее для пакетных изменений.
Цифры соответствуют сумме битов: r=4, w=2, x=1. Например, 7 (4+2+1) даёт полные права, 5 (4+0+1) — чтение и выполнение.
# Дать владельцу чтение/запись/выполнение, группе и остальным только чтение
chmod 744 my_script.sh
# Добавить право на выполнение только владельцу (символьный режим)
chmod u+x my_script.sh
# Убрать право на запись у группы и остальных
chmod go-w my_script.sh
💡 Совет: Для директорий обычно устанавливают
755(полные права владельцу, чтение и вход остальным), а для обычных файлов —644. Это отраслевой стандарт безопасности.
Шаг 3: Меняем владельца и группу файлов
Иногда нужно передать файл другому пользователю или привязать к специфичной группе проекта. Используйте chown (change owner) и chgrp (change group).
# Сменить владельца на user1, группу оставить без изменений
sudo chown user1 файл.txt
# Сменить и владельца, и группу одновременно
sudo chown user1:developers проект/
# Рекурсивно применить ко всем вложенным файлам и папкам
sudo chown -R user1:developers /var/www/html/
⚠️ Важно: Флаг
-R(рекурсия) применяет изменения ко всем вложенным объектам. Используйте его с осторожностью в системных директориях вроде/etcили/usr, чтобы не нарушить работу ОС.
Шаг 4: Автоматизируем создание безопасных файлов
По умолчанию Linux создаёт файлы с определённой маской umask. Она определяет, какие биты будут запрещены при создании. Стандартное значение 022 означает, что новые файлы получат права 644, а папки 755.
# Проверить текущую маску
umask
# Временно установить более строгую маску (027 запрещает доступ "остальным")
umask 027
Чтобы сохранить настройку после перезагрузки, добавьте строку umask 022 в конец файла ~/.bashrc или /etc/profile. Все новые сессии будут наследовать это правило.
Проверка результата
После внесения изменений убедитесь, что правила сработали корректно. Снова выполните ls -la /путь/к/файлу и сверьте вывод с ожидаемым. Попробуйте открыть, изменить или запустить файл от имени тестового пользователя, чтобы убедиться в изоляции:
# Тест от имени другого пользователя
sudo -u guest_user cat /путь/к/файлу
Если команда вернёт Permission denied, значит, защита работает. Успешный вывод текста подтвердит, что доступ настроен верно.
Возможные проблемы
- Права не меняются и появляется
Operation not permitted: Файл может быть защищён атрибутомimmutable. Снимите его командойsudo chattr -i файл, измените права и верните защитуsudo chattr +i файл. - Изменения не применяются рекурсивно или ломают структуру: Убедитесь, что используете регистр
-Rправильно. Для сложных сценариев лучше использоватьfindс флагом-exec, чтобы отдельно обрабатывать файлы и директории:find . -type f -exec chmod 644 {} +. - Скрипт запускается, но терминал выдаёт
bad interpreter: Это не ошибка прав, а проблема с кодировкой или интерпретатором. Проверьте первую строку файла (#!/bin/bash) и формат переноса строк (должен быть LF, а не CRLF).