Разделение привилегий — одна из основных парадигм безопасности в операционных системах семейства Linux и Unix. Обычные пользователи работают с ограниченными привилегиями и могут влиять только на собственную рабочую среду, но не на операционную систему в целом.
Специальный пользователь с именем root, имеет привилегии суперпользователя. Это административная учетная запись без ограничений, действующих для обычных пользователей. Пользователи могут выполнять команды с привилегиями суперпользователя или root разными способами.
В этой статье мы обсудим, как правильно и безопасно получать привилегии root, и при этом уделим особое внимание редактированию файла /etc/sudoers
.
Мы выполним эти действия на сервере Ubuntu 20.04, но данная процедура будет выглядеть примерно так же и на других современных дистрибутивах Linux, таких как Debian и CentOS.
В этом учебном модуле предполагается, что вы уже выполнили начальную настройку сервера, как было описано здесь. Войдите на сервер как обычный пользователь без прав root и выполните описанные ниже действия.
Примечание. В этом учебном модуле подробно рассказывается об эскалации прав и о файле sudoers
. Если вы просто хотите предоставить пользователю права sudo
, воспользуйтесь нашими краткими учебными модулями Создание нового пользователя с правами Sudo для Ubuntu и CentOS.
Существует три способа получить привилегии root, различающиеся по сложности.
Самый простой и удобный способ получить привилегии root — просто войти на сервер как пользователь root.
Если вы входите на локальный компьютер (или используете консоль для внеполосного подключения к виртуальному серверу), введите root
как имя пользователя в строке входа и пароль пользователя root, когда система его запросит.
Если вы используете для входа SSH, укажите имя пользователя root перед IP-адресом или доменным именем в строке подключения SSH:
- ssh root@server_domain_or_ip
Если вы не настроили ключи SSH для пользователя root, введите пароль пользователя root по запросу системы.
su
для получения прав rootВходить в систему как пользователь root обычно не рекомендуется, потому что при этом можно легко начать использовать систему не для административных задач, что довольно опасно.
Следующий способ получить привилегии суперпользователя позволяет становиться пользователем root, когда вам это потребуется.
Для этого можно использовать команду su
(substitute user) для замены пользователя. Чтобы получить привилегии root, введите:
- su
Вам будет предложено ввести пароль для пользователя root, после чего будет создан сеанс оболочки root.
После завершения задач, для которых требуются привилегии root, вернитесь в обычную оболочку с помощью следующей команды:
- exit
sudo
для выполнения команд от имени пользователя rootПоследний способ получения привилегий root заключается в использовании команды sudo
.
Команда sudo
позволяет выполнять разовые команды с привилегиями root без необходимости создавать новую оболочку. Она выполняется следующим образом:
- sudo command_to_execute
В отличие от su
, для команды sudo
требуется пароль текущего пользователя, а не пароль пользователя root.
В связи с вопросами безопасности доступ sudo
не предоставляется пользователям по умолчанию, и его необходимо настроить перед использованием. Ознакомьтесь с нашими краткими руководствами Создание нового пользователя с привилегиями Sudo для Ubuntu и CentOS, чтобы научиться настраивать нового пользователя с правами sudo
.
В следующем разделе мы более подробно расскажем о том, как изменять конфигурацию sudo
.
Команда sudo
настраивается с помощью файла, расположенного в каталоге /etc/sudoers
.
Предупреждение. Никогда не редактируйте этот файл в обычном текстовом редакторе! Всегда используйте для этой цели только команду visudo
!
Неправильный синтаксис файла /etc/sudoers
может нарушить работу системы и сделать невозможным получение повышенного уровня привилегий, и поэтому очень важно использовать для его редактирования команду visudo
.
Команда visudo
открывает текстовый редактор обычным образом, но проверяет синтаксис файла при его сохранении. Это не даст ошибкам конфигурации возможности блокировать операции sudo
, что может быть единственным способом получить привилегии root.
Обычно visudo
открывает файл /etc/sudoers
в текстовом редакторе vi
. Однако в Ubuntu команда visudo
настроена на использование текстового редактора nano
.
Если вы захотите изменить его обратно на vi
, используйте следующую команду:
- sudo update-alternatives --config editor
OutputThere are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection Path Priority Status
------------------------------------------------------------
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/vim.basic 30 manual mode
4 /usr/bin/vim.tiny 10 manual mode
Press <enter> to keep the current choice[*], or type selection number:
Выберите число, соответствующее желаемому варианту выбора.
В CentOS для изменения этого значения можно добавить следующую строку в ~/.bashrc
:
- export EDITOR=`which name_of_editor`
Исходный файл для внесения изменений:
- . ~/.bashrc
После настройки visudo
выполните эту команду для доступа к файлу /etc/sudoers
:
- sudo visudo
Файл /etc/sudoers
откроется в выбранном вами текстовом редакторе.
Я скопировал и вставил файл с сервера Ubuntu 18.04 с удаленными комментариями. Файл CentOS /etc/sudoers
содержит намного больше строк, и некоторые из них не будут обсуждаться в этом руководстве.
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d
Давайте посмотрим, что делают эти строки.
Первая строка Defaults env_reset сбрасывает среду терминала для удаления переменных пользователя. Эта мера безопасности используется для сброса потенциально опасных переменных среды в сеансе sudo
.
Вторая строка, Defaults mail_badpass
, предписывает системе отправлять уведомления о неудачных попытках ввода пароля sudo
для настроенного пользователя mailto
. По умолчанию это учетная запись root.
Третья строка, начинающаяся с “Defaults secure_path=…”, задает переменную PATH
(места в файловой системе, где операционная система будет искать приложения), которая будет использоваться для операций sudo
. Это предотвращает использование пользовательских путей, которые могут быть вредоносными.
Четвертая строка, которая определяет для пользователя root привилегии sudo
, отличается от предыдущих строк. Давайте посмотрим, что означают различные поля:
root ALL=(ALL:ALL) ALL
Первое поле показывает имя пользователя, которое правило будет применять к (root).
root ALL=(ALL:ALL) ALL
Первое “ALL” означает, что данное правило применяется ко всем хостам.
root ALL=(ALL:ALL) ALL
Данное “ALL” означает, что пользователь root может запускать команды от лица всех пользователей.
root ALL=(ALL:ALL) ALL
Данное “ALL” означает, что пользователь root может запускать команды от лица всех групп.
root ALL=(ALL:ALL) ALL
Последнее “ALL” означает, что данные правила применяются всем командам.
Это означает, что наш пользователь root сможет выполнять любые команды с помощью sudo
после ввода пароля.
Следующие две строки похожи на строки привилегий пользователя, но задают правила sudo
для групп.
Имена, начинающиеся с %
, означают названия групп.
Здесь мы видим, что группа admin может выполнять любые команды от имени любого пользователя на любом хосте. Группа sudo имеет те же привилегии, но может выполнять команды от лица любой группы.
Последняя строка выглядит как комментарий:
. . .
#includedir /etc/sudoers.d
Она действительно начинается с символа #
, который обычно обозначает комментарии. Однако данная строка означает, что файлы в каталоге /etc/sudoers.d
также рассматриваются как источники и применяются.
Файлы в этом каталоге следуют тем же правилам, что и сам файл /etc/sudoers
. Любой файл, который не заканчивается на ~
и не содержит символа .
, также считывается и добавляется в конфигурацию sudo
.
В основном это нужно, чтобы приложения могли изменять привилегии sudo
после установки. Размещение всех правил в одном файле в каталоге /etc/sudoers.d
позволяет видеть, какие привилегии присвоены определенным учетным записям, а также легко сменять учетные данные без прямого изменения файла /etc/sudoers
.
Как и в случае с файлом /etc/sudoers
, другие файлы в каталоге /etc/sudoers.d
также следует редактировать с помощью команды visudo
. Для редактирования этих файлов применяется следующий синтаксис:
- sudo visudo -f /etc/sudoers.d/file_to_edit
Чаще всего при управлении разрешениями sudo
используется операция предоставления новому пользователю общего доступа sudo
. Это полезно, если вы хотите предоставить учетной записи полный административный доступ к системе.
В системе с группой администрирования общего назначения, такой как система Ubuntu в этом учебном модуле, проще всего будет добавить данного пользователя в эту группу.
Например, в Ubuntu 20.04 группа sudo
имеет полные привилегии администратора. Добавляя пользователя в эту группу, мы предоставляем ему такие же привилегии:
- sudo usermod -aG sudo username
Также можно использовать команду gpasswd
:
- sudo gpasswd -a username sudo
Обе команды выполняют одно и то же.
В CentOS эта группа обычно называется wheel
, а не sudo
:
- sudo usermod -aG wheel username
Также можно использовать gpasswd
:
- sudo gpasswd -a username wheel
Если в CentOS добавление пользователя в группу не срабатывает сразу же, вам может потребоваться отредактировать файл /etc/sudoers
, чтобы убрать символ комментария перед именем группы:
- sudo visudo
. . .
%wheel ALL=(ALL) ALL
. . .
Мы познакомились с общим синтаксисом файла, а теперь попробуем создать новые правила.
Файл sudoers
можно организовать более эффективно, группируя элементы с помощью разнообразных псевдонимов.
Например, мы можем создать три разных группы пользователей с некоторыми общими участниками:
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
Имена групп должны начинаться с заглавной буквы. Затем мы можем дать участникам группы GROUPTWO
разрешение на обновление базы данных apt
, создав следующее правило:
. . .
GROUPTWO ALL = /usr/bin/apt-get update
. . .
Если мы не укажем пользователя или группу для запуска, команда sudo
по умолчанию использует пользователя root.
Мы можем дать членам группы GROUPTHREE
разрешение на выключение и перезагрузку системы, создав псевдоним команды и используя его в правиле для GROUPTHREE
:
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
Мы создадим псевдоним команды с именем POWER
, который будет содержать команды выключения и перезагрузки системы. Затем мы дадим членам группы GROUPTHREE
разрешение на выполнение этих команд.
Также мы можем создать псевдонимы запуска от имени, которые могут заменять часть правила, где указывается, от имени какого пользователя следует выполнить команду:
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
Это позволит любому участнику группы GROUPONE
выполнять команды от имени пользователя www-data
или пользователя apache
.
Необходимо помнить, что в случае конфликта правил более поздние правила имеют приоритет перед более ранними.
Есть ряд способов, которые позволяют более точно контролировать реакцию sudo
на вызов.
Команда updatedb
, связанная с пакетом mlocate
, относительно безобидна при ее выполнении в системе с одним пользователем. Если мы хотим разрешить пользователям выполнять ее с привилегиями root без ввода пароля, мы можем создать правило следующего вида:
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
NOPASSWD
— это свойство, означающее, что пароль не запрашивается. У него есть сопутствующее свойство PASSWD
, которое используется по умолчанию и требует ввода пароля. Данное свойство актуальной для остальной части строки, если его действие не переопределяется дублирующим тегом в этой же строке.
Например, мы можем использовать следующую строку:
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
Также полезно свойство NOEXEC
, которое можно использовать для предотвращения опасного поведения некоторых программ.
Например, некоторые программы, такие как less
, могут активировать другие команды, вводя их через свой интерфейс:
!command_to_run
При этом все команды пользователя выполняются с теми же разрешениями, что и команда less
, что может быть довольно опасно.
Чтобы ограничить такое поведение, мы можем использовать следующую строку:
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
При работе с sudo
может быть полезна следующая информация.
Если вы зададите в файле конфигурации пользователя или группу, от имени которых выполняются команды, вы можете выполнять команды от их имени, используя флаги -u
и -g
соответственно:
- sudo -u run_as_user command
- sudo -g run_as_group command
Для удобства sudo
по умолчанию сохраняет данные аутентификации в течение определенного количества времени на одном терминале. Это означает, что вам не нужно будет вводить пароль снова, пока это время не истечет.
Если в целях безопасности вы захотите сбросить этот таймер после выполнения административных команд, вы можете использовать для этого следующую команду:
- sudo -k
Если вы захотите активировать команду sudo
так, чтобы не вводить пароль и не продлевать срок действия прав sudo
, вы можете ввести:
- sudo -v
Вам будет предложено ввести пароль, который будет сохранен для последующего использования sudo
до истечения заданного периода действия sudo
.
Если вы хотите узнать, какие привилегии заданы для вашего имени пользователя, введите команду:
- sudo -l
Она выведет все правила в файле /etc/sudoers
, которые относятся к вашему пользователю. Это поможет вам понять, что вам можно делать с помощью sudo
от имени любого пользователя.
У вас несомненно будут случаи, когда запущенная команда не будет выполняться, потому что вы забудете добавить префикс sudo
. Чтобы не вводить команду повторно, вы можете воспользоваться функцией bash, позволяющей повторить последнюю команду:
- sudo !!
Двойной восклицательный знак повторяет последнюю команду. Мы ставим перед ним префикс sudo
, чтобы быстро задать соответствующие права для последней команды.
При желании вы можете добавить следующую строку в файл /etc/sudoers
с помощью visudo
:
- sudo visudo
. . .
Defaults insults
. . .
После этого sudo
будет ругаться, если пользователь введет неправильный пароль для sudo
. Мы можем использовать sudo -k
, чтобы очистить предыдущий сохраненный в кэше пароль sudo
и попробовать эту функцию:
- sudo -k
- sudo ls
Output[sudo] password for demo: # enter an incorrect password here to see the results
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo:
My mind is going. I can feel it.
Теперь вы понимаете, как читать и редактировать файл sudoers
и знаете, какие методы вы можете использовать для получения привилегий root.
Помните, что есть причины, по которым обычным пользователям не предоставляются привилегии суперпользователя. Очень важно точно понимать, что делает каждая команда, которую вы выполняете с правами root. Будьте ответственны. Определите оптимальный способ использования этих инструментов в вашей ситуации и заблокируйте все функции, которые не нужны.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!