AWSのIAMアカウントを保護するために、
- IAMユーザにはほとんど権限を与えない
- MFAは有効化
- IAMユーザはIAMグループに所属
- IAMグループに対し、特定のIAMロールへAssumeRoleするIAMポリシーを割り当て
を行ったりします。
また、aws-vault
により、ローカルにあるAWSのアクセスキーを保護したり、AWS CLIを AssumeRole して使ったりします。
- 参考
- aws-vault についてのあれこれ - Qiita
- 複数AWSアカウントのユーザ管理を、ログイン用AWS環境に集約してみた | DevelopersIO
- 『クラウド破産を回避するAWS実践ガイド』を試し読みできるようにしました #技術書典 - 憂鬱な世界にネコパンチ!
- 99designs/aws-vault: A vault for securely storing and accessing AWS credentials in development environments
- aws-vault でアクセスキーを安全に - FLINTERS Engineer's Blog
- 個人でやっている AWS IAM の運用
ただ、上記の参考ページではWindowsではどうなるかが書かれていなかったため、試してみた時のメモを残します。
目次
環境
準備
IAMユーザの作成
aws-vault
を使って AssumeRole
を試すために、以下の内容でIAMユーザを作成します。
- 付与するポリシー:
AmazonS3FullAccess
- AssumeRoleできるか検証するため、S3のみFullAccess
- AWS API Keyを有効化
- コンソールのパスワードを無効化
- プログラムでのみ利用可能
AWS CLI のインストール
aws-vaultとともに使うため、セットアップされていない場合は以下の手順で AWS CLI をインストールします。
以下より、64bitのWindowsインストーラーをダウンロード・インストールします。
AWS コマンドラインインターフェイス(CLI: AWSサービスを管理する統合ツール)| AWS
インストール後、初期セットアップを行います。
>aws configure AWS Access Key ID [None]: xxx AWS Secret Access Key [None]: xxx Default region name [None]: ap-northeast-1 Default output format [None]: json
aws-vaultを使う
aws-vault のインストール
aws-vaultのGithubのREADMEによると、Windows用のインストール方法はいくつか用意されています。
https://github.com/99designs/aws-vault
今回はパッケージマネージャを使わず、実行可能なファイルを使います。
Releaseページから aws-vault-windows-386.exe
をダウンロードし、任意のフォルダに置きます。
また、今回使いやすくするため、
- ユーザー環境変数
Path
に、ダウンロードしたexeがあるディレクトリを追加 - 都度
aws-vault-windows-386.exe
を入力するのが手間なので、ダウンロードしたファイルをaws-vault.exe
にリネーム *1
としました。
その後、Windows Terminalを起動してバージョンが表示されればOKです。
>aws-vault --version v6.2.0
aws-vault 用環境変数を追加
今回、aws-vaultの Vaulting Backends として Encrypted file
を使います。
https://github.com/99designs/aws-vault#vaulting-backends
そこで、以下のユーザー環境変数を追加します。
- キー:
AWS_VAULT_BACKEND
- 値:
file
なお、ファイルは %USERPROFILE%\.awsvault\keys
に保管されます。
また、aws-vaultのパスワードを毎回入力するのが手間な場合は、以下もユーザー環境変数に追加します。ただし、環境変数を見るとパスワードが丸見えになるので注意が必要です。
- キー:
AWS_VAULT_FILE_PASSPHRASE
- 値: aws-vault向けファイルのパスワード
aws-vaultにIAMユーザを追加
上記で作成したIAMユーザ gate
を追加します。
>aws-vault add gate Enter Access Key ID: xxx Enter Secret Access Key: xxx Enter passphrase to unlock %USERPROFILE%/.awsvault/keys/: Added credentials to profile "gate" in vault
aws-vault経由でAWS CLIが動作するか確認します。IAMユーザに権限のあるS3は操作できました。
>aws-vault exec gate -- aws s3api list-buckets Enter passphrase to unlock %USERPROFILE%/.awsvault/keys/: { "Buckets": [], "Owner": { "DisplayName": "xxx", "ID": "xxx" } }
一方、権限のないLambdaの操作はできません。
>aws-vault exec gate -- aws lambda list-functions An error occurred (AccessDeniedException) when calling the ListFunctions operation ...
動作は良さそうだったため、 %USERPROFILE%/.aws/credentials
より、すべての内容を削除します。
これでAWSのアクセスキーが平文で保存しなくて済むようになりました。
AssumeRoleを使う
ここまではIAMユーザにIAMポリシーが紐付いていました。
次はIAMユーザにIAMポリシーを直接紐付けるのではなく、管理者IAMロールに対してAssumeRoleするように変更します。
管理者IAMロールの作成
以下の内容で管理者IAMロールを作成します。
AssumeRoleできるIAMポリシーを作成
まずはAssumeRoleできるIAMポリシーを作成します。
AssumeRole先を制限するため、Resourceに上記で作成した thinkAmiAdmin
を指定します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<account_id>:role/thinkAmiAdmin" } ] }
AssumeRoleできるIAMポリシーを、IAMユーザに追加
続いて、上記のIAMポリシーをIAMユーザに追加します。
これにより、IAMユーザには
- AmazonS3FullAccess
- thinkAmiAdminにAssumeRole可能
な権限が付与されます。
aws-vault向けに .aws/config を編集
AWS CLIからAssumeRoleできるよう、.aws/config
を変更します。
[profile gate] [profile admin] source_profile = gate role_arn = arn:aws:iam::<account_id>:role/thinkAmiAdmin
動作確認
AssumeRoleでLambdaまわりも操作できています。
>aws-vault exec admin -- aws lambda list-functions { "Functions": [] }
参考:パスワードレスサインインについて
さらにIAMユーザをセキュアにするため、書籍「クラウド破産を回避するAWS実践ガイド - KOS-MOS - BOOTH」に従い、パスワードレスサインインを試してみました。
すると、IAMユーザに追加したMFAを入力するだけで、ログイン済のAWS コンソールがブラウザに表示されました。
>aws-vault login admin Enter token for arn:aws:iam::<account_id>:mfa/gate: xxx # ブラウザが起動し、AWSコンソールでログイン済になる