Sudo (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Sudo
. Дата последней синхронизации: 26 июня 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
Пользователи и группы
su (Русский)
doas (Русский)
Sudo
(англ.
substitute user do
, дословно «подменить пользователя и выполнить») позволяет системному администратору делегировать полномочия, чтобы дать некоторым пользователям (или группе пользователей) возможность запускать некоторые (или все) команды c правами суперпользователя или любого другого пользователя, обеспечивая контроль над командами и их аргументами.
Sudo - это альтернатива
su
для выполнения команд с правами суперпользователя (root). В отличие от
su
, который запускает оболочку с правами root и даёт всем дальнейшим командам root-права, sudo предоставляет временное повышение привилегий для одной команды. Предоставляя привилегии root только при необходимости, sudo снижает вероятность того, что опечатка или ошибка в выполняемой команде произведут в системе разрушительные действия.
Sudo может также использоваться для выполнения команд от имени других пользователей; кроме того, sudo логирует все команды и неудачные попытки доступа для аудита безопасности.
Установка
Установите
пакет
sudo
.
Использование
Чтобы начать использовать
sudo
как непривилегированный пользователь, его нужно настроить должным образом. Для этого прочтите раздел о настройке.
Для использования
sudo
просто добавьте
sudo
и пробел перед нужной командой:
$ sudo
команда
Например, для использования pacman:
$ sudo pacman -Syu
Смотрите
sudo(8)
для более подробной информации.
Настройка
Defaults
sudoers(5) § SUDOERS OPTIONS
содержит список опций, которые можно использовать с командой
Defaults
в файле
/etc/sudoers
.
Здесь
доступен список опций (извлечён из исходного кода версии 1.8.7) в формате, удобном для копирования и вставки в файл
sudoers
.
Смотрите
sudoers(5)
для более подробной информации, например о настройке таймаутов.
Просмотр текущих настроек
Выполните
sudo -ll
для вывода текущей конфигурации sudo.
Чтобы посмотреть настройки, действующие для конкретного пользователя, выполните
sudo -lU
пользователь
.
Использование visudo
Файл настроек
/etc/sudoers
всегда
следует редактировать с помощью команды
visudo(8)
.
visudo
блокирует файл
sudoers
, сохраняет изменения во временный файл и проверяет, что файл синтаксически корректен, перед тем как скопировать его в
/etc/sudoers
.
Важно
Крайне важно, чтобы файл
sudoers
был без синтаксических ошибок! Любая ошибка делает sudo неработоспособным.
Всегда
редактируйте его только с помощью
visudo
для предотвращения ошибок.
Из
visudo(8)
:
Обратите внимание, что это дыра в безопасности, поскольку позволяет пользователю запускать любую программу, какую он захочет, просто прописав её в VISUAL или EDITOR.
visudo использует
vi
в качестве текстового редактора по умолчанию. Пакет
sudo
скомпилирован с опцией
--with-env-editor
по умолчанию и использует переменные
VISUAL
и
EDITOR
.
EDITOR
не используется, если задана переменная
VISUAL
.
Чтобы выбрать
nano
в качестве редактора для
visudo
в текущем сеансе, задайте и экспортируйте переменную
EDITOR
перед запуском
visudo
. Чтобы выбрать другой редактор однократно, можно просто прописать эту переменную перед командой
visudo
:
# EDITOR=nano visudo
В качестве альтернативы можно отредактировать копию файла
/etc/sudoers
и вручную запустить проверку синтаксиса с помощью команды
visudo -c
/копия/файла/sudoers
. Это может пригодиться, если вас не устраивает, что
visudo
блокирует файл.
Для изменения редактора на постоянной основе для текущего пользователя, смотрите раздел
Переменные окружения#На уровне пользователя
. Для того, чтобы установить выбранный редактор на постоянной основе для всей системы, но только для
visudo
, добавьте следующее в
/etc/sudoers
(предположим, что вы предпочитаете
nano
в качестве редактора):
# Сброс окружения
Defaults      env_reset
# Установка ограниченного варианта nano в качестве редактора по умолчанию и запрет visudo использовать EDITOR/VISUAL.
Defaults      editor=/usr/bin/rnano, !env_editor
Примеры настроек
Настройка sudo осуществляется добавлением записей в файл
/etc/sudoers
. Чтобы дать пользователю привилегии суперпользователя, когда он вводит
sudo
перед командой, добавьте следующую строку:
имя_пользователя
ALL=(ALL:ALL) ALL
Разрешить пользователю выполнять все команды от любого пользователя, но только на машине с определенным названием хоста:
имя_пользователя
название_хоста
=(ALL:ALL) ALL
Предоставить членам группы
wheel
доступ к sudo:
%wheel      ALL=(ALL:ALL) ALL
Совет
Для добавления новых администраторов рекомендуется включить доступ к sudo для группы
wheel
и
добавлять новых пользователей в неё
, поскольку по умолчанию
Polkit
рассматривает членов группы
wheel
как администраторов. Если пользователь не является членом группы
wheel
, программы, использующие Polkit, могут запросить аутентификацию с использованием пароля root вместо пароля пользователя.
Чтобы не спрашивать пароль у пользователя:
Важно
Это позволит любому процессу, запущенному под вашим именем пользователя, использовать sudo, не спрашивая разрешения.
Defaults:
имя_пользователя
!authenticate
Разрешить выполнять только конкретные команды и только пользователю на определенном хосте:
имя_пользователя
название_хоста
=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
Примечание
Наиболее общие опции должны идти в начале файла, а наиболее частные - наоборот, в конце файла, так как более нижние строки переопределяют более верхние. В частности, добавляемая строка должна быть после строки
%wheel
, если ваш пользователь находится в этой группе.
Разрешить выполнять конкретно определённые команды только для пользователя на определенном хосте и без пароля:
имя_пользователя
название_хоста
= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
Подробный пример для
sudoers
доступен в
/usr/share/doc/sudo/examples/sudoers
. Также смотрите
sudoers(5)
для получения более подробной информации.
Права доступа к файлам sudoers по умолчанию
Файл
sudoers
должен иметь владельца root и группу root (0). Права доступа всегда должны быть установлены как
r--r-----
(0440). Эти права установлены по умолчанию, однако если вы случайно измените их, они должны быть немедленно изменены обратно, иначе sudo не будет работать.
# chown -c root:root /etc/sudoers
# chmod -c 0440 /etc/sudoers
Советы и рекомендации
Отключение таймаута запроса пароля
Часто раздражает такая вещь: вы запускаете какой-то долгий процесс, который работает с обычными правами и повышает их только при необходимости, и когда sudo запросит пароль, вы можете случайно не заметить это и не ввести его вовремя, из-за чего случается таймаут, процесс умирает и проделанная работа теряется или, если повезёт, кэшируется. Обычно советуют отключить запрос пароля для sudo или увеличить время действия ранее введённого пароля, однако оба этих способа имеют негативные последствия для безопасности. Таймаут
запроса
пароля тоже можно отключить, и поскольку это никак не влияет на безопасность, это и должно быть предпочтительным решением:
Defaults passwd_timeout=0
Сигнал при запросе пароля
Чтобы работающий в фоне терминал привлёк ваше внимание в момент запроса пароля, можно добавить
символ BELL
в строку запроса пароля:
Defaults passprompt="^G[sudo] password for %p: "
Вместо
^G
должен быть вписан настоящий символ BELL. Например, чтобы ввести его в
vim
, используйте сочетание
Ctrl+v
Ctrl+g
, а в
nano
используйте
Alt+v
Ctrl+g
.
Перенос псевдонимов
Если у вас установлено много псевдонимов, вы могли заметить, что они не переносятся в сеанс sudo. Однако, это легко исправить. Просто добавьте в ваш
~/.bashrc
или
/etc/bash.bashrc
строку:
alias sudo='sudo '
Один тайм-аут на все сеансы терминала
Важно
Это позволит любому процессу воспользоваться вашим открытым сеансом sudo.
По умолчанию сеанс sudo действует только в пределах текущего терминала; при запуске sudo в новом терминале он запросит пароль заново. Если вас это раздражает, укажите для опции
timestamp_type
значение
global
:
Defaults timestamp_type=global
Время действия введённого пароля
Возможно, вы захотите изменить промежуток времени, в течение которого sudo действует без ввода пароля. Этого легко добиться добавив опцию
timestamp_timeout
в
/etc/sudoers
(по умолчанию 5 минут):
Defaults timestamp_timeout=10
Если вы запускаете много sudo-команд подряд, возможно, вместо увеличения
timestamp_timeout
лучше просто периодически обновлять временную метку. Команда
sudo -v
запустит отсчёт таймаута заново. С помощью команды
sudo -K
можно удалить временную метку, что приведёт к запросу пароля при следующем запуске
sudo
.
Обновление временной метки можно автоматизировать с помощью такого псевдонима (добавьте его в
.bashrc
):
alias sudo='sudo -v; sudo '
Также можно сделать bash-функцию: подробнее на
stackexchange
.
Переменные окружения
Если у вас много переменных окружения или вы экспортировали ваши настройки прокси через
export http_proxy="..."
, когда вы используете sudo, эти переменные не будут переданы в открытый сеанс, если вы не запустите sudo в опцией
-E
.
$ sudo -E pacman -Syu
Рекомендованный способ сохранения переменных окружения - это прописать их в
env_keep
:
/etc/sudoers
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
Пароль суперпользователя
Вы можете сконфигурировать sudo так, чтобы он спрашивал пароль суперпользователя вместо пароля текущего пользователя, добавив
targetpw
(целевой пользователь, по умолчанию root) или
rootpw
в список опций Defaults в
/etc/sudoers
:
Defaults targetpw
Чтобы не понадобилось разглашать пароль root обычным пользователям, можно указать эту опцию только для определённой группы:
Defaults:%wheel targetpw
%wheel ALL=(ALL) ALL
Отключение учетной записи root
Вы можете захотеть отключить возможность входа систему пользователя root. Без этого атакующие сначала должны будут угадать имя пользователя, сконфигурированного как sudoer, а также пароль этого пользователя. Смотрите для примера
Secure Shell (Русский)#Отключение
.
Важно
Будьте осторожны. Вы можете попасть в свою ловушку, если отключите вход систему пользователя root. Sudo по умолчанию не установлен, и его стандартная конфигурация не позволяет ни получить доступ к правам root без пароля, ни дать такой доступ вам по вашему собственному паролю. Убедитесь, что пользователь правильно сконфигурирован как sudoer
перед
отключением аккаунта суперпользователя!
Если файл sudoers настроен на использование rootpw по умолчанию, то не отключайте root-вход ни одной из следующих команд!
Если вы уже попали в ловушку, смотрите статью
Сброс пароля root
для получения помощи.
Можно заблокировать аккаунт с помощью
passwd
:
# passwd -l root
Похожая команда снимает блокировку:
$ sudo passwd -u root
Также вы можете отредактировать
/etc/shadow
и заменить зашифрованный пароль root на "!":
root:!:12345::::::
Тогда, чтобы задать новый пароль и тем самым разблокировать пользователя root:
$ sudo passwd root
Совет
Чтобы попасть в командную оболочку root даже после отключения аккаунта, используйте команду
sudo -i
.
kdesu
kdesu можно использовать в
KDE
для запуска графических программ с привилегиями суперпользователя. Вероятно, что kdesu по умолчанию будет пытаться использовать su, даже если аккаунт root отключен. К счастью, можно сказать kdesu использовать sudo вместо su. Создайте/отредактируйте файл
~/.config/kdesurc
:
[super-user-command]
super-user-command=sudo
или используйте следующую команду:
$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo
Еще один пример настройки
Допустим, вы создали 3 пользователей: admin, devel и joe. Пользователь "admin" используется для journalctl, systemctl, mount, kill и iptables; "devel" используется для установки пакетов и редактирования настроек; "joe" - пользователь, под которым вы вошли в систему. Чтобы разрешить "joe" перезагружаться, выключать систему и использовать netctl, мы должны сделать следующее:
Отредактировать
/etc/pam.d/su
и
/etc/pam.d/su-1
.
Потребовать, чтобы пользователь был в группе wheel, но никого в неё не добавлять.
#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth            required        pam_wheel.so use_uid
auth            required        pam_unix.so
account         required        pam_unix.so
session         required        pam_unix.so
Разрешить вход по SSH только для группы 'ssh'. В эту группу будет входить только "joe".
# groupadd -r ssh
# gpasswd -a joe ssh
# echo 'AllowGroups ssh' >> /etc/ssh/sshd_config
Перезапустите
службу
sshd.service
.
Добавить пользователей в другие группы.
# for g in power network ;do ;gpasswd -a joe $g ;done
# for g in network power storage ;do ;gpasswd -a admin $g ;done
Установить права на настройки так, чтобы devel мог редактировать их.
# chown -R devel:root /etc/{http,openvpn,cups,zsh,vim,screenrc}
Cmnd_Alias  POWER       =   /usr/bin/shutdown -h now, /usr/bin/halt, /usr/bin/poweroff, /usr/bin/reboot
Cmnd_Alias  STORAGE     =   /usr/bin/mount -o nosuid\,nodev\,noexec, /usr/bin/umount
Cmnd_Alias  SYSTEMD     =   /usr/bin/journalctl, /usr/bin/systemctl
Cmnd_Alias  KILL        =   /usr/bin/kill, /usr/bin/killall
Cmnd_Alias  PKGMAN      =   /usr/bin/pacman
Cmnd_Alias  NETWORK     =   /usr/bin/netctl
Cmnd_Alias  FIREWALL    =   /usr/bin/iptables, /usr/bin/ip6tables
Cmnd_Alias  SHELL       =   /usr/bin/zsh, /usr/bin/bash
%power      ALL         =   (root)  NOPASSWD: POWER
%network    ALL         =   (root)  NETWORK
%storage    ALL         =   (root)  STORAGE
root        ALL         =   (ALL)   ALL
admin       ALL         =   (root)  SYSTEMD, KILL, FIREWALL
devel	    ALL         =   (root)  PKGMAN
joe	    ALL         =   (devel) SHELL, (admin) SHELL
С такими настройками вам практически никогда не понадобится входить как суперпользователь.
"joe" может подсоединиться к своему домашнему WiFi.
$ sudo netctl start home
$ sudo poweroff
"joe" не может использовать netctl от имени другого пользователя.
$ sudo -u admin -- netctl start home
Когда "joe" хочет воспользоваться journalctl или убить зависший процесс, он может переключиться на нужного пользователя:
$ sudo -i -u devel
$ sudo -i -u admin
Но "joe" не может переключиться на суперпользователя.
$ sudo -i -u root
Если "joe" хочет начать gnu-screen сессию как admin, он может сделать это следующим образом:
$ sudo -i -u admin
[admin]$ chown admin:tty `echo $TTY`
[admin]$ screen
Настройка sudo с помощью вкладываемых в /etc/sudoers.d файлов
sudo
обрабатывает файлы, содержащиеся в директории
/etc/sudoers.d/
. Это означает, что вместо того, чтобы редактировать
/etc/sudoers
, вы можете менять настройки в отдельных файлах и перемещать их в эту директорию. Это даёт два преимущества:
Вам не понадобится редактировать файл
sudoers.pacnew
;
Если с новой записью будет проблема, вы можете просто удалить соответствующий файл вместо необходимости редактировать
/etc/sudoers
(но смотрите предупреждение ниже).
Формат записей в этих вкладываемых файлах такой же, как и в самом файле
/etc/sudoers
. Чтобы редактировать их напрямую, используйте
visudo -f /etc/sudoers.d/
файл
. Смотрите
sudoers(5) § Including other files from within sudoers
для дополнительной информации.
Файлы из каталога
/etc/sudoers.d/
обрабатываются в лексикографическом порядке; файлы, содержащие
.
или
~
в имени, пропускаются. Чтобы избежать путаницы с сортировкой, рекомендуется начинать имена файлов с двух цифр, например
01_foo
.
Примечание
Порядок настроек в файлах имеет значение: убедитесь, что правила не переопределяют сами себя.
Важно
Файлы в
/etc/sudoers.d/
так же хрупки, как и сам
/etc/sudoers
: любой некорректный файл сделает
sudo
неработоспособным. Поэтому по той же причине настоятельно рекомендуется использовать
visudo
Редактирование файлов
sudo -e
или
sudoedit
позволяет редактировать файл от имени другого пользователя, но при этом запускать текстовый редактор от имени вашего пользователя.
Это полезно для редактирования файлов от имени root без предоставления повышенных привилегий вашему текстовому редактору. Подробнее об этом читайте в
sudo(8) § e
.
В качестве редактора можно использовать любую программу, поэтому, например, можно использовать
meld
для управления файлами
pacnew
:
$ SUDO_EDITOR=meld sudo -e /etc/
файл
{,.pacnew}
Шутливые оскорбления
Вы можете сконфигурировать sudo так, чтобы при вводе неверного пароля он выводил шутливые оскорбления вместо стандартного сообщения "Sorry, try again". Найдите строку
Defaults
в
/etc/sudoers
и добавьте
insults
в список опции, разделяя их запятыми. Конечный результат может выглядеть так:
/etc/sudoers
Defaults insults
Для проверки, введите
sudo -K
, чтобы завершить текущий сеанс и позволить sudo заново запросить пароль.
Решение проблем
Проблемы с TTY через SSH
По умолчанию SSH не выделяет tty при выполнении удалённой команды. Без tty sudo не может отключить отображение пароля при его вводе. Вы можете воспользоваться ssh опцией
-t
, чтобы заставить его выделять tty.
Defaults
опция
requiretty
всего лишь позволяет запускать sudo пользователям, если они имеют tty.
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults    requiretty
Наложение umask
Sudo накладывает на значение
umask
пользователя свою собственную (которая по умолчанию установлена в 0022). Это предотвращает sudo от создания файлов с более либеральными правами доступа, чем это позволяет umask пользователя. Несмотря на то, что это разумное значение по умолчанию, если не используется измененная umask, это может привести к ситуации, когда программа, запущенная через sudo может создавать файлы с правами доступа отличными от тех, которые создаются при запуске программы непосредственно суперпользователем. Для исправления таких ошибок sudo предоставляет возможность исправить umask, даже если желаемая umask более либеральна, чем установлено в umask пользователя. Добавив такие строки (используйте
visudo
) вы измените поведение sudo по умолчанию:
Defaults umask = 0022
Defaults umask_override
Это установит sudo umask в umask суперпользователя по умолчанию (0022) и переопределит поведение по умолчанию, всегда используя указанную umask и независимо от umask пользователя.