AWS
IAM

スイッチロールユーザーに対して期間限定&MFA利用でのアクセスを許可する。

はじめに

たまたま、AWS: 特定の日付内で MFA を使用する特定のアクセスを許可するを見つけ、とても良さそうだったので、少しアレンジしつつ挙動の確認をしてみました。

簡単にどんなことをしたかというと、

  • 特定のユーザーに期間限定でAWSコンソールへアクセスできるようにする。
  • 他のアカウントからのスイッチロールを利用する。
  • スイッチ元でMFAを利用していない場合はアクセスできないようにする。

この3点について確認しました。

設定

特に変わった作業はないです。ポリシーの作成をしてからロールの作成を行います。

ポリシーの作成

まずはIAMのポリシーから「ポリシーの作成」を行います。
スクリーンショット 2018-10-19 11.12.09.png
上の画像のように「JSON」タブを選択したら以下のポリシーをコピペして「Review policy」をクリックします。

IAMポリシー
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "*"
        ],
        "Resource": "*",
        "Condition": {
            "DateGreaterThan": {"aws:CurrentTime": "2018-10-01T00:00:00Z"},
            "DateLessThan": {"aws:CurrentTime": "2018-12-31T23:59:59Z"}
        }
    }
}

Condition のところに注目です。DateGreaterThanDateLessThanで利用できる期間の設定が行えます。
ここでは "2018/10/01 〜 2018/12/31" の期間でこのポリシーが利用できる設定を行っています。

次にポリシーの名前と説明を設定画面になるので適当に入力します。
スクリーンショット 2018-10-19 11.23.02.png
ここでは 「LimitedTime」 というポリシー名を設定しました。

ロールの作成

ポリシーを作成したらアタッチするロールの作成です。
「ロールの作成」をクリックしたら今回は「別のAWSアカウント」を選択し、アカウントIDのところにスイッチ元のアカウントIDを入力し「次のステップ:アクセス権限」へ進みます。
スクリーンショット 2018-10-19 11.10.18.png

ここでは先ほど作成したポリシー(ここではLimitedTime)を選択して「次のステップ:確認」へ進みます。
スクリーンショット 2018-10-19 11.29.12.png

確認画面ではロール名と説明の入力画面になるため適当に入力します。
スクリーンショット 2018-10-19 11.30.24.png

今度は「LimitedTimeUser」というロール名にしました。

これで設定は完了です。
それでは許可スイッチロールしてみます。
スクリーンショット 2018-10-19 11.33.49.png
スクリーンショット 2018-10-19 11.36.01.png
無事スイッチロールできました。

期間外でスイッチロールした場合

それでは設定した期間外でスイッチロールしたらどうなるのでしょうか?
今回はポリシーの DateLessThan を過去にして確認してみました。

S3へアクセスした場合

スクリーンショット 2018-10-19 11.38.19.png

EC2へアクセスした場合

スクリーンショット 2018-10-19 11.39.05.png

とりあえずS3とEC2の2つに対してアクセスしてたところ、ロールは用意されているのでスイッチロールはできますが、アクセス権限がないためエラーとなりました。

MFAの利用設定

このロールに対してMFA利用設定を追加するとどうなるのでしょうか?

IAMポリシー(MFAあり)
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "*"
        ],
        "Resource": "*",
        "Condition": {
            "Bool": {"aws:MultiFactorAuthPresent": true},
            "DateGreaterThan": {"aws:CurrentTime": "2018-10-01T00:00:00Z"},
            "DateLessThan": {"aws:CurrentTime": "2018-12-31T23:59:59Z"}
        }
    }
}

Condition のところに 「"Bool": {"aws:MultiFactorAuthPresent": true}」 を追加しています。

それではこの状態で改めてスイッチロールし直してみます。
スクリーンショット 2018-10-19 11.38.19.png
すると先ほどの期間外の状況と同じく、スイッチロールはできてもアクセス権限がないのでエラーとなってしまいます。
なぜならスイッチ元のユーザーでMFAを利用したログインを行っていなかったからです。
それではスイッチ元のAWSコンソールに対してMFAを利用したログインを行った上で再度スイッチロールしてみます。
スクリーンショット 2018-10-19 11.36.01.png
すると無事スイッチできました。

おわりに

期間設定は一時的なアカウント払い出しが必要になった場合などでとても便利です。
また、今回スイッチロールを絡めたのは、パートナー企業などに対して利用しているところは少なくないと思ったからです。
その際に気になるのが、もし許可したAWSアカウント側でMFAが設定されていなかったらという点です。
そういったセキュリティ維持にもポリシーで制限させておくと良いと思います。