linux-labs

Вики / Пользователи и права

sudo

Команда Ubuntu 24.04 · sudo 1.9 ПраваБезопасностьБазовое

Выполнение команд от root и других пользователей; sudoers и NOPASSWD.

sudo выполняет команду от имени другого пользователя (по умолчанию root), проверяя права по правилам в sudoers. Лучше, чем сидеть под root: точечно, с логированием, по паролю своего пользователя.

sudo apt update                   # выполнить от root
sudo -u postgres psql             # от другого пользователя
sudo -i                           # интерактивный root-shell (login shell)
sudo -s                           # root-shell без смены окружения
sudo -l                           # какие команды мне разрешены
sudo -k                           # сбросить кэш пароля (следующий sudo спросит снова)
sudo !!                           # повторить предыдущую команду под sudo

Право даёт членство в группе sudo (Ubuntu) / wheel (RHEL), либо явное правило. Никогда не редактируй sudoers напрямую — только через visudo (проверяет синтаксис, иначе можно потерять sudo):

sudo visudo                       # основной файл /etc/sudoers
sudo visudo -f /etc/sudoers.d/90-deploy   # отдельный drop-in (рекомендуется)
sudo visudo -c                    # проверить синтаксис всех файлов

Формат правила и алиасы:

# кто   где = (от кого)      что
alice   ALL = (ALL:ALL)      ALL
deploy  ALL = (root) NOPASSWD: /bin/systemctl restart myapp, /bin/systemctl status myapp
%devs   ALL = (root)         /usr/bin/apt        # %группа
Cmnd_Alias SERVICES = /bin/systemctl restart nginx, /bin/systemctl reload nginx
web     ALL = (root) NOPASSWD: SERVICES

NOPASSWD: — без запроса пароля (для автоматизации; держи область узкой!).

Полезные Defaults (в /etc/sudoers.d/):

Defaults        env_reset                          # чистое окружение (безопасно)
Defaults        secure_path="/usr/sbin:/usr/bin:/sbin:/bin"
Defaults        timestamp_timeout=15               # минут кэш пароля (0 = всегда спрашивать)
Defaults:deploy !requiretty
Defaults        logfile="/var/log/sudo.log"        # отдельный лог
sudo -E cmd                       # сохранить переменные окружения (если разрешено)
sudoedit /etc/nginx/nginx.conf    # = sudo -e: править root-файл своим $EDITOR безопасно
sudo -v                           # продлить кэш пароля (для длинных скриптов)

sudoedit правит копию от твоего имени и атомарно кладёт назад — безопаснее, чем sudo vim (не запускает редактор от root).

user is not in the sudoers file

Пользователя нет в группе sudo. От root: usermod -aG sudo alice (нужен релогин, см. users-groups).

sudo: a terminal is required to read the password

Нет TTY (по SSH без -t или из скрипта). Варианты: NOPASSWD для нужной команды, ssh -t, либо sudo -S (пароль из stdin).

NOPASSWD не срабатывает для смены пользователя

(root) NOPASSWD: ALL разрешает команды от root, но не sudo -u other. Для смены без пароля — правило (other) или sudo runuser -u other -- cmd.

Команда работает руками, но не через sudo (PATH/env)

env_reset/secure_path чистят окружение. Зови по полному пути или настрой secure_path; для переменных — sudo -E (если разрешено).

Сломал sudoers, потерял доступ

visudo не даст сохранить файл с ошибкой. Если всё же потерял — зайди через root-консоль (recovery/гипервизор) и поправь.

sudo cmd ; sudo -u user cmd ; sudo -i      # от root / от юзера / root-shell
sudo -l                            # что мне разрешено
sudoedit /etc/файл                 # безопасно править root-файл
sudo visudo -f /etc/sudoers.d/10-x # правка правил БЕЗОПАСНО
usermod -aG sudo alice             # выдать sudo (релогин)
# правило: who ALL=(root) NOPASSWD: /path/cmd

См. также