57

Изучаем GNU/Linux часть 17. Su и visudo (RHCSA)

Продолжаем изучать GNU/Linux и готовиться к сертификации от Red Hat (RHCSA).


Для тех, кто видит мои посты впервые - я стараюсь очень лёгким языком с нуля научить вас работать с операционной системой GNU/Linux. Зачем? Потому что - Стоит ли делать курс по RHCSA?


Изучаем GNU/Linux часть 16. Процессы #3: Работа с процессами (RHCSA)

Изучаем GNU/Linux часть 15. Процессы #2: Информация о процессах #2 (RHCSA)

Изучаем GNU/Linux часть 14. Процессы #1: Информация о процессах

Изучаем GNU/Linux часть 13. Bash #2: переменные (RHCSA)

Изучаем GNU/Linux часть 12. Bash #1: bash-completion, alias, type

Изучаем GNU/Linux часть 11. Стандартные потоки (RHCSA)


Ссылки на темы 1 лвла - Изучаем GNU/Linux часть 10. Текстовые редакторы nano и vi (RHCSA)


Про смену пользователя, выполнение команд от имени другого пользователя, login и non login shell и visudo. Про sudo продолжим в следующий раз.

GNU/Linux

1.2K пост15.6K подписчика

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

1
Автор поста оценил этот комментарий

ты очень круто все объясняешь! спасибо!

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

спасибо =)

4
Автор поста оценил этот комментарий

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

Недавний случай из жизни - один знакомый хелпдеск, который линукс почти не знает, при попытке дать права на файл, написал от рута chmod -R 777 / path/to/file.

показать ответы
5
Автор поста оценил этот комментарий

Мы с вами уже выяснили, что Linux – система многопользовательская. Если с помощью команды wc посчитать количество строк в файле /etc/passwd, где перечислены все пользователи (wc -l /etc/passwd), то увидим, что сейчас в системе 45 пользователей. (cat /etc/passwd) Среди них есть наш пользователь user, суперпользователь root, а остальные, которых создавали не мы, а система, считаются сервисными пользователями. Нам сегодня понадобится еще один пользователь, поэтому создадим его с помощью команды sudo useradd user2, введём наш пароль, а потом с помощью sudo passwd user2 зададим пароль для второго пользователя.


Начнём с команды su. Она позволяет менять текущего пользователя или запускать команды от имени другого пользователя. При этом нужно знать пароль этого другого пользователя. Это бывает нужно, когда у нашего пользователя нет нужных прав, либо когда нам нужно запустить какой-то процесс от имени другого пользователя, в тех же целях безопасности. Допустим, мой пользователь сейчас не может зайти в директорию /home/user2 (cd /home/user2), потому что моему пользователю отказано в правах. Я могу написать su user2, ввести пароль пользователя user2 и стать этим самым вторым пользователем, как видно в начале строки. А дальше смогу зайти в нужную директорию (cd /home/user2 ). Чтобы вернуться к моему пользователю, я могу написать exit, либо нажать Ctrl+d. Если написать просто su, либо su root, и ввести пароль рута, можно работать от рут пользователя.


Но помните мы разбирали файлы bash_profile и bashrc ? Мы там писали переменные и алиасы, и в случае с bash_profile нам нужно было перезалогинится, а в случае с bashrc нам нужно было просто запустить новый эмулятор терминала. То есть bash_profile это файл настроек для login shell, а bashrc для non login shell. Давайте сделаем вот что. У пользователя user2 (su user2) в файле bash_profile (nano /home/user2/.bash_profile) создадим переменную test1 равную test1 (test1=test1), а в файле bashrc (nano /home/user2/.bashrc ) переменную test2 равную test2 (test2=test2). Теперь выйдем (ctrl+d) и заново зайдём (su user2) и посмотрим, как обстоят дела с переменными (echo $test1, echo $test2). Как видите, сработала настройка только из bashrc, то есть non login shell. Это означает, что переменные окружения у нас остались с предыдущего пользователя. Допустим, если посмотреть переменную PATH, то можно увидеть пути к директориям /home/user/bin, а это домашняя директория первого пользователя. Также (pwd), если писать su user2, можно заметить, что директория, в которой мы находимся, не меняется (pwd).


Зачастую нужно, чтобы при логине за другого пользователя поменялось окружение, то есть чтобы применились настройки из bash_profile нужного пользователя. Для этого после su следует писать дефис (su – user2). Теперь у меня есть обе переменные (echo $test1, echo $test2), то есть считался файл ~/.bash_profile, а значит это был login shell. Также стоит заметить, что при su c дефисом поменялась и директория – раньше мы находились в домашней директории пользователя user (pwd), а после перехода (su – user2), (pwd) текущая директория - /home/user2. Кстати, чтобы понять, текущий shell – login или non login, не обязательно выдумывать каждый раз какие-то проверки с переменными, достаточно проверить значение переменной $0(echo $0. При non login shell значение будет просто bash, а при login shell -bash. И если проверить ту же переменную PATH (echo $PATH), можно увидеть, что теперь здесь нет пути /home/user/bin, то есть переменные окружения не передались от предыдущего пользователя, а появились как следует. Так вот, подводя итоги – login shell – это оболочка с авторизацией, то есть она считывает настройки – те же переменные, алиасы, функции сначала с файла /etc/profile, где написано смотреть на файлы в директории /etc/profile.d/ и в файл ~/.bash_profile в домашней директории пользователя. Там также написано смотреть в файл ~/.bashrc в домашней директории пользователя, в котором также написано смотреть в файл /etc/bashrc. В случае же с non login shell, сначала считывается файл ~/.bashrc в домашней директории пользователя, затем считывается файл /etc/bashrc, который в свою очередь ссылается на файлы в /etc/profile.d/. Но приведённая схема может отличаться на других дистрибутивах.


Ладно, со сменой пользователя разобрались. Мы еще говорили, что su позволяет запускать команды от имени другого пользователя. Для этого используется ключ -c. Пример на экране (su user2 -c “touch file”, su – user2 -с “touch file”). Объясните в комментариях, почему первая команда завершилась с ошибкой, а вторая без? Ну и зачастую, su используют чтобы работать от имени root пользователя, так что для примера запустим nano от рута (su - -c “nano /etc/passwd”) и теперь мы можем редактировать файл /etc/passwd и в целом можем делать всё что угодно. Кстати, если запускать su от имени рута ( su root, su user2), то никаких паролей не потребуется, рут может логинится кем угодно.


Но у su есть один нюанс – нужно знать пароли других пользователей, если конечно вы не рут. Когда вы один админ в системе, то это не проблема. Но представьте, что есть несколько пользователей или администраторов. Давать друг другу пароли плохая идея, потому что безопасность строится на полном недоверии друг к другу, включая других администраторов. Другой администратор может умышленно вас подставить, неопытный хелпдеск может сделать ошибку от вашего имени, завтра могут уволить кого-то, а он от вашего имени может положить все сервера. Ну и если не говорить о недоверии, когда несколько админов работают от имени одного пользователя, то кто-то может что-то неправильно настроить, и потом не вспомнит или не сознается, и в коллективе формируется недоверие и в целом негативная атмосфера. Учётные записи придумали не просто так, в жизни бывает всякое, поэтому всем будет легче работать от своего имени. Ну и во вторых, когда работает несколько пользователей, допустим если есть хелпдеск и вы хотите дать ему возможность только создавать пользователей, то вроде ему и нужны какие-то права суперпользователя, но и давать пароль от рута не хочется.


Для решения таких проблем есть утилита sudo. Вы уже замечали её пару раз – с помощью неё мы устанавливали какие-то программы и создавали пользователей – потому что у нашего пользователя не было соответствующих прав. А если писать перед командой sudo – например, sudo useradd user2 – то команда useradd запускается от имени суперпользователя. Но, естественно, не любой пользователь может написать sudo и выполнить любую команду – у нашего user это работает, потому что при установке системы мы поставили галочку “сделать пользователя администратором”. Как это работает – давайте разбираться.


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


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


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


Про sudo можно говорить много, поэтому разберём его в следующий раз. Сегодня мы с вами разобрали su – который позволяет нам поменять текущего пользователя, к примеру стать суперпользователем, или запускать команды от имени другого пользователя. Но нужно понимать, что это очень опасно – даже случайная синтаксическая ошибка может испортить всю систему так, что не получится исправить, не говоря уже о каких-нибудь зловредах. А так как все мы люди, и можем ошибаться, может заесть клавиатура и всё такое – у хороших администраторов есть правило – не работать от имени рута, а при необходимости использовать sudo.