AWSスイッチロール設定の備忘録
この記事で紹介すること
AWS環境における複数のサービスを、それぞれ独立したアカウントで管理することは、セキュリティの向上やコスト管理の効率化に有効です。
今回、初めてスイッチロールの設定を行ったので、その手順を整理しながら、備忘録としてまとめました。
本記事では、まずAWS Organizationsを使ってサービスごとにアカウントを分ける方法を紹介します。
その後、IAMユーザーを作成し、スイッチロールを用いて作業者が各アカウントにアクセスできるようにする具体的な手順を解説します。
設定方法
作業用IAMユーザ作成
マネジメントコンソールからIdentity and Access Management (IAM)を開き、ユーザの作成をします。
今回はサンプルでWorkUserというユーザ名にしていますが、作業者名を入れておくことを勧めます。
許可を設定は、後で追加するので、このステップでは何も追加する必要はありません。
IAMユーザを作成後、初期パスワードを取得するのを忘れないようにしましょう。
このIAMユーザには何も権限をつけていないので、現状だとログインしても何も操作は行えません。
サービスアカウントの作成
AWS Organizationsを開きAWSアカウントを追加を押下します。
Eメールアドレスは受信できるメールアドレスを設定する必要があるので、エイリアスで登録しておくと良いでしょう。
もし、間違ったメールアドレスで登録してしまうと、削除が非常に面倒なので注意が必要です。
サービスアカウントへのログイン
ログアウトし、先ほど作成したアカウントへログインします。
AWS Organizationsでは、パスワードを設定していないので、パスワードの再設定を行います。
ルートユーザとしてログインから遷移し、パスワードをお忘れですか? というリンクからメールを送信します。
スイッチ先(サービスアカウント)のアカウントでロールを作成する
先ほどログインしたアカウント(スイッチ先のアカウント)でロールを作成します。
Identity and Access Management (IAM)からロールの作成画面へ遷移し、カスタム信頼ポリシーを選択します。
カスタム信頼ポリシーには下記を記載します。{}内の部分は自身の情報に書き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::{スイッチ元のアカウントID}:user/{ユーザ名}"
]
},
"Action": "sts:AssumeRole"
}
]
}
許可ポリシーには、作業者に与えたい権限を付与します。
今回は、AdministratorAccessを付与しておきます。
確認画面では、下記の状態になっているはずです。
Roleが作成できたら、下記のリンクをコピペしておくと、後からスイッチロールする時にフォームに値が自動で入るので、楽に切り替えることができます。
スイッチ元のアカウントにポリシーを作成する
ログアウトし、元のアカウントへログインします。
ポリシーエディタでJSONを選択し、下記を記載します。{}内の部分は自身の情報に書き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::{スイッチ先のアカウントID}:role/WorkUser"
}
]
}
スイッチロールを試す
設定が完了したので、スイッチロールできることを確認します。
ログアウトし、作業用IAMユーザでログインします。
ログイン後、もしロール作成手順の最後にコピーしておいたリンクがあれば、それを開きます。
ない場合でも、下記を開くことで、スイッチロール画面に遷移することができます。
必要な値が入っていることを確認してからSwitch Roleを押下します。
MFA(多要素認証)を強制する
通常のパスワード認証だけでは、不正アクセスのリスクがありますが、MFAを追加することで、ログイン時に別の確認手段も必要となり、アカウントが乗っ取られる可能性を大幅に減らすことができます。
スイッチロール先のアカウントで作成したRoleを下記のように変更します。
(Conditionのブロックが追加されています。)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::{スイッチ元のアカウントID}:user/{ユーザ名}",
]
},
"Action": "sts:AssumeRole",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
これにより、MFAを設定していないとスイッチロールができなくなりました。
しかし、現在作業ユーザは、何の権限も与えられていない状態なので、MFA設定も行えない状態であり、付与が必要です。
ルートアカウントで、下記のポリシーを作成し、作業ユーザにアタッチします。
(参考サイトのポリシーにiam:ChangePasswordを許可するよう加えています。)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListActions",
"Effect": "Allow",
"Action": [
"iam:ListUsers",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowUserToCreateVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice"
],
"Resource": "arn:aws:iam::*:mfa/*"
},
{
"Sid": "AllowUserToManageTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:EnableMFADevice",
"iam:GetMFADevice",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowUserToDeactivateTheirOwnMFAOnlyWhenUsingMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice"
],
"Resource": [
"arn:aws:iam::*:user/${aws:username}"
],
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
},
{
"Sid": "BlockMostAccessUnlessSignedInWithMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ListUsers",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"iam:ChangePassword"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
再度、作業ユーザに戻ると、MFA設定ができるようになっているはずです。
MFAの設定方法は割愛します。
MFA設定をした後、スイッチロールするためには、ログインし直す必要があることに注意しましょう。
これで設定は完了です。
採用情報
e-dashエンジニアチームは現在一緒にはたらく仲間を募集中です!
同じ夢について語り合える仲間と一緒に、環境問題を解決するプロダクトを作りませんか?
Discussion