landrunner’s blog

しばらく開発から離れてた人間が、技術的キャッチアップを図るための勉強ブログ

VPCと送信元IPアドレスに基づいたアクセス制御のためのIAMポリシー

IAMユーザーのアクセス制御

AWSのIAMユーザーはIPアドレスを元にしたアクセス制御することで、会社など特定の場所からしかアクセスできないようにすることができます。(リンク先参照)

AWS: 送信元 IP に基づいて AWS へのアクセスを拒否する - AWS Identity and Access Management

これによりIAMユーザーのセキュリティを高めることができます。 ただ、1つ欠点があり、EC2上でAWSの機能を使おうとしたときもアクセスを拒否されます。
このポリシーが適用される限りCodeCommitからgit cloneをするといったことはできなくなります。

"Bool": {"aws:ViaAWSService": "false"}AWS内から機能を呼び出しをできるようにするための条件なのですが、残念ながら現在のところEC2始めいくつかの機能からの呼び出しはこの条件の適用対象外になっています。

VPCを条件に用いたアクセス制御

IPアドレスに加えVPCもアクセス制御の条件に加えます。
つまり特定のIPアドレスから実行されるか、または特定のVPC内で実行されれば動作するような条件に書き換えます。

そのIAMポリシーはこちら。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "1.1.1.0/24"
                },
                "Bool": {
                    "aws:ViaAWSService": "false"
                },
                "StringNotEquals": {
                    "aws:SourceVpc": "vpc-e00000000"
                }
            }
        }
    ]
}

vpc-e00000000の所に開発に使用しているVPCのIDを入れればOKです。

複数のVPCで使用したい場合はこちらでいけるはずです(試してません)。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "1.1.1.0/24"
                },
                "Bool": {
                    "aws:ViaAWSService": "false"
                },
                "ForAllValues:StringNotEquals": {
                    "aws:SourceVpc": ["vpc-e00000000", "vpc-e00000001"]
                }
            }
        }
    ]
}

注意

私はいつもCodeCommitやDynamoDBを呼び出すとき、VPCにエンドポイントを作って使用するのですが、これらのサービスはエンドポイントを作らずに使うと一旦インターネットを経由します。
インターネット経由の場合にこの権限設定が動くかは未確認です。