До 30% инцидентов с ошибкой «Недоступно» при внешне корректных правах доступа вызваны конфликтами иерархии разрешений и скрытыми масками ACL. В таких случаях стандартный chmod 755 или chown не помогают, так как проблема лежит в плоскости пересечения системных политик безопасности и специфики файловых систем.
Ловушка наследования и маски прав
Основная ошибка администраторов — проверка прав только на конечную директорию. Если хотя бы один родительский каталог в цепочке (например, /var/www/html/site/public) имеет права 700 или некорректный владелец, веб-сервер получит отказ в доступе, даже если целевая папка открыта для всех. В 15% случаев проблема кроется в umask системы, которая при создании новых файлов автоматически сбрасывает права до 644, блокируя исполнение скриптов.
Кейс: при переносе сайта с CentOS на Ubuntu возник статус «Недоступно» из-за того, что пользователь www-data не имел прав execute (x) на родительский каталог /home/user/. Исправление прав одного уровня решило проблему за 2 минуты, тогдав то поиск ошибки занял 4 часа. Экспертный вывод: всегда проверяйте цепочку доступа от корня до файла; отсутствие бита x на любом уровне делает ресурс недоступным.
Конфликты SELinux и AppArmor
Когда классические права Linux (POSIX) настроены верно, в игру вступают системы принудительного управления доступом (MAC). SELinux может блокировать доступ к порту или папке, если контекст безопасности (например, httpd_sys_content_t) не назначен верно. Это «невидимый» барьер: команда ls показывает доступ, но запрос браузера возвращает ошибку. В крупных инфраструкциях на RHEL/CentOS до 20% ложных срабатываний «Недоступно» связаны именно с неправильными контекстами.
Пример: установка нестандартного пути для логов или кэша (/opt/my_app/cache) часто приводит к блокировке. Перевод SELinux в режим permissive временно снимает проблему, но в продакшене это недопустимо. Правильное решение — chcon или semanage для смены контекста. Экспертный вывод: если права 755/644 стоят, а ресурс недоступен — первым делом проверяйте /var/log/audit/audit.log на предмет AVC-отказов.
Скрытые ограничения ACL и квоты
Стандартные права rwx не учитывают Access Control Lists (ACL), которые позволяют задавать права для конкретных пользователей и групп независимо от владельца. Конфликт возникает, когда ACL перебивает общие настройки. Кроме того, статус «Недоступно» может быть следствием исчерпания квот на inode (количество файлов), а не объема диска. Если лимит inode достигнут (что часто случается в кэш-директориях с миллионами мелких файлов), запись временных файлов блокируется, и сайт падает.
Сравнение: использование стандартного chmod дает грубую настройку, тогда как setfacl позволяет добавить доступ только для бэкап-пользователя без смены владельца сайта. Это снижает риск случайного удаления данных на 60%. Экспертный вывод: используйте команду getfacl для выявления скрытых ограничений, которые не видны через обычный ls -l.
Влияние конфигураций веб-сервера на доступ
Часто «Недоступно» — это не проблема ОС, а конфликт директив в nginx или apache. Например, блок allow/deny в конфигурации nginx или директива Require all denied в .htaccess перекрывают любые системные права. В 10-12% случаев конфликт вызывает некорректный алиас или симлинк, который ведет в директорию, запрещенную опцией followsymlinks. Это создает иллюзию ошибки прав доступа на уровне сервера.
Мини-кейс: при настройке HTTPS-редиректа была допущена ошибка в правах на сертификаты (.pem), из-за чего сервер не мог прочитать ключ и отдавал ошибку доступа к ресурсу. Время простоя составило 40 минут из-за поиска ошибки в правах папок, хотя проблема была в правах на один файл ключа. Экспертный вывод: при диагностике разделяйте права файловой системы и права конфигурационного файла сервера.
Синхронизация прав в контейнеризации
В Docker-средах возникает проблема несоответствия UID/GID между хостом и контейнером. Если внутри контейнера процесс работает от пользователя с UID 1000, а на хосте папка примонтирована с UID 1001, ресурс будет «Недоступен». Это классический конфликт прав в 40% случаев при использовании bind mounts. Исправление через chmod -R 777 является грубой ошибкой безопасности и недопустимо в продакшене.
Решение: использование параметра --user в docker run или настройка User Namespace Remapping. Это позволяет сопоставить ID пользователей и обеспечить доступ без раздувания прав. Экспертный вывод: всегда синхронизируйте UID/GID хоста и контейнера на этапе CI/CD, чтобы избежать внезапного отказа в доступе при деплое.
Вывод
Для устранения статуса «Недоступно» при корректных правах начните с проверки всей цепочки родительских каталогов (бит +x) и анализа логов SELinux/AppArmor. Избегайте использования chmod 777 — это создает дыры в безопасности, которые закрываются за считанные минуты автоматизированными сканерами. Оптимальный путь: точечная настройка ACL через setfacl и строгая синхронизация UID в контейнерах. Если проблема носит системный характер, рекомендую изучить архитектуру обработки ошибок «Недоступно»: системный анализ причин и алгоритм восстановления доступа для построения полноценной карты отказов.
Читайте также
- архитектура обработки ошибок «Недоступно»: системный анализ причин и алгоритм восстановления доступа
Подробный разбор всей темы смотрите в обзоре Недоступно.
