Пользователи и группы
Ваш удалённый сервер работает под управлением операционной системы Linux. Это многопользовательская система: в ней могут работать разные пользователи, каждый со своими настройками и правами доступа. Чтобы пользователи могли комфортно сосуществовать в одном пространстве и не мешать друг другу, создана система разграничения прав доступа.
Первым в Linux автоматически создаётся суперпользователь с неограниченными правами, его логин — root. Ему можно всё.
Для выполнения команды от имени суперпользователя root перед командой нужно ввести команду sudo, вы это уже делали при настройке Gunicorn и демона systemd.
Команда sudo доступна только для профилей, внесенных в файл /etc/sudoers. Администратор системы может отредактировать этот файл командой visudo.
Ограничения прав
Все пользователи сервера, кроме root, так или иначе ограничены в правах.
У каждого пользователя есть своя домашняя директория в папке home. Название домашней директории по умолчанию совпадает с именем пользователя. В ней пользователь обладает неограниченными правами: он может создавать и редактировать директории и файлы, удалять их и вообще чувствовать себя как дома.
В своих владениях пользователь может менять права доступа: например, он может закрыть доступ к своей домашней директории или к какому-то её содержимому для других пользователей.
Взаимодействие с операционной системой всегда происходит от имени определённого пользователя. Когда пользователь создаёт файл командой touch — запускается процесс от имени пользователя и внутри процесса запускается утилита touch. Она создает новый файл, и в описании файла отмечает владельца этого файла: текущего пользователя.
Не только разработчики и администраторы, но и программы, работающие на сервере, запускают свои процессы от имени пользователей, специально для этого созданных. База данных запускает процессы от имени своего пользователя, системные демоны работают из-под своих пользователей, операционная система выполняет свои задачи из-под пользователя root.
Группы пользователей
Пользователи объединяются в группы, и по принадлежности к той или иной группе система определяет права доступа для каждого пользователя. Права доступа назначаются не для отдельных пользователей, а для групп.
При создании пользователя автоматически создаётся группа, название которой совпадает с именем пользователя, и пользователь включается в эту группу. Эта группа называется «основной группой пользователя» или «группой по умолчанию». Затем пользователя можно включить в любое количество дополнительных групп или изменить его группу по умолчанию.
Например, на сервере работают администраторы и разработчики. Есть смысл запретить разработчикам менять настройки сервера и конфигурацию nginx, но нужно открыть им доступ к директории с кодом приложения.
Для этого нужно, во-первых, создать группу, которая объединила бы этих разработчиков. Группа создаётся командой groupadd из-под пользователя root (через sudo):
Скопировать кодBASH
sudo groupadd developer
...и включить в неё всех разработчиков:
Скопировать кодBASH
sudo usermod -aG developer torvalds
# пользователь torvalds добавлен в группу разработчиков "developer"
sudo usermod -aG developer sir-timothy
# добавили ещё одного разработчика в группу "developer"
Команда usermod (англ. user modification, «изменение пользователя») управляет свойствами пользователя; ключ -G назначает пользователю новую группу, ключ -a (append) указывает, что новую группу надо добавить к списку тех групп, в которые уже включён пользователь. Без ключа -a прежние группы будут удалены и заменены на новую.
Будьте внимательны к регистру: ключ -g заменит главную группу пользователя (группу по умолчанию), и пользователь может потерять доступ к своим файлам.
Команда groups покажет список групп, в которые включён текущий пользователь:
Скопировать кодBASH
# посмотреть список групп пользователя, из-под которого вы сейчас работаете
groups
your_username : your_group1 your_group2
А можно посмотреть список групп, в которые включён любой другой пользователь:
Скопировать кодBASH
# посмотреть список групп пользователя torvalds
groups torvalds
torvalds : torvalds developer
Осталось выдать Торвальдсу и Бернерс-Ли права на доступ к директории с проектом Yatube.
Права доступа
Каждый файл принадлежит определенному пользователю и группе. У каждого файла есть права доступа, определяющие, кто имеет права читать, изменять и запускать этот файл.
В своей домашней директории пользователь может делать что угодно, но при попытке создать файл в системной папке
Скопировать кодBASH
touch /etc/file.txt
...система ответит «посторонним вход запрещён»:
Скопировать кодBASH
touch /etc/file.txt
touch: cannot touch '/etc/file': Permission denied
Система сообщает, что текущий пользователь не может создать файл в системной директории /etc: у пользователя нет прав на изменение этой папки.
Права доступа к каждой директории или файлу задаются тремя записями:
- права доступа для владельца файла/директории;
- права доступа для пользователей, входящих в группу, назначенную для этого файла/директории;
- права доступа для всех остальных пользователей.
Например, владельцу файла можно разрешить читать файл, редактировать его и исполнять (запускать программный файл); членам группы, назначенной для файла, можно только читать файл; всем остальным можно полностью запретить любой доступ к этому файлу.
Владелец (owner) — это пользователь, который создал файл/директорию (впоследствии владелец может быть переназначен).
Группа (group) задаётся при создании файла/директории. По умолчанию это основная группа владельца, но потом может быть назначена другая группа.
Все остальные (all) — это любые пользователи за исключением перечисленных выше.
Чтобы посмотреть, как выглядит описание прав, выполните в домашней директории команду ls -la. В консоли вы увидите примерно такие строки:
Скопировать кодBASH
drwxr-xr-x 2 praktikum praktikum 4096 июл 12 17:04 .
drwxr-xr-x 4 root root 4096 июл 12 17:03 ..
-rw-r--r-- 1 praktikum praktikum 220 июл 12 17:03 .bash_logout
-rw-r--r-- 1 praktikum praktikum 3771 июл 12 17:03 .bashrc
-rwxrw-r-- 1 praktikum praktikum 115 июл 12 17:04 file
Каждая строка начинается с последовательности из десяти символов, именно здесь описаны права доступа.
Первый символ означает тип объекта, это может быть файл (символ -) или директория (символ d).
Далее идут девять символов, это три группы по три символа.
Первая группа из трёх символов — это права доступа для владельца файла (для owner), далее три символа с правами для группы (group) и последние три символа — это права доступа для всех остальных пользователей (all).
Права определяются символами r (read: чтение, просмотр), w (write: запись, изменение), x (execute: запуск, исполнение). Если вместо одного из этих символов стоит -, значит, этот тип доступа запрещён.
Таким образом комбинация rwx разрешает любые действия с файлом, а --- запрещает любые действия. rw- разрешает читать и изменять, но не разрешает запускать: вместо x стоит «минус».
Рассмотрим последнюю строку:
Скопировать кодBASH
-rwxrw-r-- 1 praktikum praktikum 115 июл 12 17:04 file
Первый символ в строке — это -, значит, file — это файл.
Права доступа к file: rwxrw-r--
- для владельца — полные права:
rwx (read, write, execute), то есть владелец может открывать этот файл, изменять и запускать; - для пользователей из группы владельца:
rw-, эти права позволяют им открывать и изменять файл (read, write), но не разрешают запускать; - все остальные пользователи могут только открывать (read) файл:
r--.
Дальше в строке:
- счётчик жёстких ссылок (1),
- владелец файла (praktikum),
- группа файла (praktikum),
- объём файла (115),
- дата изменения и название.
Есть альтернативный способ описания прав доступа — числовой. Права записываются группой из трёх цифр: первая цифра определяет права для владельца, вторая — для пользователей его группы, третья — для всех прочих пользователей.
Права определяются цифрами от 0 до 7:
0 — нет прав (соответствует ---)
1 — только выполнение (соответствует --x)
2 — только запись (соответствует -w-)
3 — запись и выполнение (соответствует -wx)
4 — только чтение (соответствует r--)
5 — чтение и выполнение (соответствует r-x)
6 — чтение и запись (соответствует rw-)
7 — все права (соответствует rwx)
Таким образом, запись 764 обозначает те же права, что и -rwxrw-r--
Для изменения прав доступа к файлу или к директории применяют команду chmod (change mode). Первым аргументом передаются права (числовое значение), вторым — имя файла или директории, к которым эти права будут применены. Чтобы рекурсивно изменить права доступа к директории (для всех вложенных файлов и папок), команду chmod выполняют с ключом -r.
Теперь можно осознанно разделить права доступа для администраторов сервера и разработчиков: дать полный доступ для группы developer к директории с проектом, а прав для других директорий не давать.
Скопировать кодBASH
chgrp developer /home/morty/yatube/
Теперь для директории /home/morty/yatube/ можно установить права для группы (а группа этой директории — developer), и все пользователи этой группы получат права доступа к файлам в директории с проектом.
Скопировать кодBASH
chmod -R 775 /home/morty/yatube/
Группе даны полные права на доступ к файлам в директории проекта Yatube. Добро пожаловать в команду разработчиков, Тим и Линукс!
Дополнительные команды
Создать пользователя:
Скопировать кодBASH
sudo useradd van-rossum
Изменить пароль для пользователя:
Скопировать кодBASH
sudo passwd van-rossum
Информация о пользователях хранится в файле /etc/passwd:
Скопировать кодBASH
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
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
uuidd:x:106:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:107:113::/nonexistent:/usr/sbin/nologin
sshd:x:108:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
dima:x:1000:1001::/home/dima:/bin/bash
postgres:x:109:116:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
Каждая строка — это запись о пользователе, данные в строке разделены двоеточиями.
dima:x:1000:1001::/home/dima:/bin/bash
dima — имя пользователя (логин)
x — пароль (он скрыт)
1000 — уникальный идентификатор пользователя
1001 — уникальный идентификатор основной группы пользователя
<пусто> — информация о пользователе
/home/dima — домашняя директория пользователя
/bin/bash — оболочка терминала по умолчанию
Информация о группах хранится в файле /etc/group:
Скопировать кодBASH
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
developer:x:9:
...
# имя_группы:скрытый_пароль:идентификатор_группы:
Команда ps (process status) выводит на экран список запущенных процессов. Та же команда с ключом -aux выведет расширенный список, с информацией о том, какой процесс запущен под каким пользователем:
Скопировать кодBASH
ps -aux
postgres 682 0.0 0.2 72804 5716 ? Ss июн06 0:03 postgres: 12/main: stats collector
postgres 683 0.0 0.3 218716 6800 ? Ss июн06 0:00 postgres: 12/main: logical replication launcher
root 9831 0.0 0.0 57308 1512 ? Ss июн07 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 9832 0.0 0.2 57884 5376 ? S июн07 0:00 nginx: worker process