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

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

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

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 ポリシーライフを!