エンタメ系企業の社内もろもろを担当しているakibinです。
最近はChaiにハマってます。めにめにめに赤ちゃんチェケラ。
やりたいこと
これをやりたいと思います。(最近はIAMロールをお面に例えることがスタンダードなようです)
これを実現したかった理由。
- セキュリティを担保(MFA)した状態でログインを簡素化したい
- 複数AWSアカウントを切り替えるのがめんどくさい
- 複数AWSアカウントに作成したIAMユーザの管理がめんどくさい
- 極力アクセスキーを使用したくない
AWSのセキュリティインシデントはアクセスキー漏洩が圧倒的に多いようで、AWSのIAMユーザのアクセスキーの管理にも、アクセスキーではなくIAMロールで代用すると明記されています。
なので、当初はAWSアカウントのセキュリティ強化で色々考えていたのですが、結果セキュリティ強化と利便性の兼ね備えた、IAM王構成が実現できました。
この構成だとIAMユーザとIAMグループは使用せず、IAMロールとIAMポリシーのみで複数AWSアカウントへ簡単にアクセス、またアクセスキーを使用せず複数AWSアカウントへCLIでのアクセスが実現が可能です。
項目
管理コンソール
- Googleアカウント(MFA)で踏み台となるAWSアカウントへSSO
- 踏み台AWSアカウントから他のAWSアカウントへスイッチング
CLI
- CLIからGoogleアカウント(MFA)で踏み台AWSアカウントへログイン
- CLIで踏み台AWSアカウントから他のAWSアカウントへスイッチング
管理コンソール:Googleアカウント(MFA)で踏み台となるAWSアカウントへSSO
こちらの設定方法はAWSの公式ブログ G Suite アカウントを用いた AWS へのシングルサインオン を参照させてもらいました。そのまんま手順通り設定すればGoogleアカウントでSSOが可能になります。
作業中の注意点として、踏み台AWSアカウントに設定するIAMロールの最大セッション時間と、Googleアカウント側のユーザーのカスタム属性(Seesion Duration)の値は合わせてください。
Googleアカウント側のユーザーのカスタム属性(Seesion Duration)の値
Googleアカウントで踏み台AWSアカウントへSSOが可能となったら、次に他のAWSアカウントへスイッチングする設定を行います。
管理コンソール:踏み台AWSアカウントから他のAWSアカウントへスイッチング
スイッチ先のAWSアカウントへ、踏み台AWSアカウントからスイッチを許可するIAMロールを作成します。
1. スイッチ先のAWSアカウントのIAMページ→[ロール]から[ロールの作成]をクリック
2. [別のAWSアカウント]を選択、踏み台AWSアカウントの[アカウントID]を入力して次のステップへ
MFAはGoogleアカウントで行われているのでチェック不要です。
3. 踏み台アカウントに許可するアクセス権限(IAMポリシー)を選択
今回は読み込みのみ(ReadAccessOnly)の権限を付与しました。
4. 任意でタグを付ける
今回はつけてませんが、Nameとかでわかりやすくタグ付けするのもありと思います。
5. ロール名とロール説明(任意)を入れてロールを作成
6. 作成したIAMロールを開く
7. [信頼関係]タブを開き、[信頼関係の編集]を開く
8. "Principal"に踏み台AWSアカウントへのSSO設定時に作成したIAMロールのarnを入れる
GoogleアカウントからSSO設定時に作成した踏み台AWSアカウントのIAMロールのarn(Amazon リソースネーム)をコピーして...
※踏み台AWSアカウントのIAMロール
..."Principal"の"AWS"箇所にペーストする。[信頼ポリシーの更新]をクリック
踏み台AWSアカウントの特定のIAMロールからのスイッチがこれで許可されます。
IAMユーザでのスイッチングであればこれで設定完了なのですが、今回はGoogleアカウントからSSOする踏み台AWSアカウントのIAMロールからスイッチするのでもう1作業あります。
それが、
踏み台AWSアカウントにスイッチ先AWSアカウントのIAMロールへのスイッチを許可するIAMポリシーを作成して、踏み台AWSアカウントのSSO用IAMロールにアタッチする
です。
9. 先程スイッチ先AWSアカウントに作成したIAMロール(from_fumidai)のarnをコピーしておく
10. 踏み台AWSアカウントのIAMページから[ポリシー]を開き[ポリシーの作成]
11. [JSON]タブを開き、以下をコピペ。"Resource"には先程コピーしたスイッチ先AWSアカウントのIAMロールのarnを入れる
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::************:role/from_fumidai"
}
]
}
12. 任意でタグを入れる
13. [ポリシー名]と[説明](任意)を入れて[ポリシーの作成]
14. 踏み台AWSアカウントへSSOするためのIAMロールを開き、作成したIAMポリシーをアタッチするため、[ポリシーをアタッチします]をクリック
15. 作成したIAMポリシーを選択して[ポリシーをアタッチ]
では、実際に踏み台AWSアカウントにSSOして、スイッチ先AWSアカウントにスイッチングしてみます。
16. スイッチ先AWSアカウントのスイッチ用IAMロールのスイッチング用URLをコピーしておく
17. Googleアカウントから踏み台AWSアカウントへSSO
18. 先程コピーしたスイッチング用URLへアクセス。色を決めて[ロールの切り替え]
これでSSOからの他のAWSアカウントへスイッチングができました!
ちなみにスイッチングの履歴はブラウザに保存され、以下で履歴を確認してスイッチングが可能です。
キャッシュクリアすると履歴が消えるので、その場合はスイッチ先AWSアカウントのスイッチ用IAMロールのスイッチング用URLから再度スイッチングしてください。
次はCLIでのGoogleアカウントでのログインと、他のAWSアカウントへのスイッチング方法です。
CLIからGoogleアカウント(MFA)で踏み台AWSアカウントへログイン
aws-google-auth (CLIによるSAML認証ツール)を使用してログインしていきます。
【今回の条件】
- macOS 10.15.6
- AWS CLIインストール済み
1. Macでpipを使えるようにする
以下の記事を参照させていただきました!
【Python】macOSでpipを使えるようにする
2. pipコマンドでaws-google-authをインストール
$ pip install aws-google-auth
3. ~/.aws/configに設定値を入力
[profile sts]
region = xx-xxxxxx-x
google_config.ask_role = False
google_config.keyring = False
google_config.duration = 43200
google_config.google_idp_id = xxxxx(Googleアカウントのidp_id)
google_config.role_arn = xxxxx
google_config.google_sp_id = xxxxx(Googleアカウントのsp_id)
google_config.u2f_disabled = False
google_config.google_username = xxxxx
- region
アクセスするリージョンを入力 - google_config.duration
管理コンソール:Googleアカウント(MFA)で踏み台となるAWSアカウントへSSOで設定した、踏み台AWSアカウントに設定したIAMロールの最大セッション時間と、Googleアカウント側のユーザーのカスタム属性(Seesion Duration)の値と合わせてください。 - idp_idとsp_id
AWSマネジメントコンソールへのリンクURLから取得可能です
- google_config.role_arn
踏み台AWSに作成したSSO用のIAMロールのarn - google_config.google_username
GoogleアカウントのID
aws-google-authコマンドを実行
$ aws-google-auth
Google Password: # Googleアカウントのパスワードを入力
# MFA認証。今回の場合は私のスマホでログインを許可しました。SMSやAuthenticaterを使用している場合はTokenを求められるので、それを入れてEnter
Check your phone - after you have confirmed response press ENTER to continue.
以下のようなメッセージが出れば認証完了です。
Assuming arn:aws:iam::************:role/ima-role_name
Credentials Expiration: 2021-07-02 04:53:35+09:00
5. プロファイルの切り替え
$ export AWS_DEFAULT_PROFILE=sts
これでOK!IAMユーザの一覧でも見てみましょう。
$ aws iam list-users
当然お見せできませんが、一覧表示されました!
で、AWS管理コンソールでアクセスキーは発行していませんが、実際には~/.aws/credentials
を見るとアクセスキーが発行されていました。
ただ、これはGoogleアカウントのID/PWとMFAをパスしないと使用できないので、セキュアですね。
CLIで踏み台AWSアカウントから他のAWSアカウントへスイッチ
では次に、CLIでログインした踏み台AWSアカウンtのから他のAWSアカウントへスイッチする方法です。
1. スイッチ先のAWSアカウントに作成したIAMロールのarnをコピー
2. ~/.aws/config
にスイッチ先のAWSアカウントのIAMロールのプロファイルを作成
[profile from_fumidai]
role_arn = arn:aws:iam::************:role/from_fumidai
source_profile = sts
- role_arn
先程コピーしたarn - source_profile
Googleアカウントでログイン用のプロファイルの名前
Googleアカウントでログイン用のプロファイルを元(source)にして、from_fumidaiにアクセスする感じです。
3. プロファイルの切り替え
$ export AWS_DEFAULT_PROFILE=from_fumidai
これでOK!もう一度IAMユーザの一覧でも見てみましょう。
$ aws iam list-users
IAMロールになるというか、IAMロールを使ってアクセスしてる感じなんですが、この子マチガエテルヨ…
おまけ:どうしてもプログラム用にアクセスキーを使いたい場合…
というわけで、ユーザに関してはGoogleアカウントでのSSOとスイッチングで複数AWSアカウントにアクセス可能になりました。
CLIも上記のような感じでアクセスキー発行なしでアクセス可能です。
また、SDKなどプログラム用のアクセス制御について、AWSのベストプラクティスでもIAMロールを使用することが基本となります。
が、どうしてもアクセスキーを使用したいシーンもあると思います。
その場合は、以下を考慮してもらえるといいと思います。
- 専用のIAMユーザを作成してアクセスキーを発行
ユーザ用のIAMユーザにアクセスキーを発行しない - プログラムごとに発行
複数プログラムで共有しない - 担当者をタグ付けする
用途や担当者を明確にするためタグ付けする - IAMポリシーでアクセスできるリソースを制限、またIP制限でアクセスキー自体を外部環境から使用できなくする
たとえば、特定のIPアドレス以外からの使用を制限する場合は以下のような感じです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"***.***.***.***/32"
]
}
},
"Resource": "*"
}
]
}
これにより、万が一漏洩したとしても、そのアクセスキーでは何も出来ないです。
これぐらい、アクセスキーの取り扱いは注意したほうが良いと思います。
おまけ以上です!