困っていること
AWS Systems Manager Session Manager でポートフォワーディングする際に接続先の EC2 インスタンスをタグで絞り込みたいです。
参考資料[1]を元に、下記のように IAM ユーザーにポリシーを付与しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:StartSession"
],
"Resource": [
"arn:aws:ec2:ap-northeast-1:<AccountID>:instance/*"
],
"Condition": {
"StringLike": {
"ssm:resourceTag/Env": [
"Dev"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"ssm:TerminateSession",
"ssm:ResumeSession"
],
"Resource": [
"arn:aws:ssm:*:*:session/${aws:userid}-*"
]
}
]
}
しかしながら、下記のエラーが発生し、ポートフォワーディングによる接続ができません。
An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam:::user/IAMUserName is not authorized to perform: ssm:StartSession on resource: arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSession because no identity-based policy allows the ssm:StartSession action
どのように対応すれば良いでしょうか。
どう対応すればいいの?
下記の IAM ポリシーに変更してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:StartSession"
],
"Resource": [
"arn:aws:ec2:ap-northeast-1:<AccountID>:instance/*"
],
"Condition": {
"StringLike": {
"ssm:resourceTag/Env": [
"Dev"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"ssm:StartSession"
],
"Resource": [
"arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSession"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:TerminateSession"
],
"Resource": [
"arn:aws:ssm:*:*:session/${aws:username}-*"
]
}
]
}
どうしてこうしなければいけないのか
ssm:StartSession
アクションでは、Resouce
句で対象を絞り込むことができます。
アクション | 説明 | アクセスレベル | リソースタイプ(*必須) | 条件キー |
---|---|---|---|---|
StartSession | セッションマネージャーセッションの指定したターゲットへの接続を開始する許可を付与 | 書き込み | document | |
instance | ||||
managed-instance | ||||
task | ||||
ssm:SessionDocumentAccessCheck | ||||
ssm:resourceTag/${TagKey} | ||||
aws:ResourceTag/${TagKey} |
Resouce
句にinstance
を指定し、Condition
句にssm:resourceTag/${TagKey}
を指定した場合、ドキュメントが対象から外れてしまします。
AWS Systems Manager Session Manager でポートフォワーディングする際に実行するドキュメントはAWS-StartPortForwardingSession
です。
そのため、ssm:StartSession
アクションの許可について、Resouce
句にドキュメントAWS-StartPortForwardingSession
を対象するように明示的に記載する必要があります。