Получение доступа к AWS с использованием MFA в Unix/Linux
Как вам известно, один из самых безопасных способов авторизации в AWS — это использование MFA. Но тогда, при использовании AWS CLI у вас возникнут трудности с получением ресурсов. Я нашел решение и сейчас покажу как это можно сделать на готовом примере.
Вам потребуется установить дополнительное ПО (AWS CLI, python/python3, pip/pip3), ссылки на некоторые установки ниже:
Установка AWS CLI в Unix/Linux
Установка pip/setuptools/wheel в Unix/Linux
У меня имеется python3 + pip3 + AWS CLI, по этому, можно начинать…
Получение доступа к AWS с использованием MFA в Unix/Linux
aws-mfa упрощает управление вашими аккаунтами через AWS SDK, когда к вашей учетной записи AWS применяется многофакторная аутентификация (MFA). Данное ПО/решение автоматизирует процесс получения временных креденшелов из AWS Security Token Service и обновляет ~/.aws/credentials файл для дальнейшего использования.
Концепция aws-mfa заключается в том, что существует два типа учетных данных:
- long-term — Ваши типовые ключи доступа AWS, состоящие из AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY. Собственно я предпочитаю именно этот метод.
- short-term — Временный набор учетных данных, которые генерируются через AWS STS, используя ваши долгосрочные учетные данные (long-term) в сочетании с ID-шником MFA устройства (ID устройства или ARN виртуального устройства), и токен.
И так, нам понадобится aws-mfa пакет, который можно поставить через pip (у меня pip3, т.к использую python3):
$ pip3 install aws-mfa
Или через гит:
$ git clone https://github.com/broamski/aws-mfa.git && cd aws-mfa && python3 setup.py install
Я предпочитаю заюзать 1-й вариант, а вы как хотите. Установка на этой завершена, но перед тем как заюзать данный солюшен — стоит настроить AWS конфиг.
Открываем AWS конфиг:
$ vim ~/.aws/credentials
Приведу наглядный пример того, что нужно будет прописать:
[Test] aws_access_key_id = POPULATED_BY_AWS-MFA aws_secret_access_key = POPULATED_BY_AWS-MFA region = us-east-1 mfa_authorisation_key = MFA_authorisation_key [Test-long-term] aws_access_key_id = YOUR_KEY_ID_from_AWS aws_secret_access_key = YOUR_ACCESS_KEY_from_AWS region = us-east-1
Где:
[Test]
- aws_access_key_id = POPULATED_BY_AWS-MFA — Сгенерируется при запуски данной утилиты
- aws_secret_access_key = POPULATED_BY_AWS-MFA- Сгенерируется при запуски данной утилиты
- region = us-east-1 — Задал стандартный регион.
mfa_authorisation_key = MFA_authorisation_key — Служит для моего скрипта (получение OTP).
[Test-long-term]
- aws_access_key_id = YOUR_KEY_ID_from_AWS — Ключ ИД, можно взять в AWS самой учетки.
- aws_secret_access_key = YOUR_ACCESS_KEY_from_AWS — Акцес ключ, можно взять в AWS самой учетки.
- region = us-east-1 — Задаем дефалтный регион.
YOUR_KEY_ID_from_AWS иYOUR_ACCESS_KEY_from_AWS можно взять и сгенерировать (пример):
Чтобы сгенерировать временные креды для использования AWS CLI с использованием MFA, воспользуйтесь следующей командой:
$ aws-mfa --duration 10800 --device arn:aws:iam::167127734783:mfa/test --profile=Test
Где:
- aws-mfa — Сама утилита.
- —duration 10800 — Сколько будет работать сгенерированные креды.
- —device arn:aws:iam::167127734783:mfa/test — Собственно учетка с MFA.
- —profile=Test — Профиль для которого стоит сгеренировать креды.
Примерный вывод будет такой:
INFO - Validating credentials for profile: Test WARNING - Your existing credentials are missing or invalid, obtaining new credentials. Enter AWS MFA code for device [arn:aws:iam::167127734783:mfa/test] (renewing for 10800 seconds):194342 INFO - Fetching Credentials - Profile: Test, Duration: 10800 INFO - Success! Your credentials will expire in 10800 seconds at: 2018-10-16 11:36:33+00:00
Откроем файл с AWS кредами и поглядим что там имеется:
$ cat .aws/credentials [Test] aws_access_key_id = ASIASN2MW3H7TP6QXXYE aws_secret_access_key = bjph1SuPHIuPUbXaNnVG/UrEV6D+EywYU8mCtiIi region = us-east-1 mfa_authorisation_key = 77QHUHUEKB7VUCTYJ4BP55TLQL5YWCQRD3OLT3JEQU7O775F7CV3QCFEPKVODILF assumed_role = False aws_session_token = FQoGZXIvYXdzEDoaDAqnr0mgg2Tj4S+SSSKvAUbiDR+Y7BC4q2oQuJX0Qdbr5liq5dDBbxmYgeV/3dzj9m5ZQDqEWnsXlHylQIHqdEAnVwHgjHCYJlBHiFkBapOxFjcnvrg5Kw2+HSKVfriGTrzkmnwvtKU4fJx9CI5SwFAJFsL4u4S/N2BZnBQ0dQe7kCEku01tSJAKSgy2XTmj8WifMIzbVTbBPtF2djwTRZre/vouA4MqmGy9VPvGaoAgqMJyMFQR5vWBmieacP4okcaW3gU= aws_security_token = FQoGZXIvYXdzEDoaDAqnr0mgg2Tj4S+SSSKvAUbiDR+Y7BC4q2oQuJX0Qdbr5liq5dDBbxmYgeV/3dzj9m5ZQDqEWnsXlHylQIHqdEAnVwHgjHCYJlBHiFkBapOxFjcnvrg5Kw2+HSKVfriGTrzkmnwvtKU4fJx9CI5SwFAJFsL4u4S/N2BZnBQ0dQe7kCEku01tSJAKSgy2XTmj8WifMIzbVTbBPtF2djwTRZre/vouA4MqmGy9VPvGaoAgqMJyMFQR5vWBmieacP4okcaW3gU= expiration = 2018-10-16 11:36:33 [Test-long-term] aws_access_key_id = AKIAJXSSYFQAWAYKL5PQ aws_secret_access_key = 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
Как-то так! Работает как нужно!
Для дополнительных опций утилиты, можно обратится к хелпу:
$ aws-mfa -h usage: aws-mfa [-h] [--device arn:aws:iam::123456788990:mfa/dudeman] [--duration DURATION] [--profile PROFILE] [--long-term-suffix LONG_TERM_SUFFIX] [--short-term-suffix SHORT_TERM_SUFFIX] [--assume-role arn:aws:iam::123456788990:role/RoleName] [--role-session-name ROLE_SESSION_NAME] [--force] [--log-level {CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET}] [--setup] optional arguments: -h, --help show this help message and exit --device arn:aws:iam::123456788990:mfa/dudeman The MFA Device ARN. This value can also be provided via the environment variable 'MFA_DEVICE' or the ~/.aws/credentials variable 'aws_mfa_device'. --duration DURATION The duration, in seconds, that the temporary credentials should remain valid. Minimum value: 900 (15 minutes). Maximum: 129600 (36 hours). Defaults to 43200 (12 hours), or 3600 (one hour) when using '-- assume-role'. This value can also be provided via the environment variable 'MFA_STS_DURATION'. --profile PROFILE If using profiles, specify the name here. The default profile name is 'default'. The value can also be provided via the environment variable 'AWS_PROFILE'. --long-term-suffix LONG_TERM_SUFFIX, --long-suffix LONG_TERM_SUFFIX The suffix appended to the profile name toidentify the long term credential section --short-term-suffix SHORT_TERM_SUFFIX, --short-suffix SHORT_TERM_SUFFIX The suffix appended to the profile name toidentify the short term credential section --assume-role arn:aws:iam::123456788990:role/RoleName, --assume arn:aws:iam::123456788990:role/RoleName The ARN of the AWS IAM Role you would like to assume, if specified. This value can also be provided via the environment variable 'MFA_ASSUME_ROLE' --role-session-name ROLE_SESSION_NAME Friendly session name required when using --assume- role --force Refresh credentials even if currently valid. --log-level {CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET} Set log level --setup Setup a new log term credentials section
Вот скрипт для генерации OTP:
Скрипт для генерации OTP при использовании MFA в Unix/Linux
А у меня все, статья «Получение доступа к AWS с использованием MFA в Unix/Linux» завершена.