Как пользоваться sudo


Это вторая часть статьи, посвящённой команде sudo, если вы ещё не видели первую часть, то перейдите к ней «Что такое sudo».

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

Как обойти ограничения запуска команд с sudo

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

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

К примеру, в предыдущей части мы указали настройку:

admin ALL=(root:ALL) /home/admin/backup.sh,/usr/bin/apt

Она разрешает пользователю выполнять команды /home/admin/backup.sh и /usr/bin/apt. Может ли этот пользователь выполнить, например, такую команду:

sudo rm -rf / # не выполняйте эту команду, а то придётся переустанавливать ОС

Если вы не понимаете приведённую выше команду, то смотрите «Азы работы в командной строке Linux (часть 1)».

Поскольку я уже знаю, что в этом случае я смогу обойти ограничение, то вместо удаления корневой файловой системы, я специально создам папки, для которых у обычного пользователя не будет прав на удаление (я залогинен как root):

mkdir -p /root/test1/test2/test3

Итак, я выполняю вход под пользователем admin:

su - admin

Теперь я (пользователь admin) хочу совершить злодейство — я хочу удалить папку /root/test1 принадлежащую ненавистному мне root'у:

rm -rf /root/test1
rm: невозможно удалить '/root/test1/test2/test3': Отказано в доступе

Недостаточно прав, попробую выполнить с правами суперпользователя:

sudo rm -rf /root/test1
Sorry, user admin is not allowed to execute '/usr/bin/rm -rf /root/test1' as root on HackWare.

Опять неудача — пользователю admin разрешено выполнять только команду /usr/bin/apt и команду /home/admin/backup.sh. Проверяем права доступа на эти файлы:

ls -l /usr/bin/apt
-rwxr-xr-x 1 root root 18520 сен 19 23:06 /usr/bin/apt

У пользователя есть право записи, но пользователем является root.

Проверяем второй файл:

ls -l /home/admin/backup.sh
-rw-r--r-- 1 admin admin 0 янв 24 14:05 /home/admin/backup.sh

Пользователем является admin и у него есть право записи!

Записываем нашу зловредную команду в этот файл:

echo 'rm -rf /root/test1' > /home/admin/backup.sh

Добавляем права выполнения этому файлу, если вдруг их не было:

chmod +x /home/admin/backup.sh

И запускаем этот файл с sudo:


sudo /home/admin/backup.sh

Как можно увидеть, программа завершилась без ошибки:

А папка /root/test1 больше не существует:

ls -l /root/test1

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

Как показывать звёздочки во время ввода пароля sudo

Во время ввода пароля sudo, терминал не даёт никакой обратной связи, то есть не показывае звёздочки и, будто бы, никак не реагирует. У меня даже спрашивали в комментариях под какой-то статьёй: «появляется запрос ввода пароля и система зависает». На самом деле система прекрасно работает и считывает введённый пароль, причём такой вариант является более безопасным, поскольку не позволяет посторонним увидеть длину пароля.

Тем не менее если вам хочется, чтобы в терминале при вводе пароля sudo отображались звёздочки (*******) по количеству введённых символов, как это сделано в большинстве приложений, то дальше будет показано как это настроить.

Откройте для редактирования конфигурационный файл sudo:

sudo visudo

Найдите строку

Defaults	env_reset

и добавьте к ней pwfeedback, чтобы строка стала выглядеть так:

Defaults	env_reset,pwfeedback

Если у вас редактор vim, то нажмите кнопку Esc, напечатайте :wq и нажмите ENTER. Если вы используете редактор nano, то нажмите Ctrl+x, затем y и нажмите ENTER для сохранения и закрытия файла.

Чтобы изменения вступили в силу, выполните следующую команду для сброса текущих настроек терминала:

reset

Вот и всё, теперь каждый раз, когда вы вводите пароль в терминал, вы будете получать визуальный отзыв (****), как это показано на следующем скриншоте:


Как увеличить или уменьшить длину сессии sudo

После ввода пароля пользователя для sudo? если вы хотите выполнить ещё одну команду с sudo, то в течение установленного промежутка времени у вас не будет спрошен пароль. Длина сессии, например, в Linux Mint составляет 15 минут. Если вы считаете, что длина сессии беспарольного выполнения команд sudo слишком маленькая или слишком большая, то далее показано, как её изменить.


Для установки таймпута пароля sudo, используется параметр timestamp_timeout. Вначале откройте файл /etc/sudoers с полномочиями суперпользователя, используя команды sudo и visudo примерно так:

sudo visudo

Теперь в пункт Defaults добавьте директиву timestamp_timeout с нужным вам значением в минутах, например, в следующей строке установлено время, когда sudo не запрашивает повторно пароль на 20 минут:

Defaults        env_reset,timestamp_timeout=20

Примечание: вы можете установить любое время в минутах на ваше усмотрение. Вы также можете установить время на 0, если вы хотите запрос пароля при каждом использовании команду sudo. Чтобы навсегда отключить запрос пароля, установите значение на -1.

Для сохранения изменений нажмите Ctrl+o, затем ENTER и для выхода Ctrl+x.

Как узнать, какие команды вводил пользователь с sudo

По умолчанию sudo ведёт журнал действий через системный лог (journalctl). Чтобы сохранять журнал действий с sudo, добавьте следующую директиву:

Defaults	logfile="/var/log/sudo.log"

Пример записей из файла /var/log/sudo.log:

Jan 25 14:47:20 : admin : TTY=pts/0 ; PWD=/home/admin ; USER=root ;
    COMMAND=/usr/bin/apt
Jan 25 14:47:26 : admin : TTY=pts/0 ; PWD=/home/admin ; USER=root ;
    COMMAND=/usr/bin/apt update
Jan 25 14:49:56 : admin : TTY=pts/0 ; PWD=/root ; USER=root ;
    COMMAND=/usr/bin/ls -l
Jan 25 14:50:10 : admin : TTY=pts/0 ; PWD=/root ; USER=root ;
    COMMAND=/usr/bin/apt update
Jan 25 14:50:39 : admin : TTY=pts/0 ; PWD=/home/admin ; USER=root ;
    COMMAND=./backup.sh

В каждой записи присутствуют следующие поля:

  • дата и время
  • пользователь, который выполнил команду
  • номер терминала
  • текущая рабочая директория
  • пользователь, от чьего имени выполнялась команда
  • сама команда

При желании можно добавить в эти записи имя хоста и номер года, для этого используйте, соответственно, параметры log_host и log_year следующим образом:

Defaults	log_host,log_year,logfile="/var/log/sudo.log"

Ниже пример настроенного файла журнала sudo:

Как сохранить ввод и вывод команд с sudo

Можно не только просматривать команды, которые выполнялись с sudo, но и сохранять ввод и вывод этих команд. Использование параметров log_input и log_output включает запуск команды sudo в псевдо tty и ведёт журнал всего ввода и вывода, отправленного на экран:

Defaults	log_input, log_output

По умолчанию данные сохраняются в директорию /var/log/sudo-io и, если имеется порядковый номер сеанса, то они сохраняются в директорию seq Вы можете настроить директорию хранения, структуру папок и имена файлов параметрами iolog_dir и iolog_file. По умолчанию данные будут сохраняться в структуре папок начиная с 00/00/01 и далее:

cd /var/log/sudo-io/
ls -l
cd 00/00/01
ls -l
cat log

Как поменять сообщение о неправильном пароле sudo

Когда пользователь вводит неверный пароль, соответствующее сообщение показывается в командной строке. По умолчанию сообщение на русском «Попробуйте ещё раз.», а на английском «sorry, try again». Вы можете отредактирвоать это сообщение используя параметр badpass_message примерно так:


Defaults	badpass_message="Пароль неверный, введите свой пароль пользователя"

Как увеличить количество попыток ввода пароля sudo

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

Defaults	passwd_tries=5

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

Defaults	passwd_timeout=2

Опции sudo

Кроме уже рассмотренных имеется несколько других опций, которые могут пригодиться в той или иной ситуации:

  • -n: автономный режим без вывода запросов пользователю (если запрос есть, то программа завершает работу)
  • -P: сохранить вектор группы вместо установки целевой группы
  • -p ЗАПРОС: использовать указанный запрос пароля
  • -S: читать пароль из стандартного ввода
  • -s ШЕЛЛ: запустить указанную оболочку от имени указанного пользователя; также можно задать команду для выполнения в этом шелле
  • -b: выполнить команду в фоновом режиме
  • -H: установить для переменной $HOME домашний каталог указанного пользователя
  • -T СЕКУНДЫ: оборвать выполнение команды после указанного лимита времени

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *