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

# はじめに
たまたま、[AWS: 特定の日付内で MFA を使用する特定のアクセスを許可する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_aws_mfa-dates.html)を見つけ、とても良さそうだったので、少しアレンジしつつ挙動の確認をしてみました。

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

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

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


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

## ポリシーの作成
まずはIAMのポリシーから「ポリシーの作成」を行います。
![スクリーンショット 2018-10-19 11.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/82090/25704fbd-25b8-0c80-0dd0-fc125100a388.png)
上の画像のように「JSON」タブを選択したら以下のポリシーをコピペして「Review policy」をクリックします。

```text: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_ のところに注目です。_DateGreaterThan_ と _DateLessThan_で利用できる期間の設定が行えます。
ここでは　"2018/10/01 〜 2018/12/31"　の期間でこのポリシーが利用できる設定を行っています。

次にポリシーの名前と説明を設定画面になるので適当に入力します。
![スクリーンショット 2018-10-19 11.23.02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/592d08cd-f9ed-4398-07bf-d4fbd3db693e.png)
ここでは 「_LimitedTime_」 というポリシー名を設定しました。

## ロールの作成
ポリシーを作成したらアタッチするロールの作成です。
「ロールの作成」をクリックしたら今回は「別のAWSアカウント」を選択し、_アカウントID_のところにスイッチ元のアカウントIDを入力し「次のステップ：アクセス権限」へ進みます。
![スクリーンショット 2018-10-19 11.10.18.png](https://qiita-image-store.s3.amazonaws.com/0/82090/060b0f6f-7971-cb2e-7441-bf6d92703760.png)

ここでは先ほど作成したポリシー(ここではLimitedTime)を選択して「次のステップ：確認」へ進みます。
![スクリーンショット 2018-10-19 11.29.12.png](https://qiita-image-store.s3.amazonaws.com/0/82090/3d6f2502-3b14-5e19-d701-9713d465a95c.png)

確認画面ではロール名と説明の入力画面になるため適当に入力します。
![スクリーンショット 2018-10-19 11.30.24.png](https://qiita-image-store.s3.amazonaws.com/0/82090/69d80450-6299-30dd-4829-1b1ac84bf03b.png)

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

これで設定は完了です。
それでは許可スイッチロールしてみます。
![スクリーンショット 2018-10-19 11.33.49.png](https://qiita-image-store.s3.amazonaws.com/0/82090/01ed5847-e75d-1250-63c0-f50bf344025c.png)
![スクリーンショット 2018-10-19 11.36.01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/fa95cfa0-b2ff-29ef-41a2-85e76cf89fdc.png)
無事スイッチロールできました。


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

### S3へアクセスした場合
![スクリーンショット 2018-10-19 11.38.19.png](https://qiita-image-store.s3.amazonaws.com/0/82090/c272edbb-7164-40f3-5c2e-1f93f34c52d3.png)

### EC2へアクセスした場合
![スクリーンショット 2018-10-19 11.39.05.png](https://qiita-image-store.s3.amazonaws.com/0/82090/3cd78ac6-003b-1b6d-1602-ddfb3e5d77df.png)

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


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

```text: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](https://qiita-image-store.s3.amazonaws.com/0/82090/c272edbb-7164-40f3-5c2e-1f93f34c52d3.png)
すると先ほどの期間外の状況と同じく、スイッチロールはできてもアクセス権限がないのでエラーとなってしまいます。
なぜならスイッチ元のユーザーでMFAを利用したログインを行っていなかったからです。
それではスイッチ元のAWSコンソールに対してMFAを利用したログインを行った上で再度スイッチロールしてみます。
![スクリーンショット 2018-10-19 11.36.01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/fa95cfa0-b2ff-29ef-41a2-85e76cf89fdc.png)
すると無事スイッチできました。


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