chmod на простом английском — почему каждый пишет 755, не понимая, что это значит

Обновлено

755, 644, 777 — вы вводили их десятки раз. Вот что они на самом деле означают, почему chmod 77-7 является ленивым, а не злым, и в каких случаях каждый из этих значений является правильным выбором.

chmod на простом английском — почему все пишут 755, не понимая, что это означает 1
Реклама · УДАЛИТЬ?

В какой-то момент на ранней стадии вашей карьеры кто-то сказал вам, что нужно запускать chmod 755 на директории или chmod 644 на конфигурационном файле. Это сработало. Вы перешли к следующему шагу. Сейчас, спустя годы, вы всё ещё вводите эти же цифры из памяти — и если кто-то спросит вас, что означает 755, вы вяло указываете на экран и говорите: «это стандартная настройка прав доступа».

Это нормально, пока это не становится проблемой. В момент, когда вам нужно отладить ошибку «доступ запрещён», решить, что ввести в новый скрипт, или объяснить молодому разработчику, почему chmod 777 не является решением для всех случаев — внезапно память о цифрах оказывается недостаточной.

Вот что означают эти цифры.

Структура битов

Права файлов в Unix состоят из трёх наборов по три бита. Это всё. Каждый набор устанавливает права для определённой категории пользователей — владельца, группы, других — и каждый бит в наборе соответствует праву на чтение, запись или выполнение.

Значения: чтение = 4, запись = 2, выполнение = 1. Для каждого набора вы складываете эти значения. Таким образом, 7 означает чтение + запись + выполнение (4+2+1). 5 означает чтение + выполнение (4+1). 4 означает только чтение.

Разберём 755: владелец получает 7 (rwx), группа получает 5 (r-x), другие получают 5 (r-x). В двоичной системе: 111 101 101. В символической нотации: rwxr-xr-x. Тот стандарт, который вы вводили на протяжении всей жизни — это просто «владелец может делать всё, остальные могут читать и выполнять, но не могут писать».

Чтение вывода ls -la

Выполните ls -la в любом каталоге и вы получаете что-то вроде этого:

drwxr-xr-x  2 deploy www-data 4096 May 29 10:00 public_html
-rw-r--r--  1 deploy www-data 2341 May 29 09:45 config.php
-rwx------  1 deploy deploy    891 May 28 14:20 deploy.sh
-rw-------  1 deploy deploy    411 May 10 08:30 .env

Первый символ — тип файла: d для каталога, - для обычного файла, l для символической ссылки. Затем идут три группы по три символа — владелец, группа, другие. Тире означает, что право отсутствует.

Число после прав определяет количество жёстких ссылок. Затем имя владельца, имя группы, размер файла в байтах, время последнего изменения и, наконец, имя файла.

Таким образом, drwxr-xr-x 2 deploy www-data означает: каталог, владелец (deploy) может читать, писать и выполнять, группа (www-data) может читать и перемещаться, но не может писать, все остальные могут читать и перемещаться, но не могут писать. Две жёсткие ссылки. Это ваш стандартный веб-каталог.

Частые значения прав и причины их существования

Вот расшифровка значений, которые вы будете использовать на практике, что они означают и в каких случаях следует применять:

ЦенитьСимволическийДвоичныйЧто это означаетКогда их использовать
755rwxr-xr-x111 101 101Владелец: полный доступ. Группа/другие: чтение + выполнениеКаталоги, публичные исполняемые файлы, скрипты, подающиеся веб-сервером
644rw-r–r–110 100 100Владелец: чтение + запись. Группа/другие: только чтениеКонфигурационные файлы, статические ресурсы, HTML, исходные файлы PHP
600rw——-110 000 000Владелец: чтение + запись. Все остальные: ничегоПриватные ключи SSH (~/.ssh/id_rsa), файлы .env
700rwx——111 000 000Владелец: полный доступ. Все остальные: ничегоСкрипты, содержащие секреты, приватные исполняемые файлы
777rwxrwxrwx111 111 111Все: полный доступ/tmp, временные директории в контейнерах — почти везде не используется

Почему каталогам нужны права на выполнение — потому что «выполнение» в каталоге означает «переход» — возможность войти в каталог и получить доступ к его содержимому. Если каталог имеет r--r--r--, вы можете перечислить имена файлов внутри, но не можете получить доступ к ним. Вам нужно право x, чтобы войти в каталог или открыть файлы. Именно поэтому для каталогов используется 755, а не 744.

Если вы хотите работать с этими значениями интерактивно, используйте Калькулятор прав chmod на IO Tools позволяет включать отдельные биты и видеть обновлённые восьмеричные и символические значения в реальном времени — полезно, когда нужно построить неизвестное значение прав доступа.

Символическая нотация: в каких случаях использовать

Восьмеричная нотация устанавливает все права сразу. Символическая нотация позволяет вносить постепенные изменения. Оба подхода корректны — выбор зависит от того, что вы делаете.

chmod u+x script.sh добавляет право на выполнение для владельца без изменения остального. Если файл в настоящее время имеет значение 644, это делает его 744. Если вы использовали восьмеричную нотацию и написали chmod 744 script.sh, вы получите тот же результат — но вам нужно знать текущее состояние сначала.

Символические операторы просты: + добавляет право, - удаляет его, = устанавливает его точно. Цели — u (владелец), g (группа), o (другие), a (все три).

chmod u+x deploy.sh          # add execute for owner
chmod g-w config.php         # remove write from group
chmod o=r public/index.html  # set others to read-only exactly
chmod a+r shared.txt         # add read for everyone

Используйте символическую нотацию, когда хотите изменить одно право без сброса всех остальных. Используйте восьмеричную нотацию, когда вы устанавливаете права с нуля или хотите иметь полный контроль над конечным состоянием.

Почему новые файлы не создаются с правами 666 по умолчанию

Создайте новый файл с текстового редактора или touch и вы получите 644. Создайте каталог и вы получите 755. Откуда берутся эти значения по умолчанию?

Файлы начинаются с теоретического максимума 666 (без права на выполнение по умолчанию — это должно быть явно установлено). Каталоги начинаются с 777. Значение umask вычитается из этих максимумов.

По умолчанию на большинстве систем Linux установлено значение 022. Применённое к файлу: 666 – 022 = 644. Применённое к каталогу: 777 – 022 = 755. Именно поэтому 644 и 755 кажутся стандартными значениями — они механически таковы.

Выполните umask с аргументами, чтобы увидеть текущее значение. Измените его в профиле вашей оболочки, если вам нужно более строгое значение — umask 027 даёт вам файлы с правами 640 и каталоги с правами 750, что удаляет все права для «других» и разрешает только группе чтение.

chmod 777: не злой, просто ленивый

Вот честный взгляд на chmod 777: это не катастрофа безопасности в каждом контексте. Это почти никогда не является правильным решением в производственной среде, и люди используют его, потому что это устраняет ошибку с правами без необходимости думать.

На общей серверной системе, chmod 777 на писуемом каталоге означает, что любой процесс, запущенный под любым пользователем — включая уязвимое веб-приложение — может писать в этот каталог. Это реальная уязвимость. Это также тип, который остаётся в производстве навсегда, потому что «мы это исправим позже».

Приемлемые случаи использования 777:

  • /tmp в временных контейнерах — ничего не сохраняется, ничего не важно, переходите к следующему шагу
  • Отладка проблемы с правами в разработке — используйте это, чтобы подтвердить, что проблема в правах, а не в чем-то другом, затем установите правильное значение
  • Временные директории на доверенной, однопользовательской машине — если вы единственный пользователь, то права «других» являются теоретическими

Диагностический процесс: появляется ошибка «доступ запрещён», временно применяйте 777, чтобы подтвердить, что проблема в правах, а не в чем-то другом, затем определите правильное значение и установите его. chmod 777 как диагностический инструмент — это нормально. chmod 777 в развертывочном скрипте, который никто не пересматривает — именно так происходят проникновения.

Значения, которые стоит знать

Вы не обязаны запоминать все возможные комбинации. Эти четыре охватывают около 95% реальных случаев:

  • 755 — каталоги и исполняемые файлы, которые должны быть доступны публично
  • 644 — файлы, которые должны быть доступны для чтения всеми, но доступ к записи должен быть только у владельца
  • 600 — чувствительные файлы: ключи SSH, данные, файлы .env. SSH отклонит использование приватного ключа, если он не имеет прав 600 или строже.
  • 700 — скрипты, которые выполняются с секретами внутри и не должны быть запускаемы другими пользователями

Когда вы сталкиваетесь с чем-то, что выходит за рамки этого диапазона, используйте структуру битов: определите, что каждый из владельца, группы и других должен делать, сложите биты, запишите число. Инструмент Калькулятор Chmod будет полезен здесь, если вы предпочитаете не выполнять вычисления под давлением.

Модель прав — это одна из тех вещей в Unix, которая кажется произвольной, пока вы не понимаете, что это просто двоичное сложение. Как только это становится понятным, вы перестаёте копировать команды других людей и начинаете устанавливать права сознательно — и это и есть цель.

Хотите убрать рекламу? Откажитесь от рекламы сегодня

Установите наши расширения

Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска

в Расширение Chrome в Расширение края в Расширение Firefox в Расширение Opera

Табло результатов прибыло!

Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!

Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?

новости с техническими моментами

Примите участие

Помогите нам продолжать предоставлять ценные бесплатные инструменты

Купи мне кофе
Реклама · УДАЛИТЬ?