Эту заметку я хочу посвятить команде su. Когда я только начинал использовать Linux, единственным применением этой команды, которое я находил полезным, было временное переключение под "суперпользователя" root. Для этого надо было лишь набрать команду в таком виде:

su

В результате, на экран выдавался запрос пароля для "суперпользователя", и если ответ был верен, то происходило переключение подroot-а. После этого можно было выполнять какие-то манипуляции, доступные только этому пользователю, например, производить административные действия: останавливать и запускать службы, производить настройку (например, сети), монтировать и размонтировать удаленные каталоги (если, конечно, не использовалась файловая система sshfs), и так далее.

Из-за этого очевидного использования команды su я, если честно, считал, что свое название она и получила, как сокращение от "superuser". Лишь несколько позже я узнал, что с помощью этой команды можно переключиться под любого пользователя, если набрать ее следующим образом:

su -l имя_пользователя

где имя_пользователя - имя того пользователя, от имени которого хотелось бы поработать. И название произошло, на самом деле, как сокращение от "substitute user". Кстати, если запустить приведенную выше команду, работая в качестве "суперпользователя" root, то запроса на ввод пароля не последует. Во всех остальных случаях, вам придется указать пароль пользователя, от имени которого вы собираетесь работать... если, конечно, вы его знаете...

Приведенные выше примеры использования команды su позволяют переключиться и какое-то время работать от имени нужного пользователя. Для того, чтобы вернуться обратно, необходимо выполнить следующую команду:

exit

Еще один нюанс: команду можно использовать, как, своего рода, матрешку - переключившись под одного пользователя и работая от его имени, можно, не выходя, переключиться под другого пользователя. Естественно, для возврата к своему пользователю надо будет выполнить команду exit соответствующее количество раз.

Кстати, сам ключ l можно опустить, оставив лишь - - эффект будет ровно таким же. Но вот если совсем не указать -, то есть, набрать:

su имя_пользователя

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

Есть еще один удобный формат этой команды:

su -c "нужная_команда" [[-] имя_пользователя]

Таким способом можно выполнить нужную команду от имени определенного пользователя, не переключаясь под него явно даже временно. Если имя пользователя не указать, то будет подразумеваться, что вы хотите выполнить команду от имени "суперпользователя". Использование - имеет такой же смысл, как и раньше: оставить в силе окружение текущего пользователя или переключиться в окружение пользователя, от имени которого будет выполняться нужная команда.

Как я уже отмечал выше, команда su будет каждый раз запрашивать у вас пароль пользователя, под которым вы захотите работать или выполнить команду - безопасность, она такая, требует частого клавиатурного ввода. Но, как и у любого другого правила, у этого тоже есть исключения 😉. Во-первых, пароль не спрашивается у root-а: а зачем его спрашивать, "суперпользователь" и так может делать все, что душа пожелает 💪[1]. Во-вторых, такое поведение (переключение без пароля) можно организовать, в принципе, для любого пользователя - для этого надо лишь добавить его в специальную группу wheel.

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

Итак, имеем:

  • Операционная система Debian Jessie
  • Пользователь с очень редким и оригинальным именем имя_пользователя
  • Желание не набирать каждый раз пароль при необходимости воспользоваться командой su.

Казалось бы, первое, что надо сделать, это добавить нашего пользователя в требуемую группу. Но... В моем случае, группы wheel не оказалось вовсе. И я забеспокоился: раз группы изначально не существует, то, может, операционка о ней ничего не знает и, соответственно, все мои хлопоты будут напрасны? Существует лишь один способ ответить на этот вопрос - попробовать (на самом деле, способов два - и первый - почитать документацию, но... "мыжпрограммисты" 😋). Итак, создаем группу (работаем, переключившись под "суперпользователя" 😉):

groupadd wheel

Теперь можно добавить в нее пользователя:

usermod -aG wheel имя_пользователя

Как следует из документации, имея группу wheel, можно влиять на функциональность модуля pam_wheel просто редактируя файл /etc/pam.d/su. Делать это (редактировать файл) надо, работая, конечно же, от имени "суперпользователя" root. Чего можно добиться таким редактированием? Например, если раскомментировать (просто убрать символ #) в файле /etc/pam.d/su следующую строку:

#auth required pam_wheel.so

то больше ни один пользователь (кроме root) не сможет выполнять команду su. Очевидно, эта конфигурация считается самой защищенной. И вот для того, чтобы в этой ситуации разрешить конкретному пользователю использовать возможности su, как раз и производят приведенные выше манипуляции, а именно, создают группу и добавляют в нее нужного пользователя.

Теперь, когда мы знаем самую надежную и безопасную конфигурацию, можно поговорить об ее прямой противоположности - о конфигурации, которая позволяет использовать функциональность команды su совсем не вводя пароля. Для этого нужно опять отредактировать файл /etc/pam.d/su, раскомментировав строку:

#auth sufficient pam_wheel.so trust

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

Теперь про то, как обстоят дела у меня. Я ослабил безопасность системы, как только мог. Во-первых, я не стал ограничивать доступ к команде su всем пользователям - не раскомментировал строчку #auth required pam_wheel.so. Во-вторых, я добавил сам себя (своего пользователя) в группу wheel, и разрешил пользователям этой группы (то бишь, себе) пользоваться возможностями su без ввода пароля (раскомментировал строчку #auth sufficient pam_wheel.so trust). Стоит так делать, или нет - решать вам.

На самом деле, в файле /etc/pam.d/su есть еще много интересных опций и возможностей. Но прежде, чем пытаться их задействовать или отменять, внимательно прочитайте (хотя бы) комментарии в самом файле - он довольно неплохо самодокументирован. И помните: то, что вы сейчас прочитали в этой заметке - всего лишь простейшие, хотя, наверное, и самый распространенные, варианты использования команды su. Возможностей и особенностей у нее значительно больше. Но я, на сегодня, пожалуй, закончу...


  1. На самом деле, можно устроить так, чтобы пользователь root не смог воспользоваться командой su. Смысла в этом немного, но, в качестве задания для любопытных - вполне подойдет ↩︎