Три триады, по три бита каждая
Каждый файл Unix несёт девять битов прав, упорядоченных как три группы по три. Первая
триада принадлежит владельцу файла, вторая — группе файла, третья — всем остальным в
системе. Внутри каждой триады биты означают чтение, запись и выполнение и имеют вес 4, 2 и 1
соответственно. Сложив значения нужных битов, получаем одну цифру от 0 до 7, поэтому права
традиционно записываются тремя восьмеричными цифрами.
В этом и состоит весь секрет числа вроде 755. Цифра владельца — 7, то есть 4 + 2 + 1, значит,
владелец может читать, записывать и выполнять. Цифры группы и остальных — по 5, то есть 4 + 1,
значит, они могут читать и выполнять, но не изменять. Символьно то же значение пишется как
rwxr-xr-x, что ровно и выводит ls -l после начального символа типа файла.
Три глагола на каталоге означают немного разное. Чтение позволяет перечислить имена внутри
него, запись позволяет создавать и удалять записи, а выполнение позволяет заходить внутрь,
чтобы добраться до уже известного пути. Каталог с чтением, но без выполнения, почти бесполезен:
вы видите имена, но не можете открыть ничего за ними.
Значения, которые вы реально будете вводить
Горсть комбинаций покрывает большинство реальных задач. 644 (rw-r--r--) — нормальный режим
для документа или исходного файла: владелец редактирует его, остальные читают. 755 (rwxr-xr-x) —
нормальный режим для каталога или исполняемого скрипта, поскольку обоим нужен бит выполнения,
чтобы быть хоть как-то применимыми. 600 (rw-------) держит файл приватным для владельца — именно
этого требует OpenSSH для закрытых ключей, а 700 делает то же для каталога.
Режимы, дающие право записи остальным, заслуживают второго взгляда. 777 позволяет любой учётной
записи на машине перезаписать или удалить файл, и почти никогда не является правильным ответом —
это просто самый быстрый способ скрыть ошибку прав, не поняв её. Когда веб-сервер не может
записать в каталог загрузок, настоящее решение обычно в смене владельца или группы через chown,
а не в открытии файла всему миру.
Права также взаимодействуют с umask. Новые файлы создаются с режимом по умолчанию, уменьшенным
на значение umask, обычно 022, поэтому свежесозданный файл чаще приходит как 644, а не 666.
Setuid, setgid и sticky bit
Четвёртая цифра может стоять перед тремя привычными и несёт три специальных бита: setuid (4),
setgid (2) и sticky bit (1). Они меняют, от чьего лица запускается программа и как каталог
обращается с создаваемыми внутри файлами.
Setuid на исполняемом файле заставляет его работать с правами владельца файла, а не запустившего
его пользователя. Так passwd может обновлять общесистемный файл, будучи запущенным
непривилегированным пользователем, и именно поэтому бинарники с setuid так тщательно проверяют —
ошибка в одном из них — прямой путь к правам владельца. Setgid делает то же для группы. На
каталоге setgid имеет более дружелюбный смысл: новые файлы внутри наследуют группу каталога,
что сохраняет согласованность общего проектного каталога вне зависимости от автора записи.
Sticky bit наиболее знаком по /tmp, обычно записываемому как 1777. Он позволяет любому создавать
файлы в каталоге, но ограничивает удаление владельцем каждого файла, так что пользователи не могут
удалять временные файлы друг друга. В длинном списке эти биты заменяют символ выполнения: s
вместо x означает установленный setuid или setgid, S с большой буквы — бит установлен, а
выполнение нет, а t отмечает sticky bit.