chmod без магии: как читать права доступа в Unix
Что на самом деле значат 755 и 644, как связаны числовой и символьный форматы прав и когда нужны setuid, setgid и бит sticky.
Первый раз, когда chmod 755 чинит сломавшийся деплой, это похоже на заклинание. Копируешь строку со Stack Overflow, ошибка 500 исчезает — и идёшь дальше, так и не поняв, что означала цифра. Всё хорошо ровно до того дня, когда 755 оказывается неверным ответом, а почему — непонятно. Калькулятор chmod превращает эту цифру в то, что можно прочитать.
Три цифры — три категории
У каждого файла в Unix есть права для трёх категорий: владелец, группа владельца и все остальные. Это и есть три цифры в 755, слева направо: владелец, группа, остальные.
Каждая цифра — сумма трёх значений:
- чтение = 4
- запись = 2
- выполнение = 1
Складываете нужные. Чтение плюс запись — это 6. Чтение плюс выполнение — 5. Всё вместе — 7. Ничего — 0. Так что 755 читается как: владельцу всё (7), группе и остальным — чтение и выполнение (5 и 5). В символьной форме тот же режим выглядит как rwxr-xr-x — те же девять переключателей, только выписанные буквами.
Режимы, которые реально набирают
Запоминать все 512 комбинаций не нужно. На практике почти всё закрывает несколько:
- 644 (
rw-r--r--) — обычный файл. Владелец правит, остальные читают. Конфиги, HTML, картинки. - 755 (
rwxr-xr-x) — скрипты, программы и каталоги. Бит выполнения на каталоге означает «сюда можно войти», и на этом спотыкаются постоянно. - 600 (
rw-------) — приватные файлы. Здесь живёт ваш SSH-ключ. Если его сможет прочитать кто-то ещё,sshоткажется его использовать. - 700 (
rwx------) — каталог, который можете открыть только вы.
С битом выполнения на каталоге стоит разобраться отдельно. Папка с правами 644 выглядит читаемой, но зайти в неё через cd или нормально посмотреть содержимое не получится: для каталогов «выполнение» значит «проход внутрь». Я видел, как люди по двадцать минут ловят ошибку доступа, которую снял бы один +x на папке.
Символьный режим, когда цифры надоели
Числовой режим заменяет весь набор прав целиком. Иногда же надо поменять всего один бит — и тут символьная запись выручает:
chmod +x script.sh— сделать исполняемым, остальное не трогатьchmod u+w file— дать владельцу право на записьchmod go-r secret.txt— забрать чтение у группы и остальных
Разница важна. chmod 700 говорит «поставь ровно это». chmod +x говорит «добавь вот это к тому, что уже есть». На общем файле второй вариант заметно безопаснее.
Четвёртая цифра, которую никто не объясняет
Иногда встречается режим из четырёх цифр — 4755 или 1777. Ведущая цифра управляет специальными битами:
- setuid (4) запускает программу от имени владельца, а не от вашего. Именно так
passwdправит/etc/shadow, хотя вам туда нельзя. - setgid (2) делает то же для группы, а на каталоге заставляет новые файлы наследовать группу папки — удобно для общих проектных каталогов.
- бит sticky (1) защищает общий каталог. У
/tmpправа1777: файлы создавать может любой, а удалять — только свои. Без него любой пользователь стёр бы чужие временные файлы.
В этих битах лучше разобраться, а не копировать вслепую: случайный setuid на неправильном бинарнике — это настоящая дыра в безопасности.
Проверьте перед запуском
Права — из тех вещей, где ошибка молчит ровно до того момента, когда перестаёт: утёкший ключ, скрипт, который не запускается, веб-сервер с ошибкой 403. Введите режим в Калькулятор chmod — и он покажет символьную строку, строку ls -l, точную команду и понятную заметку о том, кто что может. Прочитайте один раз, а потом выполняйте команду со спокойной душой.