AWS Systems Manager Session ManagerでIP制限する

SSH/RDPで行っていたサーバー管理をAWS Systems Manager Session Managerに切り替えるにあたり、IP制限は継続したいというケース向けに、Session ManagerでIP制限する方法を紹介します。
2020.02.11

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

AWS Systems Manager Session Managerを利用するとWindows・Linuxに関係なくクロスプラットフォームにシェルアクセス出来ます。

SSH/RDを使ってサーバー管理する場合、ポートの通信を許可し、さらに、接続元のIPアドレスを制限することが多かったと思います。 Session Managerの場合、ポート管理は不要になり、IAMだけでアクセスコントロールされます。

SSH/RDPで行っていたサーバー管理をSession Managerに切り替えるにあたり、ポート管理が不要になったのは嬉しいけれど、IP制限は継続したいというケース向けに、Session ManagerでIP制限する方法を紹介します。

やり方

AWS Systems Manager Session Manager はIAMでアクセスコントロールされているため、IP制限もIAMレベルで行います。

ユーザーが次のIAMポリシーによりSession Managerを利用する権限が与えられていたとします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ssm:StartSession",
                "ssm:TerminateSession",
                "ssm:ResumeSession",
                "ssm:DescribeSessions",
                "ssm:GetConnectionStatus"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ]
}

このポリシーに、アクセス元IPアドレス(192.0.2.0/24または203.0.113.0/24)で制限したのが次のポリシーです。

アクセス元IPアドレスが aws:SourceIp で指定した CIDR にマッチする(IpAddress)場合、Action で指定した API を許可(Allow)します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ssm:StartSession",
                "ssm:TerminateSession",
                "ssm:ResumeSession",
                "ssm:DescribeSessions",
                "ssm:GetConnectionStatus"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "192.0.2.0/24",
                        "203.0.113.0/24"
                    ]
                }
            }
        }
    ]
}

補集合的に、アクセス元IPアドレスが aws:SourceIp で指定した CIDR にマッチしない(NotIpAddress)場合、Action で指定した API を拒否(Deny)したのが次のポリシーです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ssm:StartSession",
                "ssm:TerminateSession",
                "ssm:ResumeSession",
                "ssm:DescribeSessions",
                "ssm:GetConnectionStatus"
            ],
            "Effect": "Deny",
            "Resource": [
                "*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "192.0.2.0/24",
                        "203.0.113.0/24"
                    ]
                }
            }
        }
    ]
}

別のポリシーで広範囲にアクセス権限を許可しており、ピンポイントにIP制限するポリシーを追加したい場合は、Deny 方式のほうが向いているでしょう 。

Session Manager系 API 全般で適用可能

Session Managerを利用したシェルアクセスは

の3種類があります。

いずれのケースでも ssm:StartSession でセッションを開始するという点では同じため、IAM で IP制限する際は、この3つの違いを意識する必要はありません。

ノーマル Session Manager利用時にIP制限に引っかかった例です。

$ aws ssm start-session --target i-1234

An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam::1234:user/test-user
is not authorized to perform: ssm:StartSession on resource: arn:aws:ec2:eu-central-1:1234:instance/i-1234

SSH Session Manager利用時にIP制限に引っかかった例です。

$ ssh -i /path/to/ssh.pem ec2-user@i-1234

An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam::1234:user/test-user
is not authorized to perform: ssm:StartSession on resource: arn:aws:ec2:eu-central-1:1234:instance/i-1234
ssh_exchange_identification: Connection closed by remote host

いずれのケースでも ssm:StartSession の実行に失敗しているのがわかります。

参考