これまでは、AWSコンソールでデータを確認するだけの場合、一般ユーザでログインし、設定に変更を加えたい場合、rootでログインしていました。
しかし、私の場合、AWSをテスト的に使っており、頻繁に設定変更をおこないたくなるので、いちいちログインし直すこの運用はとても面倒に感じていました。
また、rootでログインしているとGuardDutyが毎回アラートを発砲してしまうので、それも避けたいと考えていました。
そこで今回は、AWSコンソールでLinuxで言うsudo的な運用ができるように、スイッチロールの設定をしてみました。
スイッチロール機能で同一アカウント内で最低限の権限昇格が可能
AWSにはスイッチロール機能というものがあり、パスワードを要求せずに簡単に権限昇格をさせることが可能です。
だだし、パスワードを要求しない分、権限を与えすぎるとrootユーザでログインしたのと変わらなくなり、かなり危なくなりそうなので注意が必要と思われます。
1.IAMでスイッチ先のロール作成
rootユーザでAWSコンソールにログイン後、IAMに移動します。

上記画面の左上にある「ロールの作成」ボタンを押すと、以下の画面が表示されます。
ここで、左から2番目の「別のAWSアカウント」を選択し、現在使っているAWSアカウントIDを入力します。
実は同一のAWSアカウントも入力可能ですので、同じAWSアカウント内でロールを切り替えたい場合は、こちらを選択してください。
もちろん、別のAWSアカウントのロールに切り替える場合もこちらを使います。

そして、「次のステップ:アクセス権限」ボタンを押すと、今回作成するロールに与えるポリシー(権限)を選択できます。
下の例ではAdministratorAccessを設定していますが、実はあとで変更しています。あまり権限を与えすぎると、このユーザIDを乗っ取られた時に、何でもできてしまいますので。

上記画面から「次のステップ:タグ」を押すと、タグの設定ができます。ここは任意ですので、自分がわかりやすいようにタグをいくつか付けて、「次のステップ:確認」を押します。

すると、設定の確認画面が表示されますので、ここでロール名等を入力し、「ロールの作成」ボタンを押します。

これで、新しいロールが作成されました。

2.IAMでスイッチ元のポリシーの作成
次にログインIDに対してスイッチロールさせる為のポリシーを作成します。

IAMの画面の左ペインから「ポリシー」を選択後、メイン画面の左上に表示される「ポリシーの作成」を選択します。
すると以下のポリシー作成画面が表示されますので、「JSON」タブに切り替え後、以下の画面のとおり、記述を行ってください。

一応、記述内容をテキストにしておきますので、コピペした後、「アカウントID」と「ロール名」の部分を書き換えてもらえればOKです。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::(スイッチ先のアカウントID):role/(1.で設定したロール名)"
}
}
上記の記述が終わったら、「ポリシーの確認」ボタンを押します。
すると、ポリシーの名前を記入する画面が表示されますので、それを記入後、「ポリシー の作成」ボタンを押してください。

3.ユーザーにロールへのアクセス権限を付与
権限昇格をさせたいユーザーに2.で作成したポリシー(AdminGroupRoleへのスイッチを許可したもの)を割り当てます。
IAMの画面の左ペインから「ユーザー」を選択後、メイン画面からポリシーを割り当てたいユーザーを選択します。

するとユーザーの概要画面が表示されますので、「アクセス権限」タブの中から「アクセス権限の追加」ボタンを押します。

すると以下の画面が表示されますので、「既存のポリシーを直接アタッチ」を選択後、先ほど作成したポリシー(AdminSwitchPolicy)を選択します。

その後、「次のステップ:確認」ボタンを押すと確認画面が表示されますので、そのまま「アクセス権限の追加」ボタンを押します。

4.実際にスイッチロールしてみる
これでスイッチロールが可能となりましたので、許可したアカウントにてAWSコンソールにログイン後、画面右上に表示されている「ユーザー名@アカウントID」をクリックし、表示されたプルダウンの中から「スイッチロール」を選択します。

すると以下のロール切り替え画面が表示されますので、スイッチ先のアカウント(スアカウントID)とロール(ロール名)、色(背景色)を指定し、「ロールの切り替え」ボタンを押してください。

うまくいけば、画面右上のログイン情報(ロール名@アカウントID)の背景が指定した色に切り替わり、元のログインユーザーではできなかった操作ができるようになります。

以上で、スイッチロールが正常に動作することが確認できました。
しかし、この設定のままだと、ログイン可能なユーザーであれば誰もが特権を持つことができるようになってしまいますので、次回は、スイッチロールができるユーザを制限する方法をアップしたいと思います。
