Spring Cloud Security JWT: распространение открытого ключа с использованием сервера конфигурации / ротации ключей
Как вы управляете своими частными / открытыми ключами для подписания / проверки JWT в среде Spring Cloud?
Эта проблема":
На данный момент я генерирую пару ключей. Затем скопируйте Private + Public Key на мой auth-server
приложение. А также скопируйте открытый ключ на каждый сервер ресурсов.
Когда я теперь хочу реализовать "Поворот ключей", я должен как-то заполнить новые ключи для каждого сервиса.
Идея:
Может быть, я мог бы использовать spring-cloud-config-server
хранить и распространять ключевые пары?
Сервер конфигурации уже предоставляет учетные данные для входа в базу данных. Так почему бы не хранить там еще более конфиденциальную информацию?
Вопросы):
Если это путь: как бы вы реализовали распределение пары ключей с помощью spring-cloud-config-server
?
У вас есть проблемы с безопасностью?
Как вы решили эту проблему? Я думаю, есть лучшие решения.
РЕДАКТИРОВАТЬ:
Может быть, есть какое-то решение с использованием Spring Oauth's security.oauth2.resource.jwt.keyUri
недвижимость для JWKs?
2 ответа
Вам следует рассмотреть возможность использования Spring Cloud Consul Config:
Консул предоставляет хранилище ключей / значений для хранения конфигурации и других метаданных. Spring Cloud Consul Config является альтернативой серверу и клиенту Config. Конфигурация загружается в среду Spring во время специальной фазы начальной загрузки. Конфигурация хранится в папке /config по умолчанию. Несколько экземпляров PropertySource создаются на основе имени приложения и активных профилей, которые имитируют порядок разрешения свойств в Spring Cloud Config.
Вы можете отправить / обновить, чтобы обновить ваш ключ, или следить за изменениями:
Consul Config Watch использует возможность консула наблюдать за ключевым префиксом. Config Watch выполняет блокирующий вызов Consul HTTP API, чтобы определить, изменились ли какие-либо соответствующие данные конфигурации для текущего приложения. Если имеются новые данные конфигурации, публикуется событие обновления.
Прежде всего, у меня был бы шлюз, чтобы скрыть механизм JWT. Это позволит вам отозвать токены из шлюза. Если пользователь знает о своем токене, вы не можете отозвать его без отзыва открытого ключа. Это будет выглядеть так:
Это легко реализовать с помощью фильтров zuul и сессионных компонентов.
Во-вторых, если вы сказали это в комментариях, вы можете просто создать новый закрытый ключ для генерации новых токенов. Но все ваши серверы ресурсов должны быть в состоянии прочитать все ранее сгенерированные токены. Поэтому вам необходимо иметь список открытых ключей на каждом сервере ресурсов, и каждый раз, когда вы получаете запрос, вы должны пытаться проверять его с каждым открытым ключом. Возможно, вы можете иметь идентификатор открытого ключа (и поставить идентификатор на каждый сгенерированный токен), чтобы избежать глупого поиска этой задачи.
Для распределения ключей используйте весеннюю облачную шину и кролик mq мне кажется правильным.