Права доступа к файлам Linux: chmod 755, 644 и 777
Права доступа к файлам в Linux определяют, кто может читать, изменять или запускать каждый файл и каждый каталог в системе. У любого объекта есть три класса пользователей (владелец, группа и все остальные), и каждый класс получает три бита прав: чтение (r), запись (w) и выполнение (x). Итого девять битов на файл. Команда chmod их задает, а привычное сокращение, которое встречается повсюду, — восьмеричная запись: биты rwx каждого класса сворачиваются в одну цифру от 0 до 7 (чтение 4 + запись 2 + выполнение 1).
Три режима покрывают почти всё, что когда-либо приходится набирать:
- 755 (
rwxr-xr-x) — каталоги и скрипты: владелец может их изменять, все остальные — читать и запускать. - 644 (
rw-r--r--) — обычные файлы: владелец пишет, все остальные читают. - 777 (
rwxrwxrwx) — полный доступ для всех. Почти всегда это ошибка: дыра в безопасности, а не решение.
Переключайте любые комбинации в бесплатном калькуляторе chmod и следите, как одновременно обновляются восьмеричное число, строка rwx и точная команда. Остальная часть руководства объясняет, как работают эти числа и где уместно каждое из них.
Права доступа к файлам Linux за 30 секунд
| Восьмеричное | Символьное | Типичное применение |
|---|---|---|
| 400 | r-------- | Закрытый ключ SSH, только чтение |
| 600 | rw------- | Приватные файлы, ключи SSH, .env |
| 644 | rw-r--r-- | Веб-страницы, конфиги, большинство файлов |
| 700 | rwx------ | Приватные каталоги (~/.ssh) |
| 755 | rwxr-xr-x | Скрипты, бинарники, веб-каталоги |
| 775 | rwxrwxr-x | Каталоги с общим доступом для группы |
| 777 | rwxrwxrwx | Все и вся — избегайте |
| 1777 | rwxrwxrwt | Общие временные каталоги вроде /tmp |
Практическое правило: 644 для файлов, 755 для каталогов, а дальше — только ужесточать. Ослабляйте режим лишь тогда, когда что-то конкретное ломается, и никогда заранее.
Модель прав: владелец, группа и остальные
Один файл делят три класса. Владелец (обычно тот, кто его создал), одна группа и остальные — то есть любая учетная запись, которая не является ни владельцем, ни членом группы. Каждый класс независимо получает чтение, запись и выполнение:
- чтение (r) — просмотр содержимого файла или списка записей каталога.
- запись (w) — изменение файла либо добавление и удаление записей в каталоге.
- выполнение (x) — запуск файла как программы или вход в каталог (
cd).
Тонкость, на которой все спотыкаются: у каталога биты означают немного другое. r позволяет получить список имен, w — создавать и удалять записи внутри, а x — проходить сквозь каталог к файлам ниже, чтобы можно было выполнить cd. Можно иметь r без x на каталоге, выполнить на нем ls и всё равно получить «Permission denied», как только попытаетесь войти. Именно поэтому у каталогов 755, а не 644.
Как читать строку ls -l
Выполните ls -l — и каждая запись начинается с блока из десяти символов:
$ ls -l
-rw-r--r-- 1 jack staff 1400 Jul 17 10:00 index.html
drwxr-xr-x 5 jack staff 160 Jul 17 10:00 assets
Читайте слева направо. Первый символ — это тип файла, а не право: - — обычный файл, d — каталог, l — символьная ссылка, c или b — устройство, p — именованный канал, s — сокет. Следующие девять символов — три группы rwx: владелец, группа, остальные. Значит, -rw-r--r-- — это обычный файл, где владелец читает и пишет (rw-), а группа и остальные только читают (r-- r--), то есть 644. drwxr-xr-x — это каталог с правами 755.
Некоторые системы добавляют маркер после девяти битов. Завершающая . указывает на контекст SELinux, + означает, что ACL добавляет правила поверх базовых битов, а на macOS @ отмечает расширенные атрибуты. Ни один из них не меняет восьмеричное значение. Игнорируйте маркер и читайте девять символов.
Восьмеричная запись: как 755 превращается в rwxr-xr-x
Восьмеричные права работают потому, что каждое право — это степень двойки:
- чтение = 4
- запись = 2
- выполнение = 1
Сложите биты, которыми владеет класс, — и получите его цифру. rwx — это 4 + 2 + 1 = 7. r-x — это 4 + 1 = 5. r-- — это 4. Значит, rwxr-xr-x по тройкам читается как 7 5 5. Проделайте то же с rw-r--r-- — и получите 4 + 2, 4, 4 → 644. В этом весь фокус: за восьмеричными правами нет ничего, кроме трех независимых сумм.
Цифры прав 0–7 с первого взгляда
| Цифра | Двоичное | Права |
|---|---|---|
| 0 | 000 | Нет прав |
| 1 | 001 | Только выполнение |
| 2 | 010 | Только запись |
| 3 | 011 | Запись + выполнение |
| 4 | 100 | Только чтение |
| 5 | 101 | Чтение + выполнение |
| 6 | 110 | Чтение + запись |
| 7 | 111 | Чтение + запись + выполнение |
Восьмеричная система — это просто основание 8, поэтому каждая цифра упаковывает три бита без перекрытия со следующим классом. Если позиционная арифметика подзабылась, конвертер систем счисления показывает, как основание 8 отображается на двоичную запись — точно так же, как это делает каждая цифра прав.
chmod 755, 644 и 777: режимы, которые реально понадобятся
Вот сравнение, которое напрямую отвечает на вопрос «chmod 755 против 644 против 777»:
| Восьмеричное | Символьное | Владелец | Группа | Остальные | Типичное применение | Риск |
|---|---|---|---|---|---|---|
| 644 | rw-r--r-- | чтение/запись | чтение | чтение | Обычные файлы | Безопасно по умолчанию |
| 755 | rwxr-xr-x | полный | чтение/вып. | чтение/вып. | Каталоги, скрипты | Безопасно по умолчанию |
| 600 | rw------- | чтение/запись | — | — | Приватные файлы, ключи | Очень безопасно |
| 700 | rwx------ | полный | — | — | Приватные каталоги | Очень безопасно |
| 775 | rwxrwxr-x | полный | полный | чтение/вып. | Каталоги для группы | Группа может писать |
| 777 | rwxrwxrwx | полный | полный | полный | (избегайте) | Доступно для записи всем |
Разница между 755 и 644 — один-единственный бит: выполнение. Каталогам, скриптам и бинарникам нужен x, чтобы в них можно было войти или запустить их, поэтому они получают 755. У обычного файла — HTML-страницы, изображения или конфига — нет причин быть исполняемым, поэтому он остается 644. Путаница между этими двумя вариантами стоит за большинством повседневных ошибок с правами.
Почему 777 опасно. Он выдает право записи любой учетной записи на машине, включая скомпрометированную служебную учетную запись или захваченный веб-процесс. Каталог документов, доступный для записи всем, — это хрестоматийный путь к взломанному сайту или внедренному вредоносному коду, ведь любой, кто до него доберется, может переписать ваш код. Когда пост на форуме советует chmod 777 для чего-нибудь «чтобы заработало», настоящая проблема почти всегда во владении — о нем ниже.
Исключение 1777. /tmp намеренно доступен для записи всем, но с защитой. Режим 1777 добавляет sticky-бит, который позволяет всем создавать файлы, но не дает удалять или переименовывать чужие. Именно поэтому общие временные каталоги безопасны при 1777, но никогда — при обычном 777. Введите 777 в калькуляторе chmod — и панель рисков сразу его отметит, а 1777 распознается как стандартный шаблон общего каталога.
Числовой и символьный режимы
chmod принимает одни и те же биты двумя способами.
Числовой (абсолютный) режим задает полный результат. chmod 755 file устанавливает все девять битов в rwxr-xr-x независимо от того, что было раньше. Это то, что нужно в скриптах и при развертывании, где вы приводите систему к заведомо правильному состоянию.
Символьный (относительный) режим описывает изменение. chmod u+x file переключает один бит (добавляет выполнение владельцу) и не трогает остальное. chmod u=rwx,go=rx file явно задает целые классы. Символьный режим подходит для разовых правок, когда переписывать весь режим было бы излишним.
# Numeric: overwrite the whole mode
$ chmod 644 report.txt
# Symbolic: change only what you name
$ chmod u+x deploy.sh # add execute for the owner
$ chmod go-w shared.conf # remove write from group and others
$ chmod u=rw,go=r notes.md # set each class explicitly → 644
Одна ловушка символьного режима: chmod +x без указания класса фильтруется вашим umask. При распространенном umask 022 chmod +x script.sh добавляет выполнение всем, поэтому равнозначно chmod a+x. При более строгом umask вроде 077 это затрагивает только владельца. Когда нужен гарантированный результат, называйте класс: u+x — только для владельца, a+x — для всех.
Специальные права: setuid, setgid и sticky-бит
Помимо девяти стандартных битов, четвертая, ведущая восьмеричная цифра несет три специальных режима — setuid, setgid и sticky-бит:
- setuid = 4000 — программа запускается с привилегиями владельца файла, а не вызывающего пользователя. Именно так
passwd, принадлежащий root, позволяет обычному пользователю обновить базу паролей, которой владеет root. - setgid = 2000 — та же идея для группы. На каталоге он к тому же заставляет новые файлы наследовать группу каталога, благодаря чему общий проект стабильно принадлежит одной группе.
- sticky-бит = 1000 — на общем каталоге ограничивает удаление, так что пользователи могут удалять только свои файлы.
/tmpс 1777 — канонический пример.
$ chmod 4755 /usr/local/bin/mytool # setuid
$ chmod 2775 /srv/shared # setgid on a shared dir
$ chmod 1777 /tmp # sticky bit
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59976 Jul 17 10:00 /usr/bin/passwd
Правило регистра s/S и t/T
В ls -l специальные биты занимают ту же позицию, что и бит выполнения, и регистр подсказывает, установлен ли также бит выполнения. Строчная s (setuid/setgid) или t (sticky) означает, что специальный бит и выполнение включены — это нормальный случай. Заглавная S или T означает, что специальный бит установлен, а выполнение — нет, и обычно это ошибка, потому что специальный бит на неисполняемом файле не дает ничего полезного.
Сравните rwsr-xr-x (4755, setuid с выполнением, правильно) и rwSr--r-- (4644, setuid без выполнения, подозрительно). Всякий раз, когда видите заглавную S или T, проверьте, не сбросил ли кто-то бит выполнения по ошибке.
Подводный камень с каталогами в GNU, о котором молчат
Вот платформенное различие, которое почти каждое руководство передает неверно. В Linux (GNU coreutils) числовой chmod 755 dir не сбрасывает имеющийся бит setuid или setgid на этом каталоге. Он его сохраняет. Если каталог уже имеет 2755 (setgid), а вы запускаете chmod 755 в расчете на чистый лист, бит setgid остается, и у каталога на самом деле по-прежнему 2755.
Чтобы действительно его сбросить, действуйте явно:
$ chmod 00755 dir # five-digit form zeroes the special digit
$ chmod =755 dir # = clears every bit not listed
$ chmod u-s,g-s dir # remove setuid and setgid by name
BSD и macOS поступают наоборот: числовой chmod 755 по умолчанию сбрасывает специальные биты. Поэтому скрипт развертывания, который «сбрасывает» права через chmod -R 755, ведет себя по-разному на ноутбуке с Mac и на сервере с Linux. Это сохранение описано в руководстве GNU coreutils; в сомнительных случаях используйте пятизначную форму или u-s,g-s, чтобы результат был одинаковым везде.
umask: какие права получают новые файлы
Вручную вызывать chmod для каждого файла приходится редко; большинство получают свой режим при создании, и решает его umask. umask — это набор битов, которые нужно выключить. Новые файлы начинают с базового 666, новые каталоги — с 777, а umask маскирует лишние биты:
effective mode = base & ~umask
Файлы начинают с 666, а не с 777, потому что совершенно новому файлу незачем быть исполняемым по умолчанию. Этот бит добавляют осознанно через chmod +x.
| umask | Новые файлы | Новые каталоги | Значение |
|---|---|---|---|
| 022 | 644 | 755 | По умолчанию — остальные читают, но не пишут |
| 077 | 600 | 700 | Приватно, только для владельца |
| 002 | 664 | 775 | Совместная работа в группе |
Проверьте значение по умолчанию 022 вручную: 666 & ~022 = 666 & 755 = 644, а 777 & ~022 = 755. Узнать текущее значение можно командой umask, а задать значение по умолчанию для сессии — например, umask 077 — на машине, где ничто не должно быть доступно для чтения группе или всем.
chmod и chown: права против владения
chmod и chown отвечают на разные вопросы. chmod меняет то, что можно делать владельцу, группе и остальным, — биты прав. chown меняет то, кем на самом деле являются владелец и группа. Тяга к 777 часто оказывается проблемой владения, переодетой в проблему прав.
Классический случай: веб-сервер, работающий от www-data, не может писать в свой каталог загрузок. chmod 777 убирает ошибку, разрешив запись всему миру, и оставляет за собой дыру. Правильное решение назначает владение тому процессу, которому оно нужно:
# Wrong: opens the directory to every account on the box
$ sudo chmod -R 777 /var/www/uploads
# Right: give it to the web user, keep a tight mode
$ sudo chown -R www-data:www-data /var/www/uploads
$ sudo find /var/www/uploads -type d -exec chmod 755 {} +
$ sudo find /var/www/uploads -type f -exec chmod 644 {} +
Порядок диагностики, когда что-то неожиданно не читается: сначала выполните ls -l, чтобы увидеть, кто владелец, затем расшифруйте режим, а после решите, что исправлять — chown, chmod или добавление пользователя в группу.
Рекурсивные права без ошибок
Огульный chmod -R 755 . помечает каждый обычный файл исполняемым, что в лучшем случае — шум, а в худшем — незаметный риск. Вместо этого обходите рекурсивно по типу:
$ find . -type d -exec chmod 755 {} + # directories → 755
$ find . -type f -exec chmod 644 {} + # files → 644
GNU chmod предлагает однострочное сокращение с заглавной X, которое добавляет выполнение только каталогам и тем файлам, у которых уже есть бит выполнения:
$ chmod -R u+rwX,go+rX .
Калькулятор chmod генерирует команды find отдельно для каталогов и отдельно для файлов под любой выбранный режим, так что можно скопировать правильное разделение вместо обычного -R.
Лучшие практики прав доступа в Linux
- Давайте минимально необходимые привилегии. Начинайте с самого строгого режима и открывайте лишь то, что ломается. Каждый лишний бит записи — это поверхность атаки.
- По умолчанию — файлы 644 внутри каталогов 755. Эта пара подходит почти для любого веб-корня и рабочей копии репозитория. Обычным файлам выполнение нужно редко, каталогам — всегда.
- Никогда не оставляйте 777 на том, до чего может дотянуться сервер. Если писать должны несколько учетных записей, используйте общую группу с 775 или 2775 (setgid сохраняет единое владение группой), а не открывайте режим всему миру.
- Держите закрытые ключи SSH на 600 или на 400, когда они окончательны. OpenSSH наотрез отказывается работать с закрытыми ключами, доступными для чтения группе или всем. Точное требование к файлу ключа смотрите в руководстве OpenSSH. Открытые ключи и
authorized_keysпри 644 в порядке. - Сочетайте режимы файлов с другими средствами защиты. Права — это основа; дополняйте их базовой аутентификацией из генератора htpasswd, когда папке нужен вход по паролю, и рассматривайте режимы файлов как одну из частей картины, описанной в нашем руководстве по основам веб-безопасности.
Часто задаваемые вопросы
Что означает d или l в начале drwxr-xr-x?
Первый символ в строке ls -l — это тип файла, а не право. d обозначает каталог, l — символьную ссылку, - — обычный файл, c или b — устройство, p — именованный канал, а s — сокет. Только девять символов после него кодируют реальные биты чтения, записи и выполнения.
В чем разница между строчной s и заглавной S в правах?
И строчная s, и заглавная S означают, что установлен бит setuid или setgid. Строчная s означает, что выполнение тоже установлено, — это нормальный рабочий случай. Заглавная S означает, что специальный бит включен, а выполнение выключено (как в 4644), и это почти всегда ошибка конфигурации, ведь специальный бит бессмыслен без выполнения.
Что такое umask и как он определяет права по умолчанию?
umask — это набор битов прав, которые выключаются при создании файла. Новые файлы начинают с базового 666, каталоги — с 777, а затем effective = base & ~umask убирает замаскированные биты. Значение по умолчанию 022 дает файлы 644 и каталоги 755; выполните umask, чтобы увидеть свое, или umask 077 для более приватного значения по умолчанию.
Когда использовать 400 или 700 вместо 644 или 755?
Используйте 400 или 700, когда файл или каталог должен оставаться полностью приватным. 400 (r--------) — это приватный файл только для чтения, идеальный для окончательного закрытого ключа SSH, который вы никогда не редактируете. 700 (rwx------) — это каталог, в который может войти только владелец, вроде ~/.ssh или ~/.gnupg. В отличие от 644 и 755, они не дают никому другому ничего.
Почему я вижу список каталога, но не могу войти в него через cd?
Права каталога разделяют просмотр списка и проход внутрь: бит r позволяет получить список имен, бит x позволяет войти. Каталог с r, но без x (каталог 644) показывает свои имена в ls, но блокирует cd и любой доступ к файлам внутри. Добавьте выполнение (сделайте 755), чтобы в него можно было войти.
Одинаково ли работают права доступа на macOS и в Linux?
Права доступа на обеих системах опираются на одну и ту же базовую модель rwx и восьмеричную запись, потому что обе следуют POSIX, но детали различаются. BSD и macOS по умолчанию сбрасывают setuid/setgid каталога при числовом chmod, а Linux их сохраняет. Чтение режима тоже различается: stat -c '%a' file в Linux, stat -f '%Lp' file на macOS, а еще macOS добавляет ACL и флаги файлов.
Можно ли изменить права доступа без командной строки?
Вычислить и расшифровать права можно и без терминала. Бесплатный калькулятор chmod позволяет отметить матрицу прав, ввести восьмеричное значение или вставить строку ls -l, а затем возвращает точную команду chmod. Чтобы применить ее к реальному файлу, всё равно нужна эта команда на сервере — или клиент с графическим интерфейсом либо FTP-клиент, где доступны поля прав.