Выполнить против чтения бит. Как работают разрешения каталогов в Linux?

381

В моей CMS я заметил, что каталогам нужен установленный исполняемый бит ( +x), чтобы пользователь мог их открыть. Почему разрешение на чтение требуется для чтения каталога, и как работают разрешения на каталоги в Linux?

Nick.h
источник
17
... эээ, потому что для этого есть флаг "+ x" :)
badp
16
Подумайте так: запись каталога содержит имена файлов , поэтому «чтение» каталога - это перечисление файлов, «использование» каталога - доступ к файлам.
Тайлер
7
С установленным битом выполнения каталога вы можете пройти его иерархию . Поскольку вы принадлежите "другим" людям и имеете только бит выполнения set ( chmod 771 dirOne), вы не можете перечислить содержимое dirOne. НО, если он содержит подкаталог "dirTwo" с правами, установленными как ( chmod 774 dirTwo), вы можете фактически перечислить его содержимое!
Стефан
1
Будущие посетители также должны увидеть соответствующий вопрос на AskUbuntu: askubuntu.com/q/1106822/295286
Сергей Колодяжный

Ответы:

352

При применении разрешений к каталогам в Linux биты разрешений имеют другое значение, чем в обычных файлах.

  • Бит чтения ( r) позволяет пораженный пользователю список файлов в директории
  • Биты записи ( w) позволяет пораженному пользователю создавать, переименовывать или удалять файлы в каталоге, и изменять атрибуты справочника
  • Бит исполнения ( x) позволяет пораженный пользователю войти в каталог, а также доступ к файлам и каталогам внутри
  • Липкий бит ( Tили , tесли выполнить бит установлен для других) утверждает , что файлы и директории в этом каталоге могут быть удалены только или переименовать их владельцем (или корень)
Крис Даун
источник
25
Отличный ответ, но я думаю, что последнее предложение вводит в заблуждение. Ни одно из этих разрешений не может быть переопределено для каждого файла. Здесь «доступ» немного двусмыслен: +xкаталог предоставляет доступ к файлам inode через этот конкретный каталог (ни меньше, ни больше, ну… может быть, тоже chdirнужно +x). Для чтения или записи содержимого одного файла пользователю также необходимо +r/ +wдля этого файла, но это разные права (они ничего не переопределяют).
Стефан Гименес
2
Флаг неизменности специфичен для файловой системы и не будет точно переопределять эти разрешения, поэтому я думаю, что последнее предложение вводит в заблуждение :-)
Стефан Гименес
1
Я думаю, что было бы полезно упомянуть ACL в этом и других ответах, поскольку их применение для некоторых каталогов может вводить в заблуждение, если учитывать только информацию, предоставленную Крисом Дауном
user907860
4
Кажется, что в этом ответе не упоминается объединенный эффект записи и выполнения бита, как ответ Балдрика упоминает ниже? т.е. если у вас есть только разрешение на запись, но нет разрешения на выполнение, то это совершенно бесполезно.
xji
1
@ StéphaneGimenez " +xв каталоге предоставляет доступ к файлам inode" - это похоже на хороший nemonic, но, возможно, не рассказывает всю историю? Без установленного в каталоге бита выполнения вы не можете изменить имя файла в этом каталоге. Мне интересно, почему это так, потому что имя файла хранится в записи каталога, а не в inode.
Кевин Уилер
259

Сначала подумайте: что такое каталог? Это просто список элементов (файлов и других каталогов), которые находятся внутри. Итак: каталог = список имен.

Читать бит = Если установлено, вы можете прочитать этот список. Так, например, если у вас есть каталог с именем poems:

  • Вы можете, ls poemsи вы получите список предметов, живущих внутри ( -lне раскрывать никаких деталей!).
  • Вы можете использовать параметры командной строки завершения ИЭ touch poems/so <TAB> poems/somefile.
  • Вы не можете сделать poemsсвой рабочий каталог (то есть cdв него).

Бит записи = если установлено, вы можете изменить этот список, т.е. вы можете {добавлять, переименовывать, удалять} имена в нем. Но! На самом деле вы можете сделать это, только если установлен бит выполнения.

Выполнить бит = Сделать этот каталог вашим рабочим каталогом, т.е. cdв него. Вам нужно это разрешение, если вы хотите:

  • доступ (чтение, запись, выполнение) объектов, находящихся внутри.
  • изменить сам список, т. е. добавлять, переименовывать, удалять имена в нем (конечно, бит записи должен быть установлен в каталоге).

Интересный случай 1. Если у вас есть права на запись + выполнение для каталога, вы можете {удалить, переименовать} элементы, находящиеся внутри, даже если у вас нет разрешения на запись для этих элементов. (используйте липкий бит, чтобы предотвратить это)

Интересный случай 2 : если у вас есть разрешение на выполнение (но не на запись) в каталоге и у вас есть разрешение на запись в файл, находящийся внутри, вы не можете удалить файл (поскольку он предполагает удаление его из списка). Однако вы можете удалить его содержимое, например, если это текстовый файл, вы можете использовать vi, чтобы открыть его и удалить все. Файл все еще будет там, но он будет пустым.

Резюме:

Читать бит = Вы можете прочитать имена в списке.
Бит записи = Вы можете {добавлять, переименовывать, удалять} имена в списке, ЕСЛИ бит выполнения тоже установлен.
Выполнить бит = Вы можете сделать этот каталог вашим рабочим каталогом.

PS: Статья, упомянутая Кусаланандой, хорошо читается.

Baldrick
источник
17
Размышление о каталоге как о списке делает вещи более понятными и логичными.
Трисмегистос
20
Отличный ответ, но слишком сфокусированный на термине «рабочий каталог». Мне нужен xбит для любого доступа к этому файлу: для cat a/b/c/d, мне нужен xбит для всех a, bи c, даже если я не использую их как cwd.
glglgl
1
Вот где я обнаружил, что вы не можете писать, если он тоже не исполняемый! Случай 2 тоже интересный, отличный ответ!
Мирко
1
Еще одно замечание: даже если у вас есть xразрешение на каталог, если у вас нет xразрешения на файл внутри, вы не сможете «выполнить» файл. Вы можете только catэто, например, но вы не можете запустить сам файл.
xji
2
Если вы хотите ls -lработать для папки, нужны оба разрешения rи xразрешение.
Эрик Ван
44

Я подготовил эту таблицу со всеми возможными разрешениями и их практическим эффектом.

разрешения для каталога linux

(*) Только имена файлов : другие атрибуты, такие как размер или дата, недоступны. Например, вы можете использовать клавишу табуляции для автозаполнения, но не команду ls.

Некоторые мысли :

  • Если X не установлен , R и W в основном бесполезны.
  • Одно только отключение RW в X дает ложное чувство безопасности, поскольку вы можете вслепую читать и записывать содержимое файлов и получать доступ к подкаталогам. Вы должны быть уверены, что у каждого прямого потомка каталога есть явные разрешения.
  • Редко вы будете использовать другие значения, кроме:
    • 0 : нет доступа.
    • 1 : минимальный доступ, позволяющий пройти.
    • 5 : разрешить чтение / запись, но не изменять структуру самого дерева каталогов.
    • 7 : Полный доступ.
Дэвид
источник
1
Я считаю 5 полезным значением, когда вы хотите разрешить чтение / запись, но не изменять структуру самого дерева каталогов.
hgiesel
Ты прав. Обновлено!
Дэвид
4
Отличный сводный график. Заставляет меня задуматься, что кто-то думает иметь -W-функционально эквивалентным ---для каталогов. Не очень интуитивно понятно. Конечно, эти типы битов низкого уровня часто нет.
CivFan
2
Я протестировал это на своем Mac, но с помощью -W-я мог переименовать каталог (в каталог с наклейкой), но не с ---. В этом, кажется, разница
cosyconemotel
3
@ Дэвид, Вам не хватает липкого кусочка.
Pacerier
42

Вот хорошая статья по этому вопросу.

Резюме:

Каталог с xустановленным битом позволяет пользователю cd(сменить каталог) в этот каталог и получать доступ к файлам в нем.

Подробности:

  • Читать ( r)

    Возможность читать имена файлов, хранящихся в этом каталоге.

  • Написать ( w)

    Возможность переименовывать файлы в каталоге, создавать новые файлы или удалять существующие файлы, если у вас также есть разрешения на выполнение. Если у вас нет perm для выполнения, тогда писать perms бессмысленно.

  • Execute ( x)

    Возможность cdзайти в этот каталог и получить доступ к файлам в этом каталоге.

Вот несколько примеров, которые должны облегчить понимание:

# "Full Access".  Reegen can list, create, delete, rename, delete,
# and stat any files in dir.
# Access to file contents is subject to the permissions
# of the file itself.
# New files can be created, any file can be deleted, regardless of
# file permissions.
drwx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except create,
# delete, or rename files in this directory.
dr-x------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except list the
# filenames in this directory.  If she suspects there is a file
# named "program" she can list it, but cannot do an 'ls'
# of the directory itself.  She can access any file (file
# permissions permitting) if she knows its name.  She can
# create new files, or rename/delete existing ones.
d-wx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen cannot create or delete any files in this directory.
# She can access any file (permissions permitting) if she
# knows its name already.
d--x------  1 reegen    reegen          4096 Jan 01 2003  dir

Еще больше информации в статье Hacking Linux Exposed .

Кусалананда
источник
2

Для любой операции, обращающейся к файлу или каталогу, он должен сначала разрешить путь к файлу или каталогу. Разрешение требует, чтобы пользователь имел разрешение на выполнение для всех каталогов вдоль пути, кроме конечного компонента пути. Таким образом, для каталогов вы можете думать, что бит выполнения означает «разрешаемый».

Возьмите путь /a/b/c.txtв качестве примера, скажем, пользователь имеет 1) разрешение на выполнение /и /a; 2) имеет разрешение на чтение /a/b; 3) разрешение на чтение и запись /a/b/c.txt.

  • Пользователь не сможет читать (список) /a, потому что у него нет разрешения на чтение. Но разрешение пути не подведет.

  • Пользователь будет иметь возможность читать (список) /a/b, потому что пользователь имеет разрешение на выполнение /, /aи права на чтение /a/b. Обратите внимание, что при чтении /a/bимя файла c.txtявляется видимым, но метаданные (например, размер файла) и содержимое - нет, поскольку имя файла хранится в каталоге, а не в файле, но метаданные хранятся в индексе файла.

  • Пользователь не сможет прочитать /a/b/c.txt, потому что при разрешении пути от /к /aк /a/bон терпит неудачу, /a/bтак как у пользователя нет разрешения на выполнение.

Смотрите также, как путь разрешается в файл .

Даган
источник
0

Полезная аналогия - думать о каждом файле как о книге, а каждый каталог - как о комнате, где хранятся книги.

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

Эти правила являются отдельными и отличаются от правил для каждой книги. Существуют правила, позволяющие кому-либо открывать книгу и читать ее содержимое: биты чтения для каждого файла. Существуют правила для изменения содержимого книги: бит записи для каждого файла. И для выполнения файла: биты выполнения для каждого файла.

Я пишу бит (ы), потому что есть три бита для каждого действия. Существует один бит чтения для владельца, один бит чтения для группы (групп) и бит чтения для всех остальных (других). Если какой-либо из этих трех битов установлен для конкретного пользователя, этот пользователь имеет активный бит чтения. Это не имеет значения , как было установлено , что бит быть активными либо ˙U Ser или г Роапом или о Ther, он имеет те же эффективные результаты.

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

Вот почему требуется бит чтения для каталогов: чтобы контролировать, кому разрешено перечислять содержимое комнаты (названия книг).

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

Исаак
источник
-1

Смысл Execute для каталогов вполне понятен. Поскольку в отличие от Windows нет разрешения Traverse, вы должны что-то перегрузить. Дизайнеры выбрали Execute, что вызывает бесконечную путаницу. Как парень из компьютерной безопасности, назначающий права на выполнение чего-то, что вы на самом деле не собираетесь выполнять, выглядит глупо.

NemoX
источник
1
Изобретение бита разрешения на выполнение предшествовало изобретению концепции отдельного разрешения хода примерно на два десятилетия. Логика этого ответа зависит от исторического графика времени, который не похож на реальный мир, а также не замечает существования GENERIC_EXECUTEи того, чем он является.
JdeBP