0

Я изучаю, возможна ли гибридная система инфраструктуры 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.
  • Использование простой системы, которая генерирует внешние идентификаторы для создания самих токенов доступа и использования такого типа федерации.

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

Извините за долгие вопросы и спасибо заранее.

+0

Вы не являетесь участником? Возможно, вам нужно использовать токен в руке, чтобы вызвать вызов API для запроса токена JWT ID, а затем передать этот JWT в STS AssumeRoleWithWebIdentity. Плюс предполагаемая роль должна быть создана специально для доступа к поставщику удостоверений (IdP должен быть указан в политике доверия предполагаемой IAM-роли). – jarmod

+0

@jarmod спасибо, что ответили. У меня есть сторона AWAM IAM, настроенная в соответствии с документацией для федерации веб-идентификации, но она выдает ошибку перед ударом этого кода. Точная проблема заключается в том, что запрос на идентификатор JWT равен нулю, так как я пытаюсь выполнить аутентификацию с помощью учетной записи службы Google. Я пробовал называть authorization.decoded_id_token, но он равен нулю. Я только заметил, что, вызвав get_application_default, я фактически получаю авторизацию GCE, которая может быть не такой, какой я хочу. –

ответ

0

Мы закончили тем, что не пошли по этому маршруту из-за смещения приоритетов. Решение, которое мы выбрали, когда мы хотим это сделать, было Vault Hashicorp для обмена ключами посредника API. Он достаточно безопасен и относительно легко реализуется и интегрируется. Он также имеет дополнительное преимущество, позволяя вашей учетной записи AWS возможность взаимодействовать с другими неподдерживаемыми вещами через API.