セッションマネージャを利用したEC2インスタンスへのssh接続

EIPを利用しないEC2インスタンスsshでアクセスする際にパブリックIPをいちいち確認する事が面倒だったので、不変なインスタンスIDを利用したアクセスによってssh接続の設定を簡単にする。 この際にセッションマネージャを利用することでEC2インスタンスのセキュリティ向上にもつながったので、理解した範囲でセキュリティについても紹介する。 最後にvscodeを利用したインスタンスへのリモートアクセスについて記載する。 ここではあくまでも備忘録のため、セキュリティグループのインバウンドルールがなにかなどの話はしない。

概要

  • 経緯
  • EC2インスタンスへのアクセス方法

  • ポートを開ける危険性

  • セッションマネージャを経由したssh接続
  • vscodeからのアクセス

経緯

Elastic IPを利用していないのでssh接続をする際に毎回EC2のマネージメントコンソールからパブリックipをコピペして接続するという作業が面倒になっていた。特にvscodeのremote-sshを利用していたので、インスタンスを立ち上げてIPが変わるたびにssh configを書き換えるのは無駄な作業で頻繁にやらないと忘れてしまいそうだった。

そこで何らかの不変なidを利用してvscodeからssh接続できないかが目標となった。今回は

EC2インスタンスへのアクセス方法

EC2へのアクセスは主に2つの方法がある。*1

  • ローカルsshクライアント EC2インスタンス作成時の公開鍵を利用してインスタンスに接続する。22番ポートを開ける必要がある。
  • セッションマネージャ 公開鍵や22番ポートを開ける必要がない。 ただしユーザーがec2-userでなかったり、シェルがshだったりする。

今までは前者の方法でターミナル上からアクセスしていたが、sshアクセスの際にパブリックipが必要となり、これがインスタンス起動のたびに変化するのが面倒だった。

そこでセッションマネージャを通じてssh接続をすることで、不変なインスタンスidのみが必要であることがわかった。またセッションマネージャを経由することにより、22番ポートを開ける必要がない事がわかった。これが実際にはセキュリティ向上に貢献する事がわかった。こちらに関して次に記述する。

 ポートを開ける危険性

ssh接続をする際にはセキュリティグループのインバウンドルールにおいて22番ポートを開ける必要がある。*2 22番ポートを常に開けてしまっていると、このインスタンスのセキュリティはすべて公開鍵方式に頼ってしまっていることになる。万が一秘密鍵が流出した際には直ぐに他者にアクセスされてしまい、EC2上で何らかのウイルスなどを配置されてしまうかもしれない。 セッションマネージャを利用すれば、そもそも扉は存在しないので、他人がアクセスすることはできない。 そのため可能であれば、22番ポートは閉じて置きたいということらしい。

セッションマネージャを経由したssh接続

それでは本題のセッションマネージャを通じてssh接続する方法について記述する。この方法はEC2インスタンスとクライアント(ローカル)のそれぞれについて設定が必要になる。

  • EC2インスタンスに対する設定

    • EC2インスタンスに対して何らかのロールをアタッチしていると思うが、そのロールに対してAmazonSSMManagedInstanceCoreというポリシーをアタッチする。これによりEC2インスタンスAWS Systems Managerとやり取りできるようになる。
    • EC2インスタンスにアクセスして、SSM Agentをインストールする。*3 Amazon Linux2を利用している場合はこの手順はスキップできるかもしれないが、脚注の手順に従ってインストール推奨。またAgentを立ち上げる事を忘れずに。
  • クライアント(ローカル)に対する設定

    • Session Manager Pluginのインストール。*4
    • ~/.ssh/configに以下の設定を記入。 profileのところは自分のAssume roleを利用する。

    # SSH over Session Manager host i-* mi-* ProxyCommand sh -c "aws --profile hogefuga ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

以上で、ssh -i {path/to/key} ec2-user@{instance ID}とすることで、ターミナルからインスタンスにアクセスすることができる。 この時注意したいのはEC2インスタンスのregionとprofileのregionが一致している方が都合がよい。regionが異なる場合はssh接続の際にregionを引数に入れる必要がある。これで私は6時間溶かしました。

vscodeからのアクセス

以下はregionが一致していることを前提。

  • vscodeにremote-sshをインストールする。
  • サイドパネルにremote-sshが出てくるので、歯車をクリックし、~/.ssh/configをクリック。
  • configに以下を記入。instance nameは識別しやすい適当な名前、 instance idはEC2インスタンスのinstance id, identityfileにはssh接続する際のpemファイルを入れる。

    # SSH over each instance using Session Manager Host instance name ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'" User ec2-user HostName instance id IdentityFile path to your key

  • インスタンスを起動後、ssh targetsの中から対応するインスタンスをクリックすると、vscodeの新しいウィンドウが開いてEC2インスタンスにアクセスできる。

まとめ

EC2インスタンスにアクセスする際の手順で詰まりやすい部分について記載した。詳細については以下の参考資料を参照されたい。

参考資料

ステップ 8: (オプション) Session Manager を通して SSH 接続を有効にする - AWS Systems Manager

ssm経由でVSCodeをリモートSSHで使った話 - Qiita

*1:もう一つEC2 Instance Connectという方法もあるが、使っていないので詳細はわからない。基本的には鍵の管理が簡単になったローカルと同じ方法に見える。

*2:ポートはサーバーの扉のようなものらしい。

*3:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html こちらを参照。

*4:こちらを参照。 https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html