Приветствую!
Сегодня научимся управлять правами на файлы в системах на базе Linux. В этой заметке будут рассмотрены следующие команды: id, chmod, chown. Поехали)
Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram.
Предисловие
Тема разграничения доступа к файлам в Linux является очень обширной. В данной статье я не ставил целью охватить ее всю, а лишь вести читателя-новичка в курс дела и продемонстрировать часто используемые инструменты. Более подробную статью по правам в Linux вы можете почитать на Habr. Ну а мы приступаем.
Часть материала (в основном таблицы с описаниями) были позаимствованы из книги “Командная строка Linux” за авторством Уильяма Шоттса.Все примеры из этой статьи были выполнены в консоли дистрибутива Linux Mint, установку и запуск которого я подробно описывал в статье: Установка Linux рядом с Windows.Также рекомендую к прочтению другие статьи из цикла по командной строке Linux.
В модели безопасности Unix пользователь может владеть файлами и каталогами. Если пользователь владеет файлом или каталогом, он может управлять доступом к нему. Пользователи могут также принадлежать группе, состоящей из одного или нескольких пользователей, и получить права доступа к файлам и каталогам для членов группы, которые определяются владельцами. Кроме прав доступа для группы, владелец может также определить некоторые права доступа для всех остальных, их в терминологии Unix называют мир (world).
Уильям Шоттс, “Командная строка Linux”
В Linux определяют следующие базовые права доступа к файлам и каталогам:
- права на чтение (r – read);
- права на запись (w – write);
- права на выполнение (x – execute).
Если взглянуть на вывод команды ls с ключом -l в директории с файлами, можно узнать текущие права на эти файлы:
ls -l
Первые 10 символов в выводе команды являются атрибутами файла.
Подробно вывод команды ls мы рассматривали в статье: Командная строка Linux, навигация в системе и просмотр директорий: команды pwd, ls, cd.
Эти 10 символов разбиты на блоки. Ниже на картинке представлено их описание:
Первый символ указывает тип файла. На рисунке ниже приведены часто используемые на практике типы файлов:
Оставшиеся девять символов как раз и определяют права на чтение, запись и выполнение для владельца, группы и всех остальных. Их еще называют режимами доступа.
Стоит отметить, что каждый из режимом имеет разное влияние на разные типы файлов. Ниже дано краткое описание каждому режиму в случае обычных файлов и каталогов:
А на изображении ниже представлены распространенные примеры установленных режимов с их описанием:
Список команд
Итак, сегодня наш арсенал инструментов пополнится следующими командами:
- id - позволяет получить информацию о пользователе системы и его группах
- chmod - change mode, позволяет изменять режимы доступа к файлам
- chown - change owner, поваляет изменять владельца и группу владельцев файлов
Команда id – информация о пользователях и группах
Так как система прав на файлы в Linux подразумевает взаимодействие с такими сущностями, как владелец и группа владельцев, давайте изучим команду id, с помощью которой можно получить информацию о пользователях системы и их группах.
Синтаксис:
id [ключи] [имя_пользователя]
Часто используемые ключи команды id:
- -u выводит uid указанного пользователя
- -n выводит имя группы, вместо uid (используется совместно с -u)
Пример использования:
id
Когда в Linux создается учетная запись пользователя, ей присваивается идентификатор пользователя – user ID он же uid и идентификатор основной группы – group ID или gid.
Вывод команды id без аргументов отображает uid, gid текущего пользователя, а также перечень групп, участником которых он является.
Чтобы узнать информацию о другом пользователе, необходимо передать его имя или uid в качестве аргумента:
id root
id 0
Обратите внимание, что uid пользователя root всегда равен 0. Такая константа часто используется в скриптах для проверки, запускается ли программа от имени суперпользователя.
id -u ivan
id -nu ivan
Вся информация о пользователях и группах хранится в системных текстовых файлах:
- /etc/passwd – информация об учетных записях пользователей;
- /etc/group – информация о группах;
- /etc/shadow – информация о паролях пользователей.
Команда chmod – управление атрибутами чтение/запись/исполнение
С помощью команды chmod осуществляется управления режимами доступа к файлам в Linux.
Синтаксис команды chmod:
chmod [ключи] режим файл
Часто используемые ключи команды chmod:
- -v выводить диагностические сообщения по каждому файлу
- -R рекурсивно изменять файлы и каталоги
Для практики создадим несколько файлов и каталогов:
touch text_file.txt script.sh .hidden_file.log
mkdir dir1 dir2
Команды из примера выше мы рассматривали в статье: Командная строка Linux, работа с файлами: команды touch, mkdir, cp, mv, rm.
Теперь давайте с использованием механизма перенаправления вывода наполним эти файлы какой-то информацией:
cat /etc/passwd > text_file.txt
echo "printf 'Hello R4ven'" > script.sh
history > .hidden_file.log
Подробнее про механизм перенаправления стандартных потоков мы говорили в статье: Командная строка Linux, перенаправление ввода и вывода: операторы “>”, “<“, “|”.
И скопируем пару файлов в созданные каталоги:
cp /usr/bin/ls ./dir1/
cp /usr/bin/cat ./dir2/
По умолчанию наши простые файлы имеют доступ на чтение для всех. Давайте уберем этот атрибут у файла text_file.txt такой командой:
chmod -r text_file.txt
Без дополнительных параметров, синтаксисом -r (отнять read) мы убираем атрибут чтения для всех: пользователя, группы и остальных.
Теперь при попытке вывести его содержимое, мы будем получать ошибку:
cat text_file.txt
Теперь давайте вернем доступ на чтение, но только для владельца файла, т.е. для нас:
chmod u+r text_file.txt
cat text_file.txt
Как вы догадываетесь символ + подразумевает “добавить” следующий за ним атрибут r. Перед добавляемым атрибутом мы задали параметр u (user), указывая команде chmod выполнить изменение режима только для владельца файла:
Ниже представлены возможные параметры команды chmod с описанием, а также примеры возможных комбинаций атрибутов:
Теперь давайте по аналогии добавим режим исполнения для файла script.sh только для владельца, группы владельцев и попробуем его запустить:
chmod ug+x script.sh
./script.sh
Теперь давайте уберем для всех атрибут записи со скрытого файла .hidden_file.log и попробуем в него что-то записать. Затем вернем атрибут записи для владельца и вновь выполним запись:
chmod ugo-w .hidden_file.log
echo "TEST" > .hidden_file.log
chmod u+w .hidden_file.log
echo "TEST" > .hidden_file.log
cat .hidden_file.log
Таким образом происходит манипуляция режимами доступа. Идём дальше.
Как было указано в одной из таблиц, чтобы войти в какой-либо каталог, у него должен быть атрибут исполнения – x. По умолчанию для каталогов данный атрибут устанавливается для всех.
Опробуем на практике ситуацию полного удаления данного атрибута у каталога dir1:
chmod -x dir1
ls -l ./dir1
cd ./dir1
Мы не смогли прочитать содержимое данного каталога, как и перейти в него.
Чтобы вернуть доступ к каталогу:
chmod +x dir1
ls -l ./dir1
Во всех примерах до этого момента, мы рассматривали символьный вариант установки прав на файлы. Но также существует формат установки режимов доступа с помощью восьмеричной эквивалентности (цифры от 0 до 7). Данный формат также пользуется большой популярностью.
Главное, что нужно помнить:
- 4 – чтение (r)
- 2 – запись (w)
- 1 – исполнение (x)
А также суммирование этих представлений, т.е. 4+2=6 будет означать атрибут чтения и записи rw- и так далее. Так как атрибуты имеют три группы, соответственно установка режимов может иметь вид:
775 – эквивалентно rwxrwxr-x.
Ниже представлена эквивалентность кодов режимов в разных системах счисления:
В качестве примера предоставим полный доступ всем (rwxrwxrwx) для каталога dir2 с помощью данного способа:
chmod 777 ./dir2
ls -l
Как видно, при открытии полного доступа к каталогу, в выводе команды ls наш dir2 даже выделяется особым образом.
Ниже картинка из просторов, с распространенными примерами режимов доступа в восьмеричной системе для команды chmod:
Команда chown – назначение владельца и группы
Команда chown используется для изменения владельца и группы файла или каталога. Важно отметить, что для использования этой команды необходимы привилегии суперпользователя.
chown может изменить владельца и/или группу файла в зависимости от первого аргумента.
Синтаксис команды chown:
chown [ключи] [владелец][:[группа]] файл
Часто используемые ключи команды chown:
- -v выводить диагностические сообщения по каждому файлу
- -R рекурсивно изменять файлы и каталоги
Вот несколько примеров:
sudo touch root_owner.txt
ls -l ./root_owner.txt
Видим, что владелец и группа файла имеют значение root root. При попытке изменить владельца НЕ от имени суперпользователя:
chown ivan:ivan root_owner.txt
ls -l ./root_owner.txt
Где ivan – имя моего пользователя.
Получаем ошибку. Теперь давайте всё таки укажем нового владельца:
sudo chown ivan: ./root_owner.txt
ls -l ./root_owner.txt
Если после параметра, определяющего владельца (ivan:), после символа двоеточия явно не указать группу, то автоматически подставится группа по умолчанию указанного владельца. В данном примере это ivan:ivan.
Ниже на изображении представлены некоторые примеры аргументов команды chown:
Команда chgrp
В старых версиях Unix команда chown изменяла только владельца файла, но не группу. Чтобы изменить группу, предоставлялась другая команда, chgrp. Она действует практически так же, как chown, но имеет больше ограничений. Её мы рассматривать не будем, просто знайте про её существование.
Выводы
Сегодня мы рассмотрели одну из важных частей операционных систем на основе Linux: управление базовым доступом к файлам или другими словами – правами на файлы. Мы с вами узнали:
- команду id, с помощью которой можно получить информацию о пользователях и их группах;
- команду chmod, благодаря которой можно управлять режимами доступа к файлам в системе;
- команду chown, которая позволяет менять/назначать владельца и группу владельцев файлов.
Старайтесь чаще практиковаться. Ведь теория без практики, все равно что CPU без RAM)
Спасибо, что читаете. Успехов вам!
Полезные источники
Мои ссылки:
- Мой основной сайт - r4ven.me
- Мой телеграм - t.me/r4ven_me