Навряд ли кто-то из читателей хотя бы раз в жизни не арендовал виртуальный выделенный сервер (VPS). Это просто и весьма дёшево: для личного блога, игрового сервера, учебных целей и так далее.
Случается, что на подобном сервере нужно хранить чувствительную информацию: криптографические ключи, личную и корпоративную переписку и тому подобное. Главным инструментом превентивной защиты является шифрование диска, которое предотвратит утечку информации при попадании дампа виртуальной машины в руки злоумышленника. В этой статье рассмотрим отключение прямого доступа к эмулятору терминала, что позволит подключаться к серверу исключительно через ssh, а всем недобросовестным хостерам увидеть милую кошечку с радугой.
Пример будет разобран на операционной системе Debian, использующей systemd. Главная задача заключается в отключении служб, отвечающих за инициализацию терминала: systemd-logind и getty.
Первым всегда инициализируется терминал tty1. Отключаем его командой: systemctl disable getty@tty1
. Оперировать остальными терминалами позволяет утилита getty-static. Также отключаем ее: systemctl disable getty-static
.
Перезапустив сервер, в веб-терминале VNC вместо строки приглашения с просьбой ввести логин, увидим чёрный экран. Однако, при нажатии Ctrl+Alt+F2 мы попадем во второй терминал, так как активна служба systemd-logind, которая обрабатывает манипуляции с терминалами. Блокируем ее, изменяя конфигурационный файл /etc/systemd/logind.conf
:
[Login]
NAutoVTs=0
ReserveVT=0
Теперь подключиться к серверу возможно только через ssh, прямой доступ не работает. Святое место пусто не бывает, поэтому черноту, которая заменила терминал, заменим на жизнерадостную заставку с Nyan cat.
Устанавливаем: apt-get install nyancat
. Затем создаем файл сервиса:
nano /etc/systemd/system/nyancat-tty.service
[Unit]
Description=nyancat on tty1
After=graphical.target
[Service]
Type=simple
ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/nyancat -snI
ExecStop=/bin/kill -HUP ${MAINPID}
StandardInput=tty
StandardOutput=tty
TTYPath=/dev/tty1
Restart=always
RestartSec=2
[Install]
WantedBy=graphical.target
И наконец включаем нашу службу красочной замены терминала: systemctl enable nyancat-tty.service
Теперь все попытки физического подключения к терминалу операционной системы будут выдавать милую заставку. Так как прямого доступа к управлению системой нет, к настройкам сети и ssh следует проявлять особое внимание.
Спасибо R4SAS за помощь в написании заметки.
Catslinger
Что помешает "недобросовестному хостеру" сделать дамп системы и ковырять в своё удовольствие? А вот владелец гарантированно лишается последнего шанса если SSH упадёт.
pureacetone Автор
Шифрование упомянуто в статье, как основной способ защиты. Сама же заметка посвящена ликвидации доступа к терминалу.
struvv
Так дамп ram позволяет достать ключи, не?
pureacetone Автор
Абсолютной защиты не бывает, но ее наличие увеличивает шанс на выживаемость. Это сопоставимо с бронежелетом, который часто закрывает около 60% торса, не предусматривая попадание в слабые места, а также сбоку, в ноги, руки и голову.
codecity
Вы пробовали поковыряться хотя бы 200 Мб RAM? Это кажется что 200 Мб копейки, на самом деле это размер 200 средних книг, т.е. целый книжный шкаф. Выискивать там информацию — то еще удовольствие. Особенно когда ключи хранятся в памяти подсоленные — понять где подсоленный ключ, где соль — это не так просто.
amarao
Разумеется, байты надо вручную читать, после распечатки на принтере. Ни один хаккер не догадается вбить в гугль ssh keys from memory dump и найти вот это: https://github.com/DiabloHorn/pageant_xkeys
Я уверен, что таких проектов килограммами можно найти.
codecity
Только для популярного софта, а не вашего уникального сервиса.
amarao
В 99% случаев либо никому этот софт не нужен, либо он использует стандартные библиотеки. Более того, даже не зная нифига о софте, но имея его копию, написать грепалку, которая по дампу памяти найдёт нужное (просто по регэкспу) — не то, чтобы совсем просто, но и не rocket science.
(Что-то мне подсказывает, что для всего нужного софта дампилки уже давно написаны. И кошельки у крипты, и gpg пароли...)
codecity
Криптообменник, к примеру. Софт не нужен, а ключи — нужны.
В библиотечную функцию передал ключ, получил подпись — данные из памяти потерлись. Выискать ключ среди всех переменных, особенно если ключ подсолен, исходников нет — то еще удовольствие.
amarao
А передалось оно откуда? Из программы. Которая, либо страдает паранойей (ура, хорошо), либо на php и ничего такого не думала. Тогда, зная регэксп стандартного формата ключа найти его — как нефиг делать. Вот, смотрите:
(-----BEGIN OPENSSH PRIVATE KEY-----)(.+)(-----END OPENSSH PRIVATE KEY-----)
Как вы думаете, что я найду в памяти? Этот комментарий, и....