В Linux существуют 3 типа пользователей: root, стандартный пользователи (Regular user) и сервисы (системные).
Большинство ОС имеют своих суперпользователей, т.е. пользователя который наделён максимальными правами в ОС. Во многих ОС семейства Linux
этот пользователь root
. Для установки приложений, изменения разрешений, создания пользователей, изменения системных файлов пользователи должны повысить свои привилегии до root
(sudo
).
Пользователь с наивысшими правами у нас root, как Администратор в Windows. Считается дурным тоном заходить на сервер под этим пользователем так как пользователь имеет неограниченные права. По соображения иб лучше заходить под стандартным пользователем. Если пользователь root будет скомпрометированным, то у вас будут очень большие проблемы.
Права стандартного пользователя
Как вы поняли стандартный пользователь не имеет по умолчанию всех прав для администрирования. Тогда логичный вопрос: Как мне управлять сервером? После того как вы зашли под этим пользователем (именная учетная запись) выполняем команду su - root
и вводим пароль от root. После чего вы уже не стандартный пользователь, а root. Для того, чтобы проверить кто вы, можно выполнить whoami
.
Вы заметили, что я конкретного написал su - root
, т.е. мы используем su когда хотим переключится в другого пользователя. Обязательно конечно знать пароль пользователя, но если это делать под root, то не надо.
Но с таким подходом всё ещё остаются несколько проблем:
- Сложно понять потом кто и что выполнял на сервере
- Мы никак не можем разграничить права. Любой, у кого есть пароль от root может сделать что угодно с сервером.
Sudo
И тут есть 2 выхода:
- Добавить пользователя в группу wheel, что даст ему возможность выполнять команды с повышением прав. Тут как минимум у вас в логах будет проще отыскать кто именно перезапустил сервис или сервер. Чтобы выполнять команду с повышенными правами нужно будет использовать sudo, например,
sudo cat /var/log/secure
. - Вторым этапом можно обозначить какие именно команды пользователь может выполнять. Делается это в файле
/etc/sudoers
, но об этом в другой статье.
Пример
- Создадим стандартного пользователя user
- Попробуем выполнить что-то
- Добавим его в wheel
- Попробуем выполнить что-то с использованием sudo
[root@c-stream-9-vm1 ~]# useradd user
[root@c-stream-9-vm1 ~]# passwd user
[root@c-stream-9-vm1 ~]# su - user
[user@c-stream-9-vm1 ~]$ cat /var/log/secure
cat: /var/log/secure: Permission denied
[root@c-stream-9-vm1 ~]# usermod -aG wheel user
[root@c-stream-9-vm1 ~]# su - user
[user@c-stream-9-vm1 ~]$ sudo cat /var/log/secure
Aug 10 17:53:25 c-stream-9-vm1 su[2671889]: pam_unix(su-l:session): session opened for user user by admin(uid=0)
Переключение пользователя
Для переключения пользователя без выхода из системы используется команды su - username
, этакая смена пользователя как в Winodws
. Если вы делаете это под стандартным пользователем то вам нужно будет ввести пароль нужного вам пользователя, если вы выполняете под root то пароль вводить не надо.
su - root
Password:
Если ввести su
без имени пользователя, то по умолчанию вы пытаетесь логиниться под root
.
su vs su -
Запомните раз и навсегда что правильно использовать команды su
со знаком -
. Разница в том, что когда вы используете su -
то подгружается окружение конечного пользователя, а просто su
оставляет окружение текущего пользователя.
В примере ниже мы переключаемся в пользователя root
но при этом остаемся в окружении пользователя admin
.
[admin@vm-1 ~]$ su
Password:
su: Authentication failure
[admin@vm-1 ~]$ su
Password:
[root@vm-1 admin]# ls -la
total 24
drwx------. 2 admin admin 115 Nov 2 11:58 .
drwxr-xr-x. 3 root root 19 Jun 22 11:06 ..
-rw-------. 1 admin admin 3588 Nov 1 23:39 .bash_history
-rw-r--r--. 1 admin admin 18 Jul 21 2020 .bash_logout
-rw-r--r--. 1 admin admin 141 Jul 21 2020 .bash_profile
-rw-r--r--. 1 admin admin 395 Nov 2 11:58 .bashrc
-rw-------. 1 admin admin 51 Nov 2 10:16 .lesshst
-rw-------. 1 admin admin 2612 Nov 2 11:58 .viminfo
В примере ниже мы переключаемся в пользователя root
по правильному.
[admin@vm-1 ~]$ su -
Password:
Last login: Tue Nov 2 12:09:22 +06 2021 on pts/0
[root@vm-1 ~]# ls -la
total 32
dr-xr-x---. 2 root root 151 Oct 30 13:16 .
dr-xr-xr-x. 17 root root 224 Oct 27 18:18 ..
-rw-------. 1 root root 1256 Oct 27 17:43 anaconda-ks.cfg
-rw-------. 1 root root 314 Nov 2 12:09 .bash_history
-rw-r--r--. 1 root root 18 May 11 2019 .bash_logout
-rw-r--r--. 1 root root 176 May 11 2019 .bash_profile
-rw-r--r--. 1 root root 176 May 11 2019 .bashrc
-rw-r--r--. 1 root root 100 May 11 2019 .cshrc
-rw-r--r--. 1 root root 129 May 11 2019 .tcshrc
-rw-------. 1 root root 2296 Oct 30 13:16 .viminfo
Конфигурация sudo
Я говорил о том, что вы можете задавать список разрешённых команд sudo
для пользователя. Правило по умолчанию находится в /etc/sudoers
и разрешает выполнение всех команд. Делает это строка %wheel ALL=(ALL) ALL
.
%wheel
ALL=(ALL) ALL - группа к которой применяется правило- %wheel
ALL
=(ALL) ALL - означает, что данное правило применяется ко всем хостам - %wheel ALL=
(ALL)
ALL - означает, что пользовательroot
может запускать команды от лица всех пользователей - %wheel ALL=(ALL)
ALL
- означает, что данные правила применяются всем командам
Добавление новых правил рекомендуется выполнять добавлением нового файла в директорию /etc/sudoers.d
. Например, для добавления прав пользователю admin2
:
sudo visudo /etc/sudoers.d/admin2
admin2 ALL=(ALL) /bin/ls
sudo su - admin2
sudo ls -la
Sudo без пароля
Вы уже заметили, что когда мы выполняем команды sudo
у нас запрашивается пароль и если вас это очень сильно беспокоит, то запрос пароля можно и отключить, но только это не рекомендуется делать. Для этого добавляем NOPASSWD
перед командами.
sudo visudo /etc/sudoers.d/admin2
admin2 ALL=(ALL) NOPASSWD:/bin/ls
sudo su - admin2
sudo ls -la
Комментарии