Продолжаем знакомиться с внутренней кухней дистрибутивов на базе ядра Linux. Ранее мы узнали, кто такое суперпользователь и почему его наличие так важно в системе.
Сегодня чуть ближе пройдемся по тому, что можно и чего нельзя делать с файлами и папки в Linux. Может показаться, что материал предназначен только для тех, кто плотно работает с серверами, но осмелюсь сказать, что информация, представленная ниже, полезна каждому пользователю, который хочет лучше понимать систему.
Кто твой господин?
Прежде чем говорить про разрешения, нужно понимать, кто такой владелец файла и каталога. У каждого файла или папки в дистрибутиве есть два владельца - пользователь и группа. Когда вы создаете файл или директорию, то владельцем файла становиться пользователь от чьей учетной записи это действие происходит. Группа к которой принадлежит ваш пользователь также становится владельцем файла или папки. Посмотреть пользователя и группу, которые являются владельцем можно при помощи команды:
ls -l
В примере видно, что все папки в моей домашней директории имеют владельцами пользователя jc и группу jc. Это произошло потому, что от имени этого пользователя при установке системы создавалась домашняя папка и файлы внутри нее. Когда пользователь пытается получить доступ к файлу или папке, то система (если правильнее говорить, оболочка) проверяет несколько моментов:
- является ли пользователь владельцем файла или папки
- если нет, то принадлежит ли пользователь к группе, которая является владельцем файла или папки
- если все предыдущие проверки не пройдены, то система (оболочка) предоставит вам права группы others, созданной в системе для таких ситуаций.
Чтобы проверить к какой группе относится ваш пользователь по-умолчанию, нужно ввести команду:
groups <имя_пользователя>
В выводе можно заметить, что мой пользователь принадлежит к группам jc и wheel. Последняя аналогична группе Администраторы в системе Windows и означает, что пользователи в этой группе могут выполнять команды от имени суперпользователя.
Чтобы посмотреть всех пользователей в системе нужно ввести команду
less /etc/passwd
Аналогично для вывода всех групп в системе используется команда
less /etc/group
Пользователя и группу, которые являются владельцам файла можно изменить, чтобы передать им права на владение файлами. Для этого существует две различные команды, но я использую одну, про которую и расскажу - это команда chown (change owner, сменить владельца). Чтобы сменить владельца/группу нужно ввести:
sudo chown <имя_нового_владельца>:<группа_нового_владельца>
На примере выше я создал папку test и сменил ей владельцев, поставив и пользователя, и группу root. Можно не указывать название группы после двоеточия, тогда после смены владельца файлу или папке будет назначена та группа, к которой по-умолчанию принадлежит новый владелец.
Итак, подытожим: у каждого файла или папки в Linux есть владельцы (пользователь и группа).
Права на чтение, запись и выполнение
С файлами и папками в Linux можно выполнять три действия: читать (read), записывать (write) и выполнять (execute). Эта «триада» прав так и называется - право на чтение, право на запись и право на выполнение. Что понимается под этими правами?
- Read (чтение): можно прочитать содержимое файла и отобразить содержимое каталога.
- Write (запись): изменить содержимое файла и разрешить создание, удаление или задание прав на файлы внутри папки.
- Execute (выполнение): запустить файл как программу или перейти в каталог.
У этих прав имеется относительный и абсолютный режим представления. Относительный режим - это буквенное отображение первых символов в названии прав (т. е. rwx) или - в случае если прав нет, абсолютный режим представлен цифрами - read (4), write (2), execute (1), отсутствие прав (0). Для простоты их называют буквенный и цифровой режимы.
Расшифровываем значение прав доступа на файлы и папки
Когда выше я ввел команду ls -l, то в выводе отобразился относительный (буквенный) режим прав:
rwxr-xr-x
Как видим, вывелось 9 символов. Их мы делим на три группы по три символа:
(1)rwx (2)r-x (3)r-x
Группа прав №1 относится к тому, что может делать пользователь-владелец с файлом или папкой.
Группа прав №2 говорит нам что может делать группа-владелец с файлом или папкой.
Группа прав №3 содержит информацию о правах на файл или папку для остальных пользователей и групп (не являющихся владельцами файла).
Если перевести на обычный язык, то это означает, что пользователь-владелец jc имеет полный набор прав на файл или папку (чтение, запись, выполнение), группа-владелец jc имеет право на чтение и выполнение файла/папки, другие пользователи также имеют права на чтение и выполнение файлы/папки. Знак - является отображением 0, т. е. говорит, что прав на запись у группы jc и других пользователей нет.
Теперь представим эту же запись в абсолютном режиме, т.е. при помощи цифр:
4 + 2 + 1 = 7
4 + 0 + 1 = 5
4 + 0 + 1 = 5
Таким образом, получается значение 755. Запись, как видим, получается короче и понятнее.
Изменяем права доступа на файл или папку
В случае необходимости права доступа можно поменять. Делать это нужно от имени суперпользователя (т. е. с использованием команды sudo). Команда, изменяющая права доступа называется chmod (change mode – сменить режим). Ее можно использовать в буквенном или цифровом режиме. В зависимости от выбранного режима вводить команду нужно следующим образом:
Буквенный режим
sudo chmod XYZ <имя_файла>
Букву X мы заменяем на указание того, кому мы будем менять права доступа: u (пользователь), g (группа), o (остальные), a (все). Можно комбинировать буквы и, например, написать
chmod uxYZ <имя_файла>
Букву Y мы заменяем на - если хотим запретить, на + если хотим разрешить и на = если хотим установить разрешения.
Букву Z заменяем на три буквы прав (r, w, x). Например, если хотим разрешить группе изменять файл, то вводим:
sudo chmod g+x <имя_файла>
Если хотим запретить всем пользователям и группам изменять и выполнять файл, то вводим:
sudo chmod a-wx <имя_файла>
Числовой режим
sudo chmod ABC <имя_файла>
Букву A заменяем на цифру прав для пользователя, букву B на цифру прав для группы, букву C на цифру прав для остальных. Например, чтобы предоставить полный доступ к файлу для всех нужно ввести:
sudo chmod 777 <имя_файла>
После ввода такой команды у файла будет отображаться такая запись:
rwxrwxrwx
Наглядный пример
Все, про что я писал выше применимо при работе с терминалом. Но можно использовать файловый менеджер, чтобы наглядно показать о чем шла речь.
Обратите внимание на то, что при попытка просмотра свойств папки test, для которого мы назначали пользователя и группу root система показывает, что мой пользователь не является владельцем файла и не принадлежит к группе владельцев. Получается, что изменение содержимого папки для пользователя jc закрыто (он не может создавать внутри папки test других папок или файлов).
Зачем все это?
Для тех, кто планирует работать с Linux-системами на уровне уверенного пользователя или системного администратора информация в посте даст понимание и представление о том, что такое права доступа, какие они бывают и как их изменить. Если совсем упростить, то правильное назначение прав доступа убережет систему от несанкционированного проникновения извне и не позволит «уронить» систему путем удаления или изменения важного файла.
Обычным пользователям тоже нужно понимать, что не во все папки в системе они могут войти или что-то изменить внутри нее. Когда система дает отворот-поворот, то это не значит, что Linux плохой и ужасный, это значит, что нет соответствующих прав. Права эти, в случае необходимости, можно получить или предоставить.
В статье я не коснулся расширенных прав пользователя и группы (SUID, GUID и sticky bit), этому будут посвящены другие заметки на канале. Думаю, что новичкам с лихвой хватит той информации, что опубликована выше. Если возникнут вопросы/замечания/пожелания, то пишите все в комментариях, на все что смогу ответить - дам ответ.