セッションマネージャで踏み台いらず

この記事を書いたメンバー:

那須 隆

セッションマネージャで踏み台いらず

目次

毎日汗だくですが元気です、那須です。
先週、セッションマネージャでポートフォワーディングができるようになったとアナウンスがありましたね。


セッションマネージャーを使用したローカルポートとリモートポート間のトラフィックの転送が可能に

aws.amazon.com

og_img

時々インターネット経由で VPC 内にアクセスできることが問題視されることがあるのですが、そんな話題もこれで終わりかもしれませんよ!
とても簡単なので一度テストとしてやってみてください。
ただすべての悩みが解決するわけではないので、そのあたりも書いてみます。

実現したいこと

・インターネットからの AWS(特に EC2 インスタンス)へのアクセスを遮断したい
・RDP 接続して実施する運用タスクはできるようにしたい
・踏み台(Bastion)なんて運用したくないし、踏み台のためのお金は節約したい

環境など

運用している EC2 インスタンスは Windows Server 想定です(Linux でも手順は同じですが、ポートフォワーディングするシーンが少なそうので…
Systems Manager のセッションマネージャだけで運用タスクが実施できればいいんですが、RDP でログインして GUI 操作が必要なものもあります。
なので PowerShell だけで運用できるシステムも今回はないものとします。

前提条件

下記のドキュメントに書いてますが、一応まとめておきましょう。


docs.aws.amazon.com

リモート側(運用対象 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 用のプラグインをインストールしてください。

ではやってみましょう

ポートフォワーディングのコマンド実行

コマンドは下記ドキュメントの通りです。


docs.aws.amazon.com

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 内のインターネットからの通信を厳しく制御したい場合などでは有効だと思いますので、ぜひ試してみてください。



カテゴリー
タグ

SAPシステムや基幹システムのクラウド移行・構築・保守、
DXに関して
お気軽にご相談ください

03-6260-6240 (受付時間 平日9:30〜18:00)