これをつけとけ!セキュアなIAMポリシー

セキュアな IAM ポリシーを用いることで、より安全に IAM ユーザーを使用することができます
2021.06.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんちは、テクニカルサポートチームの丸屋 正志です。

■ご注意ください
このポリシーでは「IAMユーザーと同じ名称でMFA設定を行う場合」のみMFA設定の許可が与えられています。

2022/11よりMFA設定時に任意の名称を指定できるようになっており、上記の名称と異なるMFA名を指定した際にエラーになる場合があります。(上述のセキュアポリシー以外でMFA設定の許可が与えられていればエラーは発生しません。)

(参考情報)
https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-identity-access-management-multi-factor-authentication-devices/

1. AWSアクセスキーセキュリティ意識向上委員会って何?

昨今、AWSのアクセスキーを漏洩させてしまうことが原因でアカウントへの侵入を受け、
多額の利用費発生・情報漏洩疑いなど重大なセキュリティ事案が発生するケースが実際に多々起きています。

そこで、アクセスキー運用に関する安全向上の取組みをブログでご紹介する企画をはじめました。

アクセスキーを利用する場合は利用する上でのリスクを正しく理解し、
セキュリティ対策を事前に適用した上で適切にご利用ください。

2. 皆さんは、どういったIAMポリシーを付与していますか?

IAM ユーザーを作成時に、必要なポリシーだけを付与していませんか?

例えば...

  • A というユーザーに対して、《EC2 フルアクセス》だけの権限を付与していて、更にはアクセスキーの発行をしているとします。

上記のパターンで、その A というユーザーの ID/PW が漏れてしまった時は危険では無いでしょうか?
更にいえば、アクセスキーが漏れてしまった時も危険では無いでしょうか?

実際の漏れた際については下記の記事をご参照頂けますと危険度が分かりやすいかと思います。

この記事では、現在実際に利用している IAM ユーザーに対して 《セキュアなIAMポリシー》 を付けていきたいと思います。

3. 実際のポリシー

独断になりますが、下記の様な IAM ポリシーになりました。

こちらの IAM ポリシーを用いることで下記 2 点の対策をすることが出来ます。

  • MFA を設定していない IAM ユーザーの場合は、MFA 設定以外の各種アクションの操作が出来ない
  • 指定した IP 以外からのコンソール/ CLI 操作を受け付けない

"AAA.AAA.AAA.AAA/32" および "BBB.BBB.BBB.BBB/24" は個人の環境に合わせてください

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RejectAllButSpecificIPs",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "AAA.AAA.AAA.AAA/32",
                        "BBB.BBB.BBB.BBB/24"
                    ]
                },
                "Bool": {"aws:ViaAWSService": "false"}
            }
        },
        {
            "Sid": "BlockMostAccessUnlessSignedInWithMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ListUsers",
                "iam:ChangePassword"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": false
                }
            }
        },
        {
            "Sid": "AllowIndividualUserToManageTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ListUsers",
                "iam:ChangePassword"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "AAA.AAA.AAA.AAA/32",
                        "BBB.BBB.BBB.BBB/24"
                    ]
                }
            }
        }
    ]
}

4. 解説

4.1. RejectAllButSpecificIPs について

  • 《AAA.AAA.AAA.AAA/32》 および 《BBB.BBB.BBB.BBB/24》 郡の IP 以外からの操作を全てブロック
  • "Bool": {"aws:ViaAWSService": "false"}》 を付与してあげることにより AWS サービス内で呼ばれる処理については IP 制限を掛けずに実行が可能
 {
    "Sid": "RejectAllButSpecificIPs",
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
        "NotIpAddress": {
            "aws:SourceIp": [
                "AAA.AAA.AAA.AAA/32",
                "BBB.BBB.BBB.BBB/24"
            ]
        },
        "Bool": {"aws:ViaAWSService": "false"}
    }
},

4.2. BlockMostAccessUnlessSignedInWithMFA について

  • IAM ポリシーの 《Condition》 要素を用いて、MFA を有効化していない場合は、《NotAction》 に記述された内容以外は全て拒否してれます。
{
    "Sid": "BlockMostAccessUnlessSignedInWithMFA",
    "Effect": "Deny",
    "NotAction": [
        "iam:CreateVirtualMFADevice",
        "iam:EnableMFADevice",
        "iam:ResyncMFADevice",
        "iam:ListMFADevices",
        "iam:ListVirtualMFADevices",
        "iam:ListUsers",
        "iam:ChangePassword"
    ],
    "Resource": "*",
    "Condition": {
        "Bool": {
            "aws:MultiFactorAuthPresent": false
        }
    }
},

4.3. AllowIndividualUserToManageTheirOwnMFA について

  • 《AAA.AAA.AAA.AAA/32》 および 《BBB.BBB.BBB.BBB/24》郡の IP に対して、自分自身の MFA デバイスを管理するために必要なポリシーです。
{
    "Sid": "AllowIndividualUserToManageTheirOwnMFA",
    "Effect": "Allow",
    "Action": [
        "iam:CreateVirtualMFADevice",
        "iam:EnableMFADevice",
        "iam:ResyncMFADevice",
        "iam:ListMFADevices",
        "iam:ListVirtualMFADevices",
        "iam:ListUsers",
        "iam:ChangePassword"
    ],
    "Resource": [
        "arn:aws:iam::*:mfa/${aws:username}",
        "arn:aws:iam::*:user/${aws:username}"
    ],
    "Condition": {
        "IpAddress": {
            "aws:SourceIp": [
                "AAA.AAA.AAA.AAA/32",
                "BBB.BBB.BBB.BBB/24"
            ]
        }
    }
}

5. MFA の設定方法について

2021年6月版のスマートフォンを用いたMFA設定手順については下記をご参照ください。

6. 注意事項

  • MFA を有効化後は、設定を反映させるために一旦ログアウトをしてから再ログインをする必要があります。
  • こちらのポリシーは、【IAM ユーザー】向けのため、【IAM ロール】のポリシーとしては絶対に使用しないでください。
  • IAMユーザーに対してインラインポリシーとしてアタッチするのでは無く、グループを作成してアタッチすることで管理コストを軽減することが出来ます。

7. さいごに

文章は少なめですが、何かしらの要因により、IAM ロールではなく、
IAM ユーザーを用いる場合があると思いますが、
そんな条件下の方向けに(個人的に)セキュアだと思う IAM ポリシーを書かせて頂きました。

それでは、よい IAM ポリシーライフを!