Работая в небольших компаниях сисадмином, всегда сталкиваешься с тем, что на IT инфраструктуре пытаются экономить как можно больше. И это ни хорошо, ни плохо. Это нормально, так у всех.
Однако, когда это твоя зона ответственности, приходится идти на разные ухищрения, чтобы дыра в безопасности не была единственным, что у тебя в этой самой безопасности есть.
Хоть многие и не поймут этой боли, но коллеги по цеху, прошедшие через малый бизнес с грустью могут вспомнить, в каких неожиданных местах могли находиться критически важные сервера.
А теперь представим ситуацию:
Мало того, что наш сервер стоит в общедоступном месте, так к нему еще и подключены клавиатура с монитором, а на дисплее виднеется приветственное сообщение с предложением ввести логин и пароль. И каждый проходящий в теории может испытать свою удачу.
Звучит утопично, но на деле - стандартная практика небольших компаний, старающихся экономить.
Как решить? Отключить консольный вход на сервер, оставив только возможность ssh подключений.
Немного теории
Для начала, стоит немного поговорить о консолях и терминалах.
В двух словах для ленивых: консоль - это физический доступ к серверу, терминал - виртуальный. Если ты подходишь к серверу и на клавиатуре вводишь логин и пароль - ты используешь консоль. Если ты подключаешься по SSH - ты создаешь терминальную сессию.
А теперь копнем немного глубже:
- Терминал - инструмент для взаимодействия с программами (любой тип: физический, сетевой, графический).
- Консоль - привилегированный терминал для управления системой (физический или виртуальный tty).
Консоль:
В современных системах консоль — это множество терминалов, но с особыми правами и доступом к низкоуровневым функциям.
Между виртуальными консолями можно переключаться с помощью комбинаций Ctrl + Alt + {F1-F12}.
При загрузке системы, ядро создает виртуальные консоли в каталоге /dev.
ls -l /dev/ | grep tty
Далее, ядро назначает первую консоль (tty1) для вывода загрузочных сообщений, а демон getty запускается на ttyN для ввода логина.
Терминал:
По сути, терминал - это программная абстракция для ввода и вывода данных. Самый простой пример терминала - это SSH подключение.
При подключении к серверу, SSH создаёт псевдотерминал (pseudo-terminal, /dev/pts/N). Если мы выведем всех активных пользователей в системе, увидим, что каждому подключению выдан отдельный терминал:
Терминал имеет очень ограниченный функционал. Он не имеет прямого доступа к системной консоли ядра, не даёт прямого доступа к функциям аварийного восстановления и не показывает ошибки ядра (только если их явно не перенаправить через dmesg -w).
Однако, терминал предоставляет интерактивный интерфейс для работы с оболочкой (bash), чего вполне достаточно для работы с сервером.
Вернемся к нашей проблеме
Нам необходимо пресечь попытки посторонних залогиниться на нашем сервере.
Значит, нам необходимо отключить физический доступ к tty (полностью отключить getty).
getty (сокращение от "get teletype") — это системная программа в Linux, которая управляет физическими и виртуальными терминалами (TTY). Её основная задача — инициализировать терминал, вывести приглашение к вводу логина (login:) и запустить процесс login для аутентификации пользователя.
Заходим на сервер и смотрим юниты:
systemctl list-units | grep getty
В ответ мы получим список всех активных tty.
Поскольку getty - это systemd демон, для выключения используем команды:
systemctl disable getty@tty{1..10}.service
systemctl stop getty@tty{1..10}.service
Вот так легко и просто. После отключения демонов, экран на сервере потухнет, приветственного сообщения больше не будет.
При этом, отключение getty для терминалов tty1–tty10, никак не повлияет на SSH-доступ, так как SSH-сервер работает независимо от getty.