Что такое права доступа в Linux и зачем они нужны?
Представь, что твой Linux-сервер — это многоэтажный дом с охраной. Каждому файлу и папке (квартире) выдается пропуск, который определяет, кто может зайти (прочитать), переставить мебель (записать) или вообще войти в квартиру (выполнить). Эта система пропусков и есть права доступа, а chmod — это инструмент, который выдает или забирает эти пропуски.
Без правильной настройки прав доступа (permissions) твое приложение может не запуститься, скрипты откажутся работать, а злоумышленник получит доступ к критическим данным. Давай разберем, как этим управлять.
Как посмотреть текущие права доступа: команда ls -l
Первым делом научимся «читать» пропуска. Для этого используй команду ls -l.
$ ls -l
-rw-r--r-- 1 user group 4096 Dec 10 10:30 index.html
drwxr-xr-x 2 user group 4096 Dec 10 10:35 scripts/
-rwxr-xr-- 1 user group 123 Dec 10 10:40 deploy.sh
Первый символ в строке указывает тип объекта: - (файл), d (директория), l (ссылка). Дальше идут 9 символов прав доступа, разбитые на три группы по три символа:
- Первая тройка (rw-): Права для владельца файла (user/owner).
- Вторая тройка (r--): Права для группы (group).
- Третья тройка (r--): Права для всех остальных (others).
Каждый символ в тройке означает:
- r (read) — право на чтение (для директории — просмотр содержимого).
- w (write) — право на запись (для директории — создание/удаление файлов).
- x (execute) — право на выполнение (для директории — возможность «войти» в нее).
- - — право отсутствует.
Два способа изменения прав: символьный и числовой (восьмеричный)
Команда chmod позволяет менять права двумя основными способами. Выбор зависит от ситуации и личных предпочтений.
1. Символьный (буквенный) режим
Более наглядный способ. Ты явно указываешь, для кого меняешь права (u,g,o,a), какую операцию выполняешь (+, -, =) и какие права (r,w,x).
Синтаксис: chmod [КТО][ОПЕРАЦИЯ][ПРАВА] файл
| Кто (WHO) | Операция | Права (WHAT) |
|---|---|---|
u — владелец (user) |
+ — добавить |
r — чтение |
g — группа (group) |
- — убрать |
w — запись |
o — остальные (others) |
= — установить точно |
x — выполнение |
a — все (all) (по умолчанию) |
# Добавить право на выполнение для владельца
chmod u+x script.sh
# Убрать право на запись для группы и остальных
chmod go-w secret.txt
# Установить точные права: владелец — читает/пишет, группа — читает, остальные — ничего
chmod u=rw,g=r,o= config.yaml
# Дать всем право на чтение
chmod a+r public_file.log
2. Числовой (восьмеричный) режим
Более компактный и часто используемый в скриптах способ. Каждая тройка прав представляется числом от 0 до 7.
Как считать: Сложи вес каждого установленного бита в группе: r=4, w=2, x=1.
| Комбинация | Расчет | Число |
|---|---|---|
--- |
0 + 0 + 0 | 0 |
--x |
0 + 0 + 1 | 1 |
-w- |
0 + 2 + 0 | 2 |
-wx |
0 + 2 + 1 | 3 |
r-- |
4 + 0 + 0 | 4 |
r-x |
4 + 0 + 1 | 5 |
rw- |
4 + 2 + 0 | 6 |
rwx |
4 + 2 + 1 | 7 |
Теперь, чтобы задать права для всего файла, мы просто пишем три цифры подряд: первая — для владельца, вторая — для группы, третья — для остальных.
# Установить права 644 (rw-r--r--)
chmod 644 index.html
# Установить права 755 (rwxr-xr-x) для директории
chmod 755 /var/www/myapp/
# Установить права 600 (только владелец читает и пишет) для приватного ключа
chmod 600 ~/.ssh/id_rsa
# Опасный пример: 777 (rwxrwxrwx) — полный доступ всем
chmod 777 /tmp/some_file # НЕ ДЕЛАЙТЕ ЭТОГО БЕЗ ОЧЕНЬ ВЕСКОЙ ПРИЧИНЫ
chmod 777 на рабочих серверах для файлов приложений или конфигураций. Это грубейшее нарушение безопасности, которое откроет дверь для атак.
Практические примеры и частые кейсы
Давай рассмотрим, как права доступа применяются в реальных задачах DevOps и разработки.
Настройка веб-сервера (Nginx/Apache)
Веб-сервер обычно работает от имени отдельного пользователя (например, www-data или nginx). Файлы должны быть читаемы для него, а директории — доступны для входа.
# Владелец — твой пользователь, группа — www-data
sudo chown -R $USER:www-data /var/www/myproject
# Файлы: владелец читает/пишет, группа читает, остальные читают
find /var/www/myproject -type f -exec chmod 644 {} \;
# Директории: владелец полный доступ, группа читает/входит, остальные читают/входят
find /var/www/myproject -type d -exec chmod 755 {} \;
# Особый скрипт, который должен выполняться веб-сервером
chmod 755 /var/www/myproject/cgi-bin/script.cgi
Безопасная работа с SSH ключами
OpenSSH очень строг к правам доступа. Неправильные права — и подключение не заработает.
# Права для директории .ssh (только владелец)
chmod 700 ~/.ssh
# Права для приватного ключа (только чтение/запись для владельца)
chmod 600 ~/.ssh/id_rsa
# Права для публичного ключа (может быть читаем всеми)
chmod 644 ~/.ssh/id_rsa.pub
# Права для конфига (только владелец)
chmod 600 ~/.ssh/config
Скрипты и исполняемые файлы
Чтобы запустить скрипт командой ./script.sh, у него должен быть установлен бит выполнения (x).
# Создаем скрипт
echo '#!/bin/bash\necho "Hello World"' > myscript.sh
# Даем право на выполнение для владельца (можно и для всех, если нужно)
chmod u+x myscript.sh
# Теперь его можно запустить
./myscript.sh # Выведет: Hello World
Рекурсивное изменение прав для директорий
Часто нужно поменять права для всей папки и всего, что внутри. Для этого используется флаг -R (recursive).
# Рекурсивно дать всем право на чтение файлов в директории logs
chmod -R a+r /var/log/myapp/
# Рекурсивно установить права 755 на все поддиректории и 644 на все файлы
# Внимание: это разные команды для файлов и папок!
find /path/to/dir -type d -exec chmod 755 {} \;
find /path/to/dir -type f -exec chmod 644 {} \;
chmod -R. Одна ошибка в пути или маске — и можно сломать права на всей системе. Всегда проверяй команду find без -exec сначала.
Специальные биты: SUID, SGID, Sticky Bit
Помимо основных rwx, существуют специальные биты, которые ставятся в четвертую, старшую цифру числового режима.
- SUID (Set User ID, 4): Если установлен на исполняемом файле, то он запускается с правами владельца файла, а не запустившего пользователя. Пример:
passwd. - SGID (Set Group ID, 2): Для файлов — как SUID, но для группы. Для директорий — новые файлы наследуют группу директории, а не создателя.
- Sticky Bit (1): Для директорий (например,
/tmp) разрешает удалять файлы только их владельцам, даже если у других есть право на запись.
# Установить SUID бит (например, 4755)
chmod 4755 /usr/bin/special_program
# Символьный способ:
chmod u+s /usr/bin/special_program
# Установить SGID на директорию (например, 2775)
chmod 2775 /shared/group_folder
chmod g+s /shared/group_folder
# Установить Sticky Bit на /tmp (обычно уже установлен)
chmod 1777 /tmp
chmod o+t /tmp
Часто задаваемые вопросы (FAQ)
Чем отличаются права на файл и на директорию?
Права r, w, x имеют разный смысл для файлов и папок:
| Право | Для файла | Для директории |
|---|---|---|
| r (read) | Чтение содержимого файла | Просмотр списка файлов в директории (команда ls) |
| w (write) | Изменение содержимого файла | Создание, удаление, переименование файлов внутри директории |
| x (execute) | Запуск файла как программы/скрипта | «Вход» в директорию (cd), доступ к файлам внутри |
Чтобы удалить файл, нужны права w на директорию, где он лежит, а не на сам файл!
Что такое umask и как она влияет на chmod?
umask (user mask) — это маска прав по умолчанию, которая вычитается из максимальных прав при создании нового файла или директории. По умолчанию часто 022, что означает: для новых файлов — права 644 (666 - 022), для директорий — 755 (777 - 022). Узнать текущую: umask. Изменить для сессии: umask 027.
Я изменил права, но веб-сервер все равно не может прочитать файл. В чем дело?
Проверь цепочку: 1) Права на сам файл (должны быть как минимум r для пользователя/группы веб-сервера). 2) Права на ВСЕ родительские директории вплоть до корня — на каждой должна быть хотя бы r-x для пользователя/группы веб-сервера, иначе он не «доберется» до файла. Используй namei -l /path/to/your/file для анализа.
Как рекурсивно изменить владельца и группу вместе с правами?
Для изменения владельца и группы используется команда chown. Часто их используют вместе с chmod.
# Рекурсивно изменить владельца и группу
sudo chown -R www-data:www-data /var/www
# Затем установить правильные права
sudo find /var/www -type d -exec chmod 755 {} \;
sudo find /var/www -type f -exec chmod 644 {} \;
Заключение и лучшие практики
Управление правами доступа с помощью chmod — фундаментальный навык для любого, кто работает с Linux. Запомни главное:
- Соблюдай принцип минимальных привилегий: давай ровно столько прав, сколько нужно для работы, и не больше.
- Избегай
777и666на продакшене как огня. - Для веб-контента используй классическую схему: файлы — 644, директории — 755.
- Для конфигов и приватных ключей — 600.
- Всегда проверяй права на цепочку родительских директорий.
- Используй числовой режим в скриптах для однозначности, а символьный — для быстрых точечных изменений.
Потренируйся на тестовом сервере или в виртуальной машине, создавай файлы, меняй права и проверяй результат. Со временем чтение записей типа drwxr-xr-x станет для тебя таким же естественным, как чтение обычного текста.