AWS Systems Manager Session ManagerでIP制限する
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
の実行に失敗しているのがわかります。