Самодельное облако с аппаратным ключом шифрования
Облачные хранилища удобны и прочно вошли в жизнь рабочих и колхозниц, однако, имеют ряд недостатков. Это цена за гигабайт, проблемы с приватностью данных (причём, как со стороны хакеров, так и со стороны владельцев облачного сервиса), риск блокировки аккаунта (привет гуглу) или недоступность сервиса из определённых стран (привет яндексу). В этой статье хотелось бы кратко рассказать про одну свою поделку, которую я тихо мастерю для себя и так, как я это вижу. Она не претендует на роль лучшего или уникального решения, просто мне показалось, что сделать именно так будет лучше и удобнее для пользователя.
В общем, захотелось собственное облако бесплатно, но такое, где я смогу хранить приватные данные без опасения их утечки со стороны хранилища. Для этого данные на стороне хранилища должны быть только зашифрованными и идти до хранилища уже зашифрованными.
Разумеется, я в курсе существования FreeNAS и иже с ним для организации хранилищ, в том числе и с функцией шифрования раздела. Но в них виделось несколько проблем. Например, это ключи шифрования, которые висят в ОЗУ и могут быть оттуда добыты. Либо может быть спарсен пароль, а хранилище или БД слиты. Либо просто будет получен доступ к хранилищу и данные удалены чисто из вредности, а на их место залит прон (реальный случай).
Наконец, был реальный опыт приобщения юристов к облакам, где в облаке лежал контейнер вераскрипта (утечка данных для юристов недопустима), и ничем хорошим это не кончилось. Начиная от паролей, прилепленных на монитор, и заканчивая «да я зашёл всего разок с компа отеля в Турции».
Хотелось сделать нечто простое и с одной кнопкой, а лучше – вообще без кнопки.
Мне очень понравилась концепция аппаратных криптокошельков, суть работы которых в том, что все приватные ключи хранятся в девайсе и не покидают его. Внешнее ПО загружает в кошелёк исходные данные транзакции, пользователь видит их на экране девайса и подтверждает правильность нажатием кнопки на девайсе, после чего подпись транзакции осуществляется внутри девайса, на выходе же получаем готовый скрипт. Ввод пароля осуществляется также на девайсе его кнопками. Если пользователь не дурачок и не раздаёт свои сиды по первому требованию, то безопасно пользоваться кошельком можно на любом завирусованном компе и из любой дыры, а принцип его использования понятен и логичен (всунул девайс – получил доступ, вынул – утратил доступ).
Применительно к NAS, подобный внешний девайс может выступать в роли аппаратного шифровальщика (АШ), в который загружаются нешифрованные данные, а покидают его уже зашифрованные пакеты с солью, которые, далее, идут в сеть и пишутся на удалённый диск, также зашифрованными. Бонусом получаем защиту от MITM атаки и возможность качать данные через любую интернет-дыру и с любого, даже чужого, ПК. От Диффи-Хеллмана при обмене было решено отказаться (из-за уязвимости к MITM и ненужного ИМХО усложнения).
Вторая важная функция АШ – подпись команд. Фактически, ПО на стороне хранилища выполняет не коды команд, а их скрипты. И чтобы скрипт выполнился, он должен быть правильно подписан и правильно расшифроваться приватными ключами на стороне NAS, в противном случае команда будет не корректна и проигнорирована. Иными словами, не обладающая ключами сторона не сможет считать, удалить или изменить файлы в хранилище. Синхронизация с хранилищем подтверждается аппаратно, с кнопок АШ, таким образом, если вы схватите вирус шифровальщик или кто-то получит доступ к вашему ноутбуку (источнику данных), он не сможет без вашего ведома испортить файлы в хранилище, а в облаке - сможет.
Работает АШ довольно стандартно – приватные ключи генерируются в нём рандомно из множества 2^256 (надо понажимать клавиатуру, подвигать мышкой + берутся некоторые случайные метеоданные из интернета), для нужд восстановления ключей генерируется seed фраза на 24 слова. Имея фразу, вы сможете восстановить ключи в любом другом АШ. Фразы генерируются согласно словарю BIP39 и могут быть сохранены на неэлектронных носителях или запомнены.
ПО на стороне источника (ноутбука) отправляет данные в АШ, получая назад зашифрованные пакеты. Ключи никогда не покидают АШ. Эти пакеты as is уходят в сеть по творчески переработанному протоколу DC и на стороне приёмника пишутся в одноликие файлы с расширением .hcpt. В роли единственного хаба выступает небольшой веб сервер. При получении файлов обратно, они проходят через АШ и синхронизируются с каталогом на источнике. Также есть возможность выкачать каталог без расшифровки, но для подписи команды всё равно понадобятся ключи и АШ.
Если вдруг требуется расшифровать данные на стороне приёмника (например, в роли приёмника у вас домашний ПК с выделенным под хранилище диском) надобно внедрить АШ в приёмник и вежливо попросить софтину извлечь файлы. Будет создана копия каталога с расшифрованными файлами. Это не очень удобно, но пока так. В будущем хочу допилить нормальный гуй с расшифровкой на лету, а-ля VeraCrypt, но пока это консольные программы, существующие только под виндой.
Также, АШ обучен при подключении прикидываться сначала HID устройством (стандартной клавиатурой) и запускать своё приложение автоматически при подключении. Приложение проверяет свою копию при запуске и автоматически закрывается после отключения АШ.
Сам АШ построен на базе FPGA серии iCE40 от Lattice и STM32 микроконтроллера, подключается через USB 2.0 full-speed и существует в виде паянного/перепаянного прототипа. Экран и кнопки управления пока на разъёме, т.к. приоритетным было отладить шифрование.
Что касается самих ключей шифрования, то хранятся они, сами будучи зашифрованными 4х символьным паролем, в одной куче с остальными изменяемыми данными в ПЗУ АШ. В отличие от крипто кошельков я не стал использовать защищённые чипы (ST31H320 и т.п.), т.к. если вас зажопит ФСБ/АНБ, вы им сами всё расскажете, а против гопоты и мамкиных хакеров такой защиты будет достаточно.
Ввод пароля осуществляется также, как и у криптокошельков – двумя кнопками на АШ. В выбранном разряде появляется случайное число от 0 до 9 и далее вы должны двумя кнопками вверх или вниз смотать значение до нужного и подтвердить выбор одновременным нажатием двух кнопок. Таким образом, подбор пароля, даже с применением автоматизированных средств, превращается в увлекательный и продолжительный процесс.
Пока планируется реализовать следующее:
0. Сделать нормальный просмотрщик файлов а-ля дропбокс. Чтобы хотя-бы имена файлов вытаскивало на лету.
1. Собрать АШ в красивый корпус с дисплеем и кнопочками.
2. Отладить взаимодействие с человеком и аппаратный интерфейс, исключить человеческие ошибки.
3. Перевести АШ на USB 3.0, т.к. в локальных сетях ограничения скорости 2.0 уже вполне заметны.
Буду рад любым мнениям, конструктивной критике и предложениям!
*****
UPD. Поскольку многие выразили опасение по поводу неудобства и сложности восстановления погибшего АШ путём ввода сид фразы, то привожу два видео, демонстрирующие как процесс можно упростить без потери безопасности: