Урок 16. Права sudo пользователя - команды sudo, su

Как быть обычным пользователям, которым необходимо изменить некоторые настройки или установить программы, не имея при этом соответствующих прав? Не обращаться же им каждый раз за помощью к администратору? 

Нет. Для этого они могут стать временно другими пользователями с более высокими привилегиями либо выполнить необходимые действие от имени суперпользователя.

Чтобы временно стать другим пользователем выполним команду su [-] имя_пользователя 

Система запросит пароль этого пользователя и можно продолжать работать. Одновременно изменится текущий каталог, то есть перейдет в домашний каталог  данного пользователя. Например, так:

Изменение текущего пользователя

Причем сеанс работы, запущенный от изначального имени все еще будет активен. Для возврата к нему выполним Ctrl + D или наберем команду exit. В работе команды su есть пара нюансов. 

Если ввести просто su без аргументов и опций, то вход будет осуществлен от имени суперпользователя root. Причем текущий каталог не изменится:

Каталог пользователя остался прежним

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

А можно войти в систему от имени другого пользователя и остаться в своем домашнем каталоге? 

Да, для этого введем команду su имя_пользователя:

Изменение текущего пользователя без изменения длмашнего каталога

Однако, если ввести su - , то система перейдет в домашний каталог суперпользователя:

Изменение текущего пользователя и домашнего каталога

При выполнении команды su необходимо знать пароль другого пользователя и в этом и заключается проблема. Так как обычно люди паролями не делятся, а если и поделятся, то это может привести к нежелательным последствиям. Поэтому существует другой способ временно получить права пользователя с расширенными привилегиями. Для этого достаточно выполнить sudo [опции] команда 

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

Но тогда какое отличие sudo от su? В обоих случая можно выполнять любые действия. 

Отличия есть. Во-первых, пароли суперпользователя и других администраторов скрыты от обычных пользователей. Во-вторых, не каждый пользователь может выполнять команду sudo

В некоторых системах Linux уже по умолчанию существует специальная группа sudo, которая наделена расширенными привилегиями. Пользователи, которые состоят в данной группе могут выполнять команду sudo.  

То есть, если добавить обычного пользователя в группу sudo, то с помощью команды sudo он сможет выполнять абсолютно любые команды, как и суперпользователь? 

И да и нет. Команду sudo можно гибко настроить под любые нужды. Можно ограничить привилегии определенным пользователями, а можно наоборот предоставить полную свободу действий. 

И как это сделать? 

Существует специальный файл настроек команды sudo, который находится в /etc/sudoers. Когда запускается команда sudo она проверяет файл sudoers, и если там имеется необходимая запись, то выполняется запрошенная пользователем команда. В противном случае выдается сообщение об отсутствии прав доступа. Вот как выглядит файл sudoers:

Содержимое файла sudoers

Теперь попробуем разобраться по порядку, что в нем указано. 

User_Alias  - псевдоним пользователей. С помощью псевдонима (Alias) определяют группу пользователей. Например, на рисунке уже указаны некоторые из них:

Псевдонимы пользователей в sudoers

где псевдоним ADMINS обозначает перечисленных пользователей vasya, petya, admin

Что нам это дает? 

Когда определенным пользователям нужно ограничить/расширить доступ, то всегда легче это сделать, объединив их всех в одну группу, особенно когда этих пользователей очень много. Так будет проще администрировать и в этом мы убедимся позже. 

Runas_Alias - псевдоним пользователей, от имени которых будут запускаться определенные команды. Смысл их такой же, как User_Alias:

Псевдоним пользователя для запуска команд

Host_Alias - псевдоним компьютеров (хостов). Каждый компьютер имеет свое имя. Пользователи могут подключаться к удаленной системе (серверу) через свои или чужие компьютеру. Чтобы ограничить доступ к серверу с определенных компьютеров создается список этих компьютеров, которые объединяются в одну группу:

Псевдоним хостов в sudoers

Cmnd_Alias - псевдоним команд. Объединяет в группу список команд, которые можно или нельзя выполнять:

Псевдоним команд в sudoers

В данном псевдониме необходимо указывать полный путь (не относительный) к командам, иначе ничего работать не будет.

Все псевдонимы принято писать заглавными буквами. В описании я упомянул, что псевдоним по сути является группой. Однако не следует их путать со стандартной группой самих пользователей, которые уже имеются или могут быть созданы в Linux. 

Теперь подходим к самому интересному. Чтобы ограничить или разрешить определенные действия определенным пользователям используется следующая запись: Пользователь  Компьютер = (Целевой пользователь) Команда

Отображение привилегий пользователей для запуска команд

Что же означает эта запись. Для примера рассмотрим такую запись: vasya pc = (admin) /sbin/shutdown 

Она означает следующее: пользователь vasya с компьютера pc от имени пользователя admin может выполнять только команду /sbin/shutdown, то есть выключать систему.

Иными словами пользователь vasya работает на компьютере pc. Чтобы выключить систему он набирает команду sudo -u admin shutdown 

А можно просто набрать sudo shutdown

Нет. так как в данном случае выполнение идет от имени root, что является запрещенным действием для данного пользователя. Здесь мы указали только одного пользователя. Однако, когда у нас их больше, то здесь пригодятся псевдонимы (alias), рассмотренные выше. 

Например, ADMINS SECURITY = (root) ALL означает, что пользователи, входящие в псевдоним ADMINS (petya, vasya) с компьютеров, входящих в псевдоним SECURITY (server1, server2, server3) могут выполнять от имени пользователя root абсолютно любые (ALL) команды. 

Когда данные пользователи выполняют команду sudo, то система запросит их личный пароль и продолжит выполнять запрошенные действия. 

Немного поменяем запись в sudoersADMINS SECURITY = (root)  NOPASSWD: ALL 

Теперь данным пользователям вообще не нужно вводить пароль. Рассмотрим еще пару примеров, чтобы лучше понять принцип работы. 

ALL  ALL = (ALL)  ALL - все пользователи на любых компьютерах от имени любых пользователей могут выполнять любые команды. 

ALL  localhost = /sbin/shutdown -h now - все пользователям разрешается на локальном компьютере выполнять команду shutdown, то есть выключать компьютер локально. 

%student ALL = !/sbin/ - пользователям, входящие в группу student (перед группой всегда стоит знак %), запрещено выполнять все  команды из каталога /sbin. Знак ! здесь означает обратное действие (отрицание не). 

Чтобы подробнее ознакомиться со всеми параметрами рекомендую ознакомится с описанием man sudoers. 

А как можно редактировать файл sudoers

Для редактирования нужно обладать правами root, само редактирование выполняется командой visudo. Она позволяет безопасно отредактировать файл и сообщит об ошибках. Поэтому крайне не рекомендуется использовать обычные редакторы вроде nano, vim, emacs и так далее. 

А как узнать может ли пользователь выполнять sudo или нет? 

Для этого введем команду sudo -ll. Иногда может потребоваться ввести пароль и система отобразит можно ли запускать sudo или нет:

Отображение привилегий sudo пользователей

Список команд, которые мы изучили: 

su - имя_пользователя - вход в систему от имени пользователя

su -  - вход в систему от имени суперпользователя

sudo команда - выполнение команды от имени суперпользователя

sudo -u имя_пользователя команда - выполнение команды от имени пользователя

visudo - запуск редактора файла sudoers

sudo -l - список разрешенных команд для sudo у текущего пользователя

sudo -ll - подробный список разрешенных команд для sudo у текущего пользователя