SSH(Secure Shell)は、LinuxおよびUnix系システムにおいて最も重要なリモート管理プロトコルである。暗号化された通信経路を通じて、不安定なネットワーク環境下でも安全なリモートログイン、コマンド実行、ファイル転送を実現する。従来のTelnetやrlogin、FTPといった安全性に問題のあるプロトコルを完全に代替しており、現代のインフラストラクチャにおいて不可欠な技術となっている。
本稿では、SSHの動作メカニズム、主要コマンドの実務的な使用方法、および運用を効率化する設定テクニックについて詳しく解説する。
一、SSHの動作メカニズム
SSHの通信フローは大きく分けて三个のフェーズで構成される:ハンドシェイクとバージョン交渉、鍵交換と暗号化チャネルの確立、ユーザー認証。
1. ハンドシェイクとバージョン交渉
- クライアントはサーバーの22番ポート(デフォルト)に接続をリクエストする。
- 双方のプロトコルバージョン(例:SSH-2.0)を交換し、协商に基づいて使用するプロトコルバージョンを決定する。現在の主流はSSH-2であり、SSH-1は脆弱性により使用が停止されている。
2. 鍵交換と暗号化チャネルの確立(核心部分)
SSHの最も重要なセキュリティ機構であり、ハイブリッド暗号化方式を採用している:
- 非対称暗号化(公開鍵/秘密鍵):通信開始時に「セッション鍵」を安全に交換するために使用される。代表的なアルゴリズムとしてRSA、ECDSA、Ed25519がある。
- サーバーは自己の公開鍵をクライアントに送信する。
- クライアントはサーバープublic鍵を検証する(~/.ssh/known_hostsファイルを参照)。「中間者攻撃」を防ぐための重要なプロセスである。初めて接続する場合はfinger printの確認プロンプトが表示される。
- 対称暗号化(セッション鍵):非対称暗号化経由でセッション鍵が安全に生成された後、すべてのデータ転送(パスワード、コマンド、ファイル内容を含む)は、このセッション鍵を使用して対称暗号化(AES、ChaCha20など)で行われる。
- 理由:対称暗号化の計算速度は非対称暗号化と比較して格段速く、大容量データの転送に適しているためである。
3. ユーザー認証
暗号化チャネルが確立された後、クライアントは身元を証明する必要がある。主要な認証方式は二つある:
- パスワード認証:暗号化されたチャネル内でユーザーがパスワードを入力し、サーバーが検証する。
- 公開鍵認証(推奨):
- ユーザーはローカルで鍵ペアを生成する(秘密鍵~/.ssh/id_ed25519、公開鍵~/.ssh/id_ed25519.pub)。
- 公開鍵の内容をサーバーの~/.ssh/authorized_keysファイルに追加する。
- 接続時、サーバーは公開鍵でランダムな文字列を暗号化してクライアントに送信する。
- クライアントはローカルの秘密鍵で復号化し、結果を返す。
- サーバーは検証成功后、ログインを許可する。
- 利点:毎回パスワードを入力する手間が省け、パスワードログインを無効にすることでセキュリティを大幅に向上できる。
二、主要コマンドの実務的使い方
1. ssh - リモートログインとコマンド実行
基本構文:
ssh [オプション] [ユーザー@]ホスト名 [コマンド]
実践的な使用シーン:
- リモートサーバーにログイン(デフォルトでローカル現在のユーザー):
ssh 192.168.1.100
# ユーザーを指定する場合
ssh admin@192.168.1.100
- ポート指定(サーバーがデフォルトの22番ポートを変更している場合):
ssh -p 2222 user@hostname
- 秘密鍵ファイル指定(複数の鍵を管理する場合や権限分離):
ssh -i ~/.ssh/aws_production_key user@hostname
- リモートコマンド実行(インタラクティブセッションに入らず、実行完了後に終了):
# リモートサーバーのディスク使用量をチェック
ssh user@hostname "df -h"
# リモートサーバーでサービスを再起動
ssh user@hostname "sudo systemctl restart httpd"
- 疑似ターミナル強制確保(リモートコマンドがインタラクティブな入力が必要な場合):
ssh -t user@hostname "sudo shutdown -h now"
- 詳細デバッグモード(接続失敗時に使用、ハンドシェイクの詳細を表示):
ssh -v user@hostname # 最小レベル
ssh -vvv user@hostname # 最大レベル(複雑な問題の切り分けに使用)
- 厳格なホスト鍵チェック無効化(テスト環境のみ推奨):
ssh -o StrictHostKeyChecking=no user@hostname
2. ssh-keygen - 鍵ペアの生成
公開鍵認証に使用する鍵ペアを生成するコマンドである。
実践的な使用シーン:
- デフォルトのRSA鍵を生成(非推奨、短すぎる鍵長):
ssh-keygen
# Enterキーを押してデフォルトパスを承認、パスフレーズを入力(任意、セキュリティ向上に有効)
- 高セキュリティのEd25519鍵を生成(強く推奨、安全性と速度の両立):
ssh-keygen -t ed25519 -C "work@company.co.jp"
- -t: 鍵タイプ指定(ed25519, rsa, ecdsa)
- -C: コメント追加(識別用にメールアドレスを使用するのが一般的)
- 4096ビットRSA鍵を生成(レガシーシステムとの互換性が必要な場合):
ssh-keygen -t rsa -b 4096 -C "work@company.co.jp"
- 公開鍵のfinger printを確認:
ssh-keygen -lf ~/.ssh/id_ed25519.pub
3. scp - セキュアなファイルコピー
SSHを基盤としたファイル転送ユーティリティである。
基本構文:
scp [オプション] [ソースファイル] [ターゲットパス]
実践的な使用シーン:
- ファイルアップロード(ローカル → リモート):
scp document.pdf user@hostname:/var/www/html/
- ファイルダウンロード(リモート → ローカル):
scp user@hostname:/var/log/system.log ./backup/
- ディレクトリ全体の再帰的コピー(-r オプション):
scp -r ./project user@hostname:/home/user/
- ポート指定:
scp -P 2222 backup.tar.gz user@hostname:/path/
# 注意:scp是大文字P、ssh是小文字p
4. sftp - SSHファイル転送プロトコル
FTPと同様のインタラクティブインターフェースを提供するが、SSH暗号化に基盤している。
使用方法:
sftp user@hostname
# インタラクティブモード成立后:
# put <local> (アップロード)
# get <remote> (ダウンロード)
# ls, cd, pwd, mkdir, rm などの基本コマンド
# exit または bye で終了
5. ssh-agent と ssh-add - 鍵管理
秘密鍵にパスフレーズを設定している場合、毎回入力するのは面倒である。ssh-agentはメモリ内に復号化された秘密鍵をキャッシュする。
- エージェント起動(通常はデスクトップ環境が自動起動、手動実行も可能):
eval "$(ssh-agent -s)"
- 秘密鍵をエージェントに追加:
ssh-add ~/.ssh/id_ed25519
パスフレーズを入力後、そのセッション内のすべてのssh操作で再入力不要となる。
- ロード済み鍵の確認:
ssh-add -l
- 全キャッシュをクリア:
ssh-add -D
三、上級テクニックと設定(~/.ssh/config)
管理するサーバー数が増加すると、コマンドラインで長いパラメータを入力するのは非効率である。~/.ssh/configファイルを編集することで别名とデフォルトパラメータを定義できる。
設定ファイルの例(~/.ssh/config):
# グローバルデフォルト設定
Host *
User deploy_user
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
TCPKeepAlive yes
# 本番Webサーバー
Host production-web
HostName 10.20.30.40
User wwwadmin
Port 2222
IdentityFile ~/.ssh/production.pem
# 開発用サーバー
Host dev-server
HostName 203.0.113.50
User developer
# グローバルのIdentityFileを継承、重複指定不要
# ジャンプホスト構成
# 内部DBにアクセスするにはbastion-gatewayを経由
Host internal-db
HostName 172.16.0.100
User dba
ProxyJump bastion-gateway
Host bastion-gateway
HostName 203.0.113.10
User jumpuser
Port 22
設定後の接続方法:
ssh production-web # ssh -p 2222 -i ~/.ssh/production.pem wwwadmin@10.20.30.40 と同等
ssh internal-db # ジャンプホスト経由で内部DBに自動接続
scp app.war production-web:/opt/tomcat/webapps/
四、セキュリティ最佳実践
サーバーセキュリティを確保するため、/etc/ssh/sshd_config(サーバー側設定)の最適化を推奨する:
- Root 直接ログインの禁止:
PermitRootLogin no
理由:一般ユーザーでログイン后再びsuまたはsudoを使用することで、監査が可能になり、rootパスワードへのブルートフォース攻撃を防止できる。
- パスワード認証の無効化、公開鍵認証のみ許可:
PasswordAuthentication no
PubkeyAuthentication yes
理由:パスワードの総当たり攻撃リスクを完全に排除できる。
- デフォルトポートの変更:
Port 2222
理由:自動スキャンスクリプトによる攻撃を軽減できる(针对性攻击を防ぐことはできないが、ログのゴミを大幅に減らせる)。
- 許可ユーザーの制限:
AllowUsers alice bob charlie
- Fail2Banの活用: fail2banサービスをインストールし、SSHログを監視してログインに複数回失敗したIPアドレスを自動ブロックする。
要点のまとめ
- 原理:非対称鍵交換 → 対称暗号化転送 → 公開鍵/パスワード認証
- ログイン:
ssh user@host - ファイル転送:
scpまたはsftp - 鍵生成:
ssh-keygen -t ed25519 - 効率化:~/.ssh/configで别名を設定
- セキュリティ:Rootログイン無効化、パスワード認証無効化、公開鍵のみ使用