Учетная запись облачной службы Google федеративный доступ к службе AWS
Я выясняю, возможна ли гибридная инфраструктурная система AWS/Google Cloud, и одно из моих требований - это безопасная и простая аутентификация от одной системы к другой. В настоящее время мне нужно подключиться к закрытой корзине AWS S3 из экземпляра виртуальной машины Google Cloud.
Мой вопрос, как правило: есть ли способ сделать это вообще, и какой будет лучший подход к этому. Я уверен, что каждый хочет иметь возможность использовать несколько облачных провайдеров для своей инфраструктуры с высоким уровнем безопасности, простотой использования и обслуживания.
После некоторых исследований я обнаружил, что единственный возможный способ - через Федерацию веб-идентификации, которая вообще не предназначена для этой цели. Затем, изучив варианты со стороны Google, я обнаружил, что учетные записи служб выглядят так, как будто они могут использоваться для аутентификации OAuth2 и предоставления токена для доступа к AWS через клиента STS с действием AssumeRoleWithWebIdentity.
Однако клиент STS принимает только id_token, который обычно клиент получает от сервера, если он входит в Google из приложения, которое запускается в их браузере (Javascript, PHP, Python), в то время как я пытаюсь сделать это на системном уровне с помощью Ruby SDKs. В настоящее время объект авторизации 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, который имеет доступ к необходимым ресурсам и может быть ssh'd с определенных статических внешних IP-адресов виртуальных машин в Google Cloud.
- Использование простой системы, которая будет генерировать внешние идентификаторы, чтобы самим создавать токены доступа и использовать этот тип федерации.
Я не возражаю против использования какой-либо технологии для получения федеративной аутентификации "сервер-сервер" (больше похожей на сервер-сервис, но то же самое относится и к серверу) чистым и безопасным способом.
Извините за длинные вопросы и заранее спасибо.
1 ответ
Мы не пошли по этому пути из-за смены приоритетов. Решением, которое мы выбрали, когда мы хотим это сделать, было хранилище Hashicorp для обмена ключами API посредника. Он достаточно безопасен и относительно прост в реализации и интеграции. Это также дает дополнительное преимущество, позволяя вашей учетной записи AWS взаимодействовать с другими неподдерживаемыми объектами через API.
Я знаю, что довольно поздно отвечать на эту тему, так как ей 3 года, но для этой ошибки
Предоставленный идентификатор идентификатора не является действительным JWT.
то, что я обнаружил по своим проблемам, - это аутентификация firebase, возвращающая 2 токена, который является accessToken и idToken, и вам нужно вместо этого использовать "idToken"