![]() |
Права доступа в *nix системах
Права доступа в *NIX системах В этой статье я не претендую на написание чего-то нового. Видел подобную статью на античате, но решил побольше раскрыть эту тему именно для новичков, которые часто задают вопросы на эту тему. Так как статья рассчитана на новичков, постараюсь описать вопрос в доступной форме и с примерами, из-за этого придется пожертвовать некоторыми техническими деталями (так что сильно не придирайтесь). В общем поехали. Прежде всего, надо сказать, что в *NIX ОС каждый пользователь, зарегистрированный в системе, имеет свой уникальный номер не равный нулю (0 – номер администратора ОС), по которому ОС определяет (идентифицирует) пользователя. Этот номер в *NIX называется UID, но для удобства (например, авторизации) UID`у присваивается символьное значение (имя), для этого в *NIX существует файл passwd, хранящийся в каталоге /etc (всем известный /etc/passwd). В этом файле находятся настройки пользователей, в том числе и сопоставление имени и UID`а. Не ищите в этом файле паролей, их там попросту нет (когда-то давно были), а хранятся пароли (вернее не пароли, а их хеши) в файле shadow в Linux и master.passwd в BSD. Вот пример строки из файла passwd: Цитата:
Такая запись означает, что имени пользователя merabi (секция 1) присваивается идентификатор пользователя UID 1012 (секция 3), и идентификатор группы GID 80 (секция 4). Для администратора (обычно root) эта запись будет такой: root:*:0:0. В принципе возможно создать двух пользователей с правами администратора (UID - 0, GID – 0) но не будем на этом останавливаться. Также в строке есть * (секция 2) означает это, что пароль хранится не в этом файле, а в другом (shadow или master.passwd). 5 секция не на что не влияет и просто дает описание пользователя, в нашем случае, это, наверное, имя и фамилия, но в ней может быть, что угодно или она может быть пустая. Дальше, в 6 секции описан домашний каталог пользователя, (у нас: /usr/local/www/asthma) каталог в который попадает пользователь после авторизации. В последней, 7 секции, описывается шелл, командный интерпретатор который загружается при входе пользователя в систему (в нашем примере /usr/local/bin/bash), если пользователю не предназначен шелл, то сюда обычно записывают /sbin/nologin. Еще раз замечу, что символьное имя пользователя существует для удобства, все операции ведутся именно с числом UID. Также, каждый пользователь в *NIX должен принадлежать к какой-то группе, группа также определяется числом-идентификатором GID, которому также присваивается и символьное представление (имя группы). Одной группе могут принадлежать несколько пользователей, и наоборот, один пользователь может принадлежать нескольким группам, иногда это бывает удобно, но не будем заострять на это внимание. Часто для конкретного пользователя заводят свою группу с именем этого пользователя. Просмотреть UID и GID, а также их символьные представления можно с помощью команды id в шелле, для этого нужно выполнить id имя пользователя, id без параметров выведет значения для текущего пользователя. Ну, с этим вроде разобрались, едем дальше. В *NIX каждый файл принадлежит какому либо пользователю, будь то администратор (дальше root) или nobody или любой другой. Когда создается файл, в его атрибуты записывается UID создавшего его пользователя. Root может изменять этот атрибут, т.е. фактически изменять владельца файла, с помощью команды chown, но нам сейчас это не важно. Владелец файла может изменять атрибуты файла (например, изменять права доступа, об этом ниже) читать файл, записывать в файл, исполнять файл. Иногда, можно столкнуться с такой ситуацией, что владелец файла не может его удалить или переименовать, объясню на примере: Цитата:
Теперь об атрибутах файла. Выполнив в шелле команду ls –lp мы можем увидеть список файлов в текущем каталоге, и некоторые атрибуты этих файлов, пример строки: Код:
-rw-r--r-- 1 nobody nobody 899 Dec 5 17:08 default.htmВот о правах доступа поговорим поподробнее. Возьмем наш пример и условно разделим на четыре секции: Цитата:
Цитата:
Секция 2 показывает права доступа для владельца файла (у нас rw-), секция 3 показывает права доступа для группы в которую входит владелец файла (у нас r--), секция 4 показывает права доступа для всех остальных пользователей, кроме администратора, root является по сути владельцем всех файлов, т.е. имеет такие же права как и владельцы файлов. Рассмотрим теперь секцию 2 (3 и 4 абсолютно идентичны второй) Цитата:
Цитата:
Если в секции 2 стоит r--, т.е. не включена возможность записи, то и владелец файла не сможет в него записывать, но он всегда может изменить права доступа к файлу с помощью команды шелла chmod, т.е. добавить w и после этого записывать в файл. x – дает возможность исполнять файл, например если это бинарник или скрипт шелла или cgi скрипт (например perl-скрипт) то для исполнения файла наличие x необходимо, компилятор gcc сам добавляет эту опцию к откомпилированой программе, т.е. на выходе получается файл с включенной опцией x во всех трех секциях. PHP скрипты для исполнения не нуждаются в включенной опции x, главное что бы была включена опция r, если php является cgi-скриптом, т.е. в начале файла есть строчка #! /путь до php/php, то наличие x обязательно (если ошибаюсь поправьте меня). Опции rwx жестко привязаны к своему положению в строке (к последовательности), т.е. мы можем записать права доступа виде двоичного числа, где единица означает включенную опцию, а 0 значит, что опция выключена (т.е. стоит тире) обратимся к нашему примеру: Цитата:
Посчитать это восьмеричное число не сложно, каждая цифра числа показывает права доступа для каждой секции (у нас 6 – для владельцев, 4 –для группы, 4 – для остальных) Цитата:
При использовании функций для изменения прав доступа в различных языках программирования надо быть осторожным в использовании восьмеричной си, возьмем, к примеру, php, в php для этих целей существует функция chmod(права, “имя файла”). Обычно в ЯП для обозначения числа в восьмеричной системе исчисления, перед числом ставится 0 (0x для hex и т.д.), так вот если этот 0 забыть мы получим совсем другой результат, т.к. функция воспримет это число как десятичное, попробуйте сами: Цитата:
Права доступа обычных файлов и файлов каталогов немного различаются, а именно, отличие их в атрибутах r и x. В файле каталога, находится информация о файлах и подкаталогах, а именно отображаемые имена и ссылки на физическое расположение файлов и подкаталогов на диске. Атрибут r при этом отвечает за доступ к отображаемым именам, а атрибут x за доступ к ссылкам на физическое расположение. Что же у нас получается, если включена опция r в атрибутах каталога, а x выключена, то мы можем просмотреть файлы внутри этого каталога, т.к. доступ на чтение имен файлов у нас есть (r включена), но мы не сможем прочитать, изменить, или выполнить файл даже если у нас есть соответствующие права доступа на файл (при этом мы их не увидим), т.к. доступа к физическому расположению файла у нас нет, другими словами мы “незнаем” где физически расположен файл (опция x выключена). Если опция x включена, а опция r выключена то мы можем производить с файлами действия соответствующие нашим правам доступа к файлу, но отобразить имена у нас не получится. Хотя обычно опции r и x всегда вместе включены на каталогах. Интересно и поведение опции w установленной для каталога, дело в том, что каталог не знает о правах доступа его файлов, поэтому если у нас есть права на запись/изменение каталога, то мы можем удалять файлы независимо от того, какие права доступа стоят для этого файла. Цитата:
PS статью писал сам, так что в копипасте меня не обвиняйте Спасибо за прочтение, с уважением Scipio |
всё не читал, похоже на man chmod =)
Вот в конце страницы бросилось в глаза Цитата:
|
Spyder, читай внимательнее
Цитата:
|
ну смотри, много раз встречалось
на серваке папка, наши права nobody drwxrwxrwx в ней лежит файл -rw-r-r По идее изменение запрещено, но так как мы можем изменить папку, мы можем изменить и файлы и подпапки в ней т е chmod 777 index.html в данном случаем изменит права файла на -rwxrwxrwx или у тебя какой то хэк-экзотичесский случай? 0_о |
Какая разница можно или нельзя изменяь файл, если есть возможность сменить его права?
Сменил права - перезаписал. |
Не, Spyder, такое возможно если ты (наверное в твоем случае вебсервер) являешься владельцем файла, если сомневаешься, то можешь сам попробовать, допустим у тебя есть фтп доступ, и вебшелл, часто у файлов записанных в том и в другом случае соответственно, разный владелец, так что есть возможность поэксперементировать
|
Цитата:
|
щас поищу у себя шелл с uid=99, потом отпишу, всё равно мне кажется что я прав)
AciD_FreaK, так об это я и говорю =\ |
Не, Spyder, прочти статью всетаки, там написано, что файл каталога незнает о правах доступа для файлов расположенных в нем
Не в обиду, но получается так, как с романом "Доктор Живаго" Пастернака... Цитата:
ЗЫ Spyder, просьба к тебе персональная, отпишись о результате здесь, каким бы он не был |
Да, я прочитал, попробывал на примере и правда если хозяин файла не тот от кого ты работаешь то и изменить его не получится. Беру свои слова назад =)
Просто редко работаю с c99 и не могу видеть владельца файла и папки, обычно с ачат шелом, а там такой фигни нету, сколько раз не сталкивался с подобной ситуацией - всегда получалось изменить права |
| Время: 20:02 |