Дата и время публикации:
## 1. Назначение
Команда sudo (SuperUser DO) [разрешает](https://phoenixnap.com/kb/linux-sudo) регулярному пользователю доступ к файлам и директориям с ограниченным доступом (restricts access) и операциям. По умолчанию, в Linux регулярному пользователю ограничены права доступа к определенной частям системы для предотвращения несанкционированного доступа к файлам с конфиденциальной информацией (sensitive files).
Команда sudo временно повышает привилегии регулярному пользователю, позволяя ему совершать деликатные задачи ( sensitive tasks) от имени суперпользователя root или другого пользователя.
Командц sudo нужно рассматривать как [безопасную альтернативу](https://wiki.archlinux.org/title/Sudo#:~:text=Sudo%20allows%20a%20system%20administrator,the%20journal%20for%20security%20auditing.) команде su, которая запускает командную оболочку с правами доступа суперпользователя или регулярного пользователя, что может привести к разрушению системы в случае неправильно введенных команд или наличия ошибок безопасности в них.
Каждый раз при запуске команды sudo производится отметка в системном журнале, что позволяет пользователям выполнять команды с повышением привилегий на короткое время, 5 ... 15 минут по умолчанию. Если какой-то регулярный пользователь попытается использовать команду sudo без назначенных привилегий , это факт будет зарегистрирован в системном журнале как событие безопасности.
## 2. Использование
### 2.1 Назначение sudo привелегий пользователя
По умолчанию, привелигии sudo пользователя определяет плагин политик sudoers, которые управляются через файл файле /etc/sudoerrs.
Права доступа которого должны быть установлены 0440 (--r--r---) , иначе команда sudo завершиться с ошибкой:
```shell
# chown -c root:root /etc/sudoers
# chmod -c 0440 /etc/sudoers
```
Политики в файл sudoers [задаются](https://www.sudo.ws/docs/man/1.8.15/sudoers.man/#SUDOERS_FILE_FORMAT) в виде отдельных записей и подразделяются в виде пользовательских определений: привилегии sudo пользователя.
А так же изменения опций конфигурации sudo по умолчанию.э, такой как
Каждая строчка в файле содержит определенное политику пользовательских привилегий sudo, наделяющее регулярного пользователя определенными привилегиями sudo, в широкоизвестной форме :
```shell
USER_NAME HOST_NAME = (RUNAS_USER:RUNAS_GROUP) [[TAG_SPEC:] COMMAND_LIST]
```
Формат представления привилегии sudo [содержит](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/managing-sudo-access_configuring-basic-system-settings#con_user-authorizations-in-sudoers_managing-sudo-access) обязательные и дополнительные поля:
**USER_NAME**
имя пользователя, который вводит команду. Если значение начинается с символа %, она распространяет действие политики на группу.
**HOST_NAME**
является именем узла, на котором применяется данная политика.
**RUNAS_USER:RUNAS_GROUP**
определяет пользователя и группу, под которым будет выполняться команда. Если не указывать эти значения , USER_NAME может выполнять команду под суперпользователем.
**COMMAND_LIST**
содержит перечень команд с указанием абсолютного пути к ним и позволяет ограничивать использование команд с определенными опциями и аргументами.
**TAG_SPEC**
список команд может [сопровождаться](https://www.sudo.ws/docs/man/1.7.10/sudoers.man/#Tag_Spec) тэгами, такими как NOPASSWD, PASSWD, NOEXEC, EXEC, SETENV, NOSETENV, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT и NOLOG_OUTPUT. Когда тэг установлен, он распространяется на все команды в списке. При этом тэги антонимы перекрывают действие дрг друга с учётом понижения привилегий, например, PASSWD будет перекрывать NOPASSWD, а NOEXEC отменять EXEC.
**Наделение пользователя привелегиями sudo выполнять команды от суперпользователя root**
```shell
USER_NAME ALL=(ALL:ALL) ALL
```
**Наделение пользователя привелегиями выполнять команды от другого пользрвателя на определенном узле**
```shell
USER_NAME HOST_NAME=(ALL:ALL) ALL
```
**Наделение пользователя привелегиями sudo из группы**
Для того, чтобы наделить пользователя привелегиями sudo, необходимо вкключит его учётную запись (user account) в некоторую группу, имя которой обозначено group:
```shell
%group ALL=(ALL:ALL) ALL
```
Потому что в различных дистрибутивах linux имя group предоставляющей регулярному пользователю может [разница](https://linuxconfig.org/distinguishing-between-the-sudo-and-admin-groups-in-linux-roles-and-usage) в своем названии, таком как admin, sudo и wheel .
Поэтому и возникает путаница из-за принятых соглашений определения имен в различных дистрибутивах для обозначения группы пользователей с привилегиями sudo .
В debian-базовых дистрибутивах, подобных Ubuntu, используется пользовательская группа sudo. Поэтому для наделения пользователя привилегиями sudo, достаточно просто имя учётной записи пользователя username добавить в эту группу group :
```shell
# usermod -aG sudo username
```
В RHEL и Red Hat базовых дистрибутивов, например , fedora или centos :
```shell
# usermod -aG wheel username
```
На некоторых старых системах, подобно Ubuntu 12.04 LTS :
```shell
# usermod -aG admin username
```
Для [разрешения](https://www.golinuxcloud.com/linux-wheel-group/) запуска sudo без пароля следует добавить к привелегиям sudo тэг NOPASSWD , ко всем пользователям :
```shell
%group ALL=(ALL) NOPASSWD: ALL
```
Несмотря на то, что команда sudo наделяет регулярного пользователя привелегиями временно, никто ему не помешает изменить пароль суперпользователя root, чтобы избежать этого группе пользовательских привилегий sudo следует запретить это делать:
```shell
%group ALL=(ALL) ALL, !/usr/bin/passwd root
```
Для удаления пользователя из
```shell
gpasswd -d user group
```
**Ограничения запуска команд и наделение пользователя привелегиями sudo**
Можно [разрешить](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/managing-sudo-access_configuring-basic-system-settings#proc_configuring-sudo-privileges_managing-sudo-access) непривеллигированному пользователю вводить соотв. команды на определенных рабочих станциях путем настройки политики в общесистемной директории /etc/sudoers.d/ . Это будет более безопасныс чем наделять полный доступ к пользователю или никто к суперпользователю по следующим соображениям :
- Более детальный контроль на привилегированным доступом пользователей с ограничением соотв. действий на определенных узлах взамен предоставления им полного административного доступа.
- Более лучшее регистрация действий в системном журнале и использование пользователем привелегий sudo: каждое действие регистрируется с именем пользователя, который воспользовался данными привилегиями.
- Прозрачный контроль за действиями пользователя с использованием извещений об применении им привелегий sudo .
Для реализации таких возможностей в указанной директории создать файл ``````
```shell
visudo -f /etc/sudoers.d/
```
Который создаст встроенный редактор visudo и с помощью него добавить строчки:
```shell
USER_NAME HOST_NAME = (RUNAS_USER:RUNAS_GROUP)
```
Что позволит пользователю запускать с правами RUNAS_USER:RUNAS_GROUP команду, а в системном журнале появиться запись о ее запуске.
Для примера,
```shell
%admin host1.example.com = /bin/dnf, /sbin/reboot
```
Всем пользователям из группы admin разрешено выполнять установку, обновления пакетов через пакетный менеджер dnf и перезапуск системы командой reboot на host1.example.com
Для запрета, ограничения смены пароля root пользователям группы admin так же добавить
```shell
%admin host1.example.com= !/usr/bin/passwd root
```
Для отправки извещений об использовании пользователями из группы sudo через почтовый сервис в этот же файл следует добавить строчки:
Defaults mail_always
Defaults mailto="..."
### 2.2 Ограничение времени действия пароля
После того, как привелигии sudo пользователю были назначены и он прошел процедуру авторизации, соответствующая отметка uid была сделана в системном журнале, пользователю [выделено](https://www.omglinux.com/change-sudo-timeout-linux/) короткое время около 5минут, а не некоторых дистрибутивах, подобно, Ubuntu не более 15 минут, повторного ввода пароля.
```shell
timestamp_timeout=
```
Для изменения периода действия пароля, необходимо изменить на желаемое число минут, например, на 1 час :
```shell
Defaults timestamp_timeout=60
```
Для [отмены](https://unix.stackexchange.com/questions/382060/change-default-sudo-password-timeout) периода действия пароля и запроса пароля при каждом запуске sudo :
```shell
Defaults timestamp_timeout=0
```
Но, выполнение команд может потребовать больше времени, поэтому можно [снять](https://stackoverflow.com/questions/58933609/is-it-possible-to-disable-sudo-timeout-in-the-current-shell) период действия пароля:
```shell
Defaults env_reset, timestamp_timeout=-1
```