Я изучаю, возможна ли гибридная система инфраструктуры AWS/Google Cloud, и одно из требований, которое у меня есть, - это безопасная и простая аутентификация от одной системы к другой. В настоящее время мне нужно подключиться к ограниченному ведро AWS S3 из экземпляра виртуальной виртуальной машины Google.Объединенный доступ к службе облачных сервисов Google для службы AWS
Мой вопрос в целом: есть ли способ сделать это вообще и что будет лучшим подходом к этому. Я уверен, что каждый хочет иметь возможность использовать несколько облачных провайдеров для своей инфраструктуры с высокой степенью безопасности и простотой использования и обслуживания.
После некоторого исследования я обнаружил, что единственный способ, который выглядит возможным, - это веб-идентификационная федерация, которая не предназначена для этой цели вообще. Затем, изучив варианты со стороны Google, я обнаружил, что учетные записи служб выглядят так, как будто они могут использоваться для аутентификации OAuth2 и предоставляют токен для доступа к AWS через клиент STS с действием AssumeRoleWithWebIdentity.
Однако клиент STS принимает только id_token, который обычно клиент будет получать с сервера, если они войдут в Google из приложения, которое работает в своем браузере (Javascript, PHP, Python), пока я пытаюсь это сделать уровень системы с SDK Ruby. В настоящее время объект авторизации Google :: Auth возвращает токен доступа, который не принят Aws :: STS :: Client. Я пытаюсь сделать что-то подобное:
require 'aws-sdk'
require 'googleauth'
scopes = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/compute']
authorization = Google::Auth.get_application_default(scopes)
token = authorization.fetch_access_token!['access_token']
bucket_name = 'xxx'
arn_role = 'arn:aws:iam::xxx:role/xxx'
session_name = 'GoogleApps'
client = Aws::STS::Client.new(region: 'us_east-1')
resp = client.assume_role_with_web_identity({
role_arn: arn_role,
role_session_name: session_name,
web_identity_token: token
})
Как уже упоминалось, fetch_access_token! это единственный метод, который возвращает что-либо значимое. Существует метод, который должен возвращать именно то, что мне нужно - decoded_id_token; однако в этом случае оно равно нулю. Выполнение кода выше результатов (как и ожидалось) в следующей ошибки:
The ID Token provided is not a valid JWT. (You may see this error if you sent an Access Token) (Aws::STS::Errors::InvalidIdentityToken)
Я пытался найти способ аутентификации с учетной записью службы, как будто я совершаю обычный Google Вход для того, чтобы получить id_token но без каких-либо успехов.
У меня есть несколько других вариантов, чтобы выполнить ту же задачу которые являются менее элегантно, чем использовать этот конкретный тип федерации:
- Создания IAM счета для целей и распределение безопасности полномочий с безопасной системой, как Хранилище Хашикорпа.
- Использование экземпляра «прыжок» посредника внутри AWS, который имеет доступ к , необходимый resouce и может быть ssh'd от конкретного статического внешних IP-адресов виртуальных машин в облаке Google.
- Использование простой системы, которая генерирует внешние идентификаторы для создания самих токенов доступа и использования такого типа федерации.
Я не против использования какой-либо технологии, чтобы получить от сервера к серверу (более похожий на сервер к сервису, но то же самое справедливо и для сервера). Объединенная аутентификация чистым и безопасным способом.
Извините за долгие вопросы и спасибо заранее.
Вы не являетесь участником? Возможно, вам нужно использовать токен в руке, чтобы вызвать вызов API для запроса токена JWT ID, а затем передать этот JWT в STS AssumeRoleWithWebIdentity. Плюс предполагаемая роль должна быть создана специально для доступа к поставщику удостоверений (IdP должен быть указан в политике доверия предполагаемой IAM-роли). – jarmod
@jarmod спасибо, что ответили. У меня есть сторона AWAM IAM, настроенная в соответствии с документацией для федерации веб-идентификации, но она выдает ошибку перед ударом этого кода. Точная проблема заключается в том, что запрос на идентификатор JWT равен нулю, так как я пытаюсь выполнить аутентификацию с помощью учетной записи службы Google. Я пробовал называть authorization.decoded_id_token, но он равен нулю. Я только заметил, что, вызвав get_application_default, я фактически получаю авторизацию GCE, которая может быть не такой, какой я хочу. –