т. (383) 381-86-26

Блог о создании вебсайтов

 

Linux: Ликбез по правам доступа

 

Между правами на директории и правами на файлы есть небольшая, но разница. Предположим, что у тебя есть директория с правами 600, то будут ли вложенные в эту директорию другие директории/файлы доступны для чтения/редактирования/исполнения/удаления, если на них установлены права, к примеру 777

Чтобы ответить давай разберемся как вообще работают права для директории:

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

Полный доступ

Пользователь vovk может смотреть список файлов, создавать, удалять, переименовывать, и смотреть статистику файлов и директорий (stat). Однако доступ к содержимому файлов уже является прерогативой прав доступа самого файла Можно создать новые файл или удалить любой существующий вне зависимости от прав доступа к нему.

# vovk имеет полный доступ к директории и файлам

>>> drwx------  1 vovk    vovk          4096 Jan 01 2013  dir
# vovk может делать всё тоже самое, что и в полном доступе, кроме
# создания, удаления, переименования файлов в директории.

>>> dr-x------  1 vovk    vovk          4096 Jan 01 2013  dir
# vovk может делать всё те же операции что и в полном доступе, но
# не может применить ls к директории. Если известно имя какого-либо файла в 
# этой директории и его права доступа позволяют, то он может достучаться до файла по имени.
# Также vovk может создать, удалить, переименовать существующие файлы.

>>> d-wx------  1 vovk   vovk          4096 Jun 01 2013  dir
# И наконец, vovk не может ни создавать файлов, ни создавать, ни удалять файлы в директории
# Но имеет доступ к любому файлу в директории (если права файла позволяют) и известно имя файла.

>>> d--x------  1 vovk   vovk          4096 Jun 01 2013  dir

Главное правило: "ты можешь просматривать директорию, если имеешь (x) права над ней". Поэтому, если ты хочешь иметь доступ к dir/subdir/some-file, то у тебя должны быть право (х) и на dir и на subdir.

То каким образом ты обращаешься к файлу имеет значение. К примеру, у тебя есть (х) права на /dir/subdir, а на /dir — нет. И допустим, что в данный момент времени ты находишься в /dir/subdir. Тогда ты можешь обращаться к файлам внутри subdir по относительным путям (а по абсолютным — нет). Это значит что ты не можешь вызвать cd /dir/subdir/ — прав то не хватает.

Символические ссылки ничего не меняют. Ядро использует права, вызывающего процесса для того, чтобы перейти по симлинку. К примеру, если simlink есть симлинк для /dir, то тебе потребуются (х) права для доступа к simlink/subdir. Права на самой симлинке иногда могут иметь значение, а иногда нет. Зависит от ОС.

Отнятие прав исполнения (x) на корневую директорию эффективно ограничивает доступ пользователя только к части дерева директорий. (r) права дают возможность просматривать список файлов в директории. Иногда удобно давать только (х) права, без права на чтение (r) — это позволяет использовать имена файлов в директории как пароль, так как получить доступ к файлу можно только по прямому пути к нему, включающему имя файла (так себе защита, но лишняя палка в колеса злодеям).

Права записи (w) на директорию дают (как ты читал выше) право создавать или удалять файлы, причем права доступа самого файла не имеют значения. Если хорошенько подумать, то это логично. Что происходит когда ты создаешь файл в директории? Всего лишь добавляет новая запись в список файлов директории. Изменения происходят с директорией, именно поэтому требуются права записи (w)! Тоже самое касается удаления файла из директории: при удалении файла изменяется список файлов директории. Поэтому если у тебя есть доступ на запись в директорию, то ты можешь удалять файл вне зависимости от прав доступа самого файла.

Вязкая липкость или sticky bit

И вот тут возникает дилемма: а что делать, если требуется дать доступ на запись в директорию группе лиц, но запретить им удалять не свои файлы (иначе разрешить удалять только свои файлы). Для этих целей есть в маске прав доступа бит, который называется "sticky bit" (t), который можно применять к директориям. Если для директории установлен "липкий" (дословно от sticky) бит, пользователи директории могут удалять только те файлы, владельцами которых они являются.

Впервые sticky bit появился в пятой редакции UNIX в 1974 году для использования в исполняемых файлах. Он применялся для уменьшения времени загрузки наиболее часто используемых программ. После закрытия программы код и данные оставались в памяти, а следующий запуск происходил быстрее.

Сегодня sticky bit используется в основном для директорий, чтобы защитить в них файлы. Из такой директории пользователь может удалить только те файлы, владельцем которых он является. Примером может служить директория /tmp, в которой запись открыта для всех пользователей, но нежелательно удаление чужих файлов. Установка атрибута производится утилитой chmod

(c) Wikipedia

>>> chmod +t somedir/
>>> ls -l
>>> drwxrwxr-t  2 vovk vovk 4096 авг.  20 09:46 somedir

Автоматическое назначение ID группы новым файлам

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

Бит setgid для директории (chmod g+s) заставляет только новые каталоги и файлы, созданные в ней, наследовать ID группы этой директории вместо ID группы пользователя создавшего файл. Новые поддиректории также наследуют бит setgid. Это позволяет создать общее рабочее пространство для группы без неудобств членам группы явно менять их текущую группу для создания новых файлов и каталогов. Наследование устанавливается только для новых файлов и каталогов. Уже существующим файлам и каталогам этот бит нужно устанавливать вручную, например:

>>> [root@foo]# find /path/to/directory -type d -exec chmod g+s {} \;

(c) Wikipedia

Эта возможность часто используется, когда требуется дать возможность определенной группе работать с одной директорией. Обычно пользователи должны быть частью этой группы и вызывать chgrp, либо оставлять файлы доступными всем. Однако же когда директория принуждает новые файлы быть часть собственной группы, тогда остается только установить правильно маску (к примеру umask u=rwx,g=rx,o=) и перестать беспокоиться о ручной правке прав доступа.

На это завершу этот беглый обзор, оставляя тебе возможность и пространство для собственной творческой работы ^___~

Подпишитесь на рассылку, будет интересно!