Изучаем Linux. Шаг 4. Права доступа к файлам и директориям
В прошлый раз мы знакомились с пользователями системы Linux, созданием их, удалением и проч. Сегодня важная тема прав доступа к файлам и директориям. Когда знакомились с командами чтения каталогов, то видели в выводимом списке последовательности символов типа «drwxr-xr-x» в каждой строке. Вот о значении этих букв, определяющих права доступа к файлам и директориям, сегодня и пойдет речь.
Как организован доступ к файлам и директориям
Каждый объект (файл или директория) имеет набор ограничителей, регулирующих правила взаимодействия пользователей с ними. Это важно, т. к. Linux система многопользовательская, и учетных записей может быть много с разными уровнями доступа к тем или иным ресурсам.
Чтобы успешно двигаться дальше, давайте примем, что на данный момент в системе у нас есть два пользователя. Один – тот, которого мы создавали при установке Linux на виртуальную машину (в моем случае это «andrew»), и который наделен админскими привилегиями. Второй – «test_noadm», с минимальным набором прав. Это нам пригодится для понимания того, что кому доступно. Ну и конечно же у нас есть суперпользователь – «root».
Как обычно, использовать будет терминал. Для начала перейдем в корневую папку диска (не пользователя, а именно диска) и командой просмотра содержимого каталога выведем на экран подробную информацию:
ls -l
Что-то подобное мы уже видели, но давайте остановимся подробнее на том, что же нам отобразили.
В данном случае у нас несколько полей, а именно семь:
- Тип объекта и права доступа владельца, группы и остальных пользователей.
- Цифра показывает количество ссылок на файл/директорию.
- Владелец файла/директории.
- Группа, которой принадлежит файл/директория.
- Размер файла/директории.
- Дата создания или последнего изменения объекта.
- Наименование файла/директории.
Тип объекта можно определить по первому символу первого поля:
- «-» - файл.
- «b» - файл блочного устройства.
- «c» - файл символьного устройства.
- «d» - директория.
- «l» - Символическая ссылка (link)
- «p» - Туннель или именованный туннель (pipe)
- «s» - файл сокетов (socket)
Например, «lib -> usr/lib» в нашем примере – это ссылка («l») «lib» на каталог «usr/lib», «var» - директория («d»), а «swapfile» - файл («-»). Просто файл.
Что можно сделать с файлом и директорией (прочитать, изменить, запустить или вообще ничего нельзя) определяется комбинацией символов начиная со второго.
Права доступа
Наверняка уже заметили, что номенклатура символов в этом поле невелика. По сути, их только четыре:
- «-» - доступа к файлу/директории нет.
- «r» - разрешено чтение из файла/директории.
- «w» - разрешено изменение файла/директории.
- «x» - исполняемый файл (например, скрипт)
Права доступа сгруппированы в три группы по три символа, итого девять. Группы означают:
- Первые три символа задают права доступа для владельца файла.
- Вторая тройка символов определяет правда доступа группы, к которой принадлежит файл/директория.
- Последняя тройка регламентирует права остальных пользователей (не владельца и не членов группы файла/директории).
Права доступа к файлам и директориям рассмотрим на примерах. Будем использовать каталог home. В нем обычно размещаются домашние каталоги пользователей. В разделе, описывающем права доступа к этой директории находится строка «rwxr-x---». Первый символ отбрасываем, т. к. значение «d» сообщает, что мы имеем дело с каталогом.
Разберемся с этими символами подробнее. Для примера будем использовать домашний каталог вашего пользователя, у меня это «andrew».
Первые три («rwx») определяют права доступа владельца (в данном случае «andrew») и разрешают ему читать каталог (буква «r»), модифицировать его (буква «w») и запускать на выполнение из него какие-либо программы, скрипты и т. п.
Вторая тройка («r-x») относится к группе, и если чтение и выполнение так же разрешено, то вот модифицировать каталог нельзя, что определяется символом дефиса. Давайте это проверим.
Переключимся на пользователя «root»
su
Сначала прочитаем содержимое каталога /home. Видим в нем две вложенные директории, имена которых соответствуют существующим у нас сейчас учетным записям пользователей «аndrew» и «test_noadm».
Создадим новую директорию, например, «temp»:
mkdir temp
Выводим на экран текущее содержимое директории «/home»:
ls –l
Результат на скриншоте. К каталогу «andrew» имеет полный доступ только владелец с тем же именем, члены группы этого пользователя могут читать директорию и запускать на выполнение программы. Остальным же пользователям доступ в этот каталог закрыт.
Созданный только что от имени суперпользователя каталог «temp» членам группы и остальным пользователям разрешает читать его и исполнять (запускать скрипты, содержащиеся в нем). Каталог «temp-noadm» принадлежит одноименному пользователю и права доступа к нему аналогичные каталогу «andrew».
Давайте проверим на практике. Перелогинимся на пользователя «andrew» (su andrew). Сначала зайдем в каталог «temp» (cd temp). Сейчас он пуст. Создадим тут каталог «test»:
mkdir test
Нас пошлют подальше с отказом в доступе. Правда, мы все же можем решить задачу, если будем создавать каталог от имени администратора, которому такие права даны, т. е. командой:
sudo mkdir test
На данном этапе это нам не столь интересно. Выйдем опять в каталог /home:
cd ..
Теперь зайдем в домашний каталог пользователя «test_noadm»:
cd test_noadm
Опять нам отказано в доступе. Если не забыли, в третьей группе прав доступа к каталогу «test_noadm» стоят одни дефисы. Если мы выполним те же действия от имени пользователя «test_noadm», то ситуация будет практически той же, за исключением того, что в каталоге «temp» мы ничего не сможем создать или изменить, и лазейки в виде выполнения команд от имени администратора (sudo) у этого пользователя нет.
Приведем все в первоначальный вид и, переключившись на суперпользователя, удалим наш тестовый каталог «temp» командой:
rmdir temp
Особенности ссылок на файл/каталог
Мы уже видели ссылки, когда рассматривали содержимое корневой директории нашего накопителя. В строках, описывающих ссылки всегда указан полный набор прав:
Только не стоит обманываться. Реальные ограничения указаны в файле/каталоге, на который указывает ссылка. Для примера посмотрим на ссылку «lib», которая указывает на каталог «/usr/lib». Ссылка разрешает все и всем. Если же мы перейдем в каталог «/usr» и выведем на экран его содержимое, то окажется, что вложенный каталог «/lib» уже не столь щедр и позволяет вносить изменения в его содержимое только владельцу:
Редактирование прав доступа
Опять будем все изучать на практике. Если не переключились на учетную запись администратора, то предлагаю сделать это. Перейдем в каталог «/tmp»:
cd /tmp
Содержимое сейчас нас мало интересует. Для экспериментов создадим файл «testfile.txt», воспользовавшись текстовым редактором. Я буду использовать «nano»:
nano testfile.txt
Откроется окно редактора, можно ввести какую-нибудь строку, или оставить файл пустым. Я добавлю строчку «Первая строка текста». Теперь нажимаем комбинацию клавиш «Ctrl»+«O» и затем «Ctrl»+«X». Теперь прочитаем содержимое каталога. Нас интересует строчка, описывающая созданный только что файл. Результат на скриншоте.
Указанные права доступа к файлам и директориям говорят, что этот файл доступен для чтения и записи владельцу, а члены группы и остальные пользователи могут только читать файл. Проверим или поверим? Уверен, вы сами сможете это сделать, если переключитесь на своего пользователя и попытаетесь отредактировать этот файл. Будет опять ошибка доступа и недостаток прав.
Давайте исправим ситуацию. Для изменения прав доступа к объектам используется команда «chmod». У нее есть несколько параметров, но на данном этапе они нам не нужны и не будем отвлекаться на это.
Синтаксис команды требует, чтобы мы указали кому будем добавлять права доступа. Делается это использованием символов:
- «u» - изменяем права доступа для владельца файла/каталога.
- «g» - то же для группы
- «o» - то же для остальных пользователей
- «a» - для всех.
Дадим право редактировать файл «testfile.txt» остальным пользователям. Таким образом, команда будет выглядеть так:
chmod o+w testfile.txt
Проверим что изменилось:
ls -l
Добавилась возможность редактирования файла пользователями, отличными от владельца. Проверим это. Переключаемся на нашего пользователя:
su andrew
В вашем случае вместо «andrew» будет другие имя. Открываем файл «testfile.txt» и, например, допишем строчку «Вторая строка текста». Нажимаем комбинацию клавиш для сохранения внесенных изменений, и теперь нас кротко спрашивают об имени файла, под которым мы сохраним свой титанический труд, и после выходим. Никаких жалоб на недостаток прав не последовало.
Аналогично удаляются права доступа, только в данном случае вместо знака «+» поставим «-». Например, если мы хоти запретить остальным пользователям редактировать созданный нами файл, то можно сделать это командой:
chmod o-w testfile.txt
Символ «=» не добавляет и не убирает права, а заменяет существующие теми, что указаны в команде. Например, какой-то файл разрешен пользователям только для выполнения. Если мы дадим команду «chmod o=w какой-то файл», то мы дадим разрешение только на запись в файл, а чтение и выполнение будут запрещены.
Можно использовать альтернативный способ изменения прав доступа к объектам, если воспользоваться числовой кодировкой. Каждая тройка символов заменяется числом, которое формируется следующим образом:
- 4 - разрешение на чтение.
- 2 – разрешено редактирование файла
- 1 – разрешено выполнение файла
Итоговое значение состоит из суммы этих цифр. Если конкретнее, то если мы хотим открыть файл только на чтение, то пишем 4, если на чтение и запись, то сумму 4+2, т. е. 6. Если еще и на выполнение – то 4+2+1, т. е. 7. И так для каждой тройки (владелец/группа/пользователи).
Например, первоначально наш файл имел разрешение на чтение и запись владельцу (4+2=6), на чтение членам группы (4) и остальным пользователям (4). Нашу команду выше, в который мы предоставляли доступ на запись остальным пользователям, можно было бы записать так:
chmod 646 testfile.txt
Если, например, этот файл будет скриптом, который предназначен для выполнения, то можем раздать права следующим образом: владелец может читать, редактировать и запускать этот скрипт (4+2+1=7), а члены группы и остальные пользователи будут иметь право только просматривать и также выполнять его (4+1=5). Теперь команда может быть следующей:
chmod 755 testfile.txt
Выполните, вызовите на экран содержимое каталога и проверьте, как изменилась строка, определяющая права доступа к файлу. Она должна теперь выглядеть как «rwxr-xr-x».
Заключение. Права доступа к файлам и директориям
В этот раз мы начали знакомиться с правами доступа к объектам системы. Мы не рассматривали в подробностях все параметры используемых команд, т. к. нужны они далеко не всегда и следует изучать их по мере необходимости.
Надеюсь, что абракадабра типа «rwxrw-r--» превратилась в осмысленную строку, дающую нужную информацию. Также мы должны уже уметь отредактировать эту строку, разграничив права для разных пользователей.