Что это, зачем, и как это может понадобиться?
Если мы посмотрим на список пользователей в Linux сразу после установки, мы, кроме
root
,
nobody
(пользователя с максимально ограниченными правами) и своего пользователя, увидим множество пользователей, созданных под конкретную подсистему или задачу, например:
bin
,
daemon
,
adm
,
operator
,
games
,
sshd
,
usbmux
,
sddm
,
pulse
,
apache
,
messagebus
и т.д.
Для чего это сделано? Если кратко — для безопасности, под каждую задачу, от запуска отдельной программы, до управления отдельной подсистемой, создается отдельный пользователь, который, даже если его взломает злоумышленник, не сможет получить доступ ко всей системе. Т.е. хакнули пользователя apache
, и у нас сдох только web-сервер Apache, админ нашел сбой, пропатчил, починил, перезапустил нужное — и все опять работает.
А почему пользователь неинтерактивный? Опять же, для безопасности, ваш пользователь, или же root
, интерактивные, они имеют доступ к терминалу, т.е. могут вводить команды и запускать другие программы из терминала/консоли. Но и в самом терминале и в программах, может обнаружиться ошибка, которая позволит получить пользователю получить нужные права, чтоб в системе навредить. Для того пользователю с ограниченными задачами и отключают доступ к терминалу, т.е., делают его неинтерактивным.
Как создать неинтерактивного пользователя?
Итак, начнем это делать на нашей тестовой системе.
Для начала создадим группу для тестовых пользователей, стандартной командой addgroup
. Выполнять надо из-под root
(или через sudo
, зависит от вашей системы), больше не буду на этом останавливаться.
groupadd testgrp
С помощью useradd
1. Самый простой способ:
useradd -g testgrp -d /dev/null -s /bin/false testusr1
где:
-g testgrp
— задать основную группу пользователя (вышесозданную testgrp
)
-d /dev/null
— задать в качестве расположения домашнего каталога нуль-устройство (/dev/null
)
-s /bin/false
— установить фиктивную оболочку (/bin/false
).
testusr1
— имя пользователя
Если опцию -d
не указать, система укажет для пользователя домашний каталог, как подкаталог с таким же именем, как имя пользователя, в /home
, хотя и не создаст его.
Это максимально неинтерактивный пользователь, у него не только установлена фиктивная оболочка (обычным пользователям устанавливают оболочку, например /bin/bash
) но также не установлен домашний каталог, т.е. пользователю просто некуда входить в системе, а также не установлен пароль. С пустым паролем Linux не пустит пользователя, впрочем, об этом ниже.
Если попытаться зайти в систему от имени этого пользователя, то получим ошибку Access denied:
login as: testusr1
testusr1@192.168.1.133's password:
Access denied
testusr1@192.168.1.133's password:
2. Если неинтерактивному пользователю все-таки нужен домашний каталог, например, для хранения конфигураций запускаемых от его имени программ, то домашний каталог вполне можно создать:
useradd -g testgrp -m -d /home/testusr2 -s /bin/false testusr2
К опциям -g
, -s
и -d
добавляется опция
-m
— автоматически создать пользовательский каталог
С помощью скрипта adduser
Скрипт adduser, это оболочка над программой useradd, который позволяет указать параметры нового пользователя в диалоговом режиме
Пример создания неинтерактивного пользователя:
Простыня с переводом под катом
Удобно, красиво, не надо вручную писать опции в командной строке, хотя простыня. Но можно и так, главное, не забыть про фиктивную оболочку /bin/false
и, при надобности, пустой пароль.
О «пустых» паролях
Каждому пользователю в Linux, который хочет получить доступ к терминалу или графической оболочке, должен быть присвоен пароль. Можно провести наглядный эксперимент.
1. Создадим с помощью скрипта adduser
нового пользователя testusr4
, только оставим ему некоторые параметры по умолчанию, т.е. домашний каталог и оболочку /bin/bash
, изменим только группу на testgrp
и зададим ему пароль.
2. Попробуем залогиниться:
login as: testusr4
testusr4@192.168.1.133's password:
testusr4@smallwolfie:~$
Получилось!
3. Выйдем из учетной записи и отредактируем файл /etc/shadow
в котором хранятся пароли пользователей (редактируем от имени root
):
— Найдем строчку, содержащую информацию о пароле пользователя testusr4
:
testusr4:$5$eUbahK8EwlYtD1Nw$ZCH7sMkg.fTwe/KsqfBh6.xrlo3K4V6WinyiqWhW5.8:19689:0:99999:7:::
— Приведем ее к такому же виду, что у пользователя, например, testusr1
:
Т.е. вместо хэша и других свойств пароля, находящегося между вторым и третьим двоеточием, впишем символ восклицательного знака, тем самым удалив их.
login as: testusr4
testusr4@192.168.1.133's password:
Access denied
Подробнее прочесть о формате файлов /etc/passwd
и /etc/shadow
Копия в PDF
Как отобрать интерактивность у уже созданного интерактивного пользователя?
Предположим, у нас есть интерактивный пользователь testusr5
и эту интерактивность надо пользователю отключить:
1. Лишить возможности пользователя входить по паролю, как это было описано выше.
2. Отредактировать файл /etc/passwd, найдя строку пользователя:
testusr5:x:1016:1008:,,,:/home/testusr5:/bin/bash
И заменить указанную оболочку (/bin/bash
) на фиктивную (/bin/false
):
testusr5:x:1016:1008:,,,:/home/testusr5:/bin/false
Можно заменить запись о домашнем каталоге на /dev/null, если он не нужен, а сам каталог потом удалить с диска:
testusr5:x:1016:1008:,,,:/dev/null:/bin/false
Пользователь «одного скрипта»
Интересно, что пользователю в качестве оболочки можно подсунуть не только фиктивную оболочку или обычный shell (bash, sh, zsh и т.д.) но и конкретный скрипт. Тогда, при входе этого пользователя в систему, будет выполняться только этот самый скрипт. Главное, чтоб у пользователя были права на его исполнение.
Примечание: Хоть это уже не совсем «неинтерактивный» пользователь, но ради обобщения, пусть будет тут.
Внимание! Делайте нечто подобное, когда точно уверены в своих действиях. Если злоумышленник сможет подкорректировать такой скрипт, то сможет и нагадить в системе.
Пример:
1. Создадим интерактивного пользователя с домашним каталогом, например, testusr6
, не забыв задать пароль.
2. Залогинимся от имени этого пользователя
3. В домашнем каталоге напишем простой тестовый скрипт и дадим ему права на исполнение от имени этого пользователя.
#!/bin/bash
echo "Hello, world!"
echo "Press ENTER..."
read
4. Выйдем из системы этим пользователем, и от имени root
отредактируем /etc/passwd
таким образом.
Было:
testusr6:x:1017:1008:,,,:/home/testusr6:/bin/bash
Стало:
testusr6:x:1017:1008:,,,:/home/testusr6:/home/testusr6/hello
5. Теперь попробуем войти в систему от имени testusr6
:
login as: testusr6
testusr6@192.168.1.133's password:
Hello, world!
Press ENTER...
После нажатия ENTER сеанс завершится.
Как подобную фичу можно использовать на практике, описано здесь: Удаленная перезагрузка сервера под управлением Linux. Перезагрузка Linux без ввода пароля. (копия)