Безопасность
Безопасность как гостеприимство.
Поставщик удостоверений хорош ровно настолько, насколько прочны стены между его арендаторами и насколько бережно он обращается с секретами. Вот как устроен Usher Identity. Мы описываем, что делает программа, и не заявляем ни о какой сертификации.
Архитектура
Отдельные домены, отдельные сети.
Собственные страницы Usher Identity и издатель каждого клиента находятся на разных регистрируемых доменах. Базы данных расположены в сети, из которой нельзя выйти в интернет, а единственный путь наружу — прокси, который проверяет, куда идет запрос.
- Caddy завершает TLS для каждого хоста и удаляет заголовки, которые вправе устанавливать только собственные сервисы Usher Identity.
- Уровень аутентификации обслуживает все среды и различает их по хосту; ничто, закешированное для одного хоста, не отдается другому.
- Каждый сервис подключается к Valkey под своим пользователем и имеет доступ только к своим ключам. Пользователя по умолчанию нет.
- SQL-запросы с токенами и кодами никогда не попадают в журнал базы данных вместе со своими значениями.
Интернет
Люди, ваши приложения, ваши серверы
Граничный уровень
Caddy: TLS, HSTS, удаление внутренних заголовков
usheridentity.com
Сайт и Console
usheridentity.com, console.usheridentity.com
API
api.usheridentity.com
*.usherid.com
Уровень аутентификации
Издатель и Lobby каждой среды
Сеть данных · нет выхода наружу
Postgres
Отдельная схема для каждой среды
Valkey
Каждый сервис — только со своими ключами
Единственный выход
Исходящий прокси
Для каждого URL, указанного клиентом
Обнаружение, JWKS, выход
Только публичные адреса
Изоляция
Ничего общего там, где это важно.
Каждая среда проекта получает собственную схему Postgres, собственные ключи подписи и собственные секреты, запечатанные ее собственным ключом данных. Ее издатель — это хост на домене арендаторов, а cookie привязаны к этому хосту, поэтому браузер никогда не отправит cookie одной среды в другую.
usheridentity.com
Сайт, Usher Identity Console, аккаунты Usher Identity
*.usherid.com
По издателю на каждую среду, на отдельном домене
Пользователи, сеансы и токены хранятся в схеме, созданной для этой среды. Запросы выполняются в этой схеме и никогда — в общей таблице со столбцом арендатора.
Скопировать запечатанный секрет клиента Google из рабочей среды проекта Acme в рабочую среду проекта Northwind.
Шифрование хранимых данных
Конвертное шифрование с привязкой к месту.
Секреты, которые вы передаете Usher Identity, запечатываются с помощью AES-256-GCM под ключом данных, принадлежащим одной среде. Ключи данных, в свою очередь, зашифрованы мастер-ключом с версиями, который хранится вне базы данных.
- Ключи данных для каждой среды
- Компрометация ключа данных одной среды ничего не раскрывает о ключе другой.
- Привязка через AAD
- Среда и назначение привязаны к каждому шифротексту, поэтому значение нельзя перенести в другую строку или к другому арендатору.
- Ключи с версиями
- Каждое запечатанное значение хранит версию ключа, которым оно создано, поэтому ключи можно менять, а старые значения — перешифровывать.
- Аутентифицированное шифрование
- Благодаря тегу GCM подделанное значение просто не откроется, а не расшифруется во что-то другое.
Мастер-ключ
Хранится вне базы данных, с версиями
Ключ данных, по одному на среду
Зашифрован мастер-ключом
Секрет
Запечатан с помощью AES-256-GCM под ключом данных
u1.<key version>.<iv>.<ciphertext + tag>
aad = u1 | version | environment | purpose
Практики
Детали, сделанные тщательно.
Пароли, если вы ими пользуетесь
Хешируются с помощью Argon2id с параметрами, рекомендованными OWASP (19 МиБ, два прохода), и с ограничением на число одновременных вычислений, чтобы поток попыток входа не мог обрушить сервис. Новые пароли проверяются по базам утечек через range API сервиса Have I Been Pwned, который видит лишь короткий префикс хеша пароля. Минимальная длина по умолчанию — 12 символов.
Ничего, что можно было бы использовать повторно
Секреты клиентов, токены, токены ссылок для входа и коды из писем хранятся в виде хешей. Резервные коды зашифрованы. Код авторизации действует пять минут, а на код из письма дается три попытки.
Ограничения на каждой двери
У входа, регистрации, кодов из писем, ссылок для входа, сброса пароля и проверок второго фактора — свои ограничения частоты: например, десять входов по паролю в минуту и пять кодов из писем за десять минут.
Строгая Content-Security-Policy
Каждая страница Lobby получает новый nonce и построенную вокруг него политику: выполняются только скрипты этого источника с этим nonce, формы отправляются только на тот же источник, а другие сайты не могут встроить страницу во фрейм.
Журнал аудита, которому можно доверять
Изменения рабочих пространств, проектов и сред записываются в журнал, в который можно только добавлять записи, и каждая запись связана хешем с предыдущей, поэтому измененная или пропавшая запись сразу заметна.
Исходящий прокси для URL клиентов
Каждый запрос, который Usher Identity отправляет по адресу, указанному клиентом (обнаружение OIDC, JWKS, выход по обратному каналу), проходит через один прокси. Он разрешает имя один раз, отклоняет частные адреса, loopback, link-local и адреса метаданных облака и подключается именно к проверенному адресу, поэтому DNS rebinding не превратит URL клиента во внутренний.
Поддомены, которые не выдаются дважды
Поддомен рабочей среды — это первая метка адреса ее издателя. В Console можно попасть только по приглашению, Lobby, о котором сообщили как о фишинге, приостанавливается, а однажды использованный поддомен больше никогда никому не выдается, потому что старые приложения могут по-прежнему доверять его токенам.
Сеансы заканчиваются, когда скажете вы
Usher Identity проверяет свои сеансы при каждом запросе, а не доверяет кешированной копии, поэтому завершенный вами сеанс заканчивается сразу. Токены доступа живут недолго (по умолчанию десять минут), и ваш API может проверить их через интроспекцию.
Ответственное раскрытие
Нашли что-то? Сначала скажите нам.
Если вам кажется, что вы нашли проблему безопасности в Usher Identity, мы будем рады узнать о ней и вместе с вами ее исправим.
- Что вы нашли, где и как это воспроизвести.
- Что, на ваш взгляд, с этим можно сделать.
- Как с вами связаться и хотите ли вы, чтобы мы упомянули вас.
Пожалуйста, проводите проверки только в своих средах, не обращайтесь к чужим данным и дайте нам разумное время на исправление, прежде чем рассказывать о проблеме. Чтобы пожаловаться на страницу, которая выдает себя за вход в Usher Identity, откройте раздел Сообщить о нарушении.