Как пользоваться 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 СЕКУНДЫ: оборвать выполнение команды после указанного лимита времени
Связанные статьи:
- Что такое sudo (100%)
- SSH (ч.1): Что такое SSH. Утилиты SSH (52.1%)
- SSH (ч.2): Настройка сервера OpenSSH (52.1%)
- SSH (ч.3): Как подключиться к SSH. Настройка клиента OpenSSH (52.1%)
- SSH (ч.4): Создание и настройка ключей OpenSSH (52.1%)
- Полное руководство по mod_rewrite (часть 4): Директива RewriteCond (RANDOM - 50%)