Что означает drwxr-xr-x в правах доступа Linux
Разбираем структуру строки drwxr-xr-x по символам и переводим её в числовой формат 755. Узнайте, почему флаг x критичен для доступа к папкам и чем опасна команда chmod 777.
Что означает drwxr-xr-x
drwxr-xr-x описывает директорию, которую владелец может изменять, а любой другой пользователь может читать и переходить в неё, не внося никаких изменений. В восьмеричном представлении этот режим равен 755. Linux выводит эти десять символов в начале каждой строки вывода ls -l, и они всегда означают одно и то же в одном и том же порядке, поэтому изучение одной строки позволяет понять их все.
Одно правило важнее остальных, так как от него зависит, будут ли результаты вашего тестирования достоверными. Пользователь root игнорирует биты прав доступа. Ядро предоставляет root привилегию CAP_DAC_OVERRIDE (обход дискреционного управления доступом), поэтому root открывает файлы, режим которых это запрещает. Любой пример на этой странице сработает для root, независимо от установленных битов. Выполняйте вход под обычным пользователем, если хотите увидеть работу правил в действии.
Десять символов по очереди
Создайте каталог и файл для проверки. Никакие действия в этом разделе не затрагивают ничего за пределами нового каталога.
mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txtПри стандартном значении umask 022 две строки для каталога начинаются с drwxr-xr-x, а строка для файла — с -rw-r--r--.
Первый символ обозначает тип файла, а не права доступа. d — это каталог. - — обычный файл. l — символическая ссылка. c и b — узлы символьных и блочных устройств. s — сокет, а p — именованный канал (pipe). Этот символ не входит в восьмеричное значение, поэтому drwxr-xr-x превращается в 755, а не в число, начинающееся с d.
Девять последующих символов разбиты на три группы по три, и их порядок никогда не меняется.
- Символы со 2 по 4 — это триада владельца, биты которой применяются к пользователю, владеющему файлом.
- Символы с 5 по 7 — это триада группы, биты которой применяются к группе файла.
- Символы с 8 по 10 — это триада остальных, биты которой применяются ко всем остальным пользователям.
Внутри триады позиции всегда соответствуют r, затем w, затем x, а прочерк означает, что бит выключен. Буквы никогда не меняют своего положения. r-x — это чтение без записи. -w- — это запись без чтения, что технически допустимо, но встречается редко.
Таким образом, drwxr-xr-x разделяется следующим образом: d для каталога, затем rwx для владельца, затем r-x для группы, затем r-x для остальных.
Некоторые системы выводят одиннадцатый символ. Точка в конце, drwxr-xr-x., означает, что файл имеет контекст SELinux (Security Enhanced Linux), который дистрибутивы вроде Fedora и Rocky выводят по умолчанию. Знак «плюс» в конце, drwxr-xr-x+, означает, что для файла задан POSIX ACL (список контроля доступа) — дополнительный набор правил, выходящий за рамки этих девяти битов. Просмотреть эти дополнительные правила можно с помощью getfacl <path>.
Права r, w и x работают по-разному для директорий
Это первое правило, которое часто понимают неверно. Буквы прав доступа совпадают для файлов и директорий, но предоставляемые ими возможности различаются.
rдля файла позволяет прочитать его содержимое.rдля директории позволяет просмотреть список имен файлов в ней, что необходимо для выполнения командыls.wдля файла позволяет изменять его содержимое.wдля директории позволяет добавлять и удалять записи в ней. Удаление файла — это изменение директории, поэтому право на запись в директории является решающим, а права на сам файл при этом не учитываются.xдля файла позволяет запустить его как программу.xдля директории позволяет выполнять переход через неё (traverse), что означает возможность ядра разрешить имя внутри этой директории при поиске пути.
Возможность перехода часто вызывает удивление. x для директории не означает выполнение чего-либо. Чтобы открыть /srv/site/index.html, необходимо иметь x для /, затем x для /srv, затем x для /srv/site и, наконец, r для самого файла. Если в этой цепочке хотя бы у одной директории отсутствует право x для вас, поиск прерывается, и вызывающий процесс получает ошибку Permission denied для всего пути, даже если конечный файл доступен для чтения всем. Команда namei -l /srv/site/index.html выводит каждый шаг цепочки с указанием прав и владельца, что позволяет увидеть, на каком этапе происходит блокировка.
Директория с правом r, но без права x — это специфическое промежуточное состояние. Обычный пользователь может просмотреть список имен, так как это право дает r, но не может получить метаданные (stat) любого элемента. В результате ls -l заполняет столбцы размера и прав знаками вопроса и выводит ls: cannot access ...: Permission denied для каждого элемента.
Установка прав доступа 755
Каждая триада представляет собой трехбитовое число. r соответствует 4, w — 2, x — 1. Сложите значения активных битов.
rwxравно 4 + 2 + 1 = 7rw-равно 4 + 2 = 6r-xравно 4 + 1 = 5r--равно 4---равно 0
Таким образом, drwxr-xr-x дает 7 для владельца, 5 для группы и 5 для остальных: 755. -rw-r--r-- дает 6, 4, 4: 644. drwxrwxr-x дает 7, 7, 5: 775, что соответствует 755 с добавленным правом на запись для группы. Вам не нужно считать символы вручную, так как stat выводит обе формы одновременно.
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt%A — это буквенная форма, %a — восьмеричная, а %U и %G указывают владельца-пользователя и владельца-группу.
Строки прав доступа, которые часто ищут
Это режимы доступа, с которыми вы столкнетесь на реальном сервере, с указанием восьмеричного значения и примерами их использования.
-rw-r--r--— это 644. Обычные файлы, которые сервис только читает, например, файл конфигурации или HTML-страница.-rw-------— это 600. Секретные данные: закрытый ключ SSH или файл.envприложения.-rw-rw-r--— это 664. Файл в директории, доступной группе, где участникам команды требуется право на запись.-rwxr-xr-x— это 755. Скрипты и бинарные файлы, такие как/usr/local/bin/backup.shи большинство файлов в/usr/bin.-rwx------— это 700. Приватный скрипт, который может запускать только его владелец.drwxr-xr-x— это 755. Почти любая системная директория и корневая директория веб-сайта.drwx------— это 700.~/.sshи домашние директории на защищенном сервере.drwxrwxr-x— это 775. Директория, в которую может писать группа владельца.drwxrwsr-x— это 2775. То же самое, плюс бит setgid, чтобы новые файлы внутри наследовали группу директории.drwxrwxrwt— это 1777./tmp. Завершающаяt— это sticky bit, благодаря которому пользователь может удалять только свои собственные файлы.-rwsr-xr-x— это 4755. Бинарный файл с установленным setuid, который выполняется от имени владельца, например,/usr/bin/passwdи/usr/bin/sudo.-rw-rw-rw-— это 666, аdrwxrwxrwx— это 777. Доступ на запись для всех, что на сервере почти всегда является ошибкой.lrwxrwxrwx— это то, что отображается для любой символической ссылки. Linux игнорирует биты режима на самой ссылке и проверяет целевой объект, поэтому эта строка не несет никакого смысла.
Какая триада применяется к вам
Это второе правило, в котором новички часто ошибаются. Ядро выбирает ровно одну триаду и на этом останавливается.
Если ваш ID пользователя совпадает с владельцем файла, вы получаете права владельца, а биты группы и остальных пользователей игнорируются. В противном случае, если группа файла входит в список ваших групп, вы получаете права группы. Иначе применяются права для остальных.
Из этого следуют два вывода. Триада владельца применяется, даже если она самая строгая. Файл с режимом 0466, который отображается как -r--rw-rw-, дает владельцу только право на чтение, в то время как все остальные могут записывать данные, потому что проверка владельца сработала первой, а последующие биты не учитывались. Это допустимая конфигурация, которая сбивает с толку при первой встрече.
Триада группы определяется группой файла, а не списком групп, в которых состоите вы. ls -l выводит два имени в каждой строке: владельца и группу. Только эта вторая группа имеет какое-либо отношение к данному файлу. Членство в двадцати группах помогает только в том случае, если файл принадлежит одной из них.
id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txtid выводит вашего пользователя и все группы, в которые вы входите. stat выводит владельца и группу файла. Сравните их, и вы поймете, какую триаду ядро будет использовать для вас.
Именно поэтому общая директория обычно получает группу и установленный бит setgid. sudo chmod 2775 /srv/shared отображается как drwxrwsr-x, и файлы, созданные внутри, наследуют группу директории, а не личную группу создателя, поэтому следующий пользователь сможет их редактировать. Предоставление каждому сервису собственной учетной записи — это вторая часть данной темы, она описана в один пользователь Linux на сервис на VPS.
umask определяет права доступа для каждого нового файла
Новый файл получает права доступа не от вас. Он получает их от программы, которая его создала, за вычетом битов, которые удаляет ваш umask. Umask — это маска битов для удаления, поэтому более высокое значение umask делает файлы более закрытыми.
Большинство дистрибутивов поставляются со значением 022. Программа, создающая обычный файл, запрашивает 0666. Программа, создающая каталог, запрашивает 0777. Umask удаляет 022 из обоих запросов, поэтому вы получаете 644 для файлов и 755 для каталогов. Именно эту пару прав вы видите повсюду на свежем VPS.
umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdirumask -S выводит то же самое значение в виде букв, что легче читать, чем 0022. Установите umask 027 в ~/.profile для более строгих настроек по умолчанию: 640 для файлов и 750 для каталогов, чтобы ваша группа могла читать вашу работу, а остальные — нет.
Важны два ограничения. Umask может только удалять биты, но никогда не добавлять их, поэтому вновь созданный файл никогда не будет исполняемым, что бы вы ни установили. А сервис systemd никогда не читает ваш профиль оболочки, поэтому устанавливайте значение непосредственно в файле юнита.
[Service]
UMask=0027Почему для веб-файлов используются права 644, а для директорий — 755
Веб-сервер работает от имени собственного пользователя: www-data в Debian и Ubuntu, nginx в Rocky и Alma. Этот процесс должен иметь права на чтение файлов, которые он отдает, и право на переход (traverse) по директориям, в которых они находятся. У него нет причин изменять эти файлы, и для статического сайта такая возможность не должна быть предусмотрена.
Права 644 на файл позволяют владельцу записывать данные, а всем остальным — читать их. Это дает возможность пользователю, выполняющему деплой, публиковать контент, а веб-серверу — отдавать его. Права 755 на директорию позволяют владельцу записывать данные, а всем остальным — переходить по пути, что дает веб-серверу возможность обращаться к файлам, не имея прав на добавление или удаление объектов. В результате ошибка в приложении не позволит перезаписать страницы, которые оно обслуживает.
Правило перехода по директориям критически важно. Если сайт расположен в /home/deploy/site, а права на /home/deploy установлены как 750, веб-сервер не сможет войти в домашнюю директорию пользователя. Запрос завершится ошибкой HTTP 403, а в /var/log/nginx/error.log появится запись вида:
open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5Число 13 соответствует EACCES — это отказ в доступе на уровне ядра. С сетью проблем нет: порт открыт, запрос дошел до сервера. Именно это часто сбивает с толку тех, кто изучает как работают слушающие порты в Linux. Запустите namei -l /home/deploy/site/index.html и проверьте цепочку директорий, чтобы найти первую, у которой отсутствуют права x для остальных пользователей.
Исключение составляют директории, в которые приложение должно записывать данные, например, пути для загрузки файлов. В таких случаях лучше изменить владельца директории, а не расширять права доступа: используйте sudo chown -R www-data:www-data /srv/site/uploads, оставив права 755. Ограничьте право на запись только той директорией, которой это действительно необходимо.
chmod без изменения прав для всего дерева каталогов
chmod поддерживает обе формы записи. Восьмеричная форма устанавливает все девять битов прав одновременно: chmod 644 notes.txt. Символьная форма изменяет только указанные вами права, оставляя остальные без изменений: chmod u+x deploy.sh добавляет право на выполнение для владельца, а chmod go-w notes.txt удаляет право на запись для группы и остальных пользователей.
Рекурсивное применение команд часто приводит к повреждению прав доступа в дереве каталогов. chmod -R 755 . делает исполняемыми все изображения и файлы конфигурации, так как chmod не может отличить скрипт от файла JPEG. Используйте вместо этого флаг X.
chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txtФлаг X применяет право на выполнение только к каталогам и к тем файлам, у которых уже был установлен хотя бы один бит выполнения. В результате права на каталоги становятся 755, на обычные файлы — 644, а скрипты, которые уже были исполняемыми, сохраняют свои права. Если у вас есть файл с правами, которым вы доверяете, chmod --reference=good.sh other.sh позволяет скопировать их на другой файл.
Сообщения об ошибках при некорректных битах прав доступа
bash: ./deploy.sh: Permission denied означает, что у скрипта отсутствует бит x в соответствующей вам триаде прав, либо у одного из каталогов в пути к нему нет бита x. Команда chmod u+x deploy.sh исправляет первый случай.
bash: ./deploy.sh: cannot execute: required file not found — это другая ошибка с запутывающим названием. Бит x установлен корректно, но интерпретатор, указанный в первой строке файла, отсутствует. Частая причина — использование символов переноса строки в формате Windows, из-за чего ядро ищет интерпретатор с именем /bin/bash\r. Исправьте это с помощью sed -i 's/\r$//' deploy.sh.
Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. выдается SSH-клиентом, который отказывается использовать закрытый ключ, если его могут прочитать другие учетные записи. Для файла ключа требуются права 600, а для каталога ~/.ssh — 700. Полное руководство по работе с ключами приведено в разделе управление SSH-ключами и правами доступа к файлам.
Authentication refused: bad ownership or modes for directory /home/deploy/.ssh появляется в журнале сервера, если домашний каталог или его .ssh доступны для записи группе. Настройка StrictModes в sshd отклоняет такой ключ, что со стороны клиента выглядит как неожиданный запрос пароля без пояснений.
sudo: /etc/sudoers is world writable, сопровождаемая sudo: no valid sudoers sources found, quitting, означает, что sudo проверил права доступа к собственному файлу конфигурации и отказался запускаться. Этот файл должен иметь права 0440. Это классическое последствие применения рекурсивной команды chmod ко всей системе; ошибка может возникнуть одновременно с сообщением sshd, упомянутым выше, что оставляет консоль провайдера единственным способом восстановления доступа.
Почему 777 — это не решение
Права 777 предоставляют доступ на запись каждой учетной записи на машине и каждому процессу, запущенному от имени любой из этих учетных записей. Сервер запускает службы от имени собственных пользователей, поэтому на VPS «все» означает гораздо больше, чем на обычном ноутбуке. В случае взлома службы злоумышленник может записывать данные везде, где разрешено 777.
Внутри корневой директории веб-сервера вред проявляется напрямую. Директория с правами на запись для всех, которую обслуживает сервер, означает, что уязвимость при загрузке файлов позволяет внедрить скрипт и затем выполнить его, обратившись к нему по URL.
Права 777 почти всегда являются неверным ответом на проблему с правами владения. Симптом выглядит как «приложение не может писать в эту директорию». Причина заключается в том, что директория принадлежит не тому пользователю. sudo chown -R appuser:appuser /srv/app/storage с режимом 755 решает проблему и ограничивает доступ для всех остальных учетных записей. Создание этих учетных записей до развертывания чего-либо относится к разделу первые десять минут на новом VPS.
Права на запись для всех допустимы в одном известном месте, /tmp, и записываются как drwxrwxrwt. Завершающий t — это sticky bit: директория доступна для записи всем, но пользователь может удалить только те файлы, которыми владеет сам. Без этого бита любая учетная запись могла бы удалять временные файлы другой учетной записи.
Изучите режим перед его изменением
Эти команды только считывают состояние, поэтому их безопасно выполнять в любой среде.
id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002find <path> -perm -0002 выводит список всех объектов по указанному пути, у которых установлен бит записи для всех пользователей (world write bit). Это самый быстрый способ провести аудит системы после того, как кто-то исправлял проблемы с помощью chmod 777.
Чтобы проверить, может ли конкретная сервисная учетная запись войти в каталог, выполните проверку от имени этой учетной записи. sudo -u www-data test -x /srv/site && echo yes || echo no выводит yes, если у пользователя есть право на проход (traverse) по каталогу, и no, если его нет. Проверка от имени root ничего не доказывает, так как root игнорирует эту проверку, и ответом всегда будет yes.
FAQ
Что означает drwxr-xr-x в Linux?
Это директория, на что указывает начальный символ d, с правами доступа 755. Триада владельца — rwx, поэтому владелец имеет все права на неё. Триада группы — r-x, а триада остальных пользователей — r-x, поэтому все остальные могут просматривать список файлов внутри и переходить в директорию, но никто, кроме владельца, не может добавлять или удалять файлы. Проверить права для любого пути можно с помощью stat -c '%A %a %U %G %n' <path>, которая выводит буквенную и восьмеричную формы рядом.
Почему для веб-файлов устанавливаются права 644, а для веб-директорий — 755?
Веб-сервер работает от имени отдельной учетной записи, www-data в Ubuntu. Ему требуется право на чтение файлов, которые он отдает, и право на переход (traverse) по всем директориям выше них, при этом у него нет причин записывать данные в эти файлы или директории. Права 644 дают владельцу право на запись, а всем остальным — на чтение. Права 755 дают владельцу право на запись, а всем остальным — на переход. Если приложению действительно необходимо записывать данные в директорию, следует передать её владельцу с помощью chown, а не расширять права доступа для всех.
Означает ли бит x, что я могу исполнить директорию?
Нет. Для директории x означает переход (traverse) — право разрешать имя внутри неё, пока ядро проходит по пути. cd требует этого права, как и любая операция открытия файла внутри неё. Каждая директория на пути требует x, поэтому файл с правами 644 останется недоступным, если у директории выше по пути отсутствует x для вас. namei -l /path/to/file выводит права доступа для каждой директории в цепочке, что позволяет увидеть, на каком этапе прерывается поиск.
Является ли chmod 777 когда-либо правильным решением?
Почти никогда на сервере. Это дает право на запись каждой учетной записи на машине, включая те, от имени которых работают сервисы, поэтому один скомпрометированный сервис может перезаписать файл. Когда приложению не удается записать данные в директорию, реальная проблема обычно заключается во владельце: sudo chown -R appuser:appuser /srv/app/storage с правами 755 дает приложению всё необходимое и ограничивает доступ для всех остальных. Известное исключение — /tmp с правами 1777; это работает только потому, что sticky bit запрещает пользователям удалять чужие файлы.
Почему ls выводит точку или плюс после прав доступа?
Этот одиннадцатый символ описывает правила, выходящие за рамки девяти битов прав доступа. Точка, как в drwxr-xr-x., означает, что присоединен контекст безопасности SELinux, что является нормой для Fedora и Rocky. Плюс, как в drwxr-xr-x+, означает, что установлен POSIX ACL (список контроля доступа), поэтому некоторые пользователи или группы обладают правами, которые не отображаются в трех стандартных триадах. Запустите getfacl <path>, чтобы вывести эти дополнительные записи.