Радикальная защита селфхостинга. Уровень: хардвар и хардкор

Сейчас у многих есть свой личный сервер. Насколько вы задумывались о безопасности? Настроили вход по ssh-ключам, firewall и на этом всё? Давайте поговорим про РЕАЛЬНУЮ безопасность.

Эта статья о том, как запариться, распилить свой ноутбук болгаркой, вставить туда микроконтроллер и интегрировать всё это с умным домом. Или по-простому: радикальная защита селфхостинга — уровень «хардкор».

Вводные
У меня был старый ноутбук Thinkpad t440p, который лежал без дела. Я решил сделать на нем селфхостинг.

543b40c828651b243d1bb531ac7550fb.png

Дома хостить для меня не вариант — у меня проблемы с электричеством в доме и плохой интернет, да и не подходит цифровому кочевнику размещать оборудование в съёмной квартире.

К счастью, в моем городе есть мастерская, в которой уже есть бесперебойное питание, стабильный интернет и белый IP. Но проблема в том, что в мастерская — это публичное пространство, в которое может зайти любой желающий.

Как же защитить сервер от физического воздействия, чтобы никакой злой дядька не смог трогать сервер?

Мы будем решать эту задачу последовательно, уровень за уровнем.

Уровень 0: Софтварная защита. Шифрование

Для шифрования дисков я настроил LUKS — теперь нужно вводить пароль, чтобы загрузиться в систему.

Чтобы не бегать в мастерскую и вводить пароль после каждой перезагрузки, я настроил ssh-сервер в initramfs: он спрашивает пароль и загружает систему. Все это хранится в /boot разделе.

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

В качестве системы я взял NixOS
Мой системный конфиг
Мой NixOS модуль шифрования

Уровень 1: Хардвар. Спускаемся глубже

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

Надёжность означает, что ноутбук должен меньше зависеть от стабильности электричества и интернета, к которому подключен. К счастью, у моей модели есть 4G-модем со слотом для SIM-карты, это означает, что у меня всегда будет резервный канал для интернета. В качестве резервного источника питания я докупил расширенный аккумулятор. Люблю старые синкпады.

Физическая безопасность — это более сложная и интересная проблема. Если система загружена, то ключи шифрования разделов хранятся в оперативной памяти и, теоретически, при физическом доступе можно считать эти ключи из модуля памяти напрямую. А как защитить работающий ноутбук?

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

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

Определять, что сервер «трогают», я решил с помощью обычного акселерометра, такого же, как в телефоне.

Чтобы подключить к ноутбуку акселерометр, мне понадобился микроконтроллер. Получился мини компьютер в компьютере.

Я выбрал ESP32, однако, если вам хочется, можете взять и Raspberry Pi (в мой ноутбук он влезает).

Таким образом у нас появляется две задачи: подключить акселерометр к ESP32 и подключить ESP32 к ноутбуку изнутри.

Подключаем акселерометр к ESP32
После того, как я просидел пару дней, гугля распиновку под свою вариацию ESP32, у меня получилось что-то подобное:

04be81610301baec6f7ed05df9ff5648.png

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

По-быстрому спаяв данный прототип, я запихнул его в ноутбук, написал код и он заработал!

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

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

Именно поэтому я выпаял внешний USB-порт, и припаял к нему провод внутри корпуса.

Делюсь мудростью: можно было поступить умнее и найти внутренний USB на материнской плате, тогда не придётся оставлять машину калекой. Но я не нашёл.

6c435f9576855c748a415ab1751284ed.jpg

Теперь снаружи ноутбук выглядит как-то так. Страшно? А мы только начали!

8722b52e0db0e952453284e239ffd2c3.jpg

Размещаем микроконтроллер с акселерометром в ноутбуке
Я купил заглушку для DVD-дисковода и провел шнур туда.

28796ee6ef97d1bf9dc612bf9c4677cd.jpg

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

Вот фото в упрятанном состоянии, тут видно как размещена плата ESP32 и как уложен провод от USB-порта. Заправлялось все так же, как одеяло в пододеяльник.

d6bed0c3370a9760c5b582e71f33d942.jpg7d677aaf669a3d957b88442a3c8e32f6.jpg

А вот результат, данные от акселерометра приходят в операционку:

Что делать, если ноутбук чует неладное?

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

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

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

Бота для уведомлений я написал на расте. Я скомпилировал бота в статический bin файл, который может вызываться любым скриптом. Теперь каждая часть системы безопасности может отправлять уведомления. Уведомления могут рассылаться по двум разным спискам: админов и пользователей.

911bc65a435afe4ce3b5e184e872d417.png

Ещё я сделал простенький скрипт, который проверяет открыта ли крышка ноутбука. Как только кто-то открывает ноутбук, система безопасности об этом знает. Здесь код бота.

Уровень 2: Датчик поверхности. Снизу постучали

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

Теоретически, полку под ноутбуком можно пропилить вместе с задней крышкой ноутбука — зайти через чёрный ход, как говорится. Чтобы решить эту проблему, вначале я просто поставил ноутбук на пол. Но тут же я вспомнил, что под первым этажом есть ещё и подвал, а это значит, что пол можно просверлить оттуда.

Поэтому ноутбук переехал на пол в подвале и это решило проблему пропила снизу. Но к сожалению, не решила проблему подкопа.

Что ещё мы можем предусмотреть?

Сейчас ноутбук уже кричит от малейшего прикосновения, но на этом мы не остановимся. Ведь теоретически его всё ещё можно очень аккуратно, медленно приподнять, чтобы вскрыть.

Умами мастерской была придумана кнопка на днище ноутбука, которая была бы нажата, пока ноутбук стоит, и отжималась бы при попытке ноутбук поднять.

Размечаю, как будет расположена кнопка:

34f0e7b945c0f76ac820fdebe7a93050.jpg

Подключить несложно, вот тут мы со знакомой отлаживаем работу кнопки:

Я просверлил три дырки в крышке ноутбука. Конечно же, оказалось, что они были размечены криво, и поэтому пришлось просверлить еще три.

Потом я понял, что если убрать провода под крышку, то её будет не закрыть, потому что провода мешали плотному прилеганию крышки.

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

Было решено просверлить еще три дырки для отвода проводов. Итого вышло 9 «технических отверстий» (6 запасных).

158658e346ce502a4044d83976e28642.jpg

Но после сборки я понял, что отвести провода под крышкой всё равно не получилось. Пришлось пустить провода снаружи, но не так заметно, как это было бы через внешний USB порт (+2 дырки, счетчик дырок: 11)

Теперь провода частично проходят с внешней стороны. В аэропорт точно не пропустят.

77cafa3225bc37dcec28e0bb7c0a6b55.png

Уровень 3: Внезапные осложнения. Улучшаем прототип

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

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

В дело на этот раз пошла Arduino Nano. Она лучше подходит под задачу, так как дешевле и не имеет ненужного нам функционала, типа Wi-Fi модуля.

bff9d5c86a33f9a176906325b6dc311f.jpgb710fe1d8dc95821c6962d1e841f2119.png

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

Но иметь удобный доступ к кишкам всё еще хотелось. В ход пошла болгарка (да простят меня любители thinkpad’ов). Было решено просто пропилить часть корпуса для легкого доступа внутрь.

04fb661d5afb235beafea026d4a72a36.jpg296e005d4139a45029a0989d33bf6075.jpg

И вот, наконец, всё встало идеально!

2d8c8fe281a886800ec19d94e5fb6749.png

Код на питоне, который считывает данные с микроконтроллера. Здесь код микроконтроллера. Модуль NixOS.

Уровень 4: Новая система тревоги

Для быстрого реагирования и пафоса был задействован найденный в мастерской механический звонок.

Силами сообщества была сделана интеграция звонка в умный дом на Home Assistant. Достаточно послать несложный запрос, чтобы снова почувствовать себя в школе.

caa2a8c4920eba13763a13cf8c27bb12.png8fad8ae4839aa9e845da4a25fb12f6db.png9d9d5e20686adc585154d81da1e5ca67.png

Из звонка получилась отличная сигнализация: громкая и тревожная.

Первый полёт прошел не очень удачно:

Также я вставил голос Glados из Portal 2 с разными едкими фразочками.

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

Пользуясь возможностью, хочу поблагодарить F0RTHSP4CE, хакспейс в Тбилиси, который стал домом для многих безумных, и не очень проектов в самых разных областях, от исскуства до embedded разработки (к примеру огнемет в туалете, но об этом как-нибудь в другой раз…)

© Habrahabr.ru