権限はあるのにAn error occurred (AccessDeniedException) when calling the TerminateSession operationがでてSSMセッションが開始できないときに確認すべきこと
どうもさいちゃんです。皆さん SSM のポートフォワーディングを使用してインスタンスへ接続していますか?
今回は適切な権限は付与しているはずなのに、ポートフォワーディングを使ったインスタンスへのアクセスがうまくいかないという事象が発生したので、どのように解決したかと確認すべき項目についてご紹介します。同様の事象で困っている皆様の参考になれば幸いです。
起こった事象
まず、下記ブログの要領で開発者用に AWS の Systems Manager (SSM) を使用したポートフォワーディングを使用したインスタンスへのアクセスを含む権限を付与した IAM ポリシーを作成しました。
そのポリシーをグループ(dev-user-group)にアタッチして、開発者用のユーザー(dev-user)を dev-user-group に入れ、開発者に動作確認をしてもらったところ、SSM を使用したポートフォワーディングにおいて、セッションを開始できないという問題が発生しました。
具体的には、dev-user が以下のコマンドを実行した際にエラーが発生しました。
> aws ssm start-session --target i-xxxxxxxxxxxx --document-name AWS-StartPortForwardingSession --parameters "portNumber=22, localPortNumber=10022"
このコマンドを実行すると、次のようなエラーメッセージが表示されました。
An error occurred (AccessDeniedException) when calling the TerminateSession operation: User: arn:aws:iam::xxxxxxxxxxxx:user/dev-user is not authorized to perform: ssm:TerminateSession on resource: arn:aws:ssm:ap-northeast-1:xxxxxxxxxxxx:session/dev-user-xxxxxxxxxxxx because no identity-based policy allows the ssm:TerminateSession action
他に確認した項目
最初にこのエラーが出た時は単純にポリシーに権限が足りない可能性を考えました。
作成したポリシーに ssm:TerminateSession の権限は付与していたので、不思議に思い、別のユーザー(temp-user)を作成して dev-user-group に入れてみることにしました。
temp-user を使用してポートフォワーディングを行ってみると、問題なくインスタンスへのアクセスが出来たため、ポリシーに問題があるのではなく dev-user 固有の問題であることが分かりました。
dev-user 固有の問題である事が分かった時点で、IAM ポリシーで MFA の強制を行っていないかについても考えてみました。
今回は自身でポリシーを作成していたので IAM ポリシー内では MFA の強制は行っていないことは分かっていましたが、Organizations を使用しており、SCP で MFA を強制している場合などは、作成したユーザーが組織のパスワードポリシーに沿っているかの確認も必要かもしれません。
今回に関しては事象を確認するために作成した temp-user に関しても dev-user と同じ設定にするために MFA の設定をせずにポートフォワーディングを行ってみましたが、問題なくアクセス出来たので、これも違いました。
原因と対処法
結論から言うと今回ポートフォワーディング出来なかったのは SSM プラグインがインストールされていなかった事が原因でした。
SSM プラグイン(AWS Session Manager Plugin)は、AWS の SSMを使って、EC2 インスタンスやその他のマネージドインスタンスに安全に接続するために必要なツールです。
ローカル PC からポートフォワーディングや CLI 経由のセッションマネージャーを使った接続には CLI とは別にこのプラグインのインストールが必要でした。
実際にインストールしてみます。
※ここでご紹介するのは WindowsPC に SSM プラグインをインストールする方法です。その他の OS をお使いの場合は下記から対象 OS へのインストール方法を探してみてください。
コマンドプロンプトで下記コマンドを実行します。
> curl https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe -o SessionManagerPluginSetup.exe
# 実行結果
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 8208k 100 8208k 0 0 4439k 0 0:00:01 0:00:01 --:--:-- 4446k
ダウンロードされたことを確認し、インストーラーを実行します。
> ./SessionManagerPluginSetup.exe
# 実行結果
'.' is not recognized as an internal or external command,
operable program or batch file.
この後に必要な場合は、環境変数の PATH にプラグインのディレクトリを追加します。
これで再度ポートフォワーディングを試してみます。
> aws ssm start-session --target i-XXXXXXXXXXX --document-name AWS-StartPortForwardingSession --parameters "portNumber=22, localPortNumber=10022"
# 実行結果
Starting session with SessionId: i-0f7872430e3921a45-tb4t2ykv5gbaak72vqqokz5xya
Port 10022 opened for sessionId i-0f7872430e3921a45-tb4t2ykv5gbaak72vqqokz5xya.
Waiting for connections...
セッションが確立されたようです。
> ssh ubuntu@localhost -p 10022 -i .\mypoc-key.pem
# 実行結果
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-1016-aws x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
System information as of Tue Mar 18 11:15:56 UTC 2025
System load: 0.08 Processes: 108
Usage of /: 0.7% of 289.56GB Users logged in: 0
Memory usage: 25% IPv4 address for enX0: 10.0.2.57
Swap usage: 0%
Expanded Security Maintenance for Applications is not enabled.
183 updates can be applied immediately.
67 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable
Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status
Last login: Tue Mar 18 11:15:57 2025 from 127.0.0.1
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu@ip-10-0-2-57:~$
無事インスタンスにアクセスできました。
最後に
今回は適切な権限は付与しているはずなのに、ssm:TerminateSession の権限がないと怒られた場合の対処法についてご紹介しました。
単純に SSM プラグインがないですというエラーが発生する場合もある様なのですが、今回はまさかの権限エラーのふりをしたプラグインがない事によるエラーだったのでトラブルシューティングに少し時間がかかりました。
本ブログが同じ事象でお悩みの方のお役に立てれば幸いです。