Раскрывая секрет. Архитектура Secret

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

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

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

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

Заглянем под капот

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

Хранилище

Во-первых, ваши данные хранятся на серверах Google, там же, где находится Gmail. Это значит, что ваши секреты так же надежно защищены, как и почта (это относится к надежности записи данных на диск, которые расположены в тех же дата-центрах что и Gmail). Как бывший инженер Google с глубоким знанием бэкэнда, я уверен в этом выборе.

Несколько высокоуровневых подробностей:

  • Secret хостится на Google App Engine. Написан почти полностью на Go, но имеет некоторые компоненты на Java и Python.
  • Все данные передаваемые по проводам зашифрованы с помощью TLS.
  • Мы используем нереляционную базу данных на основе Google BigTable.
  • Все сообщения шифруются перед тем, как будут записаны в базу данных. Ключи находятся на стороннем сервисе, который поддерживает ротацию ключей.
  • Изображения хранятся на Google Cloud Storage и передаются через TLS.

Контакты. Когда мы ищем людей, которых вы знаете из ваших Контактов, мы не посылаем в открытом виде номера телефонов или e-mail на наши сервера. Сначала мы локально вычисляем хеш (с «солью»), который использует сервер, чтобы найти совпадения с другими хешами. Например, номер [+15552786005] становится [a22d75c92a630725f4], и оригинальный номер телефона никогда не покидает ваш аппарат. Это односторонняя трансформация. Иными словами, мы не знаем ваших действительных данных, в отличие от других сервисов.

Важное замечание: Несмотря на то, что мы добавляем «соль» в хеш, все же возможно сравнить хеш с номером телефона, особенно если у злоумышленника есть «соль». Мы ищем способ сделать это более безопасным (например, добавлять в хеш специфичные для пользователя данные или использовать Протокол Диффи). Если у вас есть предложения по улучшению безопасности, пишите на security@secret.ly. Эта область нам очень интересна.

Секреты. Мета данные секрета хранятся без привязки к пользователю. Вместо этого, при доставке секрета пользователю мы создаем уникальный токен для пользователя и предоставляем доступ к секрету как отношение много-к-одному. Токены находятся в ACL, принадлежащем секрету, а не пользователю. Сообщения (комментарии и посты) шифруются на сервере и расшифровываются, когда уникальный токен обменивается на секрет. Сервер никогда не возвращает персонально-зависимые данные наряду с секретом.

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

Идентификациия. Для модераторов нет никакой возможности найти пост, созданный конкретным пользователем. В случае, если нам нужно получить доступ к информации для отладки или административных целей, мы используем «Правило двух человек». Два человека должны одновременно предоставить свои ключи. В нашем случае, два админа (сейчас это основатели) должны зайти через аккаунт Google (с двух-факторной авторизацией) и запросить нужный ресурс в определенный период времени. Более подробно эта система, известная как Red October, описана в блоге Cloudflare.

Доставка

Система доставки Secret была спроектирована, чтобы соответствовать этим критериям:

  • Должна быть безопасной.
  • Должна быть быстрой.
  • Должна обучаться.

Что происходит когда вы постите

  • Пост сначала сохраняется и доставляется автору.
  • Далее асинхронный процесс определяет, кому можно еще доставить ваш пост (с кем вы связаны или кому он может быть интересен). Контакты в вашей книге — это просто сильный сигнал для алгоритма.
  • Каждая доставка уникльна для пользователя и может быть отменена, что является важным свойством в борьбе со спамом (что не описывается в этой статье).
Что не происходит

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

Время. Хотя наша система имеет высокую пропускную способность, это не значит, что секреты всегда доставляются мгновенно. Например, чем меньше «друзей» есть у пользователя, тем меньше мы показываем ему. Это позволяет избежать трюка, когда можно вычислить, кто написал секрет.

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

Соединяя все вместе

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

В наши дни и наш век, безопасность и приватность важны как никогда. Это было важно для нас в Google и Square и всегда будет высшим приоритетом в Secret.

David Byttow
Со-основатель, Secret

Автор: alehano

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js