IAMを特定の時間だけ許可させる方法

ガジュマル育ててる人
2024-03-05
2024-03-05

こんにちは!ガジュマル育ててる人です。

今日はIAMユーザーの動作を特定の日だけ許可するような設定をしてほしいとのお声をいただいて
意外と簡単にできることが分かったので、記載していこうと思います。

準備(基本のおさらい)

まず、準備として時間制限のされていない状態で作成して

動作することを確認してから制限をかけてみましょう。
※今回はIAMユーザー+IAMポリシーでやってみますが、IAMロール+IAMポリシーでも実現は可能そうでした。

それではIAMポリシーでやりたいことを定義していきます。

今回は例としてEC2に対するすべての動作にしています。
下記設定のjsonで設定してみます。
※このタイミングでは時間制限かけていないので、最終的なもの見たい人は飛ばしてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*"
        }
    ]
}

limited-ec2-policy-test
という名前のポリシーを作成しました。

次にこのポリシーを使用するログインして操作するIAMユーザーを発行します。
limited-ec2-userというIAMユーザーをAWSコンソールログインを許可して作成しました。

発行できたら、作成したユーザーでログインを行い、EC2の作成や停止、削除ができるなど各種動作ができるか確認します。

問題ないことを確認できたら次に制限してみましょう。

時間制限かけてみた。

公式のリファレンスによるとIAMポリシーに下記のようなConditionのブロックを追加するだけで大丈夫みたいです。
下記の例ではUTCの2024年2月1日00時00分00秒~2024年3月30日23時59分59秒の間許可するようにしてみました。
UTCなので、時間には注意しましょう。

IAMポリシーのlimited-ec2-policy-testを編集してみて、動作するか確認してみましょう。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*",

            "Condition": {
                "DateGreaterThan": {"aws:CurrentTime": "2024-02-01T00:00:00Z"},
                "DateLessThan": {"aws:CurrentTime": "2024-03-31T23:59:59Z"}
            }
        }
    ]
}

ちなみにConditionブロックで使用できる日付の演算子は公式ドキュメントを参照すると下記6つがあります。

  1. DateEquals                        :特定の日付
  2. DateNotEquals                 :特定の日付以外
  3. DateLessThan          :特定の日時より前
  4. DateLessThanEquals   :特定の日時以前
  5. DateGreaterThan    :特定の日時より後
  6. DateGreaterThanEquals:特定の日時以後

まとめ

Conditionのブロックを追加するだけで時間制限がかけられるので、簡単に制限をかけることができますし、IAMロールでも同じように時間制限を実現できそうですね。
それに複数のステートメントがあるようなポリシーの場合は、特定のルールだけ特定の時間まで許可するようなこともできそうで、覚えておくとどこかで使えそうなものですね!

それではまた!