Недавно я писал о выпуске с открытым исходным кодом нашего «всегда зашифрованного» дистрибутива K8s. Созвездие.

Этот пост о беге Ракета.Чат на Constellation, который дает ну «всегда зашифрованный» Rocket.Chat 🙂

Это круто, потому что «всегда зашифрованный» Rocket.Chat защищает всю серверную часть Rocket.Chat от (облачной) инфраструктуры и гарантирует, что все данные всегда зашифрованы — даже во время обработки в памяти.


Что такое Созвездие💫?

Идея Constellation состоит в том, чтобы защитить целые кластеры K8s от облачной инфраструктуры с помощью виртуальных машин Confidential, которые доступны на последних серверных процессорах AMD EPYC. Constellation гарантирует, что все данные в кластере всегда зашифрованы (даже во время обработки) и недоступны из инфраструктуры. Основываясь на функции удаленной аттестации ЦП, Constellation делает ее доступной для инженера DevOps.


Что такое Rocket.Chat🚀?

Rocket.Chat — это коммуникационная платформа с открытым исходным кодом. Проще говоря, это чат-сервер с веб-интерфейсом. Думайте об этом как о самостоятельной альтернативе Slack. Его веб-сайт рекламирует его как «безопасную и совместимую коммуникационную платформу».


Зачем нам «всегда зашифровано»🔒 Rocket.Chat🚀?

Rocket.Chat предлагает шифрование сообщений E2E, но с некоторыми ограничениями. недостатки для UX (например, больше нет поиска, и пользователю нужно управлять ключом вручную), а также, концептуально, не может защитить метаданные, конфигурации сервера, код и т. д.

Инфраструктурная поверхность атаки Rocket.Chat

Следовательно, различные злоумышленники на основе инфраструктуры, например, кто-то с root-доступом к узлу K8s, все еще могут многому научиться и манипулировать. На самом деле, такой злоумышленник может даже внедрить вредоносный код JS в клиентские сеансы и слить ключи шифрования Rocket.Chat E2E или текстовые сообщения или просто отключить шифрование. Так что, вероятно, будет справедливо сказать, что E2E-шифрование Rocket.Chat в основном помогает против пассивных злоумышленников, которые могут читать или перехватывать некоторые данные на стороне сервера.

Если мы хотим защититься от активных злоумышленников с картинки выше, нам нужен «всегда зашифрованный» Rocket.Chat 💪


Запуск Rocket.Chat🚀 на Constellation💫

Запустить Rocket.Chat на Constellation оказалось довольно просто. На первом шаге я созданный кластер созвездия:

constellation create --control-plane-nodes 1 --worker-nodes 2 -y
constellation init
export KUBECONFIG="$PWD/constellation-admin.conf"
Войти в полноэкранный режим

Выйти из полноэкранного режима

Обратите внимание, что я создал свой кластер в Azure. Если у вас нет подписки на Azure или GCP, но вы все равно хотите попробовать, есть также МиниСозвездиекоторый можно запускать локально и который не требует оборудования для конфиденциальных вычислений.


Установка Rocket.Chat

Моя цель состояла в том, чтобы сделать Rocket.Chat доступным по собственному URL-адресу с помощью TLS. Для этого я установил и настроил следующие компоненты с помощью чартов Helm на моем только что созданном кластере Constellation:

  1. Ингресс-контроллер NGINX
  2. сертификат-менеджер для управления сертификатом TLS
  3. Созвездие azuredisk-csi-драйвер чтобы получить зашифрованное постоянное хранилище в Azure (обратите внимание, что оно будет автоматически установлено с предстоящим выпуском Constellation 2.2)
  4. Окончательно, Ракета.Чат себя, что также приносит MongoDB

Если вы не в настроении делать это вручную, мы также создали комбинированная диаграмма Helm. На диаграмме подробно показано, как необходимо настроить каждый компонент. После того, как вы установите желаемое имя хоста в значения.yamlдиаграмму можно установить следующим образом (при условии, что GoDaddy является поставщиком домена):

export GODADDY_API_KEY=<your creds here>
export GODADDY_SECRET_KEY=<your creds here>
export MONGO_USER_SECRET=$(openssl rand -base64 32)
export MONGO_ROOT_SECRET=$(openssl rand -base64 32)
helm dependency update ./rocketchat
helm upgrade rocket-infra ./rocketchat --install --namespace default --set infra.enabled=true --set apiKey=$GODADDY_API_KEY --set secretKey=$GODADDY_SECRET_KEY
helm upgrade rocket-app ./rocketchat --install --namespace default --set app.enabled=true rocketchat.mongodb.auth.password=$MONGO_USER_SECRET --set rocketchat.mongodb.auth.rootPassword=$MONGO_ROOT_SECRET
Войти в полноэкранный режим

Выйти из полноэкранного режима

Сделанный! 🏃‍♂️🏁

Результат находится в открытом доступе на Не стесняйтесь подойти и сказать «привет» 🙂


Что это нам дает?

Rocket.Chat работает на Constellation
Запуск Rocket.Chat на Constellation гарантирует, что все наше развертывание, включая MongoDB и все другие компоненты, которые мы установили выше, защищены от инфраструктуры и что все данные всегда зашифрованы.


Что это значит?

Constellation гарантирует, что все узлы K8s работают на конфиденциальных виртуальных машинах (CVM) на базе AMD. CVM строго изолированы от хоста и остаются зашифрованными в памяти во время выполнения. Constellation также гарантирует, что все узлы работают с одним и тем же минимальным неправильныйобраз узла на основе.


Как Constellation обеспечивает эти свойства?

Constellation использует аппаратную функцию удаленной аттестации CVM. Constellation CLI использует удаленную аттестацию для проверки первого узла в кластере и для начальной загрузки безопасного подключения к кластеру. Все последующие узлы, которые создаются в кластере, проверяются существующими. В процессе проверки проверяется, работает ли «хороший» образ узла на «хорошем» оборудовании с «хорошей» конфигурацией. Constellation знает, что такое «хороший» образ узла, потому что мы подписываем и публикуем измерения (т. е. хэши) каждого выпускаемого образа узла.

После проверки узла он получает доступ к VPN на основе Cilium/Wireguard, которая используется всеми узлами. Верифицированный узел также получает ключ для шифрования хранилища. Узлы гарантируют, что все данные, которые они записывают в сеть или в хранилище, зашифрованы. Администратору K8s не нужно заниматься управлением ключами. Все происходит автоматически.

Если сложить все это вместе, то получится кластер K8s, который

  1. хранит все данные в зашифрованном виде в сети, в хранилище и в памяти.
  2. изолирован от базовой инфраструктуры (включая гипервизор и хост-ОС).
  3. проверяется на основе «удаленной аттестации».

Созвездие документы получить более подробную информацию об архитектуре и функциях безопасности.


А как насчет пользовательских подключений?

Пользователи подключаются к Rocket.Chat через браузер, например, просматривая . Подключения TLS к Rocket.Chat на Constellation завершаются внутри CVM, поэтому шифрование является сквозным.

Отображать сертификат TLS в браузере

Но откуда пользователь знает наверняка? К сожалению, нет прямого способа для пользователя сказать. Однако они могут вручную проверить сертификат TLS (нажав на значок замка в строке браузера) и подтвердить у своих коллег, является ли это ожидаемым сертификатом. Отпечаток SHA-256 созданного мной сервера: CB 2C 2D 96 E6 B2 59 9D DC FD 99 C5 7A 80 58 60 3C A1 22 99 6D 28 BF FA AD 5B F0 52 EF F0 31 C5, кстати. 🙂

В идеале должен существовать плагин для браузера, который позволит закрепить сертификат для домена. В идеале подключаемый модуль также мог бы проверять аппаратные операторы удаленной аттестации. Это дело будущего 🙂 Даже без такого плагина Rocket.Chat на Constellation защищает от многих типов инфраструктурных атак и случайных утечек данных.


Заворачивать

Надеюсь, вам понравилось это прохождение. Лично я в восторге от возможностей, которые открывают конфиденциальные вычисления и Constellation. Что вы думаете? Любые другие приложения, которые вы хотели бы видеть, стали 🪄 «всегда зашифрованными»?

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

Что вы думаете о «всегда зашифрованных» Rocket.Chat, Constellation или конфиденциальных вычислениях в целом?