未経験〜駆け出しエンジニア向けに、AWSでEC2・踏み台・SSMへ「楽に・安全に」入るための ~/.ssh/config をユースケース中心にまとめました。長いコマンドを卒業し、ProxyJumpで踏み台を透過し、Session Managerで22番を開けない接続まで、コピペで動く設定断片つきで解説します。

01なぜ ~/.ssh/config を書くのか

サーバに入るたびに ssh -i ~/.ssh/emw-dev.pem ec2-user@203.0.113.10 -p 22 のような長いコマンドを打っていませんか。ホスト名・ユーザ・鍵・ポート・踏み台……接続先が増えるほど、この「毎回の手打ち」は事故とストレスの温床になります。

~/.ssh/config は、こうした接続情報をあらかじめ名前を付けて登録しておくファイルです。一度書けば ssh myec2 だけで入れるようになり、踏み台の多段接続や鍵の使い分けも自動化できます。

本記事は man page 的な全項目網羅ではなく、AWS で EC2・踏み台・SSM を触るときに「実際にやりたいこと」から逆引きできるユースケース中心の構成です。各節にコピペで動く ~/.ssh/config の断片を置き、最後に1画面で見返せる早見表を付けます。

02基本の Host ブロック

~/.ssh/config の最小単位は Host ブロックです。まずは1台のEC2に名前を付けてみます。

# ~/.ssh/config
Host myec2
    HostName 203.0.113.10
    User ec2-user
    IdentityFile ~/.ssh/emw-dev.pem
    Port 22

これで ssh myec2 と打つだけで、ec2-user@203.0.113.10emw-dev.pem の鍵で接続できます。scprsync、VS Code の Remote-SSH でも同じエイリアスがそのまま使えます。

項目意味
Host接続のエイリアス(ssh <この名前> で呼び出す)。ワイルドカード * も使える
HostName実際の接続先。IP か DNS 名、SSM なら後述のインスタンスID
Userログインユーザ。AMI により既定が異なる(次節)
IdentityFile使う秘密鍵のパス。相対なら ~/.ssh/ 起点
Port接続ポート。既定は 22 なので、22 のままなら省略可
設定は「上から順」かつ「先に一致した値が勝つ」方式です。Host * のような広い設定はファイルの末尾に置き、個別ホストを上に書くのが安全です。

03ユースケース:EC2 にスッと入る

EC2 に入るときの最初のつまずきは「ログインユーザ名」です。パスワードではなく鍵で入り、ユーザ名は AMI(OSイメージ)ごとに決まっています。よく使うものを挙げます。

AMI / OS既定のログインユーザ
Amazon Linux 2 / 2023ec2-user
Ubuntuubuntu
RHELec2-user(または root 無効化前提で cloud-user の場合あり)
Debianadmin

ユーザ名さえ分かれば、02 の Host ブロックに UserIdentityFile を書くだけです。開発用に複数台あるなら、エイリアスを分かりやすく付けておきます。

Host web01
    HostName 203.0.113.10
    User ec2-user
    IdentityFile ~/.ssh/emw-dev.pem

Host batch01
    HostName 203.0.113.20
    User ubuntu
    IdentityFile ~/.ssh/emw-dev.pem
現場のコツ:鍵のパーミッションが緩いと SSH は鍵を読み込まず、Permission denied になります。落としてきた鍵は最初に chmod 600 ~/.ssh/emw-dev.pem を実行するクセを付けておくと、無用なハマりを避けられます。

04ユースケース:踏み台を越えて Private subnet の EC2 へ

本番の EC2 は Private subnet に置き、直接インターネットからは入れないのが基本設計です。手前の踏み台(bastion)を経由して奥へ入るとき、便利なのが ProxyJump です。

# ~/.ssh/config
Host bastion
    HostName 203.0.113.10
    User ec2-user
    IdentityFile ~/.ssh/bastion.pem

Host app01
    HostName 10.0.1.20
    User ec2-user
    IdentityFile ~/.ssh/app.pem
    ProxyJump bastion

これで ssh app01 と打つと、SSH が自動で bastion を経由して 10.0.1.20(Private IP)へ接続します。踏み台に一度入って、そこからまた ssh を打ち直す、という二度手間が消えます。1回きりなら設定を書かずに ssh -J bastion ec2-user@10.0.1.20 のようにコマンドで指定することもできます。

多段(踏み台の先にさらに踏み台)も、カンマ区切りで書けます。

Host deep-app
    HostName 10.0.2.30
    User ec2-user
    ProxyJump bastion,app01
ProxyJump-J)は、手前のサーバ上で netcat 等を用意しなくても中継できる OpenSSH 標準機能です。以前よく使われた Agent Forwarding(-A)は、踏み台上に自分の鍵エージェントを晒すため、踏み台が乗っ取られると鍵ごと悪用される危険があります。中継目的なら Agent Forwarding より ProxyJump を推奨します。

05ユースケース:SSM で鍵レス/踏み台レスに近づける

踏み台そのものを運用したくない、22 番ポートをどこにも開けたくない——そんなときは AWS Systems Manager の Session Manager が有力です。SSH の接続経路を、インバウンドポートを開けずに SSM のトンネル(TLS/WebSocket)で作ります。

経路A:ProxyJump(踏み台SSHを透過) 自分のPC 踏み台(public) :22 開放 Private EC2 SSH -J SSH 経路B:SSM(22番を開けずトンネル) 自分のPC SSM トンネル TLS / WebSocket Private EC2 :22 閉じたまま start-session SSM Agent
SSHの2経路:ProxyJump(踏み台を透過)と、Session Manager(22番を開けずにトンネル)。

~/.ssh/config にはインスタンスID をワイルドカードで受ける形で、次のように書きます(この ProxyCommand の書式は AWS 公式ドキュメントの現行手順です)。

# ~/.ssh/config — SSH over Session Manager
Host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
    User ec2-user
    IdentityFile ~/.ssh/emw-dev.pem

これで ssh i-0123456789abcdef0 のようにインスタンスID を直接指定して接続できます。IP や DNS を気にせず、Private subnet の EC2 にも 22 番を開けずに入れます。覚えやすい別名を付けたい場合は、HostName にインスタンスID を書きます。

Host app-ssm
    HostName i-0123456789abcdef0
    User ec2-user
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
    IdentityFile ~/.ssh/emw-dev.pem
SSH over Session Manager のセッションは、通信が TLS トンネル内で暗号化されるため Session Manager 側のセッションログには残りません(AWS 公式の注意点)。「誰が・いつ・何をしたか」を記録に残したい場合は、対話セッション方式のログ設定や、踏み台側の証跡設計と合わせて検討します。踏み台の証跡・特権アクセス設計は 踏み台・特権アクセス設計の記事で詳しく扱っています。

06ユースケース:便利設定で「速く・崩れにくく」

接続が安定し、2回目以降が速くなる設定をまとめて入れておくと快適です。次の Host * ブロックは全ホスト共通の既定として、ファイルの末尾に置きます。

# ~/.ssh/config (末尾に置く共通設定)
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    ControlMaster auto
    ControlPath ~/.ssh/cm-%r@%h:%p
    ControlPersist 10m
    IdentitiesOnly yes

Include ~/.ssh/config.d/*
現場のコツ:複数の案件・複数の鍵を扱うなら、Include ~/.ssh/config.d/* で案件別ファイルに分けるのがおすすめです。顧客ごとに設定が混ざらず、退場時の削除も1ファイル消すだけで済みます。

07セキュリティ:事故らないための最低限

SSH は便利な反面、鍵や設定の緩みがそのまま侵入経路になります。難しいことの前に、まず土台を固めます。

そもそも SSH と鍵の管理を「無くす」のも立派な設計判断です。06・05 の SSM 方式に寄せれば、22 番を閉じ、鍵配布を減らし、IAM で誰が入れるかを一元管理できます。EMW では「まず SSH を減らせないか」を最初に検討します。この判断軸は 踏み台・特権アクセス設計の記事も参考にしてください。

ここまでの内容と地続きで学ぶなら、サーバ側の操作は Linux 実践コマンドリファレンス、AWS 側の操作は AWS CLI 実践リファレンスが近い距離にあります。あわせてどうぞ。

08早見表:config 項目 × 用途

迷ったときに1画面で見返せるよう、よく使う ~/.ssh/config の項目と用途をまとめます。

config 項目用途・意味
Host接続のエイリアス。ssh <この名前> で呼び出す。* でワイルドカード
HostName実際の接続先(IP / DNS / SSM なら i-xxxx
Userログインユーザ(Amazon Linux=ec2-user / Ubuntu=ubuntu
IdentityFile使う秘密鍵のパス
Port接続ポート(既定 22 なら省略可)
ProxyJump踏み台(SSH)を透過して奥のホストへ。-J 相当。多段はカンマ区切り
ProxyCommand接続経路を外部コマンドで作る。SSM トンネル等に使う
IdentitiesOnly yes指定した鍵だけを提示(認証多すぎエラーの予防)
ServerAliveInterval無通信でも生存確認を送り、勝手な切断を防ぐ
ControlMaster / ControlPersist接続を多重化し2回目以降を高速化
Include設定ファイルを分割して読み込む
StrictHostKeyCheckingホスト鍵の検証方針(既定 ask のままを推奨)

もっと踏み込んだ設計や、自社の環境に合わせた運用の相談は EMW までお気軽にどうぞ。基礎から一緒に積み上げる仲間も探しています。採用情報・カジュアル面談はこちら

09よくある質問(FAQ)

ProxyJump と ProxyCommand は、どちらを使えばよいですか?

踏み台(SSH サーバ)を透過して奥のホストへ入るだけなら ProxyJump を使います。OpenSSH 標準の機能で、設定が短く安全です。SSM のように独自のトンネルを張る場合は ProxyCommand を使います。なお、踏み台に自分の鍵を預けてしまう Agent Forwarding は避け、ProxyJump を優先してください。

SSM(Session Manager)経由の SSH でも、鍵は必要ですか?

はい、必要です。Session Manager は 22 番ポートを開けずに「経路(トンネル)」を提供するだけで、SSH 自体の認証は従来どおり鍵で行います。鍵の管理そのものを無くしたい場合は、SSH を介さず aws ssm start-session --target i-xxxx の対話セッションを使う選択もあります(こちらは完全に鍵レスです)。

Permission denied (publickey) と出て入れません。

まず User(Amazon Linux は ec2-user、Ubuntu は ubuntu)と、IdentityFile の鍵が対象ホストに登録済みの鍵か確認します。手元に鍵が複数ある場合は IdentitiesOnly yes を付けて対象の鍵だけを提示します。秘密鍵のパーミッションが緩いと SSH が読み込みを拒否するため、chmod 600 も確認してください。

秘密鍵はどこに置き、Git に入れてよいですか?

秘密鍵は ~/.ssh/ に置き、パーミッションは 600 にします。Git には絶対にコミットしないでください。履歴に一度でも入ると取り消しが難しく、流出は取り返しがつきません。共有が必要な用途は、鍵を配らずに済む SSM 方式へ寄せるのが安全です。

EMWは「まずSSHを減らせないか」から一緒に考えるAWSコンサルです。踏み台やSSMの設計、既存環境の見直しはお気軽にご相談ください。基礎を積む姿勢を大切にする仲間も募集しています。

相談する
← ブログ一覧へ戻る