# Использование команды sudo в Linux

*Команда `sudo`* (`substitute user and do`, подменить пользователя и выполнить) позволяет строго определенным пользователям выполнять указанные программы с административными привилегиями без ввода пароля суперпользователя `root`. Если быть точнее, то команда `sudo` позволяет выполнять программы от имени любого пользователя, но, если идентификатор или имя этого пользователя не указаны, то предполагается выполнение от имени суперпользователя `root`. Таким образом, использование sudo позволяет выполнять привилегированные команды обычным пользователям без необходимости ввода пароля суперпользователя `root` . Список пользователей и перечень их прав по отношению к ресурсам системы может быть настроен оптимальным образом для обеспечения комфортной и безопасной работы. Например, команда sudo в `Ubuntu Linux`, используется в режиме, позволяющем выполнять любые задачи администрирования системы без интерактивного входа под учетной записью `root`.  

Настройки `sudo` довольно несложные, и тем не менее, позволяют реализовать гибкую систему распределения полномочий отдельных пользователей в многопользовательской среде.  

Командная строка sudo может быть использована в следующих форматах: 

```text
sudo -h | -K | -k | -V
sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
sudo [-AbEHknPS] [-C num] [-g group] [-h host] [-p prompt] [-u user] [VAR=value] [-i|-s] []
sudo -e [-AknS] [-C num] [-g group] [-h host] [-p prompt] [-u user] file
```

## Параметры командной строки

```text
-A, --askpass - использовать вспомогательную программу для ввода пароля
-b, --background - выполнить команду в фоновом режиме
-C, --close-from=num - закрыть все дескрипторы файлов >= num
-E, --preserve-env - сохранить пользовательское окружение при выполнении команды
-e, --edit - редактировать файлы вместо выполнения команды
-g, --group=group - выполнить команду от имени или ID указанной группы
-H, --set-home - установить для переменной HOME домашний каталог указанного пользователя
-h, --help - показать справку и выйти
-h, --host=host - выполнить команду на узле (если поддерживается модулем)
-i, --login - запустить оболочку входа в систему от имени указанного пользователя; также можно задать команду
-K, --remove-timestamp - полностью удалить файл с timestamp
-k, --reset-timestamp - объявить недействительным файл timestamp
-l, --list - показать список прав пользователя или проверить заданную команду; в длинном формате используется дважды
-n, --non-interactive - автономный режим без вывода запросов пользователю
-P, --preserve-groups - сохранить вектор группы вместо установки целевой группы
-p, --prompt=prompt - использовать указанный запрос пароля
-S, --stdin - читать пароль из стандартного ввода
-s, --shell - запустить оболочку от имени указанного пользователя; также можно задать команду
-U, --other-user=user - в режиме списка показывать права пользователя
-u, --user=user - выполнить команду (или редактировать файл) от имени или ID указанного пользователя
-V, --version - показать сведения о версии и выйти
-v, --validate - обновить временную метку пользователя без выполнения команды
-- - прекратить обработку аргументов командной строки
```

## Примеры использования команды `sudo`

`sudo –l` - отобразить список команд, доступных для выполнения текущему пользователю. Кроме списка команд отображаются параметры среды, которые будут применяться при их выполнении.  
`sudo –ll` - отобразить список команд, доступных для выполнения текущему пользователю в длинном (расширенном) формате.  

В данном формате вместо краткого синтаксиса для списка разрешенных команд в виде `(ALL : ALL) ALL` отображается подробное описание прав пользователя:

### Sudoers entry

RunAsUsers: ALL
RunAsGroups: ALL
Команды: ALL

`sudo lshw -C network` - отобразить информацию о сетевом оборудовании с правами суперпользователя `root`  
`sudo –l –U user1` - посмотреть список команд, доступных для выполнения пользователю `user1`. Для выполнения данной команды пользователь должен быть `root` или иметь право на выполнение команды `sudo -l`, что обеспечивается настройками утилиты sudo в файле `/etc/sudoers`  
`sudo ipmitool sensor` - выполнить команду `ipmitool sensor` с правами `root`  
`sudo su` - выполнить команду `su`, т.е. создать сеанс суперпользователя `root`  
`sudo -i` - запустить командную оболочку с правами суперпользователя `root`. Для выполнения данной команды пользователь должен иметь право на выполнение программы оболочки в среде `sudo`, например - `/bin/bash`  
`sudo ls /usr/local/protected` - получить список файлов каталога, доступного только `root`  
`sudo -u user2 ls ~` - получить список файлов домашнего каталога пользователя `user2`  
`sudo -u www vi ~www/htdocs/index.html` - редактировать файл `~www/htdocs/index.html` от имени пользователя `www`  
`sudo -g adm view /var/log/syslog` - просмотреть файл системного журнала, доступного только суперпользователю `root` и членам группы `adm`  
`sudo -u user1 -g users2 vi /home/users2/textfile.txt` - редактировать текстовый файл как пользователь `user1`, с принадлежностью к первичной группе `users2`  
`sudo -E /usr/bin/firefox` - запустить браузер `firefox` от имени суперпользователя `root`, сохранив параметры среды текущего пользователя. Возможность выполнения команд с сохранением среды пользователя должна быть разрешена параметром `SETENV` в настройках файла конфигурации `sudo`

### Файл конфигурации `/etc/sudoers`

Настройки `sudo` определяется содержимым файла `/etc/sudoers`. Поскольку ошибочные данные в данном файле могут привести к серьезным проблемам доступа к ресурсам системы, рекомендуется выполнять его изменение с помощью специального редактора `sudoedit` (в некоторых дистрибутивах - `visudo`), который поддерживает функции проверки синтаксиса и значительно снижает риск создания неработоспособной конфигурации `sudo`.  
Содержимое файла `/etc/sudoers` определяет имена пользователей и групп, перечень выполняемых программ, необходимость введения паролей, и некоторые другие настройки, связанные с формированием переменных окружения при смене пользователя. Кроме данного файла, настройки `sudo` могут определяться содержимым файлов из каталога `/etc/sudoers.d`, что позволяет структурировать систему предоставления прав на использование `sudo` в виде набора файлов с осмысленными именами, что полезно при большом количестве пользователей и сложной системе разграничения прав. Имена файлов конфигураций в каталоге `/etc/sudoers.d` могут быть любыми, но их содержимое должно полностью соответствовать формату файла `/etc/sudoers`.  
Синтаксис настроек в файле `/etc/sudoers` позволяет использовать специальные псевдонимы (`Alias`-ы), с помощью которых значительно упрощается как настройка, так и восприятие конфигурационной информации `sudo`.  

*В файле конфигурации `/etc/sudoers` возможно использование четырех разновидностей псевдонимов:*

- `User_Alias` - списки пользователей, для которых настраивается политика использования sudo.
- `Runas_Alias` - списки пользователей, от имени которых может быть задано выполнение команд через sudo.
- `Host_Alias` - списки узлов, с которых выполняется подключение к системе.
- `Cmnd_Alias` - списки команд, использующиеся в настройках, выполняемых директивами файла /etc/sudoers

*Примеры:*

- `Host_Alias ADMCOMPS = localhost, server, admin` - определяет псевдоним `ADMCOMPS`, который определяет группу компьютеров с именами `localhost, server, admin`.
- `Host_Alias MAILSERVERS = 192.168.0.100, smtp2` - определяет группу из двух компьютеров с указанными `IP` и именем. Возможно использование адресов подсетей.
- `User_Alias ADMINS = jsmith, admusr` - определяет группу `ADMINS`, в которую входят пользователи с именами `jsmith` и `admusr`.  

*Аналогичным образом можно создать псевдонимы для различных наборов команд, доступных для выполнения в `sudo`:*

### Группа команд, для работы в сети, псевдоним Networking

```bash
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
```

### Группа команд для управления установкой и удалением программ, псевдоним SOFTWARE

```bash
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
```

### Группа команд для управления системными службами, псевдоним SERVICES

```bash
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
```

Аналогичным образом можно создать псевдонимы для групп команд, выполнение которых делегируется одиночным или объединенных псевдонимами пользователей.  
Основная часть настроек в файле `/etc/sudoers` задает правила, определяющие, какие пользователи, каких компьютеров, какие команды могут выполнять.  

### Формат записей

`user MACHINE=COMMANDS`  

- `user` - имена или псевдонимы пользователей  
- `MACHINE` - имена или псевдонимы компьютеров  
- `COMMANDS` - секция команд, включающая имена или псевдонимы команд и дополнительные параметры

Обычно, в файле `/etc/sudoers` присутствует директива, разрешающая выполнение пользователю root любых команд при любом подключении к системе:

### Allow root to run any commands anywhere

```root ALL=(ALL) ALL```

Аналогичным образом можно разрешить выполнение через `sudo` всех команд для пользователя, например, с именем `user`

```user ALL=(ALL) ALL```

При данной настройке, у пользователя будет запрашиваться пароль ( его личный, а не пароль суперпользователя `root` ). При необходимости, можно настроить секцию команд таким образом, чтобы пароль не запрашивался, с использованием параметра `NOPASSWD`:  

`user ALL=(ALL) NOPASSWD: /usr/bin/su, /usr/bin/drakxconf` - пароль будет запрашиваться при выполнении пользователем `user` через `sudo` всех команд, кроме `su` и `drakxconf`  

*Использование псевдонимов позволяет уменьшить необходимое число записей для определения прав пользователей, которые могут подключаться к системе с разных компьютеров и входить в разные группы:*  

`ADMINS localhost=(ALL) NOPASSWD:ALL` - разрешить группе пользователей, определенной псевдонимом `“ADMINS”` выполнять любые команды при подключении через петлевой интерфейс `“localhost”` без ввода пароля  
`ADMINS ALL= NETWORKING, SOFTWARE` - разрешить группе пользователей, объединенных псевдонимом `“ADMINS”` выполнять группы команд, объединенные псевдонимами `“NETWORKING”` и `“SOFTWARE”`  

*Для существующих в системе групп пользователей можно также разрешать выполнение отдельных команд или групп команд:*  

`%users localhost=/sbin/shutdown -h now` - разрешить локальным пользователям выключение компьютера  
`%operators ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom` - разрешить членам группы `“operators”` монтирование и размонтирование указанных устройств  
`%powerusers ALL=NETWORKING, NOPASSWD: /usr/bin/su` - разрешить членам группы `“powerusers”` выполнять команды группы `“NETWORKING”` с вводом пароля и команду `“su”` без пароля  
Довольно часто возникает необходимость исключения разрешения на выполнение отдельных команд из списка, объединенных псевдонимом. В этом случае, перед именем команды или псевдонима ставится восклицательный знак – `!`  
`ADMINS ALL= ALL, !NETWORKING` - разрешить группе пользователей, объединенных псевдонимом `“ADMINS”` выполнение всех команд, кроме команд, объединенных псевдонимом `“NETWORKING”`  

*В следующем примере, используется конфигурация команд, разрешающая выполнение через `sudo` для всех пользователей группы `“ADMINS”`, всех команд, кроме команд смены оболочки:*

```bash
ADMINS ALL= ALL, !/bin/bash, !/usr/bin/su
```

*Кроме настроек доступа, в файле `/etc/sudoers` присутствуют директивы `Defaults`, определяющие некоторые настройки путей исполняемых файлов и создание переменных окружения при выполнении команд:*  

```bash
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults env_reset
Defaults env_keep = "COLOS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
```

*По умолчанию, если интервал выполнения команд с использованием `sudo`, не превышает `5 минут`, то повторный ввод пароля не требуется. Однако, это значение можно изменить, добавив значение `timestamp_timeout в минутах`:*  

```bash
Defaults timestamp_timeout=1
```

В данном случае, если команда `sudo` будет выполняться не позже, чем через `1 минуту` после ввода пароля для предыдущей команды, то повторно пароль запрашиваться не будет. Если значение `“timestamp_timeout”` сделать равным нулю, то пароль будет запрашиваться при каждом запуске `sudo`, если сделать отрицательным `( -1 )`, - то повторный ввод пароля не будет запрашиваться никогда.  

Для исключения возможности выполнения `sudo-команд` при подключении через `ssh` без авторизации, по умолчанию, должна использоваться команда `“ssh –t“`:

```text
# Disable "ssh hostname sudo ", because it will show the password in clear.
# You have to run "ssh -t hostname sudo ".
```

### Defaults requiretty

Для определения дополнительного каталога с файлами конфигурации пользователей `sudo` используется директива:

```text
# Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
# includedir /etc/sudoers.d
```

Подробную справку по использовании `sudo` можно получить с помощью команд:

```bash
man sudo
man sudoers
```