moznion/sesstok と 1password を利用して CLI から AssumeRole する

はじめに

先日、AWS Organizations を利用して AssumeRole できる環境を構築するという記事の中で AWS コンソールから AssumeRole する環境構築の方法をまとめました。

aws コマンドなど CLI でも簡単かつセキュアに AssumeRole したいですね。
今回は moznion/sesstok と 1password を利用して CLI から AssumeRole する方法をまとめます。

moznion.hatenadiary.com

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_profilerole_arn を設定しておきます。

[dev]
source_profile = org
role_arn       = arn:aws:iam::<Switch する先のアカウントID>:role/<Switch する先のIAM Role>

1Password MFA

Organizations 側に設定した IAMユーザに MFA の設定を行います。
今回は以下の記事にしたがって 1Password の MFA を利用します。

dev.classmethod.jp

sesstok

sesstok コマンドで sesstok の初期設定を行います。
sesstok の設定は ~/.sesstok.rc というファイルに暗号化されて保存されます。
access keysecret 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 が上がること間違いなしです。
ぜひお試しください。

github.com