Выполнить vs Читать бит. Как работают права доступа к каталогам в Linux?

Вопрос или проблема

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

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

  • Чтение (r) позволяет пострадавшему пользователю перечислить файлы в каталоге.
  • Запись (w) позволяет пострадавшему пользователю создавать, переименовывать или удалять файлы в каталоге и изменять атрибуты каталога.
  • Выполнение (x) позволяет пострадавшему пользователю войти в каталог и получить доступ к файлам и каталогам внутри.
  • Sticky bit (T, или t, если бит выполнения установлен для других) означает, что файлы и каталоги внутри этого каталога могут быть удалены или переименованы только их владельцем (или root).

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

Бит чтения = если установлен, вы можете читать этот список. Например, если у вас есть каталог с именем poems:

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

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

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

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

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

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

Резюме:

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

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

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

разрешения
каталога
Октальный удалить
переименовать
создать
файлы
список
каталогов
чтение
содержимого
файла
запись
содержимого
файла
cd каталог cd
подкаталог
список
подкаталога
доступ
к подкаталогу
файлы
0
-W- 2
R– 4 только имена файлов
(*)
RW- 6 только имена файлов
(*)
–X 1
-WX 3
R-X 5
RWX 7

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

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

  • С X не установлен, R и W в основном бесполезны.
  • X в одиночку отключает RW, создавая ложное чувство безопасности, поскольку вы могли бы вслепую читать и записывать содержимое файлов и получать доступ к подкаталогам. Вы должны быть уверены, что у каждого прямого потомка каталога есть явные разрешения.
  • Редко вам понадобятся другие значения, чем:
    • 0: Нет доступа.
    • 1: Минимальный доступ, позволяющий переходить.
    • 5: Разрешает чтение/запись, но не изменение структуры дерева каталогов.
    • 7: Полный доступ.

Вот хорошая статья об этом.

Резюме:

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

Детали:

  • Чтение (r)

    Способность читать имена файлов, хранящихся в этом каталоге.

  • Запись (w)

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

  • Выполнение (x)

    Способность cd в этот каталог и получения доступа к файлам в этом каталоге.

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

# "Полный доступ". Рееген может перечислять, создавать, удалять, переименовывать,
# и получать информацию о любых файлах в каталоге.
# Доступ к содержимому файла зависит от разрешений
# самого файла.
# Новые файлы могут быть созданы, любой файл может быть удален, независимо от
# разрешений файла.
drwx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Рееген может делать все из списка "Полный доступ", кроме создания,
# удаления или переименования файлов в этом каталоге.
dr-x------  1 reegen    reegen          4096 Jan 01 2003  dir

# Рееген может делать все из списка "Полный доступ", кроме перечисления
# имен файлов в этом каталоге. Если она подозревает, что есть файл
# с именем "program", она может получить доступ к нему, но не может сделать 'ls'
# каталога. Она может получить доступ к любому файлу (при разрешениях на файлы).
# если она знает его имя. Она может
# создавать новые файлы или переименовывать/удалять существующие.
d-wx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Рееген не может создавать или удалять какие-либо файлы в этом каталоге.
# Она может получить доступ к любому файлу (при разрешениях), если она
# уже знает его имя.
d--x------  1 reegen    reegen          4096 Jan 01 2003  dir

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

Из книги Роберта Лава “Системное программирование в LINUX”, глава 1, раздел разрешения –

введите описание изображения здесь

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

Возьмем путь /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, поскольку у пользователя нет разрешения на выполнение.

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

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

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

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

Я пишу бит(ы), потому что для каждого действия есть три бита. Есть один бит чтения для владельца, один бит чтения для группы(групп) и бит чтения для всех остальных (других). Если любой из этих трех битов установлен для конкретного пользователя, этот пользователь имеет активный бит чтения. Не имеет значения, как этот бит стал активным, будь то через user или group или other, у него те же эффективные результаты.

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

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

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

access(2) — Страница руководства по Linux

Файл доступен только в том случае, если разрешения на каждом из каталогов в префиксе пути имени файла предоставляют доступ к поиску (т.е. выполнение). Если любой каталог недоступен, вызов access() завершается с ошибкой, независимо от разрешений на сам файл.

path_resolution(7) — Страница руководства по Linux

Эта страница руководства объясняет, как разрешается путь к имени файла в зависимости от разрешений

Шаг 2: пройти по пути

Если процесс не имеет разрешения на поиск в текущем каталоге поиска, возвращается ошибка EACCES (“Доступ запрещен”).

“Разрешение на поиск” означает разрешение на выполнение каталогов.

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

Ответ или решение

В контексте управления доступом в Linux, понятие разрешений для директорий включает в себя три основных разрешения: чтение (read, r), запись (write, w) и выполнение (execute, x). Эти разрешения не следует путать с аналогичными разрешениями для файлов, поскольку их действия различаются, особенно когда речь идет о директориях.

Основные виды разрешений для директорий

  1. Чтение (r): Наличие данного разрешения позволяет пользователю просматривать содержимое директории. То есть, если у пользователя есть разрешение на чтение для директории, он может выполнить команду ls, чтобы увидеть имена файлов внутри этой директории. Однако он не сможет перейти в директорию (команда cd) без выполнения разрешения.

  2. Запись (w): Это разрешение предоставляет возможность пользователю изменять содержимое директории — добавлять, переименовывать или удалять файлы из нее. Важно отметить, что для выполнения этих действий также требуется наличие разрешения на выполнение.

  3. Выполнение (x): Это ключевое разрешение, которое разрешает пользователю войти в директорию и использовать файлы, находящиеся в ней. Без этого разрешения команда cd не сработает, даже если есть разрешение на чтение. Таким образом, разрешение выполнения позволяет осуществлять доступ к файлам внутри директории или переходить в поддиректории.

Примеры

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

  • Если у пользователя есть только разрешение на чтение (r) для директории, он сможет просматривать список файлов, но не сможет зайти в директорию или выполнять с файлами какие-либо операции.

  • Если у пользователя имеется разрешение на запись (w), он сможет изменять содержимое директории (добавлять или удалять файлы), но только в случае наличия разрешения на выполнение (x). Без этого разрешения попытка удалить или изменить файл вызовет ошибку.

  • Если у пользователя есть только разрешение на выполнение (x), он может войти в директорию и обратиться к файлам, если знает их имена, но не сможет увидеть содержимое директории (использовать ls). Можно сказать, что для работы с данными внутри директории также необходимо знать путь к ним.

Доступ к файлам и поддиректориям

Чтобы получить доступ к файлам внутри директории, в первую очередь необходимо пройти по всем уровням директорий. Каждая директория на пути должна иметь разрешение на выполнение. Если на каком-либо уровне не хватает разрешения x, то попытка получить доступ к конечному файлу будет отклонена, даже если у пользователя есть все необходимые права на самом файле.

Использование Sticky Bit

Кроме основных разрешений, существует так называемый sticky bit, который дополнительно регулирует управление файлами в директории. Sticky bit позволяет пользователю удалять или переименовывать только свои файлы внутри директории, даже если у него есть разрешение на запись. Это особенно полезно в совместных директориях, таких как /tmp, чтобы предотвратить случайное удаление чужих файлов.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...