Права доступа в Linux: chmod, chown и пользователи
Основы4 минРедакция Innovialabs
Коротко
У каждого файла в Linux есть владелец, группа и три набора прав (чтение, запись, выполнение) для владельца, группы и всех остальных; chmod меняет права, chown меняет владельца.
Коротко: как Linux решает, кому что можно
У каждого файла и каталога есть владелец (пользователь), группа и три набора прав:
- u (user) — права владельца;
- g (group) — права участников группы;
- o (others) — права всех остальных.
В каждом наборе три бита: r (read, чтение), w (write, запись), x (execute, выполнение). Посмотреть их можно командой ls -l:
$ ls -l
-rw-r--r-- 1 deploy www-data 512 app.conf
drwxr-x--- 2 deploy www-data 4096 storage
Первый символ — тип (- файл, d каталог), дальше три тройки: владелец, группа, остальные. deploy — владелец, www-data — группа.
Что значат r, w, x для файлов и каталогов
Для файлов и каталогов биты работают по-разному, и это главный источник путаницы.
| Бит | Файл | Каталог |
|---|---|---|
| r | читать содержимое | видеть список файлов |
| w | изменять содержимое | создавать, удалять, переименовывать файлы внутри |
| x | запускать как программу | заходить в каталог и обращаться к файлам по имени |
Важные следствия:
- Без x на каталоге нельзя открыть файл внутри, даже если на сам файл есть права чтения.
- Удаление файла зависит от прав на каталог (w + x), а не на сам файл.
- Чтобы веб-сервер прочитал
/var/www/app/public/index.html, ему нужен x на каждом каталоге пути.
Числовая и символьная запись
Числовая (восьмеричная) запись складывает веса битов: r = 4, w = 2, x = 1. Одна цифра на каждый набор.
| Число | Права | Типичное применение |
|---|---|---|
| 644 | rw-r--r-- | обычные файлы, конфиги без секретов |
| 640 | rw-r----- | конфиги, которые читает группа сервиса |
| 600 | rw------- | приватные ключи, .env |
| 755 | rwxr-xr-x | каталоги, исполняемые скрипты |
| 750 | rwxr-x--- | каталоги, закрытые от посторонних |
chmod 640 .env
chmod 755 deploy.sh
Символьная запись удобна, когда нужно изменить один бит, не трогая остальные:
chmod u+x deploy.sh # добавить владельцу выполнение
chmod g-w config.yml # убрать запись у группы
chmod o= secret.key # убрать все права у остальных
chmod -R g+rX storage # X ставит x только каталогам (и уже исполняемым файлам)
Владельцы и группы: chown и chgrp
chown deploy file— сменить владельца;chown deploy:www-data file— сменить владельца и группу;chgrp www-data file— сменить только группу;-R— рекурсивно для всего каталога.
Пользователя добавляют в группу так: sudo usermod -aG www-data deploy (флаг -a обязателен, иначе пользователь потеряет другие группы). Изменения групп действуют после нового входа в систему.
Типовая схема для веб-приложения
Задача: код меняет только пользователь деплоя, веб-сервер или PHP-FPM код читает, а пишет только в специальные каталоги.
# владелец — пользователь деплоя, группа — пользователь веб-сервера
sudo chown -R deploy:www-data /var/www/app
# каталоги 750, файлы 640
sudo find /var/www/app -type d -exec chmod 750 {} \;
sudo find /var/www/app -type f -exec chmod 640 {} \;
# каталоги, куда приложение пишет (загрузки, кэш, логи)
sudo chmod -R g+w /var/www/app/storage
# секреты читает только владелец и группа
sudo chmod 640 /var/www/app/.env
Логика простая: процесс веб-сервера входит в группу и может читать код, но не может его изменить. Если сайт взломают через уязвимость, злоумышленник не перепишет исходники.
Названия пользователей зависят от дистрибутива: в Debian и Ubuntu это обычно www-data, в RHEL-подобных системах — nginx или apache.
Частые ошибки
chmod 777как способ «починить» ошибку доступа. Это открывает запись всем пользователям системы. Найдите, какой процесс от какого пользователя работает, и выдайте права именно ему.- Рекурсивный
chmod -R 755на всё, из-за чего все файлы становятся исполняемыми. Разделяйте права для файлов и каталогов черезfind. - Деплой от root. Файлы получают владельца root, и приложение потом не может писать в кэш.
- Приватный SSH-ключ с правами 644. OpenSSH откажется его использовать; нужно 600.
- Забытый x на родительском каталоге, из-за которого nginx отдает 403 при корректных правах на сам файл.