В Linux существуют 3 типа пользователей: root, стандартный пользователи (Regular user) и сервисы (системные).

Большинство ОС имеют своих суперпользователей, т.е. пользователя который наделён максимальными правами в ОС. Во многих ОС семейства Linux этот пользователь root. Для установки приложений, изменения разрешений, создания пользователей, изменения системных файлов пользователи должны повысить свои привилегии до root (sudo).

Пользователь с наивысшими правами у нас root, как Администратор в Windows. Считается дурным тоном заходить на сервер под этим пользователем так как пользователь имеет неограниченные права. По соображения иб лучше заходить под стандартным пользователем. Если пользователь root будет скомпрометированным, то у вас будут очень большие проблемы.

Права стандартного пользователя

Как вы поняли стандартный пользователь не имеет по умолчанию всех прав для администрирования. Тогда логичный вопрос: Как мне управлять сервером? После того как вы зашли под этим пользователем (именная учетная запись) выполняем команду su - root и вводим пароль от root. После чего вы уже не стандартный пользователь, а root. Для того, чтобы проверить кто вы, можно выполнить whoami.

Вы заметили, что я конкретного написал su - root, т.е. мы используем su когда хотим переключится в другого пользователя. Обязательно конечно знать пароль пользователя, но если это делать под root, то не надо.

Но с таким подходом всё ещё остаются несколько проблем:

  1. Сложно понять потом кто и что выполнял на сервере
  2. Мы никак не можем разграничить права. Любой, у кого есть пароль от root может сделать что угодно с сервером.

Sudo

И тут есть 2 выхода:

  1. Добавить пользователя в группу wheel, что даст ему возможность выполнять команды с повышением прав. Тут как минимум у вас в логах будет проще отыскать кто именно перезапустил сервис или сервер. Чтобы выполнять команду с повышенными правами нужно будет использовать sudo, например, sudo cat /var/log/secure.
  2. Вторым этапом можно обозначить какие именно команды пользователь может выполнять. Делается это в файле /etc/sudoers, но об этом в другой статье.

Пример

  1. Создадим стандартного пользователя user
  2. Попробуем выполнить что-то
  3. Добавим его в wheel
  4. Попробуем выполнить что-то с использованием 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