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

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

Вводные

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

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

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

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

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

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

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

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

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

В качестве системы я взял NixOS:

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

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

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

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

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

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

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

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

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

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

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

Подключаем акселерометр к ESP32 

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

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

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

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

Подключаем ESP32 к ноутбуку

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Оригинальная идея и реализация — dettlaff. Помощь в реализации — cofob. За вычитку большое спасибо коммьюнити хакспейса. За поддержку в публикации спасибо хостингу Aeza.

Комментарии (31)


  1. zenhower
    01.04.2024 12:40
    +3

    Дочитал до конца, вполне зрелый проект! Подобную услугу могли бы предлагать и крупные хостеры (если не перегибать палку со ... светом, конечно).


    1. xtended
      01.04.2024 12:40
      +4

      Но нейротоксин таки стоит оставить!


    1. uuger
      01.04.2024 12:40

      Подобную услугу могли бы предлагать и крупные хостеры

      вы имеете в виду школьный звонок или ещё что-то? потому что крупные хостеры уже давно предлагают весьма широкий набор услуг по физической защите серверов: охрана 24/7, пожаротушение, опечатанные и закрытые на второй замок стойки, ключи от которого есть только у заказчик, удалённые "ключницы" для систем аппаратного шифрования, находящиеся за пределами здания, где стоит основное оборудование.


    1. YegorP
      01.04.2024 12:40

      Вы про колокейшн, которому сто лет в обед?


      1. zenhower
        01.04.2024 12:40
        +1

        Да, колокейшн с датчиком поднятия и с нейротоксином. Вы настолько серьёзно восприняли первоапрельскую статью?


  1. middtho
    01.04.2024 12:40

    Очень даже интересно) Не факт что будет применено, но интересно и подробно)


  1. fat_dude
    01.04.2024 12:40
    +4

    Нож спецназовца из группы захвата делает чик-чик уху. Всегда очень интересно почитать как извращаются с безопасностью в тех или иных местах, но сколько живу, все истории заканчивались терморектальным криптоанализом.


    1. M_AJ
      01.04.2024 12:40

      Как он поможет, если пароль неизвестен тому, кого пытают?


      1. fat_dude
        01.04.2024 12:40
        +1

        Сдаст того, кто потенциально может знать пароль, например.


        1. M_AJ
          01.04.2024 12:40
          +1

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


          1. xdettlaff
            01.04.2024 12:40

            Да, все так. Ещё существует набор технических решений для борьбы с "терморектальным криптоанализом". Но эта тема тянет на отдельную статью :)


    1. Kasyan666
      01.04.2024 12:40

      xkcd: "Security".


  1. garwall
    01.04.2024 12:40
    +2

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


  1. rostislav-zp
    01.04.2024 12:40
    +1

    А про запрос пароля на загрузку через сеть,где можно почитать?



  1. GennPen
    01.04.2024 12:40

    В одно время у нас заказывали системники со специальными датчиками перемещения, которые подключались параллельно обычным Chassis Intrusion. На датчиках были MPU6050 и какой то контроллер, скорее всего какая то тинька.
    По мне так это более элегантное решение, но не для ноутбуков.


    1. xdettlaff
      01.04.2024 12:40

      Могу рекомендовать элегантное решение для ноутбуков: модели-трансформеры со встроенным акселерометром.


  1. maikuss
    01.04.2024 12:40

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


    1. xdettlaff
      01.04.2024 12:40

      их достаточно было отключить в биосе


      1. maikuss
        01.04.2024 12:40

        Один из внешних USB перепаян и работает. На Thinkpad можно отключать в биосе USB порты по выбору?


        1. xdettlaff
          01.04.2024 12:40

          К сожалению, выборочно отключить нельзя. Если бы мне хватило ума использовать USB с материнской платы, я бы выключил внешние USB-порты. Я знаю, что включённые USB-порты потенциально могут служить источником эксплуатации уязвимостей.

          У меня есть идеи для использования портов в будущем, но об этом во второй части, если она когда-нибудь выйдет :)


  1. YegorP
    01.04.2024 12:40
    +8

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


  1. tlv
    01.04.2024 12:40

    Судя по вводной части "Если система загружена, то ключи шифрования разделов хранятся в оперативной памяти и, теоретически, при физическом доступе можно считать эти ключи из модуля памяти напрямую." вы хотите защититься от атаки вроде cold boot

    В принципе, нужно понимать что для реализации такого типа атак ноутбук скорее зальют жидким азотом целиком и потом будут уже разбираться, что там за дополнительные провода из него торчат. Конечно, в голову приходит и решение такой задачи, датчик низкой температуры (не электронный, а на физических принципах, на изменении объема рабочего тела) соединенный с бойком, при понижении температуры накалывает капсюль и несколько десятков граммов Роскомнадзора под модулями оперативной памяти, и залитые азотом вашей инсталляции тоже будет не страшно.


    1. shogun2008
      01.04.2024 12:40

      От ColdBoot защитит AMD Secure Memory Encryption (SME) и Intel Total Memory Encryption (TME).


  1. alex1478
    01.04.2024 12:40

    >ssh-сервер в initramfs. Все это хранится в /boot разделе.

    Так вам можно initramfs или ядро подменить


    1. blind_oracle
      01.04.2024 12:40
      +3

      Для этого надо эту вундервафлю выключить так чтобы хозяин не заметил и разобрать.


  1. placidity_master
    01.04.2024 12:40
    +1

    А почему бы не сделать /boot раздел на флешке, которая после загрузки выдёргивается и хранится в безопасном месте?


    1. blind_oracle
      01.04.2024 12:40

      Я думаю по той же причине почему автор не вводит пароль руками, а через dropbear в initramfs - чтобы можно было ребутать удалённо.


      1. placidity_master
        01.04.2024 12:40

        Hidden text

        оффтоп: тупой вопрос, если сервис надо перезагружать, может удобнее поднять его на виртуалке ?


  1. zhengxi
    01.04.2024 12:40

    В старых ThinkPad уже есть акселерометр, для парковки HDD при падении ноутбука. Надо только разобраться как его читать.

    А Aeza - скамеры, они вам заблокируют аккаунт как только пополните его на заметную сумму. Почитайте о них отзывы перед тем как там что-то заказывать.


  1. Vetalnsk
    01.04.2024 12:40

    Выявлена уязвимость кнопки т.к. можно под неё просунуть кредитку с суперклеем )) необходим патч в виде гироскопа.