SSH強化とファイアウォール設定

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

前回の記事で Claude Code 専用ユーザーを作成し、プロジェクト間のファイル分離を確認しました。この記事では、SSH の認証方式を強化し、ファイアウォール(UFW)でネットワーク通信を制限していきます。

作業が終わると、公開鍵認証のみの SSH 接続、不正アクセス対策の fail2ban、アウトバウンド通信の制限まで完了した状態になります。

順番が前後しますが、この記事で行った設定変更が正しく反映されているか確認するコマンドをまとめておきます。詳細については本文をご覧ください。

# 公開鍵が配置されているか
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」から公開鍵ファイルを転送することもできます。

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 yesPasswordAuthentication 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

設定が反映されたことを確認します。

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 を通過して通信できています。

現在の状態まとめ

ここまでで、SSH とファイアウォールのセキュリティ強化が完了しました。

  • SSH:公開鍵認証のみ、パスワード認証無効、ルートログイン禁止
  • fail2ban:SSH の不正アクセスを自動 BAN
  • UFW インバウンド:メインPCからの SSH のみ許可
  • UFW アウトバウンド:DNS、HTTPS、指定 DB サーバーのみ許可。その他はすべて拒否

次の工程では、専用ユーザーに対するディスククォータやリソース制限など、さらに細かい制限を設定していきます。