Права доступа в Linux/Unix для начинающих

У новичков в мире Linux/Unix возникает ощущение, что права доступа — это нечто вроде шаманства, всякие там 755, 644 и, самое страшное заклинание, — 666. Попробую коротко и предельно просто объяснить, что ничего сложного в этих цифрах нет.

Самое основное: у каждого файла есть пользователь-владелец и группа, к которой он «приписан». Ну и в системе есть еще другие пользователи. Первая цифра в этой триаде означает, какой уровень доступа у владельца, вторая — у группы, третья — у всех остальных пользователей, включая системных (о них ниже). Естественно, пользователь root — царь и бог в системе, поэтому права доступа его вообще не касаются. Он может делать с любыми файлами все что захочет.


Когда же применяются эти самые права? Например, если вы хотите посмотреть содержимое какого-то файла с помощью команды cat, это означает, что запускается процесс от вашего имени, и система, используя записанные у файла права доступа, принимает решение, можно ли процессу сделать данное действие. Или, скажем, в системе запущен веб-сервер Apache, запущен он от имени «виртуального» пользователя nobody. Веб-серверу приходит запрос из сети на отправку файла, операционная система и в этом случае принимает решение, можно ли давать доступ к данному файлу пользователю nobody.

Мы разобрались, что каждая цифра трехзначного числа означает уровень доступа для определенной категории пользователей. Теперь самое время узнать, что значат разные цифры. Права доступа делятся на 3 категории: право на чтение (r — read), на запись (w — write) и исполнение (x — eXecute). Каждая категория — это бит в двоичном числе, то есть право может быть или не быть, складываются биты так — rwx. То есть, если рассматривать право доступа в виде восьмеричного (ну можно и десятичного) числа, то нужно просуммировать значения этих битов, если есть право на чтение — добавляем 4, если на запись — 2, если на исполнение — 1. «Сатанинское» право доступа 666 означает, что у владельца, у группы и у всех остальных пользователей есть возможность читать данный файл и записывать в него (кстати, может, в Апокалипсисе был намек на то, что мир погубит дыра в системе безопасности?). Право на исполнение означает ровно это — вы можете запускать данный файл, он является программой или скриптом (напомню, что Windows определяет это по расширению — .exe, .bat и т.д.). Как сделать так, чтоб вы могли запускать и редактировать какой-то скрипт, а все остальные могли только читать его содержимое в ознакомительных целях? Очень просто — присвоить права доступа 744.

Хорошо, мы можем редактировать файл, означает ли это, что мы можем его удалить? Нет, мы можем очистить его содержимое, но из этого вовсе не следует автоматически возможность его удалить или переименовать. Каждый файл находится в папке (директории), а у папок тоже есть такие же права доступа, только означают они слегка другое. Представим, что папка — это тоже файл, а его содержимое — это записи о файлах, находящихся в ней. Тогда право на чтение папки будет означать возможность прочитать список файлов в ней (например, командой ls), а право на запись — это возможность добавлять новые файлы, переименовывать их, удалять и т.п. Естественно, папку нельзя «запустить», поэтому, казалось бы, право на исполнение для папки бессмысленно, но это не так, для папок этот флаг имеет другое значение — возможность вообще «проходить» в эту папку. Например, вы можете создать какую-то папку, поставить на нее права 700, а внутри создать файл с правами 666, но все равно никто, кроме вас и root, не сможет ничего сделать с этим файлом, потому что на папке стоит запрет на все действия для всех, кроме владельца, в том числе и на проход в нее. А как сделать, чтоб пользователи могли заходить в свои домашние каталоги в папке /home, но при этом не могли даже видеть список других домашних каталогов? Все просто, возможность видеть содержимое каталога, это право на чтение, то есть на папку /home можно поставить права 711 (владелец ее — root).

Начинающие веб-мастера, разместив свой сайт на Linux-сервере, бывает, сталкиваются с проблемой, что скрипты не могут записывать файлы и ругаются на отсутствие прав доступа. Давайте разберемся, в чем тут дело. Представим, что вы загрузили папку по FTP, вы — владелец этой папки, а сервер по умолчанию установил на нее права 755, то есть для вас — все права, для всех остальных — только права на чтение и прохождение в папку (5 = 4 + 1). У части провайдеров веб-сервер на вашем сайте работает от имени вашего пользователя, поэтому у него не возникает проблем с добавлением файлов в эту папку. У другой части провайдеров веб-сервер работает от имени «анонимного» пользователя nobody, www-data или что-то типа того, поэтому ваши скрипты и не могут создавать файлы. Решение проблемы — вручную установить права на папку 777 (chmod 777 имя_папки). С файлами ситуация похожая: при загрузке по FTP владельцем файла являетесь вы, а права по умолчанию на него — 644, то есть все остальные, в том числе и веб-сервер, могут только читать этот файл, поэтому скрипт не может перезаписывать его содержимое или что-то в него добавлять (но если вы уже установили для его родительской папки права 777, то ваш скрипт сможет удалить этот файл и создать новый на его месте). Опять же, решение проблемы — добавить права на запись — chmod 666 имя_файла (права на исполнение для обычного файла не нужны, вот почему для папки мы используем 777, а для файла 666).

Еще что нужно учесть при работе веб-сервера от имени анонимного пользователя. Представим, что вы по FTP создали папку pictures, установили на нее права 777, а ваш скрипт создал внутри папку 2012, чтоб разделять картинки по годам. Потом скрипт начал загружать картинки в эту папку 2012. Вдруг вы захотели удалить какие-то из этих файлов через свой FTP-клиент. Но не тут-то было — дело в том, что владельцем папки 2012 будет «пользователь», от имени которого работает веб-сервер, а не вы, и по умолчанию он тоже установит права на папку 755, лишив вас возможности вносить правки в содержимое этого каталога. Чтобы решить эту проблему, нужно поменять права доступа к папке 2012 через скрипт, который будет выполняться от имени веб-сервера.

Думаю, для начала хватит, дальше можете изучать вопрос сами, если оно вам нужно, конечно :)

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