chmod 777, 755, 644: что означают права доступа в Linux

Скрипт не запускается, и терминал выдаёт bash: ./deploy.sh: Permission denied. Или обратная история: сайт лежит, потому что кто-то ночью сделал chmod -R 777 и забыл, зачем. На уровне HTTP то же самое выглядит как 403 Forbidden, только в браузере, а в терминале сообщение выглядит как отказ операционной системы. Права доступа в Linux кажутся тайной шифром ровно до тех пор, пока не расшифруешь три цифры, и после этого становится проще, чем кажется.
Три группы и три действия
У каждого файла есть владелец, группа и категория «все остальные». Права задаются отдельно для каждой группы, поэтому в записи всегда три тройки символов. Самих действий тоже ровно три: читать, писать и выполнять.
- r, read, чтение: увидеть содержимое файла или список имён в каталоге, соответствует биту 4;
- w, write, запись: изменить содержимое файла, создать, удалить или переименовать файл в каталоге, бит 2;
- x, execute, выполнение: запустить файл как программу, а для каталога это право перейти внутрь него, бит 1;
- u, user, владелец: тот, кому файл принадлежит; g, group, группа: пользователи из группы файла; o, others, остальные: все прочие, включая анонимных посетителей сайта.
Смысл разделения на группы простой: на сервере есть не только вы. У веб-сервера своя группа, у приложения своя, у деплоя своя. Права настраивают так, чтобы каждая часть системы делала ровно то, что ей нужно, и ничего больше.
Восьмеричная запись: почему r это 4, w это 2, x это 1
Три действия складываются в одно число по битам, и получается восьмеричная цифра от 0 до 7. Read весит 4, write весит 2, execute весит 1. Одна цифра кодирует права одной группы, а три цифры подряд, по одной на владельца, группу и остальных, кодируют полный набор.
0 = 0 --- нет прав
1 = 1 --x только выполнение
2 = 2 -w- только запись
3 = 2 + 1 -wx запись и выполнение
4 = 4 r-- только чтение
5 = 4 + 1 r-x чтение и выполнение
6 = 4 + 2 rw- чтение и запись
7 = 4 + 2 + 1 rwx все три праваИз этой таблицы сразу видно, откуда берутся три знакомые цифры. В 644 первая цифра это 6, то есть 4 плюс 2, чтение и запись; вторая и третья это 4, то есть только чтение. В 755 первая цифра это 7, а вторая и третья это 5, то есть 4 плюс 1, чтение и выполнение.
Что значат 644, 755, 777, 600 и 700
- 644, то есть rw-r--r--: обычный файл, который нужно читать, а править может только владелец. Стандарт для текстовых файлов, конфигов, .htaccess и файлов сайта;
- 755, то есть rwxr-xr-x: файл, который нужно запускать, или каталог, в который нужно заходить. Владелец читает, пишет и выполняет, группа и остальные читают и выполняют, но не пишут;
- 777, то есть rwxrwxrwx: все права для всех. На работающем сервере это почти всегда ошибка;
- 600, то есть rw-------: файл доступен только владельцу. Так обращаются с паролями, ключами и файлами .env;
- 700, то есть rwx------: каталог или скрипт, доступный исключительно владельцу. Личный каталог пользователя и ~/.ssh выглядят именно так;
- 750, то есть rwxr-x---: каталог, в который может зайти своя группа. Рабочая настройка для каталога приложения.
Про 777 стоит сказать отдельно, потому что именно его чаще всего советуют в интернете. Право записи для группы «остальные» означает, что абсолютно любой пользователь на сервере, включая скомпрометированный сайт из соседнего аккаунта, может создать и изменить файл. Если этот файл исполняемый или подключается веб-сервером, туда можно положить свой код, и он выполнится от имени сервера. Для каталога uploads с картинками это путь к загрузке вредоносного файла, для конфига с паролем от базы это путь к утечке.
Символьная запись rwxr-xr-x
Восьмеричные числа удобны в скриптах, но держать в голове, что значит 755, необязательно. Символьная запись читается прямо: десять символов, три группы по три позиции, в порядке владелец, группа, остальные. Дефис означает, что права нет.
Есть и третий формат, в котором каждое право выписано отдельной операцией. Он удобен тем, что меняет ровно то, что нужно, и не трогает остальное: u+x добавит право выполнения владельцу, g-w уберёт право записи у группы, o=r оставит у остальных только чтение. Порядок операций в команде значения не имеет, а вот порядок букв в символьной записи важен.
Числом: 755
Символьно: rwxr-xr-x
По частям: chmod u+r,u+w,u+x,g+r,g+x,o+r,o+x
Для файла: chmod 755 filename
Для каталога: chmod 755 directory/Каталогу нужен x, и вот почему
Для файла права читаются привычно: r открывает содержимое, w меняет его, x запускает. Для каталога смысл другой, и именно здесь новички чаще всего ошибаются, потому что интуиция подсказывает «чем больше, тем лучше».
- r на каталоге это право увидеть список имён файлов;
- w на каталоге это право создавать в нём файлы, удалять их и переименовать;
- x на каталоге это право пройти внутрь: перейти в каталог и открыть файлы, которые внутри;
- r и w без x дают странный эффект: имена видно, но войти нельзя;
- x без r даёт обратный эффект: войти можно, а список файлов посмотреть нельзя.
Отсюда практическое правило: каталог без права x нерабочий, какие бы права ни стояли. И обратное тоже верно: если каталог закрыт на 700, а файл внутри выставлен на 644, владелец всё равно не прочитает файл, потому что перейти внутрь нельзя. Права файла не действуют в обход прав каталога, в котором он лежит.
umask: откуда берутся 644 и 755
Права нового файла не придумываются в момент создания, а вычисляются из маски umask. Маска задаёт права, которые запрещены. Файл создаётся как 666, каталог как 777, и из этих базовых значений вычитается маска.
Маска по умолчанию в большинстве дистрибутивов Linux равна 022. Значит, у нового файла запрещены запись для группы и для остальных, и получается 644, а у нового каталога запрещено право записи для остальных, и получается 755. Именно поэтому на свежем сервере все файлы и каталоги выглядят одинаково, и именно поэтому «права слетели» обычно означает, что кто-то менял маску или копировал файлы с другими правами.
Базовые права: файл 666, каталог 777
umask 022 (по умолчанию) → файлы 644, каталоги 755
umask 002 → файлы 664, каталоги 775
umask 027 → файлы 640, каталоги 750
umask 077 → файлы 600, каталоги 700
umask 000 → файлы 666, каталоги 777Текущую маску показывает команда umask, изменить её можно командой umask 027 в том же терминале, после чего новые файлы будут создаваться с более закрытыми правами. Деталь, о которой забывают: маска влияет только на новые объекты, права уже существующих файлов и каталогов не меняются.
Как это выглядит в ls -l
Команда ls -l показывает в начале каждой строки десять символов. Первый отвечает за тип объекта, остальные девять это права в символьной записи, а дальше идут число ссылок, владелец, группа, размер, дата и имя.
-rw-r--r-- 1 www-data www-data 1234 Nov 3 10:12 index.php
drwxr-xr-x 2 www-data www-data 4096 Nov 3 10:12 uploads
-rwxr-xr-x 1 deploy deploy 512 Nov 3 09:40 backup.sh
-rw------- 1 deploy deploy 96 Nov 3 09:38 .env
lrwxrwxrwx 1 www-data www-data 12 Nov 3 10:12 current -> releasesПервый символ расшифровывается так: дефис это обычный файл, d это каталог, l это символическая ссылка, c это символьное устройство, b это блочное устройство. Дальше идут три группы по три символа, и из них сразу читается ответ: index.php это 644, uploads это 755, backup.sh это 755, .env это 600. У символической ссылки права показываются как 777, но они ничего не значат, потому что доступ определяется правами цели, на которую ссылка указывает.
Подбираем права без догадок
Откройте калькулятор прав доступа: он показывает четыре представления одного набора сразу, восьмеричное число, символьную запись, перечисление отдельных прав и готовую команду. Есть пресеты 644, 755, 777, 700, 600, 750, 666 и 400, переключатель «файл или каталог» и поле, куда можно вписать число и получить расшифровку. Например, 755 превращается в rwxr-xr-x и в команду chmod 755 filename, а для каталога подставляется chmod 755 directory/.
Отдельная задача рядом с правами это расписание задач. Если скрипт запускается по cron, у него должен быть бит исполнения, а лог или файл блокировки лучше закрыть: 644 для лога, 600 для файла с чувствительными данными. Разобрать само выражение расписания помогает разбор cron-выражений, а как из этих строк получается расписание в человекочитаемом виде, разобрано в статье о cron в простых словах.
Типичные ошибки
- chmod -R 777 на весь сайт. Проблема не в том, что перестанет работать, а в том, что заработает слишком широко;
- забытый x на каталоге: 666 на каталоге выглядит безобидно, хотя внутрь оно не пустит;
- попытка сделать каталог исполняемым, чтобы запустить лежащий в нём скрипт: право x ставится на самом файле, а каталогу x нужен для обхода;
- смена прав на файле вместо каталога: скрипт не запустится, потому что не хватает x на самом .sh, а не на папке рядом;
- права на .htaccess: значение 777 позволяет любому посетителю дописать в файл свои директивы, правильное значение там 644;
- chmod 600 на публичной папке: загруженные файлы перестанут отдаваться, если процесс веб-сервера работает от другого пользователя;
- chmod 755 на файле с данными: если это конфиг, пароль или ключ, то execute тут не нужен, достаточно 644 или 600.
Частые вопросы
Почему скрипт перестал запускаться после переноса сайта?
Чаще всего дело не в самих правах, а в том, что при копировании потерялся бит исполнения или сменился владелец файлов. Посмотрите вывод ls -l для проблемного файла и сравните с ожидаемым. Символическая ссылка, созданная до переноса, может вести в никуда, и тогда проблема выглядит как права, хотя на самом деле это ссылка.
Чем отличаются 644 и 664?
Второй цифрой. В 664 у группы появляется 6, то есть 4 плюс 2, чтение и запись, а у остальных остаётся 4, то есть только чтение. На одиночном файле в рабочей папке разница невелика, но на общем каталоге 664 позволяет коллеге по группе менять содержимое. Сравнение с 775 то же: у каталога во второй позиции стоит 7 вместо 5, то есть группе добавляется запись.
Что такое setuid, setgid и sticky bit?
Это дополнительные биты, которые записываются четвёртой цифрой перед основными тремя. Setuid даёт программе права владельца файла, setgid заставляет новые файлы наследовать группу каталога, а sticky bit, он же t, запрещает удалять файлы из каталога кому-либо, кроме владельца файла, владельца каталога и суперпользователя. Классический пример с sticky bit это каталог /tmp, он выглядит как drwxrwxrwt.
Чем chmod отличается от chown?
У файла три независимых атрибута, и путать их не стоит. chmod меняет права, chown меняет владельца, chgrp меняет группу. Если скрипт не запускается из-за отсутствующего бита исполнения, помогает chmod, а если не совпадает владелец, нужен chown. На сервере с несколькими пользователями владельца и группу обычно задают один раз, а права подбирают точечно.
Нужно ли ставить 755 на скрипты cron?
Да, если задача запускает файл напрямую. Классическая настройка выглядит так: сам скрипт получает 755, лог или файл блокировки 644, а если туда пишется что-то чувствительное, то 600. Кстати, у cron ограниченный PATH, поэтому в команде лучше указывать абсолютные пути к интерпретатору и к самому скрипту.