Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Создание нового пользователя для sudo
Если вы используете удаленный сервер под управлением Ubuntu (например, облачный сервер Simple-Server), то сначала необходимо подключиться к нему по SSH-соединению от имени root:
Например, команда подключения может выглядеть так:
После чего консольный терминал потребует ввести root-пароль. При этом в целях безопасности символы пароля не отображаются в консольном терминале — его нужно набрать «вслепую».
Далее необходимо создать нового пользователя, дав ему произвольное имя:
В консольном терминале появится несколько сообщений, сообщающих о создании нового пользователя, отдельной группы, в которую он автоматически был добавлен, и директории, связанной с этим пользователем:
Adding user `easy' ...
Adding new group `easy' (1001) ...
Adding new user `easy' (1000) with group `easy' ...
Creating home directory `/home/easy' ...
Copying files from `/etc/skel' ...После этого терминал консоли попросит ввести пароль для нового пользователя, а также указать дополнительную информацию о нем:
Changing the user information for easy
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]Закончив заполнение данных, нужно ввести в консоль символ y, после чего процесс создания нового пользователя можно считать завершенным.
Добавление пользователя в группу sudo
Нового пользователя необходимо добавить в специальную группу sudo, которая наделит его расширенными полномочиями:
-
Флаг
-aнеобходим, чтобы указанная группа не заменила множество других групп, в которых пользователь уже состоит. В данном примере пользовательeasyкак минимум состоит в ранее созданной группеeasy. -
Флаг
-Gнеобходим для указания дополнительной группы, в которую будет добавлен пользователь. Он отличается от флага-g, который устанавливает основную группу пользователя. В данном примере основной группой пользователяeasyявляется группаeasy.
Флаг -a необходим, чтобы указанная группа не заменила множество других групп, в которых пользователь уже состоит. В данном примере пользователь easy как минимум состоит в ранее созданной группе easy.
Флаг -G необходим для указания дополнительной группы, в которую будет добавлен пользователь. Он отличается от флага -g, который устанавливает основную группу пользователя. В данном примере основной группой пользователя easy является группа easy.
Таким образом созданный пользователь получает дополнительные привилегии, соответствующие специальной группе sudo.
Теперь можно переключиться на нового пользователя:
Сразу после переключения в консольном терминале появится сообщение о том, что теперь можно выполнять команды от имени администратора (root) с помощью sudo:
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.Кстати, всегда можно проверить, под каким пользователем выполняются команды:
В консоли появится имя активного пользователя:
Выполнение команд через sudo
Для тестирования привилегий нового пользователя можно попробовать вывести содержимое системной директории /root:
Флаг -la является комбинацией двух флагов:
-
-lуказывает на подробный (длинный) формат вывода содержимого файловой системы. -
-aуказывает на вывод каталогов, название которых начинается с символа точки.
-l указывает на подробный (длинный) формат вывода содержимого файловой системы.
-a указывает на вывод каталогов, название которых начинается с символа точки.
Таким образом команда ls подробно покажет все содержимое указанной директории /root.
При этом во время первого выполнения этой команды терминал попросит ввести пароль, который указывался при создании пользователя easy:
[sudo] password for easy:После ввода пароля появится содержимое каталога /root:
total 48
drwx------ 7 root root 4096 Nov 20 05:30 .
drwxr-xr-x 20 root root 4096 Nov 20 12:09 ..
drwx------ 3 root root 4096 Nov 11 12:17 .ansible
-rw-r--r-- 1 root root 4078 Nov 20 10:12 .bash_history
-rw-r--r-- 1 root root 3106 Oct 15 2021 .bashrc
drwx------ 2 root root 4096 Nov 11 12:17 .cache
drwxr-xr-x 3 root root 4096 Nov 19 05:36 .local
-rw------- 1 root root 214 Nov 18 04:26 .mysql_history
-rw-r--r-- 1 root root 161 Jul 9 2019 .profile
-rw-r--r-- 1 root root 1372 Nov 18 04:16 resize.log
drwx------ 3 root root 4096 Nov 11 12:17 snap
drwx------ 2 root root 4096 Nov 18 04:16 .sshОбратите внимание, что использование sudo не требует оборачивания вызываемой команды в кавычки или что-то еще. Целевая команда пишется в естественном виде сразу после sudo.
Если ввести показанную выше команду без использования sudo:
То в консольном терминале появится сообщение об отказе в доступе:
ls: cannot open directory '/root': Permission deniedЕще одна базовая команда, которая выполняется с помощью sudo, — обновление списка доступных репозиториев:
Аналогично, если попытаться обновить репозитории без sudo, появится сообщение об ограничении доступа:
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)Таким образом, попытка использования любой команды, требующей права администратора для своего выполнения, будет сопровождаться выводом в консольный терминал сообщений об отказе в доступе.
От имени другого пользователя
С помощью sudo можно выполнять команды не только от имени root, но и от имени любого другого пользователя.
Давайте сначала переключимся обратно на root:
После этого терминал попросит ввести пароль пользователя root:
А теперь попробуем выполнить команду, требующую права администратора, от имени пользователя easy из-под пользователя root, используя флаг -u:
sudo -u easy ls -la /rootВ консольном терминале появится уже знакомое сообщение об отказе в доступе:
ls: cannot open directory '/root': Permission deniedПереключимся обратно на easy:
Для наглядности можно проделать тоже самое под пользователем easy:
sudo -u root ls -la /rootСперва в консольном терминале появится предложение ввести пароль от easy, а далее последует содержимое указанной директории:
total 52
drwx------ 7 root root 4096 Nov 20 15:39 .
drwxr-xr-x 20 root root 4096 Nov 20 12:09 ..
drwx------ 3 root root 4096 Nov 11 12:17 .ansible
-rw-r--r-- 1 root root 4171 Nov 20 15:21 .bash_history
-rw-r--r-- 1 root root 3106 Oct 15 2021 .bashrc
drwx------ 2 root root 4096 Nov 11 12:17 .cache
drwxr-xr-x 3 root root 4096 Nov 19 05:36 .local
-rw------- 1 root root 214 Nov 18 04:26 .mysql_history
-rw-r--r-- 1 root root 161 Jul 9 2019 .profile
-rw-r--r-- 1 root root 1372 Nov 18 04:16 resize.log
drwx------ 3 root root 4096 Nov 11 12:17 snap
drwx------ 2 root root 4096 Nov 18 04:16 .ssh
-rw-r--r-- 1 root root 0 Nov 20 15:39 .sudo_as_admin_successfulНастройка прав доступа sudo
Возможности каждого конкретного пользователя из группы sudo могут быть ограничены выполнением только некоторых разрешенных команд.
Чтобы проверить это, сперва переключимся обратно на root:
Чтобы настроить уникальные права доступа для каждого пользователя sudo, нужно открыть файл /etc/sudoers:
После чего добавить туда описание разрешенных команд по следующей схеме:
ПОЛЬЗОВАТЕЛЬ ХОСТ=(АВАТАР:ГРУППА) КОМАНДЫ-
ПОЛЬЗОВАТЕЛЬ. Имя пользователя, который будет инициировать командуsudo. -
ХОСТ. Имя хоста, на котором будет запускаться командаsudo. Параметр актуален в том случае, если используется несколько машин. -
АВАТАР. Имя пользователя, из под чьего имени будут выполняться разрешенные команды черезsudo. -
ГРУППА. Группа, к которой принадлежит пользователь. -
КОМАНДЫ. Набор команд (может состоять из одной команды), который будет разрешен для запуска черезsudo.
ПОЛЬЗОВАТЕЛЬ. Имя пользователя, который будет инициировать команду sudo.
ХОСТ. Имя хоста, на котором будет запускаться команда sudo. Параметр актуален в том случае, если используется несколько машин.
АВАТАР. Имя пользователя, из под чьего имени будут выполняться разрешенные команды через sudo.
ГРУППА. Группа, к которой принадлежит пользователь.
КОМАНДЫ. Набор команд (может состоять из одной команды), который будет разрешен для запуска через sudo.
В самом простом варианте можно разрешить выполнение всех команд из под любого пользователя:
В более сложном варианте разрешается выполнение только конкретных команд от имени ограниченного числа пользователей:
easy ALL=(root:ALL) /usr/bin/apt,/usr/bin/rm,/bin/nanoОбратите внимание, что наборы команд перечисляются через запятую без пробела.
Кстати, чтобы узнать полные пути до бинарных файлов необходимых команд, можно воспользоваться соответствующей утилитой:
В консольном терминале появится информация о всех перечисленных командах:
apt: /usr/bin/apt /usr/lib/apt /etc/apt /usr/share/man/man8/apt.8.gz
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz
nano: /usr/bin/nano /usr/share/nano /usr/share/man/man1/nano.1.gz /usr/share/info/nano.info.gzСамый первый путь после имени команды и является реальным адресом бинарного файла.
Чтобы указанные ограничения стали активны, в этом же файле нужно заменить строку, которая разрешает пользователям группы sudo выполнять любые root-команды:
На аналогичную, но с символом комментария в начале, чтобы настройка стала неактивна:
#%sudo ALL=(ALL:ALL) ALLПосле этого можно обратно переключиться на easy:
А теперь снова выполним уже знакомую команду вывода содержимого директории /root:
В консольном терминале появится сообщение о запрете выполнения указанной команды на данном хосте:
Sorry, user easy is not allowed to execute '/usr/bin/ls /root' as root on 3798037-yn55665.twc1.net.А вот команда обновления репозиториев будет работать:
Конечно, узнать подробности полномочий пользователей можно, просто просмотрев содержимое файла /etc/sudoers. Однако есть более простой способ — использовать ту же самую команду sudo:
-
Флаг
-lуказывает на необходимость вывода всех разрешенных команд пользователя. -
Флаг
-Uуказывает имя целевого пользователя. Если флаг не указывать, то выведутся права доступа для пользователяroot.
Флаг -l указывает на необходимость вывода всех разрешенных команд пользователя.
Флаг -U указывает имя целевого пользователя. Если флаг не указывать, то выведутся права доступа для пользователя root.
В консольном терминале выведется сообщение, содержащее подробности прав доступа указанного пользователя:
Matching Defaults entries for easy on 3798037-yn55665:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty
User easy may run the following commands on 3798037-yn55665:
(root : ALL) /usr/bin/apt, /usr/bin/rm, /bin/nanoКлючевым в этом выводе является этот отрывок сообщения:
User easy may run the following commands on 3798037-yn55665:
(root : ALL) /usr/bin/apt, /usr/bin/rm, /bin/nanoОн сообщает, что пользователь easy может запускать следующие команды от имени root:
/usr/bin/apt/usr/bin/rm/bin/nano
То есть ровно те команды, которые указаны в конфигурационном файле /etc/sudoers. Таким образом можно просмотреть привилегии конкретного пользователя без утомительного выискивания нужных строк в файле /etc/sudoers.
Более того, получение информации о пользовательских привилегиях можно сделать еще проще, просмотрев наличие разрешения на выполнение конкретной команды:
Если команда запрещена, то в консольном терминале ничего не появится. Если же она разрешена:
В консольный вывод будет содержать полный адрес до бинарного файла команды:
Таким образом можно проверить возможность выполнить определенную команду от имени текущего пользователя в том случае, если точные права доступа не известны.
Утилита sudo позволяет выполнять команды без явного ввода пароля. Разумеется, отключение пароля нельзя считать безопасным, поэтому такая настройка выполняется на свой страх и риск.
Чтобы отключить пароль, нужно открыть файл /etc/sudoers:
После чего добавить новую строку, содержащую ключевое слово NOPASSWD и список команд, для которых ввод пароля не требуется:
easy ALL=(root:ALL) NOPASSWD: /usr/bin/aptПри этом указанную команду в строке с NOPASSWD нужно убрать из предыдущий строки таким образом, чтобы разрешенные команды с вводом пароля были указаны отдельно от разрешенных команд без ввода пароля:
easy ALL=(root:ALL) /usr/bin/rm,/bin/nano
easy ALL=(root:ALL) NOPASSWD: /usr/bin/aptТо есть получится две секции разрешенных команд — с требованием ввода пароля и без него.**
**
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.