Введение
Задумывались ли вы когда-нибудь, почему вам приходится вводить “sudo” при попытке выполнить определенные команды в среде Linux или Unix операционной системы? Sudo — это на самом деле аббревиатура, означающая “super-user do”. Когда вы используете команду sudo, вы можете запускать программы и выполнять команды с привилегиями безопасности другого пользователя.
По умолчанию команда sudo позволяет системным пользователям выполнять команды с привилегиями суперпользователя. При новой установке ОС Linux/Unix создается учетная запись root, обладающая привилегиями суперпользователя. При первоначальной настройке сервера системы Linux/Unix системные администраторы входят в систему под учетной записью root и распределяют системные права другим пользователям системы. Эти настройки хранятся в файле под названием sudoers. Учетная запись с привилегиями root может редактировать файл sudoers и изменять привилегии других пользователей.
В этом руководстве мы обсудим, как получить привилегии root и внести изменения в файл sudoers.
Предварительные требования
Это практическое руководство, и вам нужно будет протестировать команды, чтобы полностью понять материал. В этом руководстве мы будем использовать сервер Ubuntu 20.04, однако вы можете выполнить эти шаги, если у вас есть любой из современных дистрибутивов Linux, таких как Debian и CentOS. Вы можете перейти по этой ссылке, чтобы настроить собственный облачный сервер Ubuntu на CloudSigma.
Получение привилегий Root
Получить привилегии root можно тремя способами, которые мы обсудим ниже:
Вход от имени root
Самый простой метод, который большинство людей используют для получения привилегий root, — это вход в систему с использованием учетных данных пользователя root. Если вы получаете доступ к своей локальной машине, вы можете просто ввести имя пользователя, и вам будет предложено ввести пароль.
Другой метод, который вы можете использовать для входа от имени root, — это использование SSH — инструмента командной строки для входа и выполнения задач на сервере. Для этого требуется имя пользователя и IP-адрес вашего сервера. Синтаксис для входа от имени root выглядит следующим образом (замените IP-адрес вашего сервера):
|
1 |
ssh root@your_server_ip_or_domain_name |
Когда вы введете вышеуказанную команду в своем терминале, вам будет предложено ввести пароль, если вы не настроили ключи SSH, или ввести парольную фразу для вашего ключа SSH, если вы их настроили. Как только вы введете правильные учетные данные, вы войдете в систему. Следуйте этому руководству для получения пошаговых инструкций по использованию SSH для подключения к удаленному серверу в Ubuntu.
Использование su для перехода в режим root
Вы можете войти в систему Linux, используя любую другую учетную запись, отличную от root, что обычно рекомендуется при выполнении неадминистративных задач. Всякий раз, когда вы хотите получить привилегии root, вы можете просто ввести su в своем терминале:
|
1 |
su |
Система запросит у вас пароль root, после чего вы получите доступ к сеансу оболочки root. Находясь в этом сеансе оболочки, вы можете выполнять все административные задачи, а когда захотите вернуться в обычную оболочку, просто нажмите Ctrl + D. Также вы можете ввести exit в терминале и нажать Enter.
Использование sudo для запуска команд с привилегиями root
Команда sudo, которая была кратко представлена в начале этого руководства, позволяет выполнять однострочные команды без необходимости использования оболочки с привилегиями root. Вы просто вводите sudo перед командой, которую необходимо выполнить:
|
1 |
sudo execute_this_command |
Например, чтобы обновить систему, вы можете ввести следующее:
|
1 |
sudo apt-get update |
Система запросит у вас пароль. Разница между командами su и sudo заключается в том, что su запрашивает пароль root, в то время как sudo запрашивает пароль текущего пользователя. Доступ к sudo не предоставляется пользователям по умолчанию, поскольку это влечет за собой серьезные последствия для безопасности системы. Мы обсудим это подробнее в следующих разделах.
Использование Visudo для редактирования файла sudoers
Привилегии sudo настраиваются в файле sudoers , расположенном по адресу /etc/sudoers. Эти привилегии необходимы любому пользователю для получения доступа к системе Linux. Любая синтаксическая ошибка не позволит пользователям войти в систему, что приведет к ее неработоспособности.
Visudo команда открывает файл в специальном редакторе, который проверяет синтаксис файла при сохранении. Поэтому важно использовать только visudo команду для открытия файла, чтобы не привести серверную систему в нерабочее состояние. По умолчанию visudo настроен на открытие текстового редактора с помощью (vi) vim. Однако в Ubuntu visudo настроен на использование текстового редактора nano. В Debian или Ubuntu вы можете переключиться на другой редактор, введя следующую команду:
|
1 |
sudo update-alternatives --config editor |
Она выводит список редакторов, из которого вы можете выбрать редактор по умолчанию, как показано на скриншоте. Выберите номер, соответствующий предпочитаемому редактору:

В дистрибутиве CentOS Linux отредактируйте файл /etc/sudoers и добавьте следующие строки:
|
1 2 |
Defaults editor = /usr/bin/vim:/usr/bin/vi:/usr/bin/nano Defaults env_keep += "EDITOR" |
Введите следующую команду. Не забудьте заменить your_editor_of_choice на имя выбранного вами редактора:
|
1 |
export EDITOR=`which your_editor_of_choice` |
Эта команда добавляет строку в файл ~/.bashrc. Введите в терминале следующее, чтобы применить изменения:
|
1 |
. ~/.bashrc |
Теперь, когда visudo настроен, вы можете открыть файл /etc/sudoers, введя команду:
|
1 |
sudo visudo |
Редактирование файла Sudoers
При запуске предыдущей команды файл откроется в выбранном вами основном редакторе. Ниже представлено содержимое файла:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# # Этот файл ДОЛЖЕН редактироваться с помощью команды 'visudo' от имени root. # # Пожалуйста, рассмотрите возможность добавления локального содержимого в /etc/sudoers.d/ вместо # непосредственного изменения этого файла. # # Информацию о том, как писать файл sudoers, см. на странице справочного руководства (man). # 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 могут получать привилегии root %admin ALL=(ALL) NOPASSWD:ALL # Разрешить членам группы sudo выполнять любые команды %sudo ALL=(ALL) NOPASSWD:ALL # Дополнительную информацию о директивах "#include" см. в sudoers(5): #includedir /etc/sudoers.d |
Комментарии довольно подробные, но ниже мы обсудим, что означают эти строки.
Строки параметров по умолчанию (Defaults)
- Defaults env_reset — сбрасывает переменные окружения терминала, удаляя любые пользовательские переменные. Таким образом, это очищает потенциально опасные переменные из сессии sudo.
- Defaults mail_badpass — указывает системе отправлять уведомления о неудачных попытках ввода пароля sudo по почте настроенному пользователю mailto обычно это учетная запись root.
- Defaults secure_path – Содержит несколько путей в файловой системе, по которым операция sudo будет искать приложения для запуска, чтобы предотвратить использование других определенных пользователем путей, которые могут быть опасны для системы.
Строки спецификации привилегий пользователей
|
1 |
root ALL=(ALL:ALL) ALL |
- 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 имеет те же привилегии с дополнительной возможностью выполнять команды от имени любой группы.
Строка включения /etc/sudoers.d
Строка #includedir /etc/sudoers.d может показаться комментарием из-за символа # в начале строки. Однако это директива включения, указывающая, что файлы в каталоге /etc/sudoers.d должны быть подключены и использованы как часть файла sudoers. Файлы в этом каталоге подчиняются тем же правилам, что и файл sudoers.
Любой файл в этом каталоге, который не содержит точки (.) и не заканчивается на ~ считывается и добавляется в конфигурацию файла sudoers. Этот каталог позволяет приложениям изменять привилегии sudo при установке, помещая все связанные с ними правила в один выделенный файл в каталоге /etc/sudoers.d без изменения файла sudoers по умолчанию. Более того, если вы хотите проверить или отозвать привилегии для приложения, вы можете легко проверить или изменить файлы в каталоге /etc/sudoers.d без непосредственного изменения файла /etc/sudoers напрямую.
Как правило, все файлы в каталоге /etc/sudoers.d всегда следует редактировать с помощью команды visudo. Ниже приведен синтаксис, не забудьте заменить имя файла, который вы хотите отредактировать, в команде:
|
1 |
sudo visudo -f /etc/sudoers.d/file_name_to_edit |
Назначение привилегий Sudo пользователю
Предоставление новому пользователю общего доступа sudo означает, что вы предоставили учетной записи пользователя полный административный доступ к системе. Это обычная задача, которую выполняют системные администраторы при создании других пользователей без прав root с привилегиями sudo.
В таких системах, как Ubuntu 20.04, в которых уже есть группа администрирования общего назначения, мы можем легко назначить привилегии sudo пользователю, добавив его в эту группу. Группа sudo, как видно в файле /etc/sudoers, имеет полные административные привилегии, и мы можем добавить имя пользователя в группу, введя следующую команду:
|
1 |
sudo usermod -aG sudo username |
При желании вы можете использовать команду gpasswd, чтобы сделать то же самое:
|
1 |
sudo gpasswd -a username sudo |
В CentOS, группа по умолчанию с привилегиями sudo называется wheel, поэтому вы можете назначить привилегии с помощью команды:
|
1 |
sudo usermod -aG wheel username |
Кроме того, с помощью команды gpasswd вы можете сделать то же самое с помощью команды:
|
1 |
sudo gpasswd -a username wheel |
В некоторых случаях wheel группа в CentOS может быть закомментирована в файле /etc/sudoers. Чтобы включить её, откройте файл с помощью visudo и раскомментируйте строку с именем группы. Вы можете сделать это, удалив символ # в начале строки: %wheel ALL=(ALL) ALL.
Создание пользовательских правил
Теперь, когда вы знакомы с общим синтаксисом sudoers, пришло время настроить несколько правил.
Создание псевдонимов
Псевдонимы позволяют упорядочить файл sudoers, группируя элементы под различными «псевдонимами». В этом разделе мы обсудим три директивы: User_Alias для создания псевдонимов пользователей/групп, Cmnd_Alias для создания псевдонимов команд и Runas_Alias для разрешения запуска от имени другого пользователя.
Например, используя User_Alias, внутри вашего файла /etc/sudoers, вы можете добавить следующий фрагмент кода, чтобы создать три разные группы пользователей. Некоторые пользователи могут принадлежать более чем к одной группе:
|
1 2 3 |
User_Alias GROUPONE = adelle, nikita, ellie User_Alias GROUPTWO = nikita, brenden, natalia User_Alias GROUPTHREE = brenden, walter, james |
Обратите внимание, что все имена групп начинаются с заглавной буквы. Добавив вышеуказанные псевдонимы групп в файл /etc/sudoers, вы можете назначить привилегию на обновление базы данных apt для GROUPTWO, добавив следующее правило в файл /etc/sudoers:
|
1 |
GROUPTWO ALL = /usr/bin/apt-get update |
Обратите внимание, что без указания пользователя/группы для запуска команда sudo по умолчанию всегда будет выполняться от имени пользователя root .
Вот пример использования Cmnd_Alias, где мы создаем псевдоним команды для выключения и перезагрузки системы. Затем это правило назначается для GROUPTHREE. Для этого добавьте следующие строки в файл /etc/sudoers:
|
1 2 |
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart GROUPTHREE ALL = POWER |
В приведенном выше фрагменте первая строка создает псевдоним команды с именем POWER, который включает команды выключения и перезагрузки. Вторая строка позволяет членам GROUPTHREE выполнять эту команду.
Вот пример Runas_Alias, где мы создаем псевдоним, который позволит группе пользователей выполнять команды от имени другого пользователя:
|
1 2 |
Runas_Alias WEB = www-data, apache GROUPONE ALL = (WEB) ALL |
В приведенном выше фрагменте первая строка создает псевдоним с именем WEB, указывая, что псевдоним будет запускаться от имени пользователя apache или www-data. Вторая строка назначает псевдоним для GROUPONE. Теперь члены первой группы могут выполнять команды от имени пользователя apache или www-data.
Правила ограничения доступа
В этом разделе вы узнаете о различных способах контроля того, как sudo реагирует на вызов. Некоторые команды относительно безвредны в однопользовательских системах. В таких случаях вы можете разрешить пользователям выполнять их с привилегиями root без необходимости ввода пароля root. Например, вы можете создать правило, позволяющее пользователям из GROUPONE запускать команду updatedb без ввода пароля, добавив следующее в файл /etc/sudoers:
|
1 |
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb |
Тег NOPASSWD означает, что пароль запрашиваться не будет. Противоположным тегом для NOPASSWD является PASSWD, который используется по умолчанию. Это означает, что при запросе необходимо ввести пароль.
Тег применяется к правилу, если только он не переопределен противоположным тегом, например:
|
1 |
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill |
В этом правиле пользователи из GROUPTWO могут выполнять updatedb команду без ввода пароля. Однако они должны ввести пароль перед выполнением команды kill.
В некоторых случаях вы можете захотеть ограничить пользователей в выполнении определенных команд, чтобы предотвратить опасные действия. Здесь на сцену выходит тег NOEXEC. Некоторые программы могут запускать другие команды из своего интерфейса. Примером такой программы является less. Если вы введете команду со следующим синтаксисом внутри интерфейса less, она будет выполнена, что может привести к непредвиденному поведению.
|
1 |
!name_of_command_to_run |
Чтобы предотвратить такое поведение, вы можете добавить следующее правило в файл /etc/sudoers, чтобы ограничить определенного пользователя, идентифицируемого как username:
|
1 |
username ALL = NOEXEC: /usr/bin/less |
Дополнительная информация
В этом разделе мы приводим дополнительную информацию, директивы и команды, которые могут вам понадобиться при работе с sudo.
Если вы использовали Runas_Alias в конфигурации, указав, что пользователь или группа могут запускать команды от имени другого пользователя, вы можете выполнять команды от имени этих пользователей, используя флаг -u для пользователей и флаг -g для групп. Вот синтаксис:
|
1 2 |
sudo -u run_as_user command sudo -g run_as_group command |
Каждая из команд потребует от вас ввести соответствующий пароль. Для удобства sudo сохраняет пароль на некоторое время, чтобы вам не приходилось вводить его каждый раз при запуске команды через sudo. Вы можете сбросить это время после завершения работы с привилегированными командами sudo, введя следующую команду:
|
1 |
sudo -k |
Если у вас есть другие задачи, требующие привилегий sudo, и вы хотите продлить время до следующего запроса пароля или избежать повторного запроса пароля командой sudo позже, вы можете обновить это время, введя следующую команду:
|
1 |
sudo -v |
Команда запрашивает пароль и кэширует его для последующего использования sudo.
Чтобы просмотреть список привилегий sudo, определенных для вашего имени, вы можете ввести следующую команду:
|
1 |
sudo -l |
Команда выводит список всех правил, настроенных в файле /etc/sudoers, которые применяются к вашему имени пользователя. Исходя из этих правил, вы можете получить представление о том, какие задачи ваш пользователь может выполнять в системе. Вот пример скриншота:

В некоторых случаях вы можете запустить команду, и она завершится ошибкой, потому что вы забыли добавить перед ней sudo. В таких ситуациях вам может потребоваться заново ввести команду, начиная с sudo. Чтобы избежать повторного ввода команды, вы можете использовать функцию bash для «повторения последней команды». Синтаксис представляет собой два восклицательных знака. Вы можете выполнить последнюю запущенную в терминале команду, введя следующее:
|
1 |
sudo !! |
Наконец, важно знать, что sudo просто повышает привилегии для выполняемой команды. Для получения дополнительной информации вы можете следовать инструкциям по этой ссылке, чтобы немного развлечься со своими пользователями.
Заключение
При работе с несколькими пользователями крайне важно понимать, как устроена команда sudo и файл sudoers. В этом руководстве мы познакомились с основами чтения и изменения файла sudoers, а также с различными методами получения привилегий root.
Всегда помните, что разделение привилегий — это то, что делает системы Linux безопасными. Поэтому привилегии суперпользователя не должны предоставляться обычным пользователям. Назначайте только те привилегии, которые абсолютно необходимы конкретному пользователю для выполнения его задач в системе, а не все привилегии.
Приятной работы!
Комментарии
Комментариев пока нет. Будьте первым.