18. sudo
У su есть один нюанс – нужно знать пароли других пользователей, если, конечно, вы не root. Когда вы один админ в системе — это не проблема. Но представьте, что есть несколько пользователей или администраторов. Давать друг другу пароли плохая идея, потому что безопасность строится на полном недоверии друг к другу, включая других администраторов. Другой администратор может умышленно вас подставить, неопытный хелпдеск может сделать ошибку от вашего имени, завтра могут уволить кого-то, а он от вашего имени может положить все сервера. Ну и если не говорить о недоверии, когда несколько админов работают от имени одного пользователя, то кто-то может что-то неправильно настроить, и потом не вспомнит или не сознается. Таким образом в коллективе формируется недоверие и негативная атмосфера. Учётные записи придумали не просто так, в жизни бывает всякое, поэтому всем будет легче работать от своего имени. Ну и во вторых, когда работает несколько пользователей, допустим если есть хелпдеск и вы хотите дать ему возможность только создавать пользователей, то вроде ему и нужны какие-то права суперпользователя, но и давать пароль от рута не хочется.
Для решения таких проблем есть утилита sudo:
sudo
Вы уже замечали её пару раз – с помощью неё мы устанавливали какие-то программы и создавали пользователей – потому что у нашего пользователя не было соответствующих прав. А если писать перед командой sudo – например:
sudo useradd user2
то команда useradd запускается от имени суперпользователя. Но, естественно, не любой пользователь может написать sudo и выполнить любую команду – у нашего user это работает, потому что при установке системы мы поставили галочку «сделать пользователя администратором». Как это работает – давайте разбираться.
Вкратце, sudo позволяет запускать какие-то команды от имени какого-то пользователя. А в файле sudoers пишутся те самые политики – кому, где и что. Из того, что мы уже видели – наш пользователь может запускать команды от имени суперпользователя. Давайте для начала найдём, где это написано.

У sudo есть файл настроек — /etc/sudoers:
nano /etc/sudoers
Наш пользователь его читать не может, но так как у нас есть права суперпользователя, можем написать:
sudo nano /etc/passwd
введём свой пароль и файл откроется. В начале у нас есть строчка – этот файл нужно редактировать с помощью команды visudo:
visudo
Всё дело в том, что при запуске sudo программа каждый раз считывает этот файл, и, если здесь будет синтаксическая ошибка, sudo просто перестанет работать. А если у нас нет пароля от рута – то придётся повозиться, чтобы восстановить работу.

Давайте просто покажу – напишу в файле рандомные буквы, сохраню и выйду. Теперь, при попытке заново открыть файл с помощью sudo, у меня ничего не откроется — sudo скажет, что не смог прочесть такую-то строчку и просто откажется работать. К счастью, у меня есть пароль от рута, который я ставил при установке системы – я могу просто написать su, ввести пароль рута, а потом просто зайти и удалить лишнюю строчку:
nano /etc/sudoers
Теперь sudo опять будет работать.

Попытаемся прислушаться к совету и запустить команду visudo:
sudo visudo
Visudo открывает /etc/sudoers в дефолтном редакторе – vim. Если же я хочу, чтобы всё работало с nano, мне нужно будет кое-что поменять. Как правило, программы по умолчанию задаются с помощью переменных окружения. Как это делать мы уже знаем – зайдём в ~/.bashrc:
nano ~/.bashrc
Дальше нам нужно зайти в sudoers:
sudo nano /etc/sudoers
найти строчку c env_keep. Выше можно заметить env_reset – которая сбрасывает все переменные, чтобы сделать окружение с sudo минимальным. Так вот, в env_keep добавляем EDITOR, чтобы sudoers не игнорировал нашу переменную, сохраняем, закроем эмулятор и заново запустим, чтобы bash перечитал настройки ~/.bashrc. И теперь, при запуске:
sudo visudo
файл откроется в nano.

Обратите внимание — наверху указано не /etc/sudoers, а /etc/sudoers.tmp. Это означает, что когда мы запускаем visudo, у нас sudoers копируется во временный файл. Если здесь сделать ошибку, например, написать рандомные буквы, сохранить и попытаться выйти, то visudo сначала проверит, всё ли нормально с файлом, заметит синтаксическую ошибку и спросит нас – что делать? Если нажать enter, можно увидеть варианты – e чтобы вернуться к редактированию, x – чтобы выйти не сохраняя, Q – чтобы сохранить, но мы видим предупреждение, что это опасно. Можно вернуться, исправить ошибку, сохранить и выйти. При сохранении, sudoers.tmp заменит оригинальный файл sudoers. Таким образом visudo защищает нас от синтаксических ошибок.

Спускаемся вниз, где у нас начинаются политики. Например:
root ALL=(ALL) ALL
Первое – это пользователь, для которого написана политика. Если начинается со знака процент(%), то речь о группе пользователей. Не то, чтобы руту были нужны sudo права – он и так может делать всё что угодно. Но без этой строчки — если root почему-то запустит sudo, например, если это написано в скрипте или кто-то скопировал команды с интернета – sudo выдаст ошибку и команда не сработает. Поэтому, на всякий случай, есть эта строчка.
Теперь, что означает ALL=(ALL) ALL. Первая ALL — это на каком компьютере. Если первое значение ALL или совпадает с именем компьютера, которое можно узнать с помощью команды:
hostname
то sudo будет работать с этой строчкой. Если же тут написано что-то другое – то sudo проигнорирует эту строчку. Если у вас несколько компьютеров, вы можете написать один файл sudoers и закинуть его на все компьютеры. И sudo на каждой машинке будет считывать только строчки, где хост равен ALL или совпадает с хостнеймом машинки.

Вторая ALL – от имени какого пользователя, ALL значит от всех, то есть можно запустить команду от имени любого пользователя. По умолчанию, если явно не указывать пользователя, то команда запустится от имени root. А так, здесь можно написать конкретного пользователя, допустим user2. В таком случае пользователь root сможет запускать команды с помощью sudo только от имени user2. Также тут можно указать не только пользователя, а также группу, или просто группу. Чуть дальше будут примеры.
И третья ALL – это команды. В случае ALL можно запустить любую команду, а так, здесь можно прописать только те команды, которые вы хотите разрешить. Или наоборот, если вы хотите какие-то команды разрешить и какие-то запретить. Перед запрещёнными командами ставится восклицательный знак.

Так вот, почему наш пользователь user может запускать команды с помощью sudo? Пока что в этом файле всего 2 политики – для пользователя root и для группы wheel, всё остальное – закомментированные примеры. У группы wheel тоже все права – ALL ALL ALL. Чтобы узнать, в каких группах состоит наш пользователь, можно выполнить команду:
groups
от его имени, либо указать имя пользователя:
groups groups user groups user2
Как видно, наш пользователь user состоит в группе wheel – именно поэтому у него есть все права на систему. В других дистрибутивах вместо wheel может быть группа c именем sudo – но суть одна и та же.

Прежде чем пойдём дальше, давайте я покажу частный случай использования sudo:
sudo su
Если выполнить просто команду su, то мы меняем текущего пользователя на root пользователя, правда для этого нам нужно знать пароль этого рут пользователя. Команда sudo позволяет нам выполнить команду от имени суперпользователя, а мы знаем, что если выполнять команду su от имени root пользователя, то пароль нам указывать не нужно. А значит выполнив sudo su и введя пароль своего юзера, мы просто от имени суперпользователя запустим команду su, а так как ему не нужно вводить пароль, мы просто станем рутом. Таким образом, не зная пароля рута, мы можем стать рут пользователем.

Учитывая, что sudo это механизм, который позволяет повысить свои привилегии, этим активно пользуются злоумышленники. Давайте, для примера, посмотрим один из теоретических способов с помощью переменной PATH. У меня в переменной PATH:
echo $PATH
есть путь /home/user/.local/bin. Сейчас этой директории нет, но я могу её создать:
mkdir ~/.local/bin
и сделать такую обманку – создать символическую ссылку:
ln -s /bin/su ~/.local/bin/htop
Теперь когда я пишу htop, bash смотрит переменную PATH, видит в начале ~/.local/bin, находит там программу htop и запускает, а на самом деле это программа su. И представьте ситуацию, если мы разрешим пользователю запускать только команду htop c правами суперпользователя, допустим, чтобы понижать niceness, а этот пользователь напишет:
sudo htop
на деле выполнится sudo su – и он введя свой пароль станет рут пользователем.

Естественно, этой очень банальный способ и его невозможно применить – во-первых, sudo требует, чтобы в sudoers был полный путь к программам. То есть, если в sudo явно не указан путь /home/user/~.local/bin/htop – то ничего не сработает. Во вторых – в sudoers есть настройка secure_path. Когда пользователь будет писать sudo command, то sudo будет смотреть только в директории, указанные в этой настройке. Кстати, насчёт полного пути – его всегда можно легко найти с помощью команды which – допустим:
which htop which ls which rm
Но нужно понимать, что при ALL ALL ALL у пользователя будет полный доступ, а если вы ограничиваете пользователя определёнными командами, следует быть предельно осторожным с выбором команд, потому что очень часто можно повысить привилегии неочевидным способом. Допустим, давая кому-то право создавать пользователей, он может создать пользователя с группой wheel и через него стать рутом. Поэтому, прежде чем давать какому-то пользователю права на какую-то программу, следует очень внимательно изучить, что эта программа позволяет сделать.

Допустим, тот же less или vi позволяют запускать команды и для них есть специальный ключ, позволяющий предотвратить выполнение сторонних команд — NOEXEC. Кроме NOEXEC есть ещё пара ключей, один из примечательных — NOPASSWD – позволяет запускать указанные команды без ввода пароля. Также, чтобы постоянно не вводить sudo, можно предварительно написать:
sudo -s
В некоторых случаях люди используют sudo, чтобы предоставить доступ к редактированию каких-то файлов. И хотя лучше в таких случаях использовать права на файлы, ситуации бывают разные, поэтому у sudo есть относительно безопасный способ редактирования файлов с помощью sudoedit.

Для примера, давайте предоставлю пользователю user2 право редактировать файл /etc/passwd с помощью nano. Он вроде бы и не может открыть командой другой файл, но я могу изнутри nano открыть другой файл с помощью ^R, допустим, тот же sudoers, изменить его и сохранить как /etc/sudoers, тем самым обеспечив себе все права. Если же в sudoers я пропишу sudoedit, то предыдущая схема не будет работать, потому что принцип работы немного другой. sudoedit копирует нужный мне файл во временный файл, я редактирую временный файл, а когда сохраняю – то sudoedit заменяет нужный файл той копией, которую я изменил. Почти как с visudo.

Когда у вас много пользователей, много разных команд и компьютеров, для облегчения прописывания политик можно использовать алиасы, где можно перечислить несколько значений через запятую. В файле уже даны примеры использования. Политика состоит из 4 столбиков: User – это собственно пользователь или группа, к которой применяется политика, поэтому алиас называется User_Alias. Во втором столбике хостнеймы, поэтому Host_Alias. Дальше у нас столбик, где указывается от чьего имени разрешено запускать – называется Runas – собственно, Runas_Alias и последний столбик – команды, поэтому здесь Cmnd_Alias. Ну и тут пример использования политик с алиасами.

Также бывает полезно узнать, кто какие команды вводил с помощью sudo. Все действия sudo логирует и их можно посмотреть в файле /var/log/secure:
sudo grep sudo /var/log/secure
Также, в плане логирования, у sudo есть инструмент, называемый sudoreplay. Я его разбирать не буду, это вам такое задание – настроить и проверить его работу. Если будут какие-то сложности – спрашивайте в комментариях.

Последняя строчка файла говорит нам, что sudoers будет читать настройки из всех файлов, расположенных внутри директории /etc/sudoers.d . Для этого нам понадобится указать для visudo файл:
sudo visudo -f /etc/sudoers.d/test
Давайте пропишем здесь правило для пользователя user2, допустим, чтобы он мог от имени пользователя user запускать команду ls:
user2 centos8=(user) /bin/ls
Сохраним, выйдем и проверим:
su user2 sudo passwd user ls /home/user/ sudo -u user ls /home/user
Подводя итоги, sudo – инструмент, который позволяет дать определённым пользователям определённые права. Но это делает sudo очень опасным инструментом, которым активно пользуются злоумышленники. Поэтому нужно запомнить – без острой необходимости пользователей в sudo прописывать не стоит, если речь идёт о правах суперпользователя. Не стоит строить правила на основе запретов – разрешить всё, а потом запретить опасные команды. Это заведомо проигрышный вариант – есть огромное количество способов обойти запреты. Давайте доступ только на необходимые команды, заранее проанализируйте, посмотрите в интернете, а насколько опасно то, что вы разрешаете. В дальнейшем вы научитесь писать скрипты – так вот, вместо самих команд пишите скрипты, которые выполняют строго заданные функции и указывайте в sudoers эти скрипты вместо команд. Ну и у sudo ещё много всяких настроек, которые я не рассмотрел – но для основ этого будет достаточно.
© Copyright 2021, GNU Linux Pro, CC-BY-SA-4.0. Ревизия 5f665cc2 .
unixforum.org
Помогите отредактировать sudoers (Никак не могу отредактировать)
Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.
Модератор: Bizdelnick
28 сообщений • Страница 1 из 1
atlonchik Сообщения: 145 ОС: Gentoo Linux x86
Помогите отредактировать sudoers
Сообщение atlonchik » 15.06.2008 13:24
Пару недель назад перешёл на линукс. Использовать vim вообще не научился. Нужно добавить моего пользователя, чтобы работала команда sudo и не спрашивала пароль. Никак не могу отредактироваь используя visudo.
Спасибо сказали:
Goodvin Ведущий рубрики Сообщения: 4333 Статус: ⚝⚠⚒⚑⚖☭☞☣☤&
Re: Помогите отредактировать sudoers
Сообщение Goodvin » 15.06.2008 13:37
Что значит «не могу» ?
Потрудитесь внятно написать что именно делаете и что конкретно не получается.
Документацию по vi уже проштудировали ?
Как правильно задавать вопросы
Спасибо сказали:
anjolio Сообщения: 663 Статус: радист ОС: debian squeeze
Re: Помогите отредактировать sudoers
Сообщение anjolio » 15.06.2008 14:25
Если у вас debian, то:
1)su — заходим под рутом
2)nano — редактируем в текстовом редакторе nano (Ctrl+X — выход, при этом вас спросят куда сохранить файл)
| ! | Предупреждение от модератора sash-kan |
| как вы думаете, что полагается за вредные советы новичкам типа: «забей и редактируй sudoers напрямую»? см. мой пост ниже. sash-kan |
The two most common things in the Universe are hydrogen and stupidity. (Harlan Ellison)
Спасибо сказали:
poweroff Сообщения: 90 ОС: GNU/Linux Debian Lenny 5.0.1
Re: Помогите отредактировать sudoers
Сообщение poweroff » 15.06.2008 14:27
| ! | Предупреждение от модератора sash-kan |
| как вы думаете, что полагается за вредные советы новичкам типа: «забей и редактируй sudoers напрямую»? см. мой пост ниже. sash-kan |
1 Забей на vi используй nano, он проще.
# nano /etc/sudoers
2 Вот пример моего sudoers:
# /etc/sudoers # # This file MUST be edited with the 'visudo' command as root. # # See the man page for details on how to write a sudoers file. # Defaults env_reset # Host alias specification # User alias specification # Cmnd alias specification # User privilege specification root ALL=(ALL) ALL alexandr ALL=(ALL) NOPASSWD: ALL
Впиши вместо alexandr своего пользователя.
Никогда не слушайте ничьих советов. Особенно этот.
Спасибо сказали:
a_trub Сообщения: 277 ОС: openSUSE 11
Re: Помогите отредактировать sudoers
Сообщение a_trub » 15.06.2008 17:17
Забивать ни на что не надо, ибо visudo при выходе анализирует синтаксис, в отличие от других редакторов, того же nano. Вы же не хотите получить совсем неработоспособный sudoers из-за простейшей опечатки? Вопрос в чем конкретно? Не можете настроить sudo или не знаете как работать в vi? Во втором случае я не буду пересказывать весь мануал, а просто попрошу Вас сходить по ссылке
http://www.opennet.ru/docs/HOWTO-RU/Vim-HOWTO.html
Если коротко — вход в редактирование по INSERT (ESC — большое спасибо Juliette за замеченную оплошность, забыл, не о том думал ), выход с записью по :wq. Все остальное в Ваших руках.
Спасибо сказали:
Juliette Сообщения: 5058 Статус: ROSA Lab ОС: Ubuntu LTS, Mandriva 2011
Re: Помогите отредактировать sudoers
Сообщение Juliette » 15.06.2008 17:20
15.06.2008 17:17
вход в редактирование по ESC
Спасибо сказали:
devilr Сообщения: 3650 ОС: Mandriva => Gentoo (~amd64) Контактная информация:
Re: Помогите отредактировать sudoers
Сообщение devilr » 15.06.2008 17:30
Интересно вы советуете.
Я, может, еще не все понимаю в linux, но зачем
alexandr ALL=(ALL) NOPASSWD: ALL
По сути получается, что у вас alexandr = root. Т.е. можно, к примеру, запустить ту же консоль, по сути от рута, и делать все что угодно, в том числе и добавить других пользователей.
Не лучше ли сделать определенные команды?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
atlonchik Сообщения: 145 ОС: Gentoo Linux x86
Re: Помогите отредактировать sudoers
Сообщение atlonchik » 15.06.2008 18:29
конкретно, у меня не получается пользоваться vi. Документацию пока не прочитал — не хватает времени — идёт сессия. Оттуда и все проблемы. Ну и пока не смог разобраться с документацией по sudoers. прочел бегло, но так и не понял, как сделать, чтобы не запрашивался пароль.
Спасибо сказали:
devilr Сообщения: 3650 ОС: Mandriva => Gentoo (~amd64) Контактная информация:
Re: Помогите отредактировать sudoers
Сообщение devilr » 15.06.2008 18:41
http://www.opennet.ru/man.shtml?topic=sudo. 5&russian=0
По-русски. Но не стОит разрешать себе все. Лучше в sudoers добавить только нужные вам программы, типа mount.
В случае компрометации локального пользователя не надо давать злодею прямого рута. имхо.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Goodvin Ведущий рубрики Сообщения: 4333 Статус: ⚝⚠⚒⚑⚖☭☞☣☤&
Re: Помогите отредактировать sudoers
Сообщение Goodvin » 15.06.2008 19:01
15.06.2008 18:29
конкретно, у меня не получается пользоваться vi. Документацию пока не прочитал — не хватает времени — идёт сессия.
Конкретно, тогда чего же вы хотите ?
Освойте элементарные операции работы с текстовым редатором vi и всё получится.
А от того, что у Вас времени нет, никому здесь ни холодно, ни жарко.
Вам надо — Вы разбирайтесь, мы поможем.
Вам не надо — никому не надо.
15.06.2008 18:29
Оттуда и все проблемы. Ну и пока не смог разобраться с документацией по sudoers. прочел бегло, но так и не понял, как сделать, чтобы не запрашивался пароль.
Что именно прочитали ?
в каким именно местах документации и какие именно её части непонятны ?
Или «прочёл бегло» это значит «пролистал, не вникал, хочу чтобы прочитал кто-то другой и мне разжевал, догадался вместо меня чего я вообще хочу и мне выдал инструкцию каким пальцем какую кнопку нажать» ??
Как правильно задавать вопросы
Спасибо сказали:
Black Сообщения: 1100 ОС: ArchLinux
Re: Помогите отредактировать sudoers
Сообщение Black » 15.06.2008 22:28
(man visudo) писал(а): ENVIRONMENT
The following environment variables are used only if visudo was configured with the
—with-env-editor option:
VISUAL Invoked by visudo as the editor to use
EDITOR Used by visudo if VISUAL is not set
Не знаю с какими опциями оно у вас собрано, но если с этой, то может помочь
VISUAL=nano visudo
Вместо nano можно вписать любой редактор.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
carkov Сообщения: 52 ОС: Debian GNU/Linux 9
Re: Помогите отредактировать sudoers
Сообщение carkov » 18.01.2009 19:24
Доброго времени суток!
Настраиваю sudo и вот возник вопрос, можно ли сделать так,
что-бы sudo, при оприделенной команде, запрашивал пороль рута?
По умолчанию, запрашивает пороль рядового пользователя.
Например, что-бы при команде sudo shutdown -h 0, он запросил пороль рута
вот мой # /etc/sudoers
#
# This file MUST be edited with the ‘visudo’ command as root.
#
# See the man page for details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
# Cmnd alias specification
Cmnd_Alias HWCLOCK=/sbin/hwclock
Cmnd_Alias IFCONFIG=/sbin/ifconfig
Cmnd_Alias MODINFO=/sbin/modinfo
Cmnd_Alias REBOOT=/sbin/reboot
Cmnd_Alias SHUTDOWN=/sbin/shutdown
# Runas alias specification
# User privilege specification
root ALL=(ALL) ALL
admin ALL=(root) HWCLOCK, IFCONFIG, MODINFO, REBOOT, SHUTDOWN
Спасибо сказали:
diesel Бывший модератор Сообщения: 5989 ОС: OS X, openSuSE, ROSA, Debian Контактная информация:
Re: Помогите отредактировать sudoers
Сообщение diesel » 18.01.2009 20:33
18.01.2009 19:24
Доброго времени суток!
Настраиваю sudo и вот возник вопрос, можно ли сделать так,
что-бы sudo, при оприделенной команде, запрашивал пороль рута?
По умолчанию, запрашивает пороль рядового пользователя.
Например, что-бы при команде sudo shutdown -h 0, он запросил пороль рута
man sudoers:
Defaults Certain configuration options may be changed from their default values at runtime via one or more Default_Entry lines. These may affect all users on any host, all users on a spe‐ cific host, a specific user, or commands being run as a specific user. . SUDOERS OPTIONS sudo’s behavior can be modified by Default_Entry lines, as explained earlier. A list of all supported Defaults parameters, grouped by type, are listed below. . rootpw If set, sudo will prompt for the root password instead of the password of the invoking user. This flag is off by default. runaspw If set, sudo will prompt for the password of the user defined by the runas_default option (defaults to root) instead of the password of the invoking user. This flag is off by default.
Спасибо сказали:
carkov Сообщения: 52 ОС: Debian GNU/Linux 9
Re: Помогите отредактировать sudoers
Сообщение carkov » 18.01.2009 23:03
diesel Немогли бы Вы более подробней обяснить?
Именно по man sudoers я и настраиваю sudo
Если я добавляю флаг rootpw в строчку Defaults,
то тогда судо запрашивает пароль рута, на все перечисленые в алисах команды.
Мне нужно что-бы sudo запрашивал пароль к примеру на команды kill, reboot и т.д..
А в остальных случаях что-бы он запрашивал пароль обычного пользователя?
Спасибо сказали:
sash-kan Администратор Сообщения: 13939 Статус: oel ngati kameie ОС: GNU Контактная информация:
Re: Помогите отредактировать sudoers
Сообщение sash-kan » 22.01.2009 07:25
1. «забивать» на средство редактирования файла /etc/sudoers под названием visudo нельзя! _особенно_ новичкам.
2. к редактору vi (vim) visudo не имеет ни малейшего отношения.
3. редактор берётся тот, что указан в переменной окружения VISUAL или EDITOR. если обе переменные пусты, может быть использована программа /usr/bin/editor.
в debian это не программа, а ссылка, управляемая системой alternatives, которая может вести к программе vi (vim).
переопределить эту «альтернативу» можно с помощью:
# update-alternatives —config editor
(на самом деле алгоритм поиска подходящей программы-редактора несколько сложнее. к тому же, теоретически, может разниться от дистрибутива к дистрибутиву. желающие могут обратиться к man-страницам своего дистрибутива).
примеры запуска visudo с редактором, например, nano:
# EDITOR=nano visudo
$ sudo sh -c ‘EDITOR=nano visudo’
главное: visudo — это средство безопасного и ошибкоустойчивого редактирования файла /etc/sudoers
Писать безграмотно — значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Sudo: настройка файла /etc/sudoers
Данная статья – это продолжение темы, посвящённой утилите sudo , начатой материалами, знакомящими с данной командой и некоторыми её опциями. Ниже попробуем рассказать о настройках утилиты sudo , которые могут применяться в её отношении.
Настройки sudo по большей части находятся в файле /etc/sudoers . Для внесения изменений в этот файл крайне нежелательно использовать обычный редактор текста. Дело в том, что некорректный синтаксис файла sudoers запросто может навредить операционной системе в части повышения уровня полномочий учётных записей и их действий. Для редактирования файла sudoers существует специальная команда – visudo . Данная команда использует штатный текстовый редактор, но при сохранении внесённых в файл изменений производит проверку синтаксиса.
Здесь есть один интересный момент. Команда visudo обычно использует текстовый редактор vi . Но, например, в Ubuntu visudo открывает файл при помощи nano . И, несмотря на это, операционная система сохраняет возможность заменить использующийся редактор. В Ubuntu команда для изменения редактора выглядит следующим образом:
$ sudo update-alternatives --config editor
Здесь нужно просто ввести соответствующую цифру, либо нажать , чтобы не вносить изменений:

Содержимое файла /etc/sudoers
Теперь давайте рассмотрим некоторые настройки, содержащиеся в файле /etc/sudoers .
Во-первых, строка Defaults env_reset отвечает за сброс терминальной среды с целью удалить переменные пользователя. Такая мера безопасности применяется для ликвидации потенциально опасного воздействия переменных среды в сессии sudo .
Во-вторых, строка Defaults secure_path задаёт значение для переменной PATH . Такой путь для приложений используется утилитой sudo для выполнения операций. Это позволяет защитить систему от использования пользовательских путей, которые могут быть потенциально опасными.
Далее, в файле /etc/sudoers есть строка, определяющая полномочия sudo для учётной записи root .

В этой записи первое значение ALL указывает на то, что описанное правило будет применено ко всем хостам. Второе значение ALL указывает на то, что учётная запись root может выполнять команды от имени любого пользователя. Третье значение ALL говорит о том, что учётная запись root может выполнять команды от имени любой группы. И, наконец, последнее значение ALL указывает на то, что данное правило применяется ко всем выполняемым командам.
Также, рассматриваемый файл содержит строку, задающую правила полномочий sudo для групп.

Имена, которые начинаются со знака % , указывают на то, что речь идёт именно о названиях групп, а не об именах учётных записей. В остальном данная настройка идентична тому, как это описано в отношении пользователей.
Есть в файле /etc/sudoers настройка, которая выглядит как комментарий.
![]()
Несмотря на то, что строка с параметром includedir начинается со знака # , комментарием данная строка не является. Этот параметр указывает на то, что файлы, находящиеся в директории /etc/sudoers.d , также применяются для настройки полномочий sudo . Файлы в этом каталоге создаются в основном для того, чтобы определённые пользователи могли запускать определённые команды с использованием привилегий sudo . Данные файлы, также как и файл /etc/sudoers , необходимо редактировать командой visudo . Например, для того, чтобы отредактировать файл /etc/sudoers.d/mysettingsfile , следует применить следующую конструкцию:
$ sudo visudo -f /etc/sudoers.d/mysettingsfile
Использование псевдонимов
При организации данных по разным пользователям и группам в файле /etc/sudoers полезно использование различных псевдонимов. Вот так выглядят записи в /etc/sudoers , соответствующие трём разным группам пользователей:
User_Alias GROUPA = user1, user2, user3 User_Alias GROUPB = user4, user5, user3 User_Alias GROUPC = user1, user4, user5
Важно помнить, что названия групп должны начинаться с заглавной буквы. Следующей строкой для членов группы GROUPA мы дадим разрешение на запуск обновления базы данных apt :
GROUPA ALL = /usr/bin/apt update
Подобным же образом мы можем дать участникам группы GROUPC разрешение на перезагрузку операционной системы. Для этого необходимо создать псевдоним, содержащий команды на перезагрузку системы. Такой псевдоним мы назовём, например, RSTRT . После чего участникам группы GROUPC нужно будет выдать разрешение на запуск этих команд.
Cmnd_Alias RSTRT = /sbin/restart, /sbin/reboot GROUPC ALL= RSTRT
В файле /etc/sudoers существует возможность контролировать реакцию утилиты sudo при её вызове. Например, вы можете разрешить пользователям выполнять какую-либо команду с использованием полномочий root , но без необходимости пользователю вводить свой пароль. Для таких случаев применяется опция NOPASSWD . Так будет выглядеть запись в /etc/sudoers , разрешающая запуск команды apt update участникам группы GROUPB :
GROUPB ALL = NOPASSWD: /usr/bin/apt update
И кстати, в /etc/sudoers есть настройка, позволяющая изменить количество неправильных попыток ввода пароля при выполнении команды sudo . По умолчанию таких попыток разрешено 3. Но если есть желание увеличить из количество, допустим, до четырёх, то такая настройка будет выглядеть как:
Defaults passwd_tries=4
Там же вы можете изменить фразу, с помощью которой система сообщает вам о неверно набранном пароле при запуске sudo :
Defaults badpass_message="Your password is not correct!"
И эту фразу пользователь будет видеть вместо стандартной Sorry, try again.

Вместо заключения
Файл /etc/sudoers является очень мощным инструментом настройки функционирования системы. В этой ознакомительной статье мы лишь вкратце коснулись данной темы. Ну, а поскольку вы теперь знаете, что такие настройки возможны, глубину их изучения определять именно вам. Ведь применять или не применять их в работе с Linux-системами, решаете вы.
Получение прав администратора. Утилиты sudo, visudo и sudoedit

Команда sudo — это ещё один способ ущемления прав пользователя при доступе к аккаунту администратора. Он принят по умолчанию во всех дистрибутивах семейства Ubuntu, может быть задействован при инсталляции в Debian’е (хотя и по заказу) или подключён в любом другом дистрибутиве Linux.
Для убунтийца знание этой команды, ввиду умолчального отсутствия суперпользовательского пароля — практически необходимость: любое действие по установке программ или настройке чего бы то ни было, делается в дистрибутивах этого семейства через sudo . Однако она не повредит и пользователям более иных дистрибутивов, так как делает всякие настроечные и установочные мероприятия проще и безопасней.
Итак, sudo — это программа для получения прав суперпользователя (или любого иного пользователя), подобная su . Основных отличий от последней — два:
- во-первых, sudo по умолчанию требует указания пароля того пользователя, который получает права другого, а не пароля того, чьи права приобретаются; правда, это может быть изменено;
- Во-вторых, действие sudo распространяется по умолчанию только на одну команду — ту, которая указывается в качестве ее аргумента; хотя и такое поведение можно изменить с помощью соответствующих опций, о чём будет сказано позднее.
Этим достигается две цели: а) возможность выполнения пользователем административных действий без сообщения ему суперпользовательского пароля, и б) снижение риска повредить систему вследствие забывчивости. Да, есть еще и третья, дополнительная возможность, предоставляемая sudo — протоколирование действий, позволяющее определить, в результате чего система рухнула.
В элементарном виде применение команды sudo — элементарно же просто: требуется лишь указать в качестве ее аргумента имя команды, требующей исполнения, со всеми необходимыми последней опциями и аргументами. После этого запрашивается пароль запустившего её пользователя — и команда исполняется. Например, команда
$ sudo fdisk -l /dev/sda
данная от лица обычного пользователя, выведет информацию об указанном дисковом устройстве точно так же, как и данная root’ом.
Таким образом, утилита sudo в самом простом случае действует аналогично команде su -c [command] , но более удобным образом. Во-первых, её команда-аргумент не нуждается ни в каком экранировании. Во-вторых, в должным образом настроенной оболочке bash в отношении команд-аргументов и путей — аргументов последних, будет действовать автодополнение по нажатию клавиши Tab. Уже одно это определяет предпочтительность sudo супротив su . А как добиться от bash столь образцового поведения — мы рассмотрим в главе о командных оболочках.
Кстати, если от лица суперпользователя нужно выполнить подряд несколько команд, делать это следует быстро — введенный первый раз пароль по умолчанию “действует” в течении 5 минут. То есть в течении этого времени в ответ на команду sudo пароль повторно запрашиваться не будет.
Период действия пароля для команды sudo можно увеличить, уменьшить или вообще ликвидировать, чтобы аутентификация запрашивался всегда. Это достигается редактированием конфигурационного файла утилиты, к чему мы вернёмся чуть позже.
Аналогичным образом пользователь может отредактировать общесистемный конфигурационный файл, например:
$ sudo nano -w /etc/fstab
Впрочем, для редактирования общесистемных конфигов предназначена специальная команда sudoedit (или просто sudo с опцией -e ). Она не требует указания имени вызываемого для этой цели редактора: в качестве такового используется значение переменной EDITOR из окружения того пользователя, который ее вызвал. Если эта переменная не определена — а это обычно делается в профильных файлах регистрационной оболочки пользователя, — для редактирования вызывается редактор Vim (в своей упрощенной ипостаси, эмулирующей классический vi ).
В Ubuntu и Kubuntu в качестве общесистемного редактора по умолчанию целесообразно использовать nano : он достаточно прост в освоении и использовании начинающим пользователем, а возможностей для редактирования пары-тройки конфигов у него вполне хватит.Убедиться в этом можно здесь.
Как это ни парадоксально, команда sudo не исключает запуска администраторского сеанса внутри обычного пользовательского. Потому что с ее помощью можно запустить ту же команду su :
$ sudo su
И это — даже в Ubuntu’идах, где root-аккаунта как бы и нет; точнее, по умолчанию нет его пароля. Но использование sudo делает его ненужным даже для команды su . Но и задать пароль суперпользователя не запрещается — ведь для этого достаточно дать команду
$ sudo passwd
чтобы в дальнейшем использовать su обычным образом. И даже, при желании, авторизоваться root’ом при регистрации в системе.
Впрочем, и тут команда sudo предусматривает “идеологически правильный” метод, и даже не один. Это — опции -s и -i , пролонгирующие, хотя и несколько по разному, действие команды sudo на неопределённый срок, вплоть до завершения «вторичного сеанса» командой exit .
Опция -s , открывая вторичный сеанс root’а, сохраняет все переменные окружения первоначального пользователя. Однако, если к ней добавить опцию -H , то переменные эти будут заново считаны из профильных файлов домашнего каталога администратора, то есть /root, как при запуске интерактивного экземпляра шелла. Однако каталог, бывший текущим в момент ввода команды, при этом не изменится, как не изменится и вид приглашения командной строки.
Опция же -i полностью воспроизводит root-окружение, запуская его командную оболочку как регистрационную (login shell). Разумеется, при этом и текущий каталог меняется на /root, а приглашение командной строки приобретает вид, описанный в соответствующей переменной профильного файла администраторского шелла (в bash — PS1).
На практике разница между обеими формами обретения перманентных прав администратора не велика, особенно в bash . Но в zsh соответствующими настройками профильных файлов при желании можно добиться существенно разного окружения в каждом из этих случаев. Правда, насколько это нужно пользователю — большой вопрос. А вот то, что при использовании опций -H нахождение в перманентно административном режиме никак внешне не впроявляется, чревато ошибками. И делает в большинстве случаев применение опции -i предпочтительным.
К слову сказать, возможности sudo не ограничиваются запуском команд от лица администратора: задав опцию -u username , их можно выполнить и от лица того пользователя, чей логин задан в качестве её значения. Это может быть полезным при просмотре или копировании dot-файлов и dot-каталогов другого пользователя, часто открытых для чтения и изменения только их хозяину.
К слову сказать, команду sudo можно запустить так, чтобы она запрашивала пароль пользователя, от имени которого будет выполняться команда (например, администратора), а не того, кто требует его полномочий. Для этого существует опция -targetpw . А чтобы сделать требование root’ового пароля постоянным, достаточно определить, например, псевдоним типа
alias sudo -targetpw
Требование ввода root’ового пароля при запуске sudo — поведение её по умолчанию в некоторых дистрибутивах, например, как говорят, в Suse.
Команда sudo имеет еще немало опций — выше я привёл только те, которые мне приходилось использовать. Остальные легко посмотреть в man sudo . Из не перечисленных упомяну ещё опцию -b , предписывающую запускать «подсудную» команду в фоновом режиме. Она может быть полезна при выполнении долговременных действий, например, при копировании образов USB на флэшку командой dd.
Как мы только что увидели, команда sudo даёт пользователю практически неограниченные полномочия для любых как общесистемных действий, так и для манипуляции чужими пользовательскими данными. В связи с этим зададимся вопросами:
- любой ли пользователь может получить права администратора через команду sudo , и
- все ли действия по администрированию он может ее посредством выполнить?
Если говорить о семействе Ubuntu, в котором механизм этот был впервые задействован «из коробки» — то «из коробки» же ответ на первый вопрос будет отрицательным, на второй — положительным. А вообще это зависит от настроек программы sudo , которые описываются в файле /etc/sudoers . И в нем можно задать правила, допускающие к исполнению определенных команд только отдельных пользователей. В обобщенном виде это выглядит так:
username host = command
Здесь, как нетрудно догадаться, username — имя пользователя, для которого устанавливается данное правило, host — имя машины, с которой он может к этому правилу прибегнуть, command — конкретная команда, использование которой разрешается данному пользователю с данной машины. Команда должна быть дана с указанием полного абсолютного пути (то есть /sbin/fdisk , а не fdisk ). Поле описания команд может включать несколько значений, разделенных запятыми, например:
username ALL = /sbin/fdisk,/bin/mount
В Ubuntu’идах по умолчанию правила доступа пользователей к административным привилегиям описываются так:
# User privilege specificationroot ALL=(ALL) ALL
# Members of the admin group may gain root privileges%admin ALL=(ALL) ALL
То есть пользователь root, как ему и положено, может исполнять любые команды с любых хостов. А вот получить права его могут только пользователи, входящие в группу admin (аналог группы wheel , о которой говорилось в предыдущем подразделе). Пользователь, создаваемый в ходе обычной установки, автоматически становится членом этой группы — и потому все административные права ему доступны без всяких дальнейших настроек. Однако прочие пользователи, чьи аккаунты будут созданы в последствие, этой привилегии лишены. Если, конечно, они не были специально включены в группу admin .
В более иных дистрибутивах, не использующих sudo «из коробки», потребуется редактирование её конфигурационного файла — того самого /etc/sudoers , о котором упоминалось выше.
Файл /etc/sudoers — обычный текстовый, и, соответственно, его можно редактировать в любом текстовом редакторе (или, скажем, средствами ed или sed ). Однако при этом существует определенный риск что-нибудь напортачить (за счет обычных опечаток), вплоть до того, что полностью закрыть самому себе доступ к привилегиям суперпользователя. Конечно, ситуации эти поправимы — например, через перезагрузку в однопользовательском режиме. Однако, лучше в них не попадать. И потому более надежным средством модификации /etc/sudoers будет использование специально предназначенной для того утилиты — visudo .
Утилита visudo не делает ничего сверхъестественного — она просто открывает /etc/sudoers в текстовом редакторе, описываемом переменной EDITOR суперпользователя (если таковая не определена, им будет опять же классический vi — отсюда и название) и позволяет его отредактировать обычным образом, после чего выйти из редактора с сохранением результатов штатными его средствами. Однако перед этим результат редактирования проверяется на корректность. И если обнаруживается нарушение синтаксиса, принятого для /etc/sudoers , выдается соответствующее предупреждение. После которого можно вернуться к редактированию, отказаться от сделанных изменений или все-таки принять их (разумеется, под личную ответственность).
Утилита visudo не гарантирует стопроцентного успеха редактирования. Так как проверяет только соответствие синтаксиса, но не “правильность самих правил”. То есть если ошибка будет допущена в указании пути к нужной для данного правила команде — эта команда через sudo не сработает.
Впрочем, на деле это выглядит обычно гораздо проще и совсем не страшно. Так, в Fedora 11 мне в образцово-показательном конфиге /etc/sudoers пришлось лишь раскомментирвоать строку
%wheel ALL=(ALL) ALL
чтобы дать пользователю из указанной группы (а себя я туда включил заблаговременно, как было описано в предыдущем подразделе) все права, коими наделён администратор. Заодно можно было бы предоставить себе по блату и возможность использовать sudo без пароля. Для этого потребовалось бы снять комментарий со строки
# %wheel ALL=(ALL) NOPASSWD: ALL
Но я ограничился лишь тем, что сделал действие пароля более долгоиграющим, вписав (изначально отсутствующую строку
Defaults timestamp_timeout=10
где значение таймаута указано в минутах. Кстати, если изменить его на ноль —
Defaults timestamp_timeout=0
то пароль будет запрашиваться каждый раз при обращении к команде sudo .
Можно, напротив, отключить тайаут на действие sudo , ввдея для него отрицательное значение:
Defaults timestamp_timeout=-1
В этом случае пароль будет запрошен только при первом вызове этой команы.
Более пристальное вглядывание в файл /etc/sudoers легко подскажет возможности дать определённым пользователям или группам только ограниченный набор прав. Впрочем, тут уже начинаются тонкости всамделишнего администрирования. Я же просто лишил своего двойника-экспериментатора доступа к любым административным действиям, дабы пресечь все его поползновения на этом поприще. Впрочем, даже это не всегда позволяет мне с ним справляться — подобно тому, как Тимур Шаов не в силах совладать со своим лирическим героем.
Автор: alv
Сочинитель в жанре беллетристики технологической и более иной. Не рекомендуемой к прочтению информационно-неполовозрелым и литературно невинным гражданам. Посмотреть все записи автора alv
Автор alv Опубликовано 2009-07-19 2015-10-07 Рубрики Boot Init Login, System Метки login
Получение прав администратора. Утилиты sudo, visudo и sudoedit: 2 комментария
sarutobi :
Небольшие дополнения:
1. Sudo может запрашивать пароль не только текущего пользователя, но и пароль пользователя, от имени которого будет выполнятся команда — опция targetpw
2. В остличие от команды su, действие sudo логгируется — то есть в лог попадет запись о том кто и с какими правами какую команду выполнял. Это не относится к открытию новых сеансов (к сожалению) — после sudo bash или sudo -s в лог попадет только запись о новом сеансе шелл, но не о тех командах которые были выполнены в сеансе.
Danhuu :
Можно ли задать опцию -targetpw в /etc/sudoers, или только через алиасы?
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.