Использование AWS с многофакторной аутентификацией (MFA) в Unix/Linux
Многие ставят MFA на свои учетные записи в AWS для более секурного использования. Типа, — супер секурно и все дела… Это правда, но MFA с AWScli в стандартной конфигурации, — не будет работать из-за того, что используется временные токены.
Я расскажу как можно обойти это дело и начать использовать AWS cli с MFA. Для начала, ставим питон (у меня используется python3). Ставим библиотеки:
# pip3 install boto3 aws-mfa
PS: Если используете питон2, то можно выполнить:
# pip install boto3 aws-mfa
и так, либы уже установлены, — осталось немного видоизменить конфиг-файл самого AWS. Открываем:
$ vim ~/.aws/credentials
Стандартный конфиг выглядит следующим образом:
[default] aws_access_key_id = XXXXXXXXXXX aws_secret_access_key = YYYYYYYYYYYYYYYYYY region = us-east-1 [LinuxNotes] aws_access_key_id = XXXXXXXXXXX aws_secret_access_key = YYYYYYYYYYYYYYYYYY
Приводим к виду:
[default] aws_access_key_id = XXXXXXXXXXX aws_secret_access_key = YYYYYYYYYYYYYYYYYY region = us-east-1 [default-long-term] aws_access_key_id = XXXXXXXXXXX aws_secret_access_key = YYYYYYYYYYYYYYYYYY region = us-east-1 [LinuxNotes] aws_access_key_id = XXXXXXXXXXX aws_secret_access_key = YYYYYYYYYYYYYYYYYY [LinuxNotes-long-term] aws_access_key_id = XXXXXXXXXXX aws_secret_access_key = YYYYYYYYYYYYYYYYYY
И так далее….. Суть уловили…
После чего, запускаем:
$ aws-mfa --duration 1800 --device arn:aws:iam::41316628489:mfa/captain --profile=LinuxNotes
Где:
- —duration 1800 — Время (Количество секунд), через которое будет сбрасыватся временные креденшелы.
- —device arn:aws:iam::41316628489:mfa/captain — Это MFA роль. Ее можно глянуть через веб-консоль.
- —profile=LinuxNotes — профиль, который прописали в ~/.aws/credentials
Для удобства использования, можно использовать переменные:
$ export MFA_DEVICE=arn:aws:iam::41316628489:mfa/captain $ export MFA_STS_DURATION=1800
И потом, просто вызвать:
$ aws-mfa --profile=LinuxNotes
PS: Так же, можно заекспортировать и профиль:
$ export AWS_PROFILE=LinuxNotes
После запуска данной команды, вас попросят ввести MFA. Мне надоело каждый раз доставать свой телефон и вводить значение, по этому — я написал скрипт на питоне:
# vim get_creds.py
Вот как он выглядит:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import configparser import argparse import pyotp def get_creds_from_acc_name(acc_name): db_file = '~/.aws/credentials' config = configparser.ConfigParser() config.sections() config.read(db_file) aws_access_key_id = config[acc_name]['aws_access_key_id'] aws_secret_access_key = config[acc_name]['aws_secret_access_key'] region = config[acc_name]['region'] mfa_autorisation = config[acc_name]['mfa_autorisation'] return aws_access_key_id, aws_secret_access_key, region, mfa_autorisation def generate_token(acc_name): account_creds = get_creds_from_acc_name(acc_name) totp = pyotp.TOTP(account_creds[3]) print("Current OTP for %s:" % acc_name, totp.now()) # print (totp.verify(totp.now())) return generate_token def main(): parser = argparse.ArgumentParser() parser.add_argument('--acc', dest='account', help='Account name', default=None) results = parser.parse_args() ac_name = results.account generate_token(ac_name) if __name__ == '__main__': main()
Где нужно изменить:
- db_file — Это путь где лежит ваш .aws/credentials файл.
- Добавить значение для MFA в поле mfa_autorisation (нужно самому вставить) — в файле .aws/credentials.
После чего, можно использовать:
$ python3 get_creds.py --acc LinuxNotes Current OTP for LinuxNotes: 328868
После чего, можно использовать AWS CLI, например:
# aws ec2 describe-instances --region=us-east-1 --profile=LinuxNotes --query "Reservations[].Instances[].PrivateIpAddress[]" --instance-ids
Это немного облегчает жизнь. У меня на этом все и статья «Использование AWS с многофакторной аутентификацией (MFA) в Unix/Linux» подошла к завершению.