Владение и chown
У каждого файла Linux есть владелец (пользователь) и группа-владелец. Ядро сначала проверяет владение, чтобы решить, какая тройка rwx применяется. chown меняет владельца и группу; chgrp — только группу. Неправильное владение — самая частая причина неожиданных отказов в доступе.
Ты выставил chmod 755 на файл, а веб-сервер всё равно возвращает 403. Проверяешь права — выглядят правильно. Проблема почти всегда в владении: файл принадлежит root, а веб-сервер работает как www-data, поэтому сервер попадает под тройку «other», а не «user». Понимание того, как ядро выбирает, какую тройку rwx применить — и как менять владение — это недостающий элемент, который заставляет права работать по-настоящему.
После этого урока ты сможешь читать владельца и группу из вывода ls -l, объяснять, какую тройку rwx ядро применит для данного процесса, и менять владение файлом с помощью chown user:group file и chgrp group file.
У каждого файла есть владелец и группа. ls -l показывает их в третьем и четвёртом столбцах:
ls -l /etc/nginx/nginx.conf-rw-r--r-- 1 root root 2656 Jun 10 09:00 /etc/nginx/nginx.confЗдесь владелец — root, группа-владелец — тоже root. Девять битов прав (rw-r--r--, то есть 644) имеют смысл только тогда, когда знаешь, кто эти субъекты — потому что ядро применяет разные тройки в зависимости от того, кто спрашивает.
Ядро выбирает тройку по строгому правилу трёх шагов. Когда процесс пытается получить доступ к файлу, ядро проверяет по порядку:
- Если эффективный UID процесса совпадает с владельцем файла → применить тройку user (биты 2–4).
- Иначе, если эффективный GID процесса (или любая дополнительная группа) совпадает с группой файла → применить тройку group (биты 5–7).
- Иначе → применить тройку other (биты 8–10).
Ядро останавливается на первом совпадении. Именно поэтому файл с режимом 640, принадлежащий root:root, полностью недоступен для пользователя не-root, не входящего в группу root — он попадает в тройку «other», которая ---.
Это также означает: если ты владелец файла, твой доступ определяется исключительно тройкой user — даже если тройка group даёт больше прав.
chown меняет владельца, группу или обоих. Нужны права root (или sudo):
# изменить только владельца
sudo chown alice file.txt
# изменить только группу (двоеточие с пустым полем владельца)
sudo chown :devs file.txt
# изменить и владельца, и группу сразу
sudo chown alice:devs file.txt
# рекурсивно — используй осторожно
sudo chown -R alice:devs /var/www/myappСинтаксис user:group — наиболее распространённая форма. В старой документации встречается user.group (точка) — оба варианта работают, но двоеточие является стандартом.
chgrp меняет только группу. Он существует потому, что непривилегированные пользователи могут использовать его для смены группы файла на любую из своих групп (без sudo):
# alice может сделать это, если она член группы 'devs'
chgrp devs project.conf
# root может менять на любую группу
sudo chgrp www-data /var/www/html/index.htmlНа практике chown :group file делает то же самое, поэтому chgrp используется в основном в скриптах, где намерение очевидно.
Диагностика 403 веб-сервера.
Файл /var/www/html/app.conf существует с режимом 640. Веб-сервер работает как www-data.
ls -l /var/www/html/app.conf-rw-r----- 1 root root 1024 Jun 10 15:00 /var/www/html/app.confРежим 640: owner=rw-, group=r--, other=---. Веб-сервер (www-data) не является root и не входит в группу root, поэтому ядро применяет тройку «other»: ---. Нет права чтения → 403.
Исправление: меняем группу на www-data, чтобы сервер попал в тройку group (r--):
sudo chown root:www-data /var/www/html/app.conf
ls -l /var/www/html/app.conf-rw-r----- 1 root www-data 1024 Jun 10 15:01 /var/www/html/app.confТеперь www-data совпадает с группой → применяется тройка group r-- → чтение разрешено. Файл остаётся с режимом 640; изменилась только группа.
▸Почему это работает
На macOS chown и chgrp работают так же, и трёхшаговая проверка владения ядром идентична. Одна особенность macOS: System Integrity Protection (SIP) запрещает даже root менять владение определённых системных файлов в /System и /usr. На обычном Linux-сервере этого ограничения нет — root может выполнить chown на любом файле.
▸Частая ошибка
Распространённая ошибка при деплое приложений — запустить chown -R root:root /var/www/myapp для «защиты» каталога, а потом удивляться, почему приложение не может писать в лог-файлы. Процесс приложения работает не от root (например, node или www-data), поэтому каждая попытка записи упирается в тройку «other» с правами ---. Исправление: установить группу на сервисного пользователя приложения и убедиться, что тройка group разрешает запись: chown -R root:www-data /var/www/myapp && chmod -R 664 /var/www/myapp/logs.
Файл принадлежит alice:devs с режимом 640. Пользователь bob входит в группу devs. Что bob может делать с этим файлом?
У каждого файла Linux есть владелец (UID) и группа (GID). Когда процесс обращается к файлу, ядро выполняет трёхшаговую проверку: UID процесса совпадает с владельцем файла? → применить тройку user. GID процесса совпадает с группой файла? → применить тройку group. Иначе → тройка other. Первое совпадение выигрывает. chown user:group file меняет владельца и группу одной командой; chgrp group file меняет только группу. Неправильное владение — а не неправильные права — является самой частой причиной неожиданных 403 и отказов в доступе на продакшне.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.