目次
毎日汗だくですが元気です、那須です。
先週、セッションマネージャでポートフォワーディングができるようになったとアナウンスがありましたね。
時々インターネット経由で VPC 内にアクセスできることが問題視されることがあるのですが、そんな話題もこれで終わりかもしれませんよ!
とても簡単なので一度テストとしてやってみてください。
ただすべての悩みが解決するわけではないので、そのあたりも書いてみます。
実現したいこと
・インターネットからの AWS(特に EC2 インスタンス)へのアクセスを遮断したい
・RDP 接続して実施する運用タスクはできるようにしたい
・踏み台(Bastion)なんて運用したくないし、踏み台のためのお金は節約したい
環境など
運用している EC2 インスタンスは Windows Server 想定です(Linux でも手順は同じですが、ポートフォワーディングするシーンが少なそうので…
Systems Manager のセッションマネージャだけで運用タスクが実施できればいいんですが、RDP でログインして GUI 操作が必要なものもあります。
なので PowerShell だけで運用できるシステムも今回はないものとします。
前提条件
下記のドキュメントに書いてますが、一応まとめておきましょう。
リモート側(運用対象 EC2 インスタンス)
・そもそもセッションマネージャで PowerShell を操作できること
・IAM ロールや VPC エンドポイントは調整済みであること
・SSM エージェントのバージョンは 2.3.672.0 以上
・SSM Run Command で AWS-UpdateSSMAgent ドキュメントを実行すれば最新になります。
ローカル側(自分の Windows 端末)
・AWS CLIの更新
・aws ssm start-session コマンドが実行できるバージョンであれば OK です。
・Session Manager plugin のバージョンは 1.1.23.0 以上
・PowerShell ウィンドウでポートフォワーディングのコマンドを実行するなら Windows 用のプラグインをインストールしてください。
・WSL でポートフォワーディングのコマンドを実行するなら Linux 用のプラグインをインストールしてください。
ではやってみましょう
ポートフォワーディングのコマンド実行
コマンドは下記ドキュメントの通りです。
WSL でポートフォワーディングのコマンド実行する場合は↓これを実行しましょう。
i-0211ce477ff141826 が今から RDP 接続するテスト用インスタンス ID です。
aws ssm start-session --target i-0211ce477ff141826 --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["3389"], "localPortNumber":["13389"]}' --profile admin_beex
PowerShell ウィンドウでポートフォワーディングのコマンド実行する場合は↓これを実行しましょう。
WSL で実行するコマンドとの違いは、ダブルクオーテーションの前にエスケープを入れているだけです。
エスケープを入れないと JSON 構文エラーが出ます。
aws ssm start-session --target i-0211ce477ff141826 --document-name AWS-StartPortForwardingSession --parameters '{\"portNumber\":[\"3389\"], \"localPortNumber\":[\"13389\"]}' --profile admin_api
2020/3/2追記
パラメータの部分は JSON じゃなくてもいいことに気が付きました。↓この書き方でもOKです。
Start a Session
aws ssm start-session --target i-0211ce477ff141826 --document-name AWS-StartPortForwardingSession --parameters portNumber="3389",localPortNumber="13389" --profile admin_api
上記の例 2 つともに –profile オプションが入っていますが、ここは適宜読み替えてください。
このコマンドを実行すると、ローカル側の tcp13389 へのアクセスがリモート側の tcp3389 に転送されるようになります。
ポート番号のところは自由に変更できますよ。
なので、localhost:12345 にアクセスするとリモート側の tcp443 にアクセスできるようにすることもできますね(あ、プライベートエリアの Web サーバへのアクセスだとこれで確認できそうです
コマンドを実行すると、下記のようなログが出ます。
Starting session with SessionId: botocore-session-1567474053-07d9baf376c593aa8
Port 13389 opened for sessionId botocore-session-1567474053-07d9baf376c593aa8
これでセッションを待ち受けている状態になります。
RDPで接続
では RDP で localhost:13389 に接続してみましょう。
アクセスすると下記のようなログが出ます。
RDP セッションを切断するまでこの状態が維持されます。
Connection accepted for session botocore-session-1567474053-07d9baf376c593aa8.
PowerShell だとエラーが発生
PowerShell ウィンドウでポートフォワーディングコマンドを実行し、RDP で接続しようとすると内部エラーが発生してしまいました。
↓このようなログも出ました。
Connection accepted for session 1234567890abcdef.
Cannot perform start session: invalid argument
もし解決できたら更新します。
2019/09/12追記
Session Manager Plugin を最新のバージョンに更新したら RDP 接続できるようになりました!
AWS サポートの方のおかげです!
さいごに
今回はセッションマネージャを使って Windows Server に RDP 接続してみました。
まだまだ踏み台でリモートからのアクセスを管理している環境は多いと思います。
今回のアナウンスはその踏み台をなくせる可能性がさらに広がった形ですね。
アクセスキーの管理が課題になるとは思いますが、VPC 内のインターネットからの通信を厳しく制御したい場合などでは有効だと思いますので、ぜひ試してみてください。
- カテゴリー
- タグ