moznion/sesstok と 1password を利用して CLI から AssumeRole する
はじめに
先日、AWS Organizations を利用して AssumeRole できる環境を構築するという記事の中で AWS コンソールから AssumeRole する環境構築の方法をまとめました。
aws コマンドなど CLI でも簡単かつセキュアに AssumeRole したいですね。
今回は moznion/sesstok と 1password を利用して CLI から AssumeRole する方法をまとめます。
sesstok
sesstok は MFA に対応した AWS の一時トークンを取得することのできる Go で書かれた CLI ツールです。
読み方は某ショートムービーSNS的な感じですかね。
一定時間で失効する一時トークンを都度発行して Organizations から AssumeRole するので、Organizationsに管理が一元化され、自動化できる CLI ツールがあれば利用者側もストレスが無く開発することができそうです。
以下の記事では bash で AssumeRole していますね。
STSで一時クレデンシャルを発行する | Developers.IO
sesstok インストール
各環境向けのバイナリが配布されているのでダウンロードしてパスの通ったディレクトリにおき、実行権限を付与します。
$ wget -O ~/go/bin/sesstok https://github.com/moznion/sesstok/releases/download/<VERSION>/sesstok_darwin_amd64_<VERSION> $ chmod +x ~/go/bin/sesstok
sesstok 初期設定
AWS CLIの設定、1Password MFAの設定、sesstokの設定を行っていきます。
AWS CLI
まずは AWS CLI の環境設定を行います。
~/.aws/config
に Organization の profile としてorg
を設定し、Switch する先の profile としてdev
を設定します。
[profile org] region = ap-northeast-1 [profile dev] region = ap-northeast-1
~/.aws/credentials
には Switch する先の profile のみのsource_profile
とrole_arn
を設定しておきます。
[dev] source_profile = org role_arn = arn:aws:iam::<Switch する先のアカウントID>:role/<Switch する先のIAM Role>
1Password MFA
Organizations 側に設定した IAMユーザに MFA の設定を行います。
今回は以下の記事にしたがって 1Password の MFA を利用します。
sesstok
sesstok コマンドで sesstok の初期設定を行います。
sesstok の設定は ~/.sesstok.rc
というファイルに暗号化されて保存されます。
access key
、secret access key
およびMFA serial
は Organizations 側に作成した IAMユーザの credentials を設定します。
$ sesstok rc file path: ~/.sesstok.rc rc file doesn't exist would you like initialize? [N/y] y would you like to set a master password? [N/y] N access key ID for assume role: <ACCESS KEY> secret access key for assume role: <SECRET ACCESS KEY> MFA serial (ARN): <MFA SERIAL> profile name for assume role: org initialized (created rc file: ~/.sesstok.rc) OK, please retry this command with token code :)
これで準備が完了しました。
CLI から AssumeRole する
以下のコマンドを実行すると ~/.aws/credentials
に一時トークンが追記されます。
MFA PROFILE
には先ほど設定した IAM ユーザに対して設定した MFA の profile名を設定します。
(もう少しかっこよく書ける気がする。。。)
$ otp=`op signin --output=raw | op get totp -v <MFA PROFILE>` && sesstok "$otp" $ cat ~/.aws/credentials ... # {"sessionTokenExpiryDateTime":"2019-12-16 03:05:51 +0000 UTC"} [org] aws_access_key_id = XXXXXXXXXXXXXXX aws_secret_access_key = YYYYYYYYYYYYYYY aws_session_token = ZZZZZZZZZZZZZZ
1password の session は 30分で失効しますが、sesstok (というかSTS) の一時トークンは24時間保持されます。(--duration を指定することで任意の期間を指定できます)
まとめ
moznion/sesstok と 1password を利用して CLI から AssumeRole する方法をまとめました。
この組み合わせは QoL が上がること間違いなしです。
ぜひお試しください。