Аутентификация EC2 на EB для AWS Elasti c поисковых запросов HTTP - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь сделать HTTP-запросы от экземпляра EC2, работающего Node.js внутри elasti c beanstalk, к AWS Elasti c Search (для вставок / удаления индекса / запросов и т. Д. c.). Моя проблема связана с тем, как AWS обрабатывает аутентификацию.

Нет SDK для запроса / обновления et c. документы внутри elasti c поисковые индексы. (Есть один для управления доменом). Их рекомендуемый способ подписания запросов указан здесь . Короче говоря, они используют класс AWS .Signers.V4 для добавления учетных данных в заголовки HTTP, и им требуется ключ доступа, секретный ключ и токен сеанса.

Экземпляр EC2, с которым я работаю не хранит учетные данные в среде (решение не в моих руках) или в файле, как я получал учетные данные на своей машине. У него уже есть правильная роль для доступа к узлу поиска elasti c, Мне нужен лучший способ извлечь три учетных данных (ключ доступа, секретный ключ и токен сеанса) , поскольку они передаются в качестве аргумента в метод addAuthorization. Я попытался зарегистрировать CredentialProviderChain , но ни у одного из провайдеров не было сохраненных учетных данных. При локальном ведении журнала отображаются как переменная среды, так и файл общих учетных данных с правильными учетными данными, как и ожидалось. Мне сказали, что я не должен использовать API предполагаемой роли (который действительно возвращает учетные данные), и для меня это тоже не имело смысла, поскольку я принимал роль, которую EC2 уже имел lol

Я наткнулся на этот метод для получения метаданных экземпляра, включая учетные данные безопасности. Это мой лучший вариант? Или есть альтернатива, которую я не рассматривал? Я не слишком в восторге от этого, так как мне пришлось бы добавить несколько logi c, чтобы проверить, работает ли процесс в экземпляре EC2 (чтобы я мог тестировать локально, когда это не так), поэтому это не такое чистое решение, как я ожидал, и я хочу убедиться, что изучил все возможности.

PS Как AWS SDK обрабатывают аутентификацию? Я думаю, что у меня будет больше шансов получить одобрение моих изменений, если я буду использовать тот же подход, который использует AWS, поскольку elasti c search - единственная услуга, для которой мы должны вручную подписывать запросы. Все остальные обрабатываются SDK.

Ответы [ 2 ]

1 голос
/ 15 июля 2020

Ответ был шокирующе простым и фактически задокументирован здесь . У объекта AWS .config есть метод getCredentials, который загружает учетные данные по умолчанию в AWS .config.credentials и может быть доступен оттуда, в том числе внутри EC2.

Я предполагал, что он использует EC2 метаданные экземпляра, поскольку они действительно должны содержать учетные данные, но я не уверен, почему, когда я попытался зарегистрировать поставщик метаданных экземпляра EC2 в CredentialProviderChain, я получил пустой объект, тогда как регистрация того же на моей машине показала как SharedIniFileCredentials, так и учетные данные среды как содержащие кредиты.

1 голос
/ 14 июля 2020

Самый простой и очень хороший способ - использовать SSM. System Manager имеет хранилище параметров и позволяет сохранять зашифрованные учетные данные. Затем все, что вам нужно сделать, это назначить роль IAM для EC2 с помощью политики для доступа к SSM или просто отредактировать существующую роль и предоставить полный доступ SSM для ее запуска, а затем заблокировать ее до минимальных привилегий.

, но разве это не будет проблемой, если наши учетные данные часто меняются? Разве нам не придется обновлять их каждый раз, когда срок действия наших учетных данных истекает?

Пользователи IAM имеют ротацию паролей, вам нужен пароль учетной записи службы.

По умолчанию EC2 имеет доступ к чему-то потому что, когда вы раскручиваете один, вам нужно назначить EC2 роль IAM. Кроме того, большинство AMI EC2 поставляются с установленным AWS CLI и SDK, так что вы можете сразу получить значения хранилища параметров SSM. Вот некоторые Python для демонстрации:

ssm = boto3.client('ssm', region_name='ap-southeast-2', config=Config(proxies={'http': 'proxy:123', 'https': 'proxy:123'}))
key = "thePasswordKeyToGetTheValue"
response = ssm.get_parameter(Name=key, WithDecryption=True)
        value = response['Parameter']['Value']
...