Источник: DeCenter
Для финансовых сервисов критически важна безопасность средств, которые находятся в их управлении.
Одна из самых главных задач при разработке централизованной биржи криптовалют — защита средств клиентов.
В рамках авторской колонки Евгений Павленко, CTO Axioma Group, рассказал на примере собственных разработок, почему хорошим способом защиты для биткоина и его форков, которые используют модель транзакций с UTXO, является многократная подпись (multisig).
Как работают криптобиржи
Клиенты вводят свои средства на биржу через специальный hot-wallet, находящийся под полным контролем биржи.
Для всех клиентов в hot-wallet создаются уникальные адреса, причем для обеспечения анонимности в блокчейне для каждой операции депозита можно использовать новый адрес.
Полученные средства никак не закрепляются за клиентом. Вывод средств с биржи может производиться с любых адресов, которые выберет алгоритм формирования транзакции.
Обычно это те адреса, на которые другие клиенты ранее внесли депозиты.
Также могут быть задействованы адреса из change-wallet, где аккумулируется сдача от предыдущих транзакций, либо адреса для работы с cold-wallet, куда в целях дополнительной безопасности поступают излишки средств, не участвующих в ежедневной операционной деятельности.
По такой схеме биржа как будто работает с кошельком в реальном мире, так как любой имеющий доступ к кошельку является полноправным владельцем его содержимого.
Поэтому в своих разработках мы решили принять меры безопасности: все оперативные кошельки были зашифрованы и перемещены в изолированное защищенное окружение, процедуры работы с которым строго регламентированы.
Администратор отправляет команду для расшифровки кошелька только в момент подписи транзакций вывода средств, а оригинальный пароль кошелька может воссоздать только владелец резервной копии (владелец биржи).
Безопасность и требования бизнеса
Однако эти меры безопасности создали проблемы для бизнес-требования — иметь неограниченный запас адресов для депозита, которые могут понадобиться клиентам в любой момент.
Тогда решили применить стандарт BIP-32 Hierarchical Deterministic Wallet (open-source реализация этого стандарта).
Эта библиотека работает для биткоина «из коробки», но ее можно адаптировать для любого форка, добавив параметры нужных сетей.
Благодаря применению BIP-32 необходимое количество адресов для депозита можно моментально создать в бирже, а затем добавить в hot-wallet в режиме watch-only, чтобы отслеживать транзакции депозита.
В момент следующей расшифровки кошелька для таких адресов воссоздаются приватные ключи, и пришедшие на них депозиты поступают в распоряжение биржи.
Больше безопасности на блокчейне
Продолжая аналогию с реальным кошельком, можно сказать, что наши разработчики положили его в сейф и поставили видеонаблюдение.
Достаточно надежно, но можно лучше: функцию сохранения средств доверить банку, а для управления нанять главного бухгалтера.
Подобное разделение ответственности на блокчейне реализовано достаточно давно: оно называется многократная подпись, или multisig.
Это частный случай стандарта BIP-16 Pay to Script Hash (P2SH), который позволяет добавлять в транзакции блокчейна дополнительные правила проверки.
Вместе с подписью транзакции вывода средств на стороне hot-wallet было решено дополнительно заверять ее второй подписью.
Новую сторону, которая добавляет вторую подпись перед отправкой транзакции в сеть, так и назвали — бухгалтерия (английский термин — co-signer).
Здесь ответственный сотрудник, перед тем как поставить свое одобрение, может изучить детали транзакции и убедиться, что она легитимна, то есть состоит из правомерных заявок на вывод средств от реальных пользователей биржи.
Для ввода средств на биржу пользователям теперь нужно выдавать специальные multisig-адреса.
Чтобы распоряжаться присланным депозитом, необходимо знать оба приватных ключа, которые были использованы для создания адреса этого депозита.
Один приватный ключ сохраняется в зашифрованном виде в hot-wallet, второй — на сервере бухгалтерии.
Для сохранения конфиденциальности ключи второй подписи должны генерироваться в том же объеме и храниться независимо от остального проекта.
Осталось решить, как теперь получить неограниченный запас multisig-адресов для работы депозитов на бирже.
Новый инструмент для мультиподписи
Анализируя пути реализации multisignature, мы обнаружили нехватку доступного работающего решения.
Multisig-адрес для депозита должен быть детерминировано получен из пары адресов (публичных ключей) — адреса из hot-wallet и соответствующего ему адреса из бухгалтерии.
Для бухгалтерии мы вновь можем применить уже знакомый BIP-32, чтобы оперировать в бирже только публичными ключами, не нарушая конфиденциальность приватных ключей.
Имея на сервере биржи пару публичных ключей, соответствующих искомому multisig-адресу, можно применить стандарт BIP-45 Structure for Deterministic P2SH Multisignature Wallets.
Этот стандарт позволяет генерировать детерминированные multisig-адреса для депозита, используя только публичные ключи.
Это единственно разумный вариант, потому что применение в этой процедуре приватных ключей от сразу нескольких сторон нарушает их конфиденциальность.
В качестве бонуса обеспечивается резервное копирование депозитов: в любой момент можно восстановить все адреса, получив публичные ключи hot-wallet и бухгалтерии.
Команда наших программистов не нашла доступных библиотек, работающих со стандартом BIP-45, и решила скомбинировать уже существующие технологии для реализации этого стандарта.
Добавив в наш toolchain библиотеку Bitcoin-ruby, мы разработали новую библиотеку, которая полностью соответствует стандарту BIP-45.
Такой подход оказался очень эффективным, так как позволил максимально быстро получить нужный инструмент, отсутствующий на рынке.
Потребовалось еще одно изменение, связанное с безопасностью средств на change-wallet.
В процессе работы проекта здесь могут накапливаться значительные суммы.
Можно пытаться минимизировать эффект, например, перечислив эти средства на cold-wallet. Мы пошли другим путем и перевели эти адреса также на схему с multisignature.
Это не потребовало изменений в архитектуре. При формировании выходов транзакции используется адрес из нового пула адресов «для сдачи», который наполняется по той же самой схеме, что и адреса для депозитов.
Результат: удобство работы и безопасность
Внедрение нового решения не сильно повлияло на существующую схему работы. Multisig-адреса для депозита по-прежнему генерируются на стороне биржи и сохраняются в кошельках hot-wallet.
Здесь же находится один из пары приватных ключей, необходимый для управления средствами. Вторые приватные ключи располагаются на новой площадке, созданной для бухгалтерии.
Все исходящие транзакции, будучи подписанными на hot-wallet, направляются на эту площадку для получения второй подписи.
Только после подтверждения эти транзакции попадают в блокчейн.
Инфраструктуру площадки для бухгалтерии мы сделали полностью независимой от основного проекта, чтобы минимизировать ущерб от возможного взлома серверов проекта.
В результате внедрения технологии multisig повысился уровень защиты средств в криптовалюте, которые пользователи доверяют бирже.
Ни один сотрудник не обладает полной информацией, которая дает возможность потратить эти средства.
Сервера hot-wallet и бухгалтерии находятся на разных площадках, их обслуживание ограничено регламентом, этим занимается ответственный персонал, не связанный друг с другом. Все приватные ключи зашифрованы.
Значительно выросла защита от внешних угроз. Чтобы получить доступ к средствам, злоумышленнику теперь потребуется последовательно взломать три независимых площадки, а также узнать пароли, которыми зашифрованы кошельки.
Резервные копии мастер-ключей для hot-wallet и бухгалтерии хранятся отдельно, в надежных местах. На основе резервных копий имеется возможность восстановить 100% инфраструктуры hot-wallet и бухгалтерии с нуля.