Пользователи и права доступа
Тема пользователей и их прав в системе в первую очередь относится к функционированию самой операционной системы. Оболочка лишь предоставляет утилиты, позволяющие анализировать доступы и изменять их.
Пользователи
$ whoami
Взаимодействие с операционной системой всегда ведётся от какого-то конкретного пользователя. Команда whoami позволяет выяснить от кого именно:
$ whoami
vadim
Абсолютно любой процесс, запускаемый в операционной системе, стартует от имени некоторого пользователя. Соответственно, его возможности по влиянию на файловую систему ограничены теми правами, которые есть у пользователя, от имени которого процесс запущен.
$ ps
Команда ps (process status) выводит отчёт о работающих процессах. Информацию о том, какой процесс и под каким пользователем запущен, можно получить из вывода ps aux:
$ ps aux
# Левый столбец имя пользователя
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 167472 11464 ? Ss 14:22 0:00 /sbin/init splash
systemd+ 903 0.0 0.0 24132 13008 ? Ss 14:22 0:01 /lib/systemd/systemd-resolved
vadim 1541 0.0 0.0 162832 7752 ? Sl 14:22 0:10 /usr/libexec/at-spi2-registryd --us
kernoops 1552 0.0 0.0 11260 444 ? Ss 14:22 0:00 /usr/sbin/kerneloops --test
Взаимодействие с файловой системой происходит через запуск тех или иных утилит, модифицирующих, создающих или анализирующих файловую структуру. Это значит, что запуская, например, touch, мы стартуем процесс от своего имени, внутри которого запускается программа touch. Она, в свою очередь, создаёт файл (если его не было) и делает вас владельцем нового файла. Кстати, модификация существующих файлов не влияет на владельца — для его смены нужно воспользоваться специальной утилитой. В домашней директории пользователя всё принадлежит пользователю :
$ ls -la
total 44
drwxr-xr-x 24 vadim vadim 4096 апр 21 20:30 .
drwxr-xr-x 4 root root 4096 апр 18 11:43 ..
-rw------- 1 vadim vadim 3236 апр 21 21:22 .bash_history
Третий столбец в этом выводе — владелец. Единственная запись, которая выбивается из всего списка это .., то есть родительская директория. Её владельцем является root. Каждый каталог в директории /home является домашним каталогом конкретного пользователя. Поэтому они все имеют разных владельцев, как правило, совпадающих с именем директории.
$ id
Имя пользователя в системе должно быть уникальным, но его можно менять. Если посмотреть под капот работы этой системы, то мы увидим, что имя пользователя связано с идентификатором, называемым UID. Это число, которое и определяет пользователя. Если поменяется имя пользователя, но идентификатор останется прежним, то все доступы останутся. Если же сменится идентификатор, то фактически сменится и пользователь. Соответственно, новый пользователь потеряет доступы ко всему старому. Посмотреть свой идентификатор можно разными способами. Первый способ — с помощью команды id:
$ id
uid=1004(vadim) gid=1004(vadim) группы=1004(vadim)
Второй способ связан с просмотром одного важного файла, который является основным хранилищем пользователей в *nix-системах.
$ cat /etc/passwd
root
В любой *nix-системе присутствует специальный пользователь root, или суперпользователь. Главная его особенность — это идентификатор со значением 0 (имя в теории можно поменять). Этот пользователь имеет особое значение для системы и может выполнять абсолютно любые действия в системе (root нужен для выполнения некоторых привилегированных действий, которые недоступны обычным пользователям). Крайне не рекомендуется использовать этого пользователя на регулярной основе. И ни в коем случае нельзя входить под ним в систему (это прямой доступ ко всему и большая дыра в безопасности системы).
Группы в *nix-системах
Кроме имени, у пользователей *nix-систем есть связанное с ним понятие группа. Группа создается для группового доступа к разделяемому (общему) ресурсу (например, файлу).
Права доступа (permissions)
Кроме имени пользователя и группы, с каждым файлом ассоциированы права доступа:
- r — чтение
- w — запись
- x — исполнение
Причём эти права задаются для трёх типов пользователей: владельца (Owner), пользователей, входящих в ту же группу (Group) и остальных (Other) — тех, кто не попал в предыдущие две.
# Пример строчки из вывода команды ls -la
$ ls -la
-rw-r--r-- 1 vadim vadim 3771 апр 18 11:43 .bashrc
Рассмотрим описания прав доступа -rw-r--r-- (permissions):
- Для удобства чтения разделим эту запись на группы символов - rw- r-- r--.
- Первый символ ' - ' в этой записи говорит о том, что перед нами обычный файл.
- За ним следует три группы, в каждой из которых по три символа.
- Каждая группа описывает доступы для разных типов пользователей.
- Первая описывает права доступа для владельца файла. rw- означает, что владелец этого файла может как читать (r) этот файл, так и писать (w) в него. Последний прочерк означает, что этот файл нельзя исполнять (описывается символом x ).
- Следующая группа прав относится к тем, кто входит в группу vadim, так как именно этой группе принадлежит данный файл. Запись r-- говорит о наличии доступа только для чтения, а изменение запрещено.
- То же самое касается и тех, кто не входит в эту группу, то есть набор прав у последних двух одинаковый.
А кто же может удалить этот файл? Для ответа на этот вопрос важно знать владельца, группу и права той директории, в которой лежит файл .bashrc. Сам файл не может обозначить прав на своё удаление, они всегда берутся из того места, где он находится. Удалить файл можно только, если у вас есть возможность писать в эту директорию (в соответствии с тем, к какому типу пользователей вы относитесь).
Home
Домашняя директория имеет другие права:
$ ls -la /home/ | grep vadim
drwxr-xr-x 24 vadim vadim 4096 апр 21 20:30 vadim
- Первое отличие — это d вместо - в самом начале. d говорит о том, что перед нами директория.
- Права для владельца rwx, а для всех остальных r-x. Из этого следует, что кроме пользователя никто не может писать внутрь домашней директории этого пользователя!
Что такое x в отношении директорий? Это право позволяет перемещаться в директорию и обращаться ко всем расположенным в ней файлам и каталогам. Обращаться можно при условии, что эти файлы доступны на чтение или запись или выполнение: например, если положить доступный на чтение файл в директорию с правом x, то вы сможете прочитать этот файл. Если же убрать с директории право x, то вы вовсе лишитесь доступа к файлу.
Что такое чтение? Здесь более интуитивно понятно: директория, по сути, является списком файлов, поэтому право на чтение позволяет прочитать этот список файлов, а именно вывести список имён файлов, содержащихся в директории.
В литературе иногда используется другой способ описания прав доступа: 775. Это три числа , каждое из которых представляет собой группу rwx для наших типов пользователя в том же порядке: для владельца, входящих в группу и всех остальных. 0 — означает, что нет никаких прав для данного типа пользователей.
- # Permission rwx Binary
- 7 read, write and execute rwx 111
- 6 read and write rw- 110
- 5 read and execute r-x 101
- 4 read only r-- 100
- 3 write and execute -wx 011
- 2 write only -w- 010
- 1 execute only --x 001
- ----------------------------------------------------------------------------------------
- drwxr-xr-x в числовой форме соответствует 755, а -rw-r--r-- — 644.
Однако пользователь root находится вне этой системы. Для него не имеет никакого значения наличие любых прав — суперпользователь может всё.
Sudo
Ситуаций, в которых необходимо повышать привилегии и выполнять команды от имени суперпользователя (root), довольно много:
- Установка новых программ.
- Изменение прав доступа и владельцев файлов, не принадлежащих текущему пользователю
- Создание, редактирование и удаление файлов в местах, где не хватает прав текущего пользователя
- Запуск программ, требующих повышенные привилегии
Способ с помощью утилиты su на данный момент устарел и крайне не рекомендуется к использованию. Основной способ повышать привилегии в современных системах — утилита sudo (substitute user and do — дословно "подменить пользователя и выполнить").
Использовать sudo очень просто, достаточно написать эту команду слева от любой другой и выполнить. По умолчанию она пытается повысить привилегии до суперпользователя. В Ubuntu sudo спрашивает пароль и запоминает его на 5 минут. На протяжении этого времени вы можете использовать sudo, не вводя пароль каждый раз.
$ sudo apt install vim
[sudo] пароль для vadim: