CHMOD: Магия цифр и букв. Полное руководство по управлению правами доступа к файлам в Linux

CHMOD: Магия цифр и букв. Полное руководство по управлению правами доступа к файлам в Linux

В мире Linux и Unix-подобных систем нет волшебных заклинаний, но есть команда chmod — мощный инструмент, который, подобно стражу у ворот, решает, кто и что может делать с вашими файлами и папками. Понимание chmod — это не просто технический навык, а ключ к безопасности, стабильности и осознанному управлению вашей системой. Давайте разберемся, как эта магия работает на самом деле.

Что такое права доступа и зачем они нужны?

Представьте, что ваш файл — это дом. Права доступа определяют: кто из жильцов (пользователей) может зайти в дом (прочитать файл), кто может переставить мебель (записать в файл), а кому разрешено даже запустить лифт (выполнить файл как программу). Без этой системы любой пользователь или процесс мог бы делать с вашими конфиденциальными документами или системными файлами всё что угодно.

Права доступа — фундаментальный механизм безопасности многопользовательских систем. Их неправильная настройка — одна из частых причин уязвимостей.

Три кита: Владелец, Группа и Все остальные

Права в Linux всегда рассматриваются для трех категорий пользователей:

  • u (user/owner): Владелец файла.
  • g (group): Члены группы, к которой привязан файл.
  • o (others): Все остальные пользователи системы.

Также есть категория a (all), которая означает всех сразу (u+g+o).

Три базовых права: Чтение, Запись, Выполнение

Для каждой категории можно задать три типа доступа:

  • r (read) — Чтение (4): Для файла — возможность просмотреть содержимое. Для директории — возможность посмотреть список файлов в ней (команда ls).
  • w (write) — Запись (2): Для файла — возможность изменить или удалить содержимое. Для директории — возможность создавать, переименовывать или удалять файлы внутри нее.
  • x (execute) — Выполнение (1): Для файла — возможность запустить файл как программу или скрипт. Для директории — возможность «войти» в нее (сделать ее текущей рабочей директорией, командой cd).

Два основных способа: Символьный и Цифровой

Символьный (буквенный) метод

Более наглядный для человека. Синтаксис: chmod [категория][оператор][права] файл.

Операторы: + (добавить право), - (убрать право), = (установить право в точности).

Примеры:

  1. chmod u+x script.sh — Добавить владельцу право на выполнение файла script.sh.
  2. chmod go-w secret.txt — Отнять у группы и всех остальных право на запись в файл secret.txt.
  3. chmod a=rw config.cfg — Установить для всех (владельца, группы, остальных) только права на чтение и запись (но не выполнение).

Цифровой (восьмеричный) метод

Более компактный и часто используемый в скриптах. Каждое право имеет вес: r=4, w=2, x=1. Права для категории суммируются.

Как считать: Для каждой категории (u, g, o) вычисляется сумма от 0 до 7. Затем три цифры записываются подряд.

  • 7 (4+2+1) = rwx (чтение, запись, выполнение)
  • 6 (4+2+0) = rw- (чтение, запись)
  • 5 (4+0+1) = r-x (чтение, выполнение)
  • 4 (4+0+0) = r-- (только чтение)
  • 0 (0+0+0) = --- (нет прав)

Примеры:

  1. chmod 755 script.sh — Владелец: rwx (7), Группа: r-x (5), Остальные: r-x (5). Стандартные права для исполняемых программ.
  2. chmod 644 document.txt — Владелец: rw- (6), Группа: r-- (4), Остальные: r-- (4). Стандартные права для обычных файлов.
  3. chmod 700 ~/.ssh/id_rsa — Только владелец может читать и записывать этот приватный ключ. Никто больше — идеально для безопасности.

Команда ls -l покажет права доступа в символьном виде в начале каждой строки (например, -rwxr-xr--). Первый символ указывает тип объекта («-» для файла, «d» для директории).

Особые права: SUID, SGID, Sticky Bit

Помимо основных трех, существуют специальные биты, которые добавляют четвертую цифру в начало цифровой записи:

  • SUID (4): Установленный на исполняемый файл, заставляет его выполняться с правами его владельца, а не запустившего пользователя. Пример: chmod 4755 /usr/bin/passwd.
  • SGID (2): Для директории — файлы, созданные в ней, будут наследовать группу директории, а не создателя. Для файла — аналогично SUID, но для группы.
  • Sticky Bit (1): Для директории (например, /tmp) разрешает удалять файлы внутри только их владельцам, даже если у других есть право на запись в директорию. chmod 1777 /tmp.

Рекурсивное изменение прав

Чтобы изменить права для всей директории и всего ее содержимого (поддиректорий и файлов), используйте ключ -R (recursive).

Пример: chmod -R 755 /var/www/my_site/ — установит права 755 для всех файлов и папок внутри my_site.

Будьте крайне осторожны с chmod -R! Неправильно заданные права для системных файлов могут «сломать» работу ОС. Всегда проверяйте путь, по которому применяете команду.

Практические сценарии и лучшие практики

  • Веб-сервер: Файлы — 644, директории и CGI-скрипты — 755. Пользователь веб-сервера (например, www-data) должен иметь доступ на чтение.
  • Закрытые данные: Конфиги с паролями, SSH-ключи — 600 (только владелец).
  • Общая папка для группы: Директория — 2770 (включен SGID), файлы в ней — 660. Это позволит членам одной группы совместно работать с файлами.
  • Никогда не используйте chmod 777 (полный доступ всем) как «решение» проблем с доступом. Это грубейшая ошибка безопасности!

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

Как посмотреть текущие права доступа к файлу?

Используйте команду ls -l имя_файла. Права отобразятся в виде 10 символов в начале строки.

Что делать, если я получил ошибку «Permission denied»?

Вам не хватает прав на выполнение операции. Либо запустите команду с повышенными привилегиями через sudo (если это системный файл и вы администратор), либо измените права на файл/директорию, если вы его владелец.

Чем опасны широкие права (например, 777)?

Любой пользователь или вредоносный скрипт в системе сможет прочитать, изменить или удалить такие файлы. Если это файлы веб-сервера, доступные из интернета, это открывает двери для взлома.

Как рекурсивно изменить права только для файлов или только для папок?

Можно скомбинировать find и chmod. Например:
find /path -type f -exec chmod 644 {} \; — изменить все файлы на 644.
find /path -type d -exec chmod 755 {} \; — изменить все директории на 755.

Можно ли отменить изменения chmod?

Нет отдельной команды «отката». Нужно знать или вычислить предыдущие корректные права и установить их заново. Поэтому перед массовыми изменениями делайте бэкапы или проверяйте команды на тестовых файлах.