14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Opt TechnologiesAdvent Calendar 2019

Day 6

AWS Systems Manager と EC2 Instance Connect を利用して鍵管理、 Public IP なしで SSH 接続出来る EC2 インスタンス構築

Posted at

この記事は 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 コマンドに受け流すように記述
~/.ssh/config
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 はいいぞ!

14
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?