🎯 この記事で学べること
- 1SSHの基本的な接続方法とパスワード認証を理解できます
- 2SSH鍵認証の設定方法と公開鍵の登録手順をマスターできます
- 3ポートフォワーディングや多段SSHなどの高度な機能が使えるようになります
- 4sshd_configの設定やFail2banなどでセキュリティを強化する方法がわかります
- 5SCP、SFTP、rsyncを使った安全なファイル転送ができるようになります
読了時間: 約12分
SSHとは
みなさん、遠くにあるサーバーに安全に接続して操作したいと思ったことはありませんか?クラウドサーバーの管理やリモート開発で、セキュアな接続が必要ですよね!
SSH(Secure Shell)は、ネットワークを介して安全にリモートコンピュータに接続し、操作するためのプロトコルです。通信はすべて暗号化されているので、パスワードや送信データが盗聴されるリスクを大幅に軽減できるんです!
今回は、SSHの基本から高度な使い方、そしてセキュリティ強化の方法まで、しっかり学んでいきましょう!
基本的な接続方法
パスワード認証による接続
まずは、一番シンプルなパスワード認証での接続方法から見ていきましょう!
# 基本的な接続
$ ssh username@hostname
$ ssh username@192.168.1.100
# ポート番号を指定(デフォルトは22番)
$ ssh -p 2222 username@hostname
# 詳細な接続情報を表示(デバッグ時に便利)
$ ssh -v username@hostname
接続の流れ:
ssh user@example.com
Password: (パスワードを入力)
Connected to example.com
初回接続時は、サーバーのフィンガープリントを確認するメッセージが表示されます。これはサーバーの正当性を確認するための重要なセキュリティ機能です。必ず「yes」と入力して確認しましょうね!
接続情報の保存
毎回長いコマンドを入力するのは大変ですよね。SSH設定ファイルを使えば、接続情報を保存して簡単に接続できるようになります!
# ~/.ssh/configファイルに設定を記述
Host myserver
HostName example.com
User myusername
Port 22
IdentityFile ~/.ssh/id_rsa
# 設定を使って接続(とっても簡単!)
$ ssh myserver
SSH鍵認証の設定
鍵ペアの生成
パスワード認証よりも安全な鍵認証を設定していきましょう!鍵認証を使うと、パスワードを入力せずに安全にログインできるようになりますよ!
# RSA鍵の生成(4096ビット)
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# Ed25519鍵の生成(推奨!より安全で高速)
$ ssh-keygen -t ed25519 -C "your_email@example.com"
# パスフレーズ付きで生成
$ ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_secure
SSH鍵生成の流れ:
1. ssh-keygen -t ed25519
2. Enter file path: ~/.ssh/id_ed25519 (エンターでデフォルト)
3. Enter passphrase: (パスフレーズ入力、空でもOK)
4. 鍵ペアが生成されました!
Ed25519鍵はRSA鍵よりも安全で、鍵のサイズも小さく、認証速度も速いので推奨です。新しく鍵を作る場合はEd25519を使いましょう!
公開鍵の登録
生成した公開鍵をサーバーに登録しましょう。これで鍵認証が使えるようになります!
# 公開鍵をリモートサーバーに転送(一番簡単!)
$ ssh-copy-id username@hostname
# 手動で公開鍵を追加
$ cat ~/.ssh/id_ed25519.pub | ssh username@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 権限の設定(重要!)
$ ssh username@hostname "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
SSHのディレクトリやファイルの権限が正しく設定されていないと、鍵認証が動作しません。必ず権限を確認しましょう!
鍵の管理
# SSH Agentに鍵を追加
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_ed25519
# 登録されている鍵を確認
$ ssh-add -l
# 特定の鍵を削除
$ ssh-add -d ~/.ssh/id_ed25519
# すべての鍵を削除
$ ssh-add -D
セキュリティの強化
sshd_configの設定
安全なSSHサーバーを運用するために、セキュリティ設定を強化していきましょう!
# /etc/ssh/sshd_configの重要な設定
# ルートログインを無効化(必須!)
PermitRootLogin no
# パスワード認証を無効化(鍵認証のみに)
PasswordAuthentication no
# 空パスワードを禁止
PermitEmptyPasswords no
# 特定のユーザーのみ許可
AllowUsers user1 user2
# 特定のグループのみ許可
AllowGroups sshusers
# 認証試行回数の制限
MaxAuthTries 3
# 接続タイムアウトの設定
ClientAliveInterval 300
ClientAliveCountMax 2
設定を変更した後は、必ずsudo systemctl restart sshd
でSSHサービスを再起動しましょう。ただし、設定ミスでログインできなくならないよう、別のSSHセッションを開いたまま作業しましょうね!
ファイアウォールの設定
# UFWを使用した場合
$ sudo ufw allow 22/tcp
$ sudo ufw allow from 192.168.1.0/24 to any port 22
# カスタムポートの場合
$ sudo ufw allow 2222/tcp
# iptablesを使用した場合
$ sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
$ sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
Fail2banの導入
# Fail2banのインストール
$ sudo apt install fail2ban
# SSH用の設定(/etc/fail2ban/jail.local)
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
# サービスの起動
$ sudo systemctl enable fail2ban
$ sudo systemctl start fail2ban
# 状態確認
$ sudo fail2ban-client status sshd
高度な使用方法
ポートフォワーディング
リモートサーバー上のサービスに、ローカルから直接アクセスしたいことってありますよね?ポートフォワーディングを使えば、それが可能になります!
# ローカルポートフォワーディング
# ローカルの8080ポートをリモートの80ポートに転送
$ ssh -L 8080:localhost:80 username@hostname
# リモートポートフォワーディング
# リモートの8080ポートをローカルの3000ポートに転送
$ ssh -R 8080:localhost:3000 username@hostname
# 動的ポートフォワーディング(SOCKS5プロキシ)
$ ssh -D 9090 username@hostname
ポートフォワーディングの具体例:
ssh -L 3306:localhost:3306 dbserver
# ローカルの3306ポートからDBサーバーのMySQLに接続可能!
ポートフォワーディングを使えば、ファイアウォールで守られた内部サービスにも安全にアクセスできます。データベースやWebサーバーの開発時にとても便利ですよ!
多段SSH(踏み台サーバー経由)
セキュリティ上の理由で、直接アクセスできないサーバーに踏み台サーバー経由で接続する方法を学びましょう!
# ProxyJumpを使用(推奨!シンプルで便利)
$ ssh -J bastion@jumpserver user@targetserver
# ~/.ssh/configで設定
Host target
HostName targetserver
User user
ProxyJump bastion@jumpserver
# 古い方法(ProxyCommand)
$ ssh -o ProxyCommand="ssh bastion@jumpserver -W %h:%p" user@targetserver
SSHトンネリング
# バックグラウンドでトンネルを維持
$ ssh -fN -L 5432:localhost:5432 dbserver
# 自動再接続の設定
$ autossh -M 0 -fN -L 5432:localhost:5432 dbserver
# 複数のポートフォワーディング
$ ssh -L 3306:localhost:3306 -L 5432:localhost:5432 -L 6379:localhost:6379 server
ファイル転送
SCPを使用
SSHを使った安全なファイル転送方法を見ていきましょう。まずはシンプルなSCPから始めます!
# ファイルをアップロード
$ scp local_file.txt username@hostname:/remote/path/
# ファイルをダウンロード
$ scp username@hostname:/remote/file.txt ./
# ディレクトリを再帰的にコピー
$ scp -r local_directory username@hostname:/remote/path/
# ポート番号を指定
$ scp -P 2222 file.txt username@hostname:/path/
SFTPを使用
# SFTPセッションを開始
$ sftp username@hostname
# SFTPコマンド
sftp> pwd # リモートの現在のディレクトリ
sftp> lpwd # ローカルの現在のディレクトリ
sftp> ls # リモートのファイル一覧
sftp> lls # ローカルのファイル一覧
sftp> get file.txt # ファイルをダウンロード
sftp> put file.txt # ファイルをアップロード
sftp> exit # 終了
rsyncを使用(推奨)
大量のファイルや差分同期が必要な場合は、rsyncがとても便利です!
# 基本的な同期
$ rsync -avz local_dir/ username@hostname:/remote/dir/
# SSH経由で同期(明示的に指定)
$ rsync -avz -e ssh local_dir/ username@hostname:/remote/dir/
# 削除も同期(注意!)
$ rsync -avz --delete local_dir/ username@hostname:/remote/dir/
# 進捗を表示
$ rsync -avz --progress local_dir/ username@hostname:/remote/dir/
rsyncは差分のみを転送するので、大量のファイルを扱う場合や定期的な同期に最適です。バックアップやデプロイに活用しましょう!
SSHの便利な機能
永続的な接続(ControlMaster)
# ~/.ssh/configに追加
Host *
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 10m
# 効果:同じホストへの2回目以降の接続が高速化
エスケープシーケンス
# SSH接続中に使えるエスケープシーケンス
~. # 接続を切断
~^Z # SSHをバックグラウンドに
~# # 転送された接続の一覧
~? # エスケープシーケンスのヘルプ
~C # コマンドラインを開く(ポートフォワーディングの追加など)
SSH経由でのコマンド実行
SSHで接続せずに、直接リモートコマンドを実行することもできます。スクリプト化にとても便利ですよ!
# 単一コマンドの実行
$ ssh username@hostname "ls -la /var/log"
# 複数コマンドの実行
$ ssh username@hostname "cd /var/www && git pull && npm install"
# ローカルスクリプトをリモートで実行
$ ssh username@hostname 'bash -s' < local_script.sh
# 標準入力を渡す
$ echo "Hello from local" | ssh username@hostname "cat > remote_file.txt"
リモートコマンド実行例:
ssh server "df -h"
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 5.5G 14G 30% /
トラブルシューティング
接続できない場合
SSH接続がうまくいかない時の、段階的なデバッグ方法を見ていきましょう!
# 詳細なデバッグ情報を表示(これが一番役立つ!)
$ ssh -vvv username@hostname
# 接続テスト
$ telnet hostname 22
$ nc -zv hostname 22
# DNSの確認
$ nslookup hostname
$ dig hostname
# ルーティングの確認
$ traceroute hostname
認証の問題
鍵認証が動かない最も一般的な原因は、ファイルの権限設定です。一緒に確認していきましょう!
# 鍵の権限を確認
$ ls -la ~/.ssh/
# 正しい権限:
# ~/.ssh: 700
# ~/.ssh/id_*: 600
# ~/.ssh/id_*.pub: 644
# ~/.ssh/authorized_keys: 600
# 権限の修正
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_*
$ chmod 644 ~/.ssh/id_*.pub
# SSHエージェントの確認
$ ssh-add -l
$ echo $SSH_AUTH_SOCK
SSHはセキュリティ上の理由から、ファイルの権限が緩すぎると鍵を使ってくれません。必ず正しい権限に設定しましょう!
known_hostsの問題
# 特定のホストのエントリを削除
$ ssh-keygen -R hostname
# known_hostsファイルをクリア
$ > ~/.ssh/known_hosts
# フィンガープリントを事前に追加
$ ssh-keyscan -H hostname >> ~/.ssh/known_hosts
セキュリティのベストプラクティス
強力な鍵の使用
# Ed25519鍵の生成(推奨)
$ ssh-keygen -t ed25519 -a 100
# 既存の鍵の強度を確認
$ ssh-keygen -l -f ~/.ssh/id_rsa.pub
# パスフレーズの変更
$ ssh-keygen -p -f ~/.ssh/id_ed25519
二要素認証の設定
# Google Authenticatorのインストール
$ sudo apt install libpam-google-authenticator
# 設定
$ google-authenticator
# /etc/pam.d/sshdに追加
auth required pam_google_authenticator.so
# /etc/ssh/sshd_configを編集
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
監査とログ
# SSHログの確認
$ sudo tail -f /var/log/auth.log
$ sudo journalctl -u sshd -f
# ログインの履歴
$ last
$ lastlog
# 現在のSSH接続
$ who
$ w
🎮 理解度チェック
📝 まとめ
今回はSSHについて学びました!
- SSHはネットワークを介して安全にリモートサーバーに接続するプロトコル
- パスワード認証よりも鍵認証の方が安全で便利
- ポートフォワーディングで内部サービスにアクセス可能
- sshd_configの設定でセキュリティを強化
- SCP、SFTP、rsyncで安全なファイル転送ができる
次はrsyncコマンドで、より効率的なファイル同期の方法を学びましょう!