Red Hat System Administration I 8.2

Получение прав привилегированного пользователя

Задачи

После завершения этого раздела вы сможете переключиться на учетную запись привилегированного пользователя для управления системой Linux, а также предоставить другим пользователям права привилегированного пользователя с помощью команды sudo.

Привилегированный пользователь

Большинство операционных систем поддерживают что-то наподобие привилегированного пользователя, который имеет все полномочия для управления системой. В Red Hat Enterprise Linux это пользователь root. У него есть полномочия для переопределения стандартных прав в файловой системе, и его учетная запись используется для администрирования системы. Чтобы выполнять такие задачи, как установка и удаление программного обеспечения, и управлять системными файлами и каталогами, пользователю необходимо повысить права до root.

Только пользователь root может управлять большинством устройств, но есть несколько исключений. Например, обычные пользователи могут управлять съемными устройствами, в частности USB-устройствами. Таким образом, обычные пользователи могут добавлять и удалять файлы и иным образом управлять съемным устройством, но только root может управлять «фиксированными» жесткими дисками по умолчанию.

Однако эти неограниченные права требуют большой ответственности. Ведь пользователь root может легко повредить систему: удалить файлы и каталоги, удалить учетные записи пользователей, установить лазейки и т. д. Если кто-то посторонний получит доступ к учетной записи root, у него будет административный контроль над системой. В этом курсе администраторам рекомендуется входить в систему от имени обычного пользователя и повышать права до root только при необходимости.

Учетная запись root в Linux примерно эквивалентна локальной учетной записи администратора в Microsoft Windows. В Linux большинство системных администраторов входят в систему от имени непривилегированного пользователя и используют различные инструменты для временного получения прав root.

Предупреждение

В прошлом в Microsoft Windows администраторы, как правило, выполняли вход напрямую от имени локального администратора. Хотя это возможно в Linux, Red Hat рекомендует системным администраторам не входить в систему напрямую как пользователь root. Вместо этого следует входить как обычный пользователь и использовать другие механизмы (например, su, sudo или PolicyKit), чтобы временно получить права привилегированного пользователя.

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

Переключение пользователей

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

[user01@host ~]$ su - user02
Password: 
[user02@host ~]$ 

Если не указать имя пользователя, команда su или su - по умолчанию попытается переключиться на пользователя root.

[user01@host ~]$ su -
Password: 
[root@host ~]# 

Команда su запускает нерегистрационную оболочку, а команда su - (с дефисом в качестве опции) ― регистрационную. Основное различие между этими командами в том, что su - настраивает среду оболочки, как если бы это был новый вход под учетной записью этого пользователя, а su просто запускает оболочку от имени этого пользователя, используя при этом параметры среды исходного пользователя.

В большинстве случаев администраторам следует выполнять команду su -, чтобы получить оболочку с обычными параметрами среды целевого пользователя. Дополнительные сведения см. на man-странице bash(1).

Примечание

Команда su наиболее часто используется для вызова интерфейса командной строки (командной оболочки), запущенного от имени другого пользователя, чаще всего root. В то же время ее можно использовать с опцией -c как служебную программу Windows runas для запуска любой программы от имени другого пользователя. Выполните команду info su, чтобы узнать больше.

Выполнение команд с помощью sudo

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

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

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

Например, если команда sudo настроена для предоставления пользователю user01 разрешения на выполнение команды usermod от имени root, пользователь user01 может выполнить следующую команду, чтобы заблокировать или разблокировать учетную запись пользователя.

[user01@host ~]$ sudo usermod -L user02
[sudo] password for user01: 
[user01@host ~]$ su - user02
Password: 
su: Authentication failure
[user01@host ~]$ 

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

[user02@host ~]$ sudo tail /var/log/secure
[sudo] password for user02: 
user02 is not in the sudoers file.  This incident will be reported.
[user02@host ~]$ 

Одно из дополнительных преимуществ использования команды sudo заключается в том, что все выполняемые команды регистрируются по умолчанию в log-файле /var/log/secure.

[user01@host ~]$ sudo tail /var/log/secure
...output omitted...
Feb  6 20:45:46 host sudo[2577]:  user01 : TTY=pts/0 ; PWD=/home/user01 ; USER=root ; COMMAND=/sbin/usermod -L user02
...output omitted...

В Red Hat Enterprise Linux 7 и Red Hat Enterprise Linux 8 все участники группы wheel могут использовать sudo для выполнения команд от имени любого пользователя, включая root. Пользователю предлагается ввести свой пароль. В этом состоит отличие от Red Hat Enterprise Linux 6 и более ранних версий, в которых пользователи, входящие в группу wheel, не получали эти административные права по умолчанию.

Предупреждение

В RHEL 6 группе wheel по умолчанию не предоставлялись никакие особые права. Организации, где уже используется группа wheel в нестандартных целях, могут оказаться не готовы к тому, что RHEL 7 и RHEL 8 автоматически предоставляют всем участникам этой группы полные права sudo. Это может привести к получению неавторизованными пользователями административных прав доступа к системам RHEL 7 и RHEL 8.

Исторически группа wheel использовалась в UNIX-подобных системах для предоставления или контроля доступа привилегированного пользователя.

Открытие интерактивной оболочки root с помощью sudo

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

Еще один способ доступа к учетной записи root с помощью sudo — команда sudo -i. Она позволяет переключиться на учетную запись root и запустить стандартную командную оболочку этого пользователя (обычно это bash) и связанные сценарии входа. Если необходимо просто запустить оболочку, можно использовать команду sudo -s.

Например, администратор может получить интерактивную оболочку как пользователь root в экземпляре AWS EC2, пройдя аутентификацию на основе открытого ключа SSH, чтобы войти в систему как обычный пользователь ec2-user, а затем выполнив команду sudo -i, чтобы получить оболочку пользователя root.

[ec2-user@host ~]$ sudo -i
[sudo] password for ec2-user: 
[root@host ~]# 

Команды sudo su - и sudo -i работают по-разному. Мы кратко обсудим это в конце раздела.

Настройка sudo

Основной файл конфигурации для sudo — /etc/sudoers. Чтобы избежать проблем, когда сразу несколько администраторов пытаются изменить этот файл, редактировать его следует только с помощью специальной команды visudo.

Например, следующая строка из файла /etc/sudoers включает права sudo для участников группы wheel.

%wheel        ALL=(ALL)       ALL

В этой строке %wheel — это пользователь или группа, к которым применяется правило. % указывает, что это группа ― wheel. ALL=(ALL) указывает, что на любом хосте, на котором может быть этот файл, группа wheel может выполнить любую команду. Последний элемент ALL указывает, что группа wheel может выполнять эти команды от имени любого пользователя в системе.

По умолчанию файл /etc/sudoers также включает содержимое любых файлов в каталоге /etc/sudoers.d как часть файла конфигурации. Это позволяет администратору добавить права sudo для пользователя, просто поместив соответствующий файл в этот каталог.

Примечание

Использовать дополнительные файлы в каталоге /etc/sudoers.d удобно и просто. Вы можете включить или отключить права sudo, просто скопировав файл в каталог или удалив его из каталога.

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

Чтобы включить полные права sudo для пользователя user01, создайте файл /etc/sudoers.d/user01 со следующим содержимым:

user01  ALL=(ALL)  ALL

Чтобы включить полные права sudo для группы group01, создайте файл /etc/sudoers.d/group01 со следующим содержимым:

%group01  ALL=(ALL)  ALL

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

ansible  ALL=(ALL)  NOPASSWD:ALL

Хотя предоставление такого уровня доступа пользователю или группе создает очевидные угрозы безопасности, его часто используют с облачными экземплярами, виртуальными машинами и системами инициализации для настройки серверов. Учетная запись с такими правами должна быть хорошо защищена и может потребовать прохождения аутентификации на основе открытого ключа SSH, чтобы пользователь в удаленной системе мог получить к ней доступ.

Например, официальный AMI-образ Red Hat Enterprise Linux в Amazon Web Services Marketplace поставляется с заблокированными паролями пользователей root и ec2-user. Учетная запись пользователя ec2-user разрешает удаленный интерактивный доступ с помощью аутентификации на основе открытого ключа SSH. Пользователь ec2-user также может выполнить любую команду от имени root без пароля, так как последняя строка файла /etc/sudoers AMI-образа выглядит следующим образом:

ec2-user  ALL=(ALL)  NOPASSWD: ALL

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

Примечание

В этом курсе вы можете заметить, что sudo su - используется вместо sudo -i. Обе команды работают, но между ними есть некоторые различия.

Команда sudo su - настраивает среду root как обычный сеанс входа в систему, поскольку команда su - игнорирует параметры, заданные командой sudo, и настраивает среду с нуля.

Стандартная конфигурация команды sudo -i на самом деле настраивает некоторые параметры среды пользователя root не так, как для обычного сеанса входа в систему. Например, она немного по-другому настраивает переменную среды PATH. Это влияет на то, где оболочка будет искать команды.

Чтобы команда sudo -i работала, как su -, можно отредактировать файл /etc/sudoers с помощью visudo. Найдите строку

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

и замените ее следующими двумя строками:

Defaults      secure_path = /usr/local/bin:/usr/bin
Defaults>root secure_path = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

В большинстве случаев нет больших отличий. Однако для согласованности параметров PATH в системах с файлом /etc/sudoers по умолчанию авторы этого курса используют sudo -i в примерах и упражнениях.

Ссылки

Man-страницы su(1), sudo(8), visudo(8) и sudoers(5)

info libc persona (Справочное руководство по библиотекам GNU C)

  • Раздел 30.2. Личные параметры процесса

(Обратите внимание, что для доступа к этому информационному узлу должен быть установлен пакет glibc-devel.)