SSH強化とファイアウォール設定
篠原 隆司
アフィリエイト広告を利用しています
このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です
前回の記事で Claude Code 専用ユーザーを作成し、プロジェクト間のファイル分離を確認しました。この記事では、SSH の認証方式を強化し、ファイアウォール(UFW)でネットワーク通信を制限していきます。
作業が終わると、公開鍵認証のみの SSH 接続、不正アクセス対策の fail2ban、アウトバウンド通信の制限まで完了した状態になります。
この記事に登場する IP アドレス(192.168.1.x)はサンプルです。ご自身の環境に合わせて読み替えてください。
【広告】 XServer VPS には Claude Code のアプリイメージが用意されています。
VPS上に独立した Claude Code 環境を簡単に構築することができます。
VPSでいろいろ試すなら『XServer VPS』
順番が前後しますが、この記事で行った設定変更が正しく反映されているか確認するコマンドをまとめておきます。詳細については本文をご覧ください。
# 公開鍵が配置されているか
cat ~/.ssh/authorized_keys
# SSH の認証設定
sudo sshd -T | grep -E "passwordauthentication|permitrootlogin|pubkeyauthentication|kbdinteractiveauthentication"
# fail2ban の状態
sudo fail2ban-client status sshd
# UFW のルール一覧
sudo ufw status numbered
公開鍵認証への切り替え
初期状態では SSH のパスワード認証が有効になっています。パスワード認証はブルートフォース攻撃の対象になりやすいため、公開鍵認証のみに切り替えます。
鍵ペアの作成(まだ持っていない場合)
すでに SSH 鍵ペアをお持ちの方はこのステップを飛ばしてください。メインPC 側で鍵ペアを生成します。現在の推奨は Ed25519 です。
ssh-keygen -t ed25519 -C "your_email@example.com"
パスフレーズの設定を求められます。秘密鍵の保護のため、設定しておくことをおすすめします。生成されたファイルのうち、.pub が付いた方が公開鍵です。
公開鍵の配置
Ubuntu 側の管理ユーザーのホームディレクトリに公開鍵を配置します。
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
# メインPCの公開鍵の内容を貼り付けて保存
chmod 600 ~/.ssh/authorized_keys
Tera Term を使っている場合は、メニューの「SSH SCP」から公開鍵ファイルを転送することもできます。
次のステップでパスワード認証を無効にします。必ず先に、別の Tera Term ウィンドウから鍵認証で SSH ログインできることを確認してください。確認せずにパスワード認証を無効にすると、締め出されます。
SSH 設定の変更
まず、変更前の設定を確認しておきます。
sudo sshd -T | grep -E "passwordauthentication|permitrootlogin|pubkeyauthentication"
permitrootlogin without-password
pubkeyauthentication yes
passwordauthentication yes
Ubuntu 24.04 では、SSH の設定が /etc/ssh/sshd_config.d/ 以下のファイルで管理されています。sshd_config の先頭に Include /etc/ssh/sshd_config.d/*.conf があり、このディレクトリ内のファイルが優先されます。sshd_config 本体を編集しても、sshd_config.d/ 内の同じ設定に上書きされるため注意してください。
まず、cloud-init が作成した設定ファイルを確認します。
sudo cat /etc/ssh/sshd_config.d/50-cloud-init.conf
PasswordAuthentication yes
この設定が sshd_config より優先されているため、ここを修正します。
sudo vi /etc/ssh/sshd_config.d/50-cloud-init.conf
PasswordAuthentication yes を PasswordAuthentication no に変更して保存します。
続いて、カスタム設定ファイルを作成します。ファイル名を 60- にすることで、50-cloud-init.conf より後に読み込まれます。
sudo vi /etc/ssh/sshd_config.d/60-custom.conf
PermitRootLogin no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
KbdInteractiveAuthentication no は、パスワード認証の抜け道を塞ぐための設定です。
SSH を再起動して設定を反映します。
sudo systemctl restart ssh
Ubuntu 24.04 では SSH のサービス名は ssh です。sshd ではないので注意してください。
設定が反映されたことを確認します。
sudo sshd -T | grep -E "passwordauthentication|permitrootlogin|pubkeyauthentication|kbdinteractiveauthentication"
permitrootlogin no
pubkeyauthentication yes
passwordauthentication no
kbdinteractiveauthentication no
すべて想定通りの値になっていれば完了です。
fail2ban の導入
fail2ban は、ログを監視して不正なアクセスを繰り返す IP アドレスを自動的にブロックするツールです。パスワード認証を無効にしていても、鍵認証の失敗やブルートフォースの検知として効果があります。
sudo apt install fail2ban -y
SSH 用の設定ファイルを作成します。/etc/fail2ban/jail.conf を直接編集せず、jail.local に設定を書くのが推奨されています。
sudo vi /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 22
maxretry = 5
findtime = 600
bantime = 3600
10分間(findtime = 600秒)に5回失敗したら、1時間(bantime = 3600秒)BAN するという設定です。
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
動作を確認します。
sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
sshd の jail が有効になっていれば OK です。
UFW アウトバウンドの制限
記事4で UFW を有効にしましたが、その時点ではインバウンドの SSH を許可しただけでした。ここではアウトバウンド(外向きの通信)をデフォルト拒否にして、必要な通信だけを許可します。
これが Claude Code の隔離設計の中核です。Claude Code が外部と通信できる先を、Anthropic の API と許可された DB サーバーだけに限定します。
アウトバウンドの基本設定
# アウトバウンドをデフォルト拒否に変更
sudo ufw default deny outgoing
# DNS(名前解決に必須)
sudo ufw allow out 53/udp
# HTTPS(Claude Code の API 通信に必要)
sudo ufw allow out 443/tcp
DNS を許可しないと名前解決ができず、HTTPS の通信先にも到達できなくなります。HTTPS は Claude Code が Anthropic の API と通信するために必須です。
DB サーバーへの接続許可
開発用の DB サーバーへの接続を許可します。宛先 IP とポートを明示的に指定して、それ以外の通信は通さないようにします。
# DBサーバーへの接続を許可(IPとポートは環境に合わせて変更)
sudo ufw allow out to <DBサーバーIP> port <ポート> proto tcp
# 例:
# sudo ufw allow out to 192.168.1.10 port 13306 proto tcp
# sudo ufw allow out to 192.168.1.10 port 13307 proto tcp
# sudo ufw allow out to 192.168.1.20 port 13306 proto tcp
DB サーバーの台数やポート番号は環境によって異なります。必要な分だけルールを追加してください。
インバウンド SSH の制限
記事4で設定した SSH のインバウンドルールは、すべての IP アドレスからの接続を許可していました。これをメインPC(192.168.1.2)からの接続のみに限定します。
# 既存のルールを削除
sudo ufw delete allow OpenSSH
# メインPCからのSSH接続のみ許可
sudo ufw allow in from <メインPCのIP> to any port 22 proto tcp
# 例:
# sudo ufw allow in from 192.168.1.2 to any port 22 proto tcp
設定の確認
sudo ufw status numbered
設定の全体像は以下のようになります。
| 方向 | 対象 | ルール |
|---|---|---|
| インバウンド | SSH(22/tcp) | メインPC(192.168.1.2)からのみ許可 |
| アウトバウンド | DNS(53/udp) | すべての宛先に許可 |
| アウトバウンド | HTTPS(443/tcp) | すべての宛先に許可 |
| アウトバウンド | DB(各ポート/tcp) | 指定した DB サーバーの IP のみ許可 |
| アウトバウンド | その他すべて | 拒否(デフォルト deny) |
DNS と HTTPS の通信ができることを確認しておきます。
# DNS の名前解決
nslookup google.com
# HTTPS の外部通信(Anthropic API)
curl -I https://api.anthropic.com
DNS で IP アドレスが返ってきて、curl で HTTP レスポンス(404 等)が返ってくれば、UFW を通過して通信できています。
apt によるパッケージ更新は HTTP(80/tcp)を使います。アウトバウンドで 80/tcp を許可していないため、sudo apt update は通常時はブロックされます。パッケージの更新が必要なときは、管理者が一時的に sudo ufw allow out 80/tcp で開放し、作業が終わったら sudo ufw delete allow out 80/tcp で閉じる運用にしています。
現在の状態まとめ
ここまでで、SSH とファイアウォールのセキュリティ強化が完了しました。
- SSH:公開鍵認証のみ、パスワード認証無効、ルートログイン禁止
- fail2ban:SSH の不正アクセスを自動 BAN
- UFW インバウンド:メインPCからの SSH のみ許可
- UFW アウトバウンド:DNS、HTTPS、指定 DB サーバーのみ許可。その他はすべて拒否
次の工程では、専用ユーザーに対するディスククォータやリソース制限など、さらに細かい制限を設定していきます。
【広告】 XServer VPS には Claude Code のアプリイメージが用意されています。
VPS上に独立した Claude Code 環境を簡単に構築することができます。
VPSでいろいろ試すなら『XServer VPS』