Найти в Дзене
Записки сисадмина

Linux. getty. Отключаем консольный вход.

Оглавление

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

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

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

А теперь представим ситуацию:

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

Звучит утопично, но на деле - стандартная практика небольших компаний, старающихся экономить.

Как решить? Отключить консольный вход на сервер, оставив только возможность ssh подключений.

Немного теории

Для начала, стоит немного поговорить о консолях и терминалах.

В двух словах для ленивых: консоль - это физический доступ к серверу, терминал - виртуальный. Если ты подходишь к серверу и на клавиатуре вводишь логин и пароль - ты используешь консоль. Если ты подключаешься по SSH - ты создаешь терминальную сессию.

А теперь копнем немного глубже:

  • Терминал - инструмент для взаимодействия с программами (любой тип: физический, сетевой, графический).
  • Консоль - привилегированный терминал для управления системой (физический или виртуальный tty).

Консоль:

В современных системах консоль — это множество терминалов, но с особыми правами и доступом к низкоуровневым функциям.

Между виртуальными консолями можно переключаться с помощью комбинаций Ctrl + Alt + {F1-F12}.

При загрузке системы, ядро создает виртуальные консоли в каталоге /dev.

ls -l /dev/ | grep tty

Далее, ядро назначает первую консоль (tty1) для вывода загрузочных сообщений, а демон getty запускается на ttyN для ввода логина.

Терминал:

По сути, терминал - это программная абстракция для ввода и вывода данных. Самый простой пример терминала - это SSH подключение.

При подключении к серверу, SSH создаёт псевдотерминал (pseudo-terminal, /dev/pts/N). Если мы выведем всех активных пользователей в системе, увидим, что каждому подключению выдан отдельный терминал:

-2

Терминал имеет очень ограниченный функционал. Он не имеет прямого доступа к системной консоли ядра, не даёт прямого доступа к функциям аварийного восстановления и не показывает ошибки ядра (только если их явно не перенаправить через dmesg -w).

Однако, терминал предоставляет интерактивный интерфейс для работы с оболочкой (bash), чего вполне достаточно для работы с сервером.

Вернемся к нашей проблеме

Нам необходимо пресечь попытки посторонних залогиниться на нашем сервере.

Значит, нам необходимо отключить физический доступ к tty (полностью отключить getty).

getty (сокращение от "get teletype") — это системная программа в Linux, которая управляет физическими и виртуальными терминалами (TTY). Её основная задача — инициализировать терминал, вывести приглашение к вводу логина (login:) и запустить процесс login для аутентификации пользователя.

Заходим на сервер и смотрим юниты:

systemctl list-units | grep getty

В ответ мы получим список всех активных tty.

-3

Поскольку getty - это systemd демон, для выключения используем команды:

systemctl disable getty@tty{1..10}.service
systemctl stop getty@tty{1..10}.service

Вот так легко и просто. После отключения демонов, экран на сервере потухнет, приветственного сообщения больше не будет.

При этом, отключение getty для терминалов tty1–tty10, никак не повлияет на SSH-доступ, так как SSH-сервер работает независимо от getty.