SCPでIAM Identity CenterユーザーとIAMユーザーにIPアドレス制限をかけてみた

SCPを使ってIAM Identity CenterユーザーとIAMユーザーにIPアドレス制限をかける
2023.07.28

みなさんこんにちは、杉金です。
SCPを使って、IAM Identity CenterユーザーとIAMユーザーにIPアドレス制限をかけてみます。今回の内容は、AWS Prescriptive Guidanceに記載されている内容をもとに実施しています。詳細は下記ページをご確認ください。

別のIPアドレス制限方法

本記事でいうIPアドレス制限とは、指定したIPアドレスで接続した場合のみ各種AWSリソースにアクセスできるというものです。SCPではなく、IAM Identity Centerのアクセス許可セット毎にIPアドレス制限を行う方法としては、以下のブログを参照ください。

使い分けとしては、AWSアカウント単位やOU単位でIPアドレス制限する場合は本記事の内容を、アクセス許可セット単位でIP制限をかける場合は上記のブログを参考にする形です。接続要件が環境や人によって細かく異なる場合はアクセス許可セットでの制限が望ましいです。

注意点として、SCPは管理アカウントのユーザーやロールには適用されません。管理アカウントへのアクセスでIPアドレス制限をかけたい場合はアクセス許可セットで設定します。

適用するポリシー

適用するポリシーは以下です。 ${sourceip} の部分(2箇所)を接続を許可するIPアドレスに置き換えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyNotMyIPsIAMUsers",
            "Effect": "Deny",
            "Action": "*",
            "Resource": [
                "*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "${sourceip}"
                    ]
                },
                "StringEquals": {
                    "aws:PrincipalType": [
                        "User"
                    ]
                }
            }
        },
        {
            "Sid": "DenyNotMyIPsSSOFederation",
            "Effect": "Deny",
            "Action": "*",
            "Resource": [
                "*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "${sourceip}"
                    ]
                },
                "StringEquals": {
                    "aws:PrincipalType": [
                        "AssumedRole"
                    ]
                },
                "ArnLike": {
                    "aws:PrincipalARN": [
                        "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*/AWSReservedSSO_*"
                    ]
                },
                "Bool": {
                    "aws:ViaAWSService": "false"
                }
            }
        },
        {
            "Sid": "DenyIdPCreation",
            "Effect": "Deny",
            "Action": [
                "iam:CreateSAMLProvider",
                "iam:UpdateSAMLProvider",
                "iam:DeleteSAMLProvider"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "ArnNotLike": {
                    "aws:PrincipalARN": [
                        "arn:aws:iam::*:role/aws-service-role/sso.amazonaws.com/AWSServiceRoleForSSO"
                    ]
                }
            }
        }
    ]
}

上記のjsonは先ほど紹介したAWS Prescriptive Guidanceのページに添付ファイルとして提供されています。

補足事項

  • ページ内の制限事項にも記載がありますが、IAMロールを使用したクロスアカウントのアクセスはIPアドレスで制限していませんのでご注意ください
  • DenyIdPCreationセクションで、IAM SAML IDプロバイダー関連の操作を禁止しています。これにより各アカウントの管理者がSAML IDプロバイダーを作成してポリシーをすり抜けることを防止します

試してみた

SCPのポリシー作成とアタッチ

SCPのポリシー作成から行います。まずはAWS Organizationsのコンソールから「ポリシー」→「ポリシーを作成」を選択します。

ポリシー名に適当な名前をつけます。

下にスクロールして、ポリシーエディタ画面から先ほど記載したjsonポリシーを貼り付けます。エディタ上にエラーが無いことを確認して「ポリシー作成」を選択します。

ポリシーの作成が完了したらにポリシーの適用を行います。作成したポリシーを選び「ターゲット」タブから「アタッチ」を選択して、適用先となるOUやAWSアカウントを選択します。

これで作成したポリシーが適用されました。

動作確認

次のパターンで動作確認を行いました。

  • 確認したこと
    • IAM Identity Center経由で対象AWSアカウントにログイン
      • 指定IP:各種リソースにアクセスできる
      • 指定IP以外:各種リソースにアクセスできない
    • IAMユーザーで対象AWSアカウントに直接ログイン
      • 指定IP:各種リソースにアクセスできる
      • 指定IP以外:各種リソースにアクセスできない

注意点として、指定のIPアドレス以外であってもログイン自体はできることです。指定IPアドレス以外でアクセスした場合は、ログイン後に以下のようなAPIエラー等が起きてリソースにアクセスできません。

Security Hubの場合、ページ自体にアクセスできません。

Amazon S3バケット一覧は、以下のように権限エラーで拒否されます。

以上がアクセス拒否された状態の例です。

最後に

SCPを使って、IAM Identity CenterユーザーとIAMユーザーにIP制限をかけてみました。IP制限をかけたときの影響は多岐に渡るため、AWS公式から今回のようにガイダンスが提供されているのはとても助かりますね。 個人的には、この仕組みを実装する際に被災時など指定IPアドレスでアクセスできなくなってしまうケースが起きないかを調べて、代替手段を確認した上で実装するとよいと感じました。

参考資料