Management Consoleへのアクセス制限(IPアドレスとMFAと私)

記事タイトルとURLをコピーする

最近、めっきり寒くなりましたよね。寒くなって雪が降ると道路が凍ったり、車が走るのが困難だったりして、走行に対しての制限がかかりますよね。
ということで、Management Consoleへのアクセスを制限してみたので、そのことを書いていきます。

はじめに

制限するものを定義していきます。今回は以下の3つです。

  • 使うのは私のみ
  • MFAを使う
  • IPアドレスでログインの制限をする

この3つを制限する対象として作っていきます。

作っていく

まずは単純に作っていきます。

IAMユーザの作成

まずは一つ目の制限であるIAMユーザの作成をマネコンから行い、MFAを利用できる状態にしてください。
今回は「testuser」という名前のユーザで作成を進めます。

IAMグループの作成

次は、二つ目/三つ目の制限をIAMグループの作成で行います。ここでは3つのポリシーを割り当てます。

IPアドレスの制限

二つ目の制限、IPアドレスです。自分が利用する回線のIPアドレスを調べて、修正して下さい。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SourceIP",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.xxx",
                        "yyy.yyy.yyy.yyy",
                        "zzz.zzz.zzz.zzz"
                    ]
                }
            }
        }
    ]
}

MFAの制限

三つ目の制限であるMFAの設定を行います。ユーザ縛りのMFA縛りにします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "MFASettings01",
            "Effect": "Allow",
            "Action": "iam:DeactivateMFADevice",
            "Resource": [
                "arn:aws:iam::000000000000:mfa/testuser",
                "arn:aws:iam::000000000000:user/testuser"
            ],
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        },
        {
            "Sid": "MFASettings02",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice",
                "iam:CreateVirtualMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::000000000000:mfa/$testuser",
                "arn:aws:iam::000000000000:user/$testuser"
            ]
        },
        {
            "Sid": "MFASettings03",
            "Effect": "Allow",
            "Action": [
                "iam:ListUsers",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        }
    ]
}

実行

これでマネコンからログインすると一部使えない機能が出てきます。

  • CloudFormation
  • AWS Certificate Manager

理由は、送信元IPに基いてAWSへのアクセスを拒否するためです。 詳細については、こちらを参照下さい。

解決法

AssumeRoleでロールを割り当てる

IAMロールを割り当てることにより、権限を移譲します。

IAMロールの作成

まずはIAMロールを作成します。今回は「AdministratorAccess」ポリシーを利用したロールを作成します。
今回は「TESTROLE」という名前で作成します。
作成は「クロスアカウントアクセスのロール」の「所有しているAWSアカウント間のアクセスを提供します」から作成していきます。
現在利用中のアカウントIDを入力し、「MFAが必要」にチェックを入れます。
ポリシーのアタッチは「AdministratorAccess」に設定し、最後に信頼関係の編集を行います。以下の内容を入力して下さい

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
            "arn:aws:iam::000000000000:user/testuser"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}

IAMグループの修正

IAMグループに適用したポリシーの追加/修正を行います。

AssumeRoleする際のロールの指定

先ほど作成したロールを切り替えしたタイミングで利用できるようにします。

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::000000000000:role/TESTROLE"
    }
}

ACMのCreateKeyができるようにする

このままだとACMを利用して、証明書の作成ができない状態になります。
IPアドレスによる制限をしているポリシーを変更してあげることでACMで証明書の作成を行うことができるようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SourceIP",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "XXX.XXX.XXX.XXX",
                        "YYY.YYY.YYY.YYY",
                        "ZZZ.ZZZ.ZZZ.ZZZ"
                    ]
                },
                "Bool": {
                    "kms:BypassPolicyLockoutSafetyCheck": true
                }
            }
        }
    ]
}

さいごに

これで、IPアドレスでマネコンを制限できました。 ただし、以下のBlackbeltの資料にも書かれている通り、aws:SourceIp条件の利用はオススメしませんが、制限は可能ですので、何かの足しになると幸いです。