「サーバーに安全にリモート接続したい」
「FTPより安全にファイル転送する方法を知りたい」
「複数のサーバーを効率的に管理したい」
こんな時に必須となるのが「SSH(Secure Shell)」接続です。
SSHは、ネットワーク経由で他のコンピュータに安全に接続し、コマンドを実行したり、ファイルを転送したりできる強力なツールです。暗号化された通信により、パスワードやデータが盗聴される心配もありません。
でも「コマンドが覚えられない」「オプションが多すぎて分からない」「鍵認証の設定が難しそう」など、最初は戸惑うことも多いでしょう。
この記事では、SSH接続の基本的なコマンドから、便利なオプション、セキュアな鍵認証の設定、トンネリングなどの高度な使い方まで、初心者の方でも理解できるように詳しく解説していきます。
SSHを使いこなして、安全で効率的なリモート管理を実現しましょう!
SSHの基礎知識

SSHとは何か
まずSSHの基本概念を理解しましょう。
SSH(Secure Shell)の特徴:
- 暗号化された安全な通信
- リモートでのコマンド実行
- ファイル転送機能(SCP、SFTP)
- ポート転送(トンネリング)
- X11転送(GUI転送)
なぜSSHが必要なのか:
従来の接続方法(Telnet、FTP)の問題:
- パスワードが平文で送信される
- 通信内容が暗号化されない
- 中間者攻撃に脆弱
SSHの利点:
- すべての通信が暗号化
- 強力な認証方式
- データの完全性を保証
必要な環境
SSH接続に必要な環境を確認します。
クライアント側(接続する側):
- Linux/Mac:標準でSSHクライアントがインストール済み
- Windows:Windows 10以降は標準搭載、古い場合はPuTTY等が必要
サーバー側(接続される側):
- SSHサーバー(OpenSSH等)がインストール・起動されている
- ポート22(デフォルト)が開放されている
- ユーザーアカウントが存在する
確認コマンド:
# SSHクライアントのバージョン確認
ssh -V
# SSHサーバーの状態確認(Linux)
sudo systemctl status sshd
# SSHサーバーの状態確認(Mac)
sudo systemsetup -getremotelogin
基本的なSSH接続コマンド
最も基本的な接続方法
SSHの基本的な接続コマンドを見ていきましょう。
基本構文:
ssh [オプション] [ユーザー名]@[ホスト名またはIPアドレス] [コマンド]
実例:
# 最もシンプルな接続
ssh user@192.168.1.100
# ホスト名で接続
ssh user@example.com
# 現在のユーザー名で接続(ユーザー名省略)
ssh 192.168.1.100
# ポート番号を指定
ssh -p 2222 user@example.com
# IPv6アドレスで接続
ssh user@[2001:db8::1]
初回接続時の確認:
The authenticity of host 'example.com (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
→ フィンガープリントを確認して「yes」を入力
よく使うオプション
頻繁に使用するSSHオプションです。
主要なオプション一覧:
# ポート指定
ssh -p 2222 user@host
# 秘密鍵を指定
ssh -i ~/.ssh/mykey.pem user@host
# 冗長モード(デバッグ情報表示)
ssh -v user@host # 基本的な情報
ssh -vv user@host # 詳細情報
ssh -vvv user@host # 最も詳細
# X11転送を有効化(GUI転送)
ssh -X user@host # 基本的なX11転送
ssh -Y user@host # 信頼されたX11転送
# バックグラウンド実行
ssh -f user@host command
# 圧縮を有効化(低速回線で有効)
ssh -C user@host
# エージェント転送
ssh -A user@host
# 疑似端末を割り当てない
ssh -T user@host
# 強制的に疑似端末を割り当て
ssh -tt user@host
リモートコマンドの実行
接続せずに直接コマンドを実行する方法です。
単一コマンドの実行:
# ディスク使用状況を確認
ssh user@host "df -h"
# プロセスを確認
ssh user@host "ps aux | grep nginx"
# ファイル一覧を取得
ssh user@host "ls -la /var/log/"
# 複数コマンドを実行
ssh user@host "cd /var/www && ls -la && pwd"
スクリプトの実行:
# ローカルのスクリプトをリモートで実行
ssh user@host 'bash -s' < local_script.sh
# 引数付きでスクリプト実行
ssh user@host 'bash -s' -- arg1 arg2 < script.sh
# Pythonスクリプトの実行
ssh user@host python3 < script.py
出力のリダイレクト:
# リモートの結果をローカルファイルに保存
ssh user@host "cat /var/log/syslog" > local_log.txt
# リモートでコマンドを実行し、結果を圧縮して保存
ssh user@host "tar czf - /path/to/dir" > backup.tar.gz
SSH鍵認証の設定
鍵ペアの生成
パスワード認証より安全な鍵認証を設定しましょう。
鍵の生成コマンド:
# Ed25519鍵の生成(推奨)
ssh-keygen -t ed25519 -C "your_email@example.com"
# RSA鍵の生成(互換性重視)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 保存場所とパスフレーズの設定
Enter file in which to save the key (/home/user/.ssh/id_ed25519): [Enter]
Enter passphrase (empty for no passphrase): [パスフレーズ入力]
Enter same passphrase again: [パスフレーズ再入力]
生成される鍵ファイル:
~/.ssh/id_ed25519 # 秘密鍵(絶対に共有しない)
~/.ssh/id_ed25519.pub # 公開鍵(サーバーに登録)
鍵の権限設定:
# 正しい権限に設定
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
公開鍵の登録
生成した公開鍵をサーバーに登録します。
方法1:ssh-copy-idを使用(推奨)
# 公開鍵を自動的にサーバーに転送
ssh-copy-id user@host
# 特定の鍵を指定
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host
# ポート指定
ssh-copy-id -p 2222 user@host
方法2:手動でコピー
# 公開鍵の内容を表示
cat ~/.ssh/id_ed25519.pub
# SSHで接続してauthorized_keysに追加
ssh user@host
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "公開鍵の内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
方法3:ワンライナーで追加
cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
SSH設定ファイル(config)
接続を簡単にする設定ファイルの活用です。
~/.ssh/configの作成:
# 設定ファイルを作成
touch ~/.ssh/config
chmod 600 ~/.ssh/config
設定例:
# 開発サーバー
Host dev
HostName 192.168.1.100
User developer
Port 22
IdentityFile ~/.ssh/id_ed25519
# 本番サーバー(踏み台経由)
Host prod
HostName 10.0.0.50
User admin
Port 2222
ProxyJump bastion
# 踏み台サーバー
Host bastion
HostName bastion.example.com
User jump-user
Port 22
IdentityFile ~/.ssh/bastion_key
# 全ホスト共通設定
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
Compression yes
TCPKeepAlive yes
使用方法:
# 設定したホスト名で簡単接続
ssh dev
ssh prod
ファイル転送(SCP/SFTP)
SCPコマンドでのファイル転送
SSHを使った安全なファイル転送方法です。
基本的なSCPコマンド:
# ローカルからリモートへ転送
scp local_file.txt user@host:/remote/path/
# リモートからローカルへ転送
scp user@host:/remote/file.txt /local/path/
# ディレクトリを再帰的に転送
scp -r local_dir/ user@host:/remote/path/
# ポート指定
scp -P 2222 file.txt user@host:/path/
# 進捗状況を表示しない(クーロンジョブ用)
scp -q file.txt user@host:/path/
# 圧縮して転送(大きなファイル用)
scp -C large_file.tar.gz user@host:/path/
複数ファイルの転送:
# ワイルドカードを使用
scp *.log user@host:/var/log/backup/
# 複数のファイルを指定
scp file1.txt file2.txt user@host:/path/
# リモート間でのコピー
scp user1@host1:/file.txt user2@host2:/path/
SFTPの使い方
対話的なファイル転送を行うSFTPの使用方法です。
SFTP接続と基本操作:
# SFTP接続
sftp user@host
# ポート指定
sftp -P 2222 user@host
SFTPコマンド一覧:
# リモート側の操作
ls # ファイル一覧表示
cd /path # ディレクトリ移動
pwd # 現在のディレクトリ表示
mkdir dirname # ディレクトリ作成
rm filename # ファイル削除
rmdir dirname # ディレクトリ削除
# ローカル側の操作
lls # ローカルファイル一覧
lcd /path # ローカルディレクトリ移動
lpwd # ローカルの現在ディレクトリ
# ファイル転送
get remote.txt # ダウンロード
get -r remote_dir/ # ディレクトリをダウンロード
put local.txt # アップロード
put -r local_dir/ # ディレクトリをアップロード
mget *.txt # 複数ファイルをダウンロード
mput *.log # 複数ファイルをアップロード
# その他
help # ヘルプ表示
exit/quit # 終了
バッチモードでの実行:
# コマンドファイルを作成
cat > sftp_batch.txt << EOF
cd /var/backup
get backup.tar.gz
exit
EOF
# バッチ実行
sftp -b sftp_batch.txt user@host
SSHトンネリング(ポート転送)
ローカルポート転送
リモートのサービスをローカルで使用する方法です。
基本構文:
ssh -L [ローカルポート]:[転送先ホスト]:[転送先ポート] [SSHサーバー]
実用例:
# リモートのMySQLに接続
ssh -L 3307:localhost:3306 user@dbserver
# 接続方法:mysql -h localhost -P 3307
# リモートのWebサービスにアクセス
ssh -L 8080:localhost:80 user@webserver
# ブラウザで:http://localhost:8080
# 別のサーバーのサービスに転送
ssh -L 5433:db.internal:5432 user@gateway
# gateway経由でdb.internalのPostgreSQLに接続
# バックグラウンドで実行
ssh -fN -L 8888:localhost:8888 user@host
リモートポート転送
ローカルのサービスをリモートに公開する方法です。
基本構文:
ssh -R [リモートポート]:[転送先ホスト]:[転送先ポート] [SSHサーバー]
実用例:
# ローカルのWebサーバーをリモートに公開
ssh -R 8080:localhost:3000 user@server
# リモートで:curl http://localhost:8080
# 外部からアクセス可能にする(要設定)
ssh -R 0.0.0.0:8080:localhost:3000 user@server
# 複数のポート転送
ssh -R 8080:localhost:3000 -R 8081:localhost:3001 user@server
動的ポート転送(SOCKSプロキシ)
SSH経由ですべての通信を転送する方法です。
# SOCKSプロキシを作成
ssh -D 8888 user@server
# バックグラウンドで実行
ssh -fN -D 8888 user@server
# 圧縮も有効化(低速回線用)
ssh -CfN -D 8888 user@server
ブラウザでの使用:
プロキシ設定:
- タイプ:SOCKS5
- ホスト:localhost
- ポート:8888
コマンドラインでの使用:
# curlでSOCKSプロキシを使用
curl --proxy socks5://localhost:8888 https://example.com
# gitでSOCKSプロキシを使用
git config --global http.proxy socks5://localhost:8888
多段SSH(踏み台経由)
ProxyJumpを使った接続
踏み台サーバー経由での接続方法です。
コマンドラインでの指定:
# 単一の踏み台経由
ssh -J bastion@jump.example.com user@target.internal
# 複数の踏み台経由
ssh -J user1@jump1,user2@jump2 user@target
# ポート指定
ssh -J bastion@jump.example.com:2222 user@target
設定ファイルでの指定:
# ~/.ssh/config
Host target
HostName target.internal
User targetuser
ProxyJump bastion
Host bastion
HostName jump.example.com
User jumpuser
Port 22
ProxyCommandを使った接続
より柔軟な踏み台接続の設定です。
# ~/.ssh/config
Host target
HostName target.internal
User targetuser
ProxyCommand ssh bastion nc %h %p
# socatを使用
Host target
ProxyCommand ssh bastion socat - TCP:%h:%p
# 複数踏み台
Host target
ProxyCommand ssh -q -W %h:%p jump2
Host jump2
ProxyCommand ssh -q -W %h:%p jump1
Host jump1
HostName jump1.example.com
SSHエージェント
ssh-agentの使い方
パスフレーズの入力を省略する方法です。
エージェントの起動と鍵の追加:
# エージェントを起動
eval $(ssh-agent)
# 鍵を追加
ssh-add ~/.ssh/id_ed25519
# パスフレーズを入力
Enter passphrase for ~/.ssh/id_ed25519:
# 登録された鍵を確認
ssh-add -l
# すべての鍵を削除
ssh-add -D
# 特定の鍵を削除
ssh-add -d ~/.ssh/id_ed25519
自動起動の設定(.bashrc/.zshrc):
# SSH Agent自動起動
if [ -z "$SSH_AUTH_SOCK" ]; then
eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519
fi
エージェント転送
踏み台経由でも鍵を使えるようにする設定です。
# エージェント転送を有効にして接続
ssh -A user@bastion
# 設定ファイルで指定
Host bastion
ForwardAgent yes
セキュリティ上の注意:
- 信頼できるサーバーでのみ使用
- 踏み台サーバーの管理者は鍵を使用可能
- 必要最小限の使用に留める
セキュリティ設定
SSHサーバーの設定強化
サーバー側のセキュリティを高める設定です。
/etc/ssh/sshd_configの推奨設定:
# ポート変更
Port 2222
# rootログインを禁止
PermitRootLogin no
# パスワード認証を無効化
PasswordAuthentication no
# 公開鍵認証のみ許可
PubkeyAuthentication yes
# 空パスワードを禁止
PermitEmptyPasswords no
# ログインできるユーザーを制限
AllowUsers user1 user2
# X11転送を無効化(不要な場合)
X11Forwarding no
# 接続試行回数の制限
MaxAuthTries 3
# 同時接続数の制限
MaxSessions 10
設定の反映:
# 設定ファイルのテスト
sudo sshd -t
# SSHサービスの再起動
sudo systemctl restart sshd
fail2banによる攻撃対策
総当たり攻撃を防ぐツールの設定です。
# インストール(Ubuntu/Debian)
sudo apt install fail2ban
# 設定ファイルの作成
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# SSH用の設定
[sshd]
enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600
トラブルシューティング
接続できない時の確認事項
SSH接続が失敗する場合のチェックリストです。
基本的な確認:
# ネットワーク疎通確認
ping hostname
# ポートが開いているか確認
nc -zv hostname 22
telnet hostname 22
nmap -p 22 hostname
# DNS解決の確認
nslookup hostname
dig hostname
# ルーティングの確認
traceroute hostname
詳細なデバッグ:
# 冗長モードで接続
ssh -vvv user@host
# 特定の認証方法を試す
ssh -o PreferredAuthentications=password user@host
ssh -o PreferredAuthentications=publickey user@host
# 設定ファイルを無視して接続
ssh -F /dev/null user@host
# known_hostsを無視
ssh -o StrictHostKeyChecking=no user@host
よくあるエラーと対処法
Permission denied (publickey)
# 原因:鍵認証が失敗
# 対処法:
1. 正しい鍵を指定
ssh -i ~/.ssh/correct_key user@host
2. 鍵の権限を確認
chmod 600 ~/.ssh/id_*
chmod 700 ~/.ssh
3. authorized_keysの権限を確認
chmod 600 ~/.ssh/authorized_keys
Connection refused
# 原因:SSHサービスが起動していない、ファイアウォール
# 対処法:
1. SSHサービスの確認
sudo systemctl status sshd
sudo systemctl start sshd
2. ファイアウォールの確認
sudo ufw status
sudo iptables -L
Host key verification failed
# 原因:ホスト鍵が変更された
# 対処法:
1. known_hostsから古い鍵を削除
ssh-keygen -R hostname
2. または該当行を手動削除
vim ~/.ssh/known_hosts
よくある質問
Q: タイムアウトを防ぐには?
A: ServerAliveIntervalを設定します。
# コマンドラインで指定
ssh -o ServerAliveInterval=60 user@host
# 設定ファイルで指定
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
Q: パスワードなしで接続するには?
A: 鍵認証を設定します。
# 鍵生成
ssh-keygen -t ed25519
# 公開鍵をサーバーに転送
ssh-copy-id user@host
ただし、セキュリティのためパスフレーズは設定することを推奨します。
Q: 複数の鍵を使い分けるには?
A: IdentityFileで指定するか、ssh-agentを使用します。
# コマンドラインで指定
ssh -i ~/.ssh/specific_key user@host
# 設定ファイルで指定
Host server1
IdentityFile ~/.ssh/key1
Host server2
IdentityFile ~/.ssh/key2
Q: SSHのバージョンを確認するには?
A: 以下のコマンドを使用します。
# クライアントのバージョン
ssh -V
# サーバーのバージョン
ssh user@host "ssh -V"
Q: 接続を高速化するには?
A: 以下の設定を試してください。
# ~/.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/control-%C
ControlPersist 10m
Compression yes
TCPKeepAlive yes
まとめ
SSH接続は、適切に設定すれば非常に強力で安全なツールです。
重要なポイント:
- 基本をマスター
- 基本的な接続コマンド
- よく使うオプション
- リモートコマンド実行
- セキュリティを重視
- 鍵認証の使用
- パスフレーズの設定
- ポート変更などの強化
- 効率化の工夫
- configファイルの活用
- ssh-agentの利用
- エイリアスの設定
- 高度な機能の活用
- ポート転送
- 多段SSH
- SOCKSプロキシ
- トラブル対応
- デバッグモードの活用
- ログの確認
- 適切なエラー対処
SSHは、サーバー管理やリモート作業に欠かせないツールです。
この記事で紹介したコマンドとテクニックを活用して、安全で効率的なリモート環境を構築してください。コマンドラインの力を最大限に活用しましょう!
コメント