Получение доступа к 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» завершена.