Тема пользователей и их прав в системе в первую очередь относится к функционированию самой операционной системы. Оболочка лишь предоставляет утилиты, позволяющие анализировать доступы и изменять их.
Взаимодействие с операционной системой всегда ведётся от какого-то конкретного пользователя, созданного в системе. Команда whoami
позволяет выяснить, кто же я такой:
whoami
kirill.m
Абсолютно любой процесс, запускаемый в операционной системе, стартует от имени некоторого пользователя. Соответственно, его возможности по влиянию на файловую систему ограничены теми правами, которые есть у пользователя, от имени которого процесс запущен. Обратите внимание на то, что я говорю не "пользователь запустил процесс", а "процесс запускается от имени пользователя". Дело в том, что присутствие пользователя для запуска необязательно. Да, работая в командной строке мы запускаем всё сами, но когда система загружается, то она запускает множество различных процессов и, как мы увидим ниже, для многих из них создаются собственные пользователи с ограниченным набором прав.
Команда ps
(process status) выводит отчёт о работающих процессах. Информацию о том, какой процесс и под каким пользователем запущен, можно получить из вывода ps aux
:
ps aux
# Левый столбец имя пользователя
root 7717 0.0 0.0 4244 1504 ? S 10:52 0:00 mpstat 1 3
kirill.m 7718 0.0 0.1 36084 3236 pts/0 R+ 10:52 0:00 ps aux
alexand+ 10542 0.0 0.1 21500 2892 pts/1 Ss+ 10:10 0:00 -bash
root 11113 0.0 0.1 92796 2596 ? Ss 08:50 0:00 sshd: kirill.m [priv]
kirill.m 11116 0.0 0.0 45276 1408 ? Ss 08:50 0:00 /lib/systemd/systemd --user
kirill.m 11119 0.0 0.0 61148 1860 ? S 08:50 0:00 (sd-pam)
kirill.m 11194 0.0 0.0 92796 1800 ? S 08:50 0:00 sshd: kirill.m@pts/0
kirill.m 11195 0.0 0.2 21388 4448 pts/0 Ss 08:50 0:00 -bash
root 12195 0.0 0.0 0 0 ? S 10:13 0:00 [kworker/u30:1]
root 12880 0.0 0.1 92796 2748 ? Ss 08:55 0:00 sshd: alexander.v [priv]
alexand+ 12883 0.0 0.0 45276 1924 ? Ss 08:55 0:00 /lib/systemd/systemd --user
alexand+ 12884 0.0 0.0 61148 1860 ? S 08:55 0:00 (sd-pam)
alexand+ 12920 0.0 0.1 92796 2420 ? S 08:55 0:00 sshd: alexander.v@pts/1,pts/2
Взаимодействие с файловой системой происходит через запуск тех или иных утилит, модифицирующих, создающих или анализирующих файловую структуру. Это значит, что запуская, например, touch
, мы стартуем процесс от своего имени, внутри которого запускается программа touch
. Она, в свою очередь, создаёт файл (если его не было) и делает вас владельцем нового файла. Кстати, модификация существующих файлов не влияет на владельца — для его смены нужно воспользоваться специальной утилитой. В домашней директории пользователя всё принадлежит пользователю (хотя, если постараться, то можно навертеть как угодно):
ls -la
total 44
drwxr-xr-x 5 kirill.m kirill.m 4096 Aug 29 11:34 .
drwxr-xr-x 8 root root 4096 Apr 26 10:38 ..
-rw------- 1 kirill.m kirill.m 2540 Aug 30 07:26 .bash_history
-rw-r--r-- 1 kirill.m kirill.m 220 Aug 31 2015 .bash_logout
-rw-r--r-- 1 kirill.m kirill.m 3771 Aug 31 2015 .bashrc
drwx------ 2 kirill.m kirill.m 4096 Mar 30 18:10 .cache
-rw------- 1 kirill.m kirill.m 55 Aug 28 18:49 .lesshst
drwxrwxr-x 2 kirill.m kirill.m 4096 Aug 29 08:35 .nano
-rw-r--r-- 1 kirill.m kirill.m 655 May 16 2017 .profile
-rw-rw-r-- 1 kirill.m kirill.m 0 Aug 29 11:27 renamed-file
drwx------ 2 kirill.m kirill.m 4096 Jan 22 2018 .ssh
-rw------- 1 kirill.m kirill.m 513 Aug 29 08:06 .viminfo
Третий столбец в этом выводе — как раз владелец. Единственная запись, которая выбивается из всего списка это ..
, то есть родительская директория. Её владельцем является root
, о котором мы позже поговорим. Если хорошо подумать, то это логично — ведь директория /home
не является собственностью пользователей системы:
ls -la /home/
total 32
drwxr-xr-x 8 root root 4096 Apr 26 10:38 .
drwxr-xr-x 23 root root 4096 Aug 27 06:53 ..
drwxr-xr-x 5 alexander.v alexander.v 4096 Jan 22 2018 alexander.v
drwxr-xr-x 5 kirill.m kirill.m 4096 Aug 29 11:34 kirill.m
drwxr-xr-x 4 rakhim rakhim 4096 Apr 26 10:05 rakhim
drwxr-xr-x 4 rakhim.d rakhim.d 4096 Apr 26 10:41 rakhim.d
Каждый каталог в директории /home
является домашним каталогом конкретного пользователя. Поэтому они все имеют разных владельцев, как правило, совпадающих с именем директории.
Имя пользователя в системе должно быть уникальным, но его можно менять. Если посмотреть под капот работы этой системы, то мы увидим, что имя пользователя связано с идентификатором, называемым UID. Это число, которое и определяет пользователя. Если поменяется имя пользователя, но идентификатор останется прежним, то все доступы останутся. Если же сменится идентификатор, то фактически сменится и пользователь. Соответственно, новый пользователь потеряет доступы ко всему старому. Посмотреть свой идентификатор можно разными способами. Первый способ — с помощью команды id
:
id
uid=1002(kirill.m) gid=1002(kirill.m) groups=1002(kirill.m),999(docker)
Второй способ связан с просмотром одного важного файла, который является основным хранилищем пользователей в *nix-системах. Да, это обычный текстовый файл, как и всё остальное.
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
kirill.m:x:1002:1002::/home/kirill.m:/bin/bash
Кроме имени и идентификатора, здесь также указана домашняя директория пользователя (и её можно поменять), а также шелл по умолчанию. Запись /usr/sbin/nologin
говорит о том, что данный пользователь не может входить в систему. Такие пользователи нужны для запуска программ, имеющих ограниченные права, и им, естественно, не нужно входить в систему.
Кроме имени, у пользователей *nix-систем есть связанное с ним понятие группа. Группа, как можно догадаться из названия, создана для группового доступа к разделяемому (общему) ресурсу (например, файлу). Например, у нас есть группа разработчиков, которые регулярно ходят на сервер, и им нужно дать одинаковые возможности по управлению определёнными файлами. Так как владелец у файла ровно один, то мы не можем решить этот вопрос через смену владельца, но можем через создание группы. Достаточно её создать и привязать к самому пользователю. Группы, ассоциированные с текущим пользователем, показываются в выводе команды id
:
id
uid=1002(kirill.m) gid=1002(kirill.m) groups=1002(kirill.m),999(docker)
Здесь группа kirill.m
является основной, такая группа может быть только одна, и именно в эту группу входят любые создаваемые файлы от имени текущего пользователя. Кроме основной, пользователь может входить в произвольное число дополнительных групп. То, как это влияет на доступы, мы рассмотрим в одном из следующих уроков.
В любой *nix-системе присутствует специальный пользователь root
, или, как говорят, суперпользователь. Главная его особенность — это идентификатор со значением 0 (а имя в теории можно поменять). Этот пользователь имеет особое значение для системы и может выполнять абсолютно любые действия в системе. У пользователя root
в файле /etc/passwd
будет вот такая запись:
Крайне не рекомендуется использовать этого пользователя на регулярной основе. И ни в коем случае нельзя входить под ним в систему. root — это прямой доступ ко всему и большая дыра в безопасности системы. Кроме того, систему очень легко убить, например, удалив случайно не тот файл или испортив важную конфигурацию, после чего вход в систему станет невозможным.
Несмотря на это, root
нужен для выполнения некоторых привилегированных действий, которые недоступны обычным пользователям. Об этом мы поговорим в следующем уроке.
Вам ответят команда поддержки Хекслета или другие студенты.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт