Работаем с правами доступа на файлы и папки в Linux

1,5K прочитали
Продолжаем знакомиться с внутренней кухней дистрибутивов на базе ядра Linux. Ранее мы узнали, кто такое суперпользователь и почему его наличие так важно в системе.

Продолжаем знакомиться с внутренней кухней дистрибутивов на базе ядра Linux. Ранее мы узнали, кто такое суперпользователь и почему его наличие так важно в системе.

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

Кто твой господин?

Прежде чем говорить про разрешения, нужно понимать, кто такой владелец файла и каталога. У каждого файла или папки в дистрибутиве есть два владельца - пользователь и группа. Когда вы создаете файл или директорию, то владельцем файла становиться пользователь от чьей учетной записи это действие происходит. Группа к которой принадлежит ваш пользователь также становится владельцем файла или папки. Посмотреть пользователя и группу, которые являются владельцем можно при помощи команды:

ls -l
Результат выполнения команды в терминале на моем компьютере
Результат выполнения команды в терминале на моем компьютере

В примере видно, что все папки в моей домашней директории имеют владельцами пользователя jc и группу jc. Это произошло потому, что от имени этого пользователя при установке системы создавалась домашняя папка и файлы внутри нее. Когда пользователь пытается получить доступ к файлу или папке, то система (если правильнее говорить, оболочка) проверяет несколько моментов:

  • является ли пользователь владельцем файла или папки
  • если нет, то принадлежит ли пользователь к группе, которая является владельцем файла или папки
  • если все предыдущие проверки не пройдены, то система (оболочка) предоставит вам права группы others, созданной в системе для таких ситуаций.

Чтобы проверить к какой группе относится ваш пользователь по-умолчанию, нужно ввести команду:

groups <имя_пользователя>
Проверяем в какой группе по-умолчанию состоит пользователь jc
Проверяем в какой группе по-умолчанию состоит пользователь jc

В выводе можно заметить, что мой пользователь принадлежит к группам 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), этому будут посвящены другие заметки на канале. Думаю, что новичкам с лихвой хватит той информации, что опубликована выше. Если возникнут вопросы/замечания/пожелания, то пишите все в комментариях, на все что смогу ответить - дам ответ.