この記事は Opt Technologies Advent Calendar 2019 6 日目の乗っ取り記事です
5 日目の記事は @kadokusei さんの UTM に VyOS と WireGuard を入れてみる です
7 日目の記事は @peko-858 さんの 【ScalikeJDBC 入門】SQLInterpolation を QueryDSL に書き換えてみた です
AWS Systems Manager と EC2 Instance Connect を利用して鍵管理、 Public IP なしで SSH 接続出来る EC2 インスタンス構築
tl;dr
- EC2 Instance Connect コマンドを利用して都度生成した SSH 鍵を EC2 インスタンスへアップロード
- 生成した SSH 鍵を用いて Systems Manager の Session Manager を使って SSH 接続
→SSH 鍵管理なし Public IP なしで EC2 インスタンスへ SSH 接続ができる!最高!
SSH で繋げる EC2 インスタンスが欲しい!でも・・・
- 素直に作ると Internet Gateway から SSH ポートを開けて PublicIP 割り当てて・・・と地味に大変
- 最近なら AWS Systems Manager Session Manager で SSH 接続が可能だけど、鍵は管理が必要
- Session Manager から SSH じゃない接続も出来るけど、SSH が使いたい
- 例えば踏み台サーバーとしてインスタンスを立てておいて、ポートフォワーディングして VPC 内の RDS を直接見たいとか
- 先日出た EC2 Instance Connect を使えば鍵管理はいらないが、PublicIP が必要
あちらを立てればこちらが立たず・・・と思っていましたが、組み合わせれば PublicIP なし鍵管理なしで運用できるのでは!?と思って試してみたら出来たので記録しておきます
やり方
といってもそんなに手の込んだ事はしてないです
手順としては以下のようなステップになります
- AWS Systems Manager Session Manager 経由で SSH 接続出来るよう設定をしておく
- インスタンスに繋ぎたいときは毎回 SSH 鍵を発行して
aws ec2-instance-connect send-ssh-public-key
コマンドでインスタンスに公開鍵を送る - SSH 接続する
これだけで簡単に実現できます
既に運用中のインスタンスにも導入簡単なのでサラッと入れちゃって良さそうな気持ちを得ました
各種手順解説
AWS Systems Manager Session Manager 経由で SSH 接続出来るよう設定をしておく
ここに全てが書いてあるのでこの記事のとおりにやるだけ
AWS Systems Manager セッションマネージャーで SSH・SCP できるようになりました
手順だけ書くと、以下のようになります。実質 SSH コンフィグの設定だけみたいなもんですね、お手軽です
- ホストの SSM エージェントを対応バージョンにアップデート
- クライアントの aws-cli と Session Manager プラグインのアップデート
- SSH コンフィグの設定
- 以下のように、ホスト名にインスタンス ID を指定したら ssm コマンドに受け流すように記述
host i-_ mi-_
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
これでインスタンスが Public なネットワークに公開されていなくても SSH 接続が出来るようになります
ssh コマンド実行の際はホスト名をインスタンス ID で指定して実行すれば OK
インスタンスに繋ぎたいときは毎回 SSH 鍵を発行して aws ec2-instance-connect send-ssh-public-key
コマンドでインスタンスに公開鍵を送る
ここに全てが書いてあるので(略)
EC2 Instance Connect を使用して接続する#独自のキーと SSH クライアントを使用して接続する
- 普通に ssh-keygen で SSH 鍵を発行
- 発行した SSH 鍵を
aws ec2-instance-connect send-ssh-public-key
コマンドで指定したインスタンスに送る- 送った SSH 鍵の有効期限が 60 秒なので注意
毎回手でやるのはいくらなんでもめんどくさいので、スクリプトを書いてコマンド一発で出来るようにしておきたい手順ですね
SSH 接続する
以下を実行するだけ
ssh -i [作った鍵] ec2-user@[対象のインスタンスのインスタンスID]
チームでこの方法を使うなら最初の手順の SSH コンフィグを変更をせずに、ここの ssh コマンドに -o ProxyCommand # 以下略
を渡してあげて、それをスクリプトとして書いておくほうが導入手順が減るので良さそうですね
おわりに
ということで AWS で Public IP なしの EC2 インスタンスへ SSH 接続する方法を紹介しました
一昔前は公開鍵を S3 においておいてプロビジョニングやスケールアウト時に配布、みたいな泥臭い方法で実現していたユーザーごとの SSH 接続がごく簡単な手順で実現できました
それに、既に運用中のインスタンスであっても導入は簡単そうなのでメリットは大きいんじゃないかなという感触。使わない手はないですね
いい時代になったものです
AWS はいいぞ!