Получение доступа к AWS с использованием MFA в Unix/Linux

Получение доступа к 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 creds

Чтобы сгенерировать временные креды для использования 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» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.