Closed5

AWSのアカウントの個人用開発アカウントをほどほどにセキュアに設定してみる

sasakiysasakiy

要件は二つ

  • クレデンシャルを平文で保存しない
  • 管理が嫌にならない

機材的な要件は以下

  • Windows/WSL2 で開発
  • Ubuntu を使う
  • 開発環境はデスクトップとかラップトップで共有したい
sasakiysasakiy

使うことにしたAWSの機能

  • AWS STS

使うことにしたアプリ

  • Authenticator
  • AWS-Vault
  • 1Password

AWS STS

AWSのリソースについての権限を付与したロールを作成して、そのロールが信頼するアカウントを設定することができる。信頼されたアカウントは、申請すれば一時的にロールの権限を得ることができる。
認証の管理と認可の管理を分けることで、平時や有事のときの管理・対応を柔軟にできる
また、一時的なトークンを発行するので、トークン流出時のリスクを抑えることができる

Authenticator

https://authenticator.cc/

Chrome の拡張機能として提供される仮想MFAデバイス。これがあればスマホとかがなくてもMFAができる。この場合のFactorは、AWSのアカウントとGoogleアカウントの二段階認証ということになるので、厳密にはMFAはできていない、ということになるはず。たしか、パスワードとかの記憶要素と、指紋とかの生態要素、スマホとかの物理要素を組み合わせるからMulti Factor Authentication と呼ばれているから。
スマホでMFAをやるのが主流だし、そっちのほうが安全度は高いんだろうけど、スマホを壊れたりなくしたりしたら面倒。そして、自分はスマホをよく紛失したり、落下させたりするので、Google account に紐づけるので妥協した

AWS Vault

https://github.com/99designs/aws-vault
コマンドラインからのAWSの認証をいい感じにしてくれる機能。前述のSTSをいい感じに実行してくれる。
また、アクセスキーとかを暗号化して保存してくれる。Macだとkeychain を使えるみたい。linux では、passgnupg の使用がサポートされている
インターン先で知った

1Password

https://1password.com/jp/

AWS Vault で使うGPG鍵のパスワードを保存するのに使う。課金が必要だけど、便利そうなので使ってみる。どちらかというと、林檎系のサポートが手厚いみたいだけど、Windows/android への対応も進んできているみたい

sasakiysasakiy

AWS STS の設定

認証情報として使うIAMユーザーと、認可情報として使うIAM Roleをつくる
IAM Role は、作成後に「信頼関係」というタブから、特定のユーザーを指定できるので、必要なユーザーを指定する。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-users

作成するときに、MFA系も指定する

AWS CLI の設定

公式ドキュメントに全部書いてある。認証情報の追加はしなくていい
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

AWS Vault の設定

公式のバイナリをダウンロードして、コマンドを使えるようにする

↓の情報を参考に passgnupg を使ったキーの保存環境をつくる。GPGのパスワードは1passwordに保存する
https://github.com/99designs/aws-vault/issues/683

なお、コメントにあるように以下を.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のコマンドを実行できる

sasakiysasakiy

GPGの鍵を忘れた/保存してなかった

pass init ""という風に、pass initに空文字列を指定すると、GPGの認証情報を破棄できる。
また、このときユーザー情報も破棄しないといけなかった

$ pass
Password Store
└── dev
$ pass rm dev

このあとに、もう一度GPG鍵を作り直して、登録すればOK

sasakiysasakiy

デスクトップとラップトップでの共有について

認可はロールで行うので、それぞれのPC用にロールにアクセスできるIAMユーザーをつくればいい
面倒くさいと思っていたのは、開発環境のプロジェクトごとに毎回ユーザーを作り、デスクトップとラップトップにAPIキーを発行し、適切な場所に保存するということ
解決策としては、すべての権限を与えたADMIN的なIAMユーザーを作って、そのAPIキーをPCに保存することだが、ちょっと怖かった
今回、STSとAWS-Vaultを導入したことで、ADMINになれる認証情報を平文で保存することなく、便利な開発環境を構築できた

このスクラップは2022/09/20にクローズされました