AWSのアカウントの個人用開発アカウントをほどほどにセキュアに設定してみる
要件は二つ
- クレデンシャルを平文で保存しない
- 管理が嫌にならない
機材的な要件は以下
- Windows/WSL2 で開発
- Ubuntu を使う
- 開発環境はデスクトップとかラップトップで共有したい
使うことにしたAWSの機能
- AWS STS
使うことにしたアプリ
- Authenticator
- AWS-Vault
- 1Password
AWS STS
AWSのリソースについての権限を付与したロールを作成して、そのロールが信頼するアカウントを設定することができる。信頼されたアカウントは、申請すれば一時的にロールの権限を得ることができる。
認証の管理と認可の管理を分けることで、平時や有事のときの管理・対応を柔軟にできる
また、一時的なトークンを発行するので、トークン流出時のリスクを抑えることができる
Authenticator
Chrome の拡張機能として提供される仮想MFAデバイス。これがあればスマホとかがなくてもMFAができる。この場合のFactorは、AWSのアカウントとGoogleアカウントの二段階認証ということになるので、厳密にはMFAはできていない、ということになるはず。たしか、パスワードとかの記憶要素と、指紋とかの生態要素、スマホとかの物理要素を組み合わせるからMulti Factor Authentication と呼ばれているから。
スマホでMFAをやるのが主流だし、そっちのほうが安全度は高いんだろうけど、スマホを壊れたりなくしたりしたら面倒。そして、自分はスマホをよく紛失したり、落下させたりするので、Google account に紐づけるので妥協した
AWS Vault
また、アクセスキーとかを暗号化して保存してくれる。Macだとkeychain を使えるみたい。linux では、pass
と gnupg
の使用がサポートされている
インターン先で知った
1Password
AWS Vault で使うGPG鍵のパスワードを保存するのに使う。課金が必要だけど、便利そうなので使ってみる。どちらかというと、林檎系のサポートが手厚いみたいだけど、Windows/android への対応も進んできているみたい
AWS STS の設定
認証情報として使うIAMユーザーと、認可情報として使うIAM Roleをつくる
IAM Role は、作成後に「信頼関係」というタブから、特定のユーザーを指定できるので、必要なユーザーを指定する。
作成するときに、MFA系も指定する
AWS CLI の設定
公式ドキュメントに全部書いてある。認証情報の追加はしなくていい
AWS Vault の設定
公式のバイナリをダウンロードして、コマンドを使えるようにする
↓の情報を参考に pass
と gnupg
を使ったキーの保存環境をつくる。GPGのパスワードは1passwordに保存する
なお、コメントにあるように以下を.bashrc
に設定しないと動かなかった。デフォルトのバックエンドが --backend=keyctl
になっていたので、バージョンの問題とかかな?(自分が使ったaws-vaultは、v6.6.0
)
export AWS_VAULT_BACKEND=pass
export GPG_TTY="$( tty )"
これで使えるようになるはず
なお、.aws/config
は以下のように設定
[default]
region = ap-northeast-1
[profile dev]
mfa_serial = arn:aws:iam::アカウントID:mfa/IAMユーザー名
role_arn = arn:aws:iam::アカウントID:role/IAMロール名
最終的な認証の流れ
以下を実行して、AWS CLI 用に環境変数が設定されたbashのセッションに入る
aws-vault exec dev --duration 1h -- bash
このとき、GPG鍵のパスワードを求められるので、1Passwordから取り出してそれを入力する
また、MFAも求められるので、Authenticatorを使ってコードを得る
新たに作成されたbashのセッションは、環境変数にトークンが入っているので、aws-vault exec
をつけなくてもそのままAWS CLIのコマンドを実行できる
GPGの鍵を忘れた/保存してなかった
pass init ""
という風に、pass init
に空文字列を指定すると、GPGの認証情報を破棄できる。
また、このときユーザー情報も破棄しないといけなかった
$ pass
Password Store
└── dev
$ pass rm dev
このあとに、もう一度GPG鍵を作り直して、登録すればOK
デスクトップとラップトップでの共有について
認可はロールで行うので、それぞれのPC用にロールにアクセスできるIAMユーザーをつくればいい
面倒くさいと思っていたのは、開発環境のプロジェクトごとに毎回ユーザーを作り、デスクトップとラップトップにAPIキーを発行し、適切な場所に保存するということ
解決策としては、すべての権限を与えたADMIN的なIAMユーザーを作って、そのAPIキーをPCに保存することだが、ちょっと怖かった
今回、STSとAWS-Vaultを導入したことで、ADMINになれる認証情報を平文で保存することなく、便利な開発環境を構築できた