Вики / Пользователи и права
sudo
Выполнение команд от 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
См. также
- Права доступа (rwx, SUID, sticky) — Пользователи и права
- Пользователи и группы — Пользователи и права