Sudo

su смена пользователя на root

Чтобы войти в учётную запись root, просто введите в консоли su. После того, как вы введёте пароль, будет создан сеанс суперпользователя.

su
cat journal.log
exit

Запуск команды от пользователя root

Если вам нужно выполнить какое-то разовое действие с привилегиями суперпользователя, не нужно создавать новую оболочку. Вместо этого воспользуйтесь командой sudo. Но в отличие от su, вам нужно будет ввести пароль учётной записи текущего пользователя, а не root. А также у вас должны быть права для запуска sudo.

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

  sudo cat journal.log

Присвоение привилегий sudo

По умолчанию пользователи создаются в системе без доступа к sudo. Это делается вручную с помощью добавления учётной записи к одноимённой группе:

  usermod -aG **sudo** username 

Или:

  gpasswd -a username sudo

В CentOS группа с полными привилегиями администратора называется wheel, значит вы можете использовать примеры выше, заменив sudo на wheel.

Настройка sudo

Настроить команду sudo можно в файле /etc/sudoers с помощью команды

  visudo

Она проверит ошибки перед сохранением.

Выбрать редактор по умолчанию можно

sudo update-alternatives --config editor

В CentOS задать редактор по умолчанию ещё проще — в ~/.bashrc нужно добавить строку:

  export EDITOR=`which [editor]`

где [editor] — название программы-редактора.

Изменение файла sudoers

Для работы с файлом sudoers у вас уже должен быть доступ к учётной записи суперпользователя. Откройте файл с помощью программы visudo:

   sudo visudo 
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults        use_pty
 
# This preserves proxy settings from user environments of root
# equivalent users (group sudo)
#Defaults:%sudo env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"
 
# This allows running arbitrary commands, but so does ALL, and it means
# different sudoers have their choice of editor respected.
#Defaults:%sudo env_keep += "EDITOR"
 
# Completely harmless preservation of a user preference.
#Defaults:%sudo env_keep += "GREP_COLOR"
 
# While you shouldn't normally run git as root, you need to with etckeeper
#Defaults:%sudo env_keep += "GIT_AUTHOR_* GIT_COMMITTER_*"
 
# Per-user preferences; root won't have sensible values for them.
#Defaults:%sudo env_keep += "EMAIL DEBEMAIL DEBFULLNAME"
 
# "sudo scp" or "sudo rsync" should be able to use your SSH agent.
#Defaults:%sudo env_keep += "SSH_AGENT_PID SSH_AUTH_SOCK"
 
# Ditto for GPG agent
#Defaults:%sudo env_keep += "GPG_AGENT_INFO"
 
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root    ALL=(ALL:ALL) ALL
 
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
 
# See sudoers(5) for more information on "@include" directives:
 
@includedir /etc/sudoers.d

Настройки по умолчанию

env_resetудаляет переменные пользователя, которые могут создаваться в системе и потенциально повлиять на работу в режиме суперпользователя.
mail_badpassуказывает, что система будет отправлять на почту, указанную в настройках root, неудачные попытки получить неограниченные привилегии.
secure_path определяет путь для операций sudo. Иными словами, она содержит каталоги, в которых ОС будет искать приложения. Переопределяя пользовательские настройки, мы избегаем выполнения потенциально вредоносных программ.

Вы можете добавлять настройки по умолчанию с помощью псевдонима Default. Например, если у вас сложный пароль, вы можете расширить количество попыток ввода с трёх (по умолчанию) до 5.

  Defaults passwd_tries=5

Sudo сохраняет данные сеанса в течение 5 минут после первой аутентификации. Это сделано, чтобы вам не нужно было каждый раз при выполнении программ вводить пароль. Вы можете сбросить форсировать запрос пароля с помощью флага -k при выполнении команды sudo. Если нужно вводить пароль каждый раз, установите значение этого таймаута 0.

  Defaults timestamp_timeout=0 

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

  Defaults passwd_timeout=5
  Defaults logfile=/var/log/sudo.journal.log

Пользовательские привилегии

Четвёртая строка определяет привилегии sudo для root. Она содержит имя пользователя, список хостов, пользователей, групп и команд.

  root    ALL=(ALL:ALL) ALL

В начале стоит имя пользователя, затем указываются его привилегии. Первое ALL означает, что правило применяется ко всем хостам и IP-адресам. Второе ALL указывает на то, что пользователь может запускать команды от имени любого пользователя, третье — от имени любой группы. Четвёртое ALL применяет эти правила ко всем командам.

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

Пятая и шестая строки определяют привилегии для групп admin и sudo (на это указывает символ процента перед названием). По умолчанию группа admin может выполнять любые команды от имени любого пользователя, а sudo — любые команды от лица любой группы.

Добавим новые полномочия для пользователя timeweb-backup, которому нужно выполнять команду монтирования директории root/backup.d. Для этого добавим следующую строку:

 timeweb-backup ALL=(root) /bin/mount /root/backup.d

Теперь пользователь timeweb-backup сможет запустить команду sudo mount /root/backup.d со своим паролем, а не с паролем пользователя root.

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

Подключение других файлов

Строка, которая начинается с #includedir означает подключение конфигурации из других источников. В данном случае указано, что нужно применить правила из файлов внутри каталога /etc/sudoers.d, при этом подключается любой файл, если он не содержит в названии точку или не заканчивается тильдой (~).

Подключение файлов из этого каталога нужно для приложений, которые после установки изменяют привилегии sudo. Все файлы в одном каталоге помогают определить какие права соответствуют учётным записям, а также работать с ними, не редактируя основной файл sudoers.

Так как все файлы из этого каталога подключаются в основной файл, редактировать их нужно с помощью visudo. Для того, чтобы открыть отдельный файл, добавьте флаг -f:

  visudo -f /etc/sudoers.d/config_file

Можно назначить права, чтобы пользователь не вводил свой пароль при использовании sudo

 myuser ALL=(ALL) NOPASSWD:ALL

Псевдонимы

Чтобы упростить работу с конфигурацией файла sudoers, разработчики предусмотрели псевдонимы. Они позволяют создавать списки пользователей, флагов и команд и группировать их. Они делятся на четыре типа:

User_AliasПсевдоним пользователей, которые будут использовать sudo.
Runas_AliasПсевдоним пользователей, от имени которых команды будут выполняться.
Host_AliasПсевдоним хоста. Представляет собой список IP-адресов или хостов, с которых выполняются программы.
Cmnd_AliasПсевдоним команды.

Например, отредактируем файл sudoers так, чтобы различные пользователи могли запускать скрипты резервирования системы от пользователя root.

User_Alias Users = timeweb-backup,remote,hal9000 
Host_Alias REMOTE = timeweb.cloud
 
Cmd_Alias Cmds = /root/backup

После создания псевдонима применяем правило:

  Users Hosts = (root) Cmds

Теперь пользователи timeweb-backup, remote, hal9000 смогут запускать команды бэкапа от имени пользователя root на хосте REMOTE.

Представим, что этим пользователям должна быть доступна команда монтирования, при этом мы можем пренебречь вводом пароля:

  Users ALL = (root) NOPASSWD: /bin/mount

…а размонтировать уже нельзя:

  Users ALL = (root) NOEXEC: /bin/umount

В нашей системе мы можем разрешить всем пользователям группы admin обновлять пакеты Ubuntu, но без ввода пароля:

  Cmnd_Alias APT_UPDATE = /usr/bin/apt-get update,/usr/bin/apt-get upgrade
  ...
  %admin ALL=(ALL) NOPASSWD: APT_UPDATE

Псевдонимы помогут эффективно делить пользователей на группы и выдавать им права (или забирать их с помощью флага NOEXEC) на выполнение только определённых команд.

В случае конфликта правил в приоритете более поздние. Так что располагайте в начале файла более общие установки, чем конкретнее правило, тем ниже его стоит расположить.

Флаги sudo

Вы можете запускать команды sudo от имени тех пользователей или групп, которых задали в файле sudoers. Используйте для этого флаги -u и -g соответственно.

Чтобы посмотреть привилегии для вашего пользователя, просто используйте команду sudo -l. Вы увидите список всех правил из файла /etc/sudoers. Так вы поймёте, на что именно у вас есть разрешение в системе.