Help us understand the problem. What is going on with this article?

[AWS]踏み台不要、キーペア登録不要、ポート開放不要のSSH接続環境を作る

概要

EC2インスタンスにSSHでログインする。
接続先のインスタンスはプライベートサブネット上に立っている前提。

インスタンスからSessionManagerへの接続はVPCエンドポイントを経由する。
クライアントは、SessionManagerのシェルアクセスではなく、普通のSSHコマンドを使う。

インスタンスにキーペアは登録しない。
接続時にEC2 Instance Connectを使って一時的に登録する。
キーペアは接続ごとに生成/破棄する。

構成を図にするとこんな感じになると思う。

session-manager.png

メリット

  • キーペアの管理が不要
    秘密鍵を管理する必要がなくなる。
    公開鍵の登録も不要になるため、仮に秘密鍵が漏れてもログインできない。

  • 22番ポートの開放が不要
    インバウンドの接続がなくなるので、22番ポートを開ける必要がなくなる。

  • バッションサーバーが不要
    インターネットに不要な口を開ける必要がなくなる。

  • IAMで接続制御ができる
    EC2 Instance ConnectのAPIはIAMで制御できる。

  • CloudTrailで接続の監査ができる
    試してないがEC2 Instance Connectのリクエストなどの監査ができる。

  • シェルアクセスより軽快(な気がする)
    SSM Agentは通信に専念しているので負荷が低そう。
    シェルアクセスより動作が軽いんじゃないかと思う。

デメリット

  • アクセスキーの管理
    IAMで制御するのでアクセスキーの管理は相変わらず重要。
    とはいえ、秘密鍵を ~/.ssh に置きっぱなしにしているよりは安全じゃないかと思う。
    今はAWS CLIで自動的にAssumeRoleするような設定も簡単にできるので。

  • 準備が面倒
    AWS上の設定や、ローカルPCでも色々と設定しないといけないので面倒。
    うまくやればCloudFormationで構築できるかもしれない。

  • VPCエンドポイントが高い
    正直高すぎるんじゃないかと思う。
    たぶん、できて当然と思っている機能に金を払わされてるからなんだろう。

  • 結構すぐ切れる
    ちょっと放っておくとすぐ切れる。使ってる時に切断されることはない。
    何かいい方法があるかもしれないけど、まだ見つけられていない・・・

準備

面倒な準備をしていく。

AWS

VPCエンドポイント

プライベートサブネット内のインスタンスにSessionManagerで接続するには、NATやVPCエンドポイントの設定が必要。
VPCエンドポイントは各サブネットごとに設定する必要がある。

ここ に書いてある中で com.amazonaws.ap-northeast-1.ec2 以外が必要。
ログを出力するならS3のVPCエンドポイントも必要かもしれない。

セキュリティグループ

SessionManagerで接続するので22番ポートの開放が不要になる。
もし開いている場合は閉じる。

マネージドインスタンス

マネージドインスタンスとして認識されていないとSessionManagerで接続できない。
EC2インスタンス用のIAMロールに AmazonSSMManagedInstanceCore ポリシーをつけること。
AmazonEC2RoleForSSM は古い。

認識されているかどうかは、AWSコンソールのSystemsManager>マネージドインスタンスで確認できる。

SSM Agent

SessionManagerを使って接続するインスタンスには、SSM Agentがインストールされている必要がある。
StateManagerを使うことでSSM Agentを常に最新の状態に保つことができる。
マネージドインスタンスのページで Agent auto update ボタンをクリックするだけ。

この時点でAWSコンソールからシェルアクセスはできるんじゃないかと思う。

EC2 Instance Connect

キーペア登録不要でログインするために必要。
最新のAmazon Linuxではインストール済み。
/opt/aws/bin/ 以下に eic-* で始まるコマンドがあるはず。
ない場合は ここ を参考にしてインストールする。

IAMロール

SessionManager関連の設定はこちら。
クイックスタートデフォルト IAM のポリシー Session Manager | AWS Systems Manager ユーザーガイド

EC2 Instance Connect関連の設定はこちら。
タスク 4: EC2 Instance Connect の IAM アクセス許可を設定する | Amazon EC2
Linuxインスタンス用ユーザーガイド

Amazon EC2 Instance Connect のアクション、リソース、および条件キー | AWS IAMユーザーガイド

ローカルPC

Session Manager Plugin

ここ に書いてある方法に従ってインストールする。
一応 Homebrewでインストールできるようにしている人 も見かけた。使ってないけど。

ssh

~/.ssh/configProxyCommand の設定を追記する。

Host i-* mi-*↲
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"↲

EC2 Instance Connect CLI

mssh コマンドを使うとキーペアの自動生成などしてくれるらしい。
今は自作のコマンドで同じようなことをやってしまってるのでインストールしてない。
5年たったらAWS CLIの薄いラッパーコマンドが出来ていた | Qiita

接続

公開鍵の登録

一時的なキーペアを作成し、公開鍵を接続先インスタンスに登録する。

キーペアの生成

ssh-keygen で適当に作成。
たしかRSAじゃないと接続できなかったと思う。

$ ssh-keygen -t rsa -b 4096

公開鍵の登録

$ aws ec2-instance-connect send-ssh-public-key \
              --instance-id i-1234567890abcdef0 \
              --instance-os-user ec2-user \
              --availability-zone ap-northeast-1a \
              --ssh-public-key file://path/my-rsa-key.pub
{
    "RequestId": "f31e23d4-1786-4761-8583-bb03de0795c9",
    "Success": true
}

SSH接続

一時的な秘密鍵を使って接続してみる(公開鍵の有効期限は60秒)。

$ ssh -vvv -i ~/.ssh/tmp.pem -l ec2-user i-1234567890abcdef0

普通のSSH接続なのでポートフォワーディングなどもそのまま出来る。

ryo0301
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした