【実務・中級編】 ポート22番(SSH):セキュアシェルを悪用したブルートフォースおよび認証情報侵害による不正アクセスの防御 – サイバーセキュリティとプライバシー保護実践ガイド

玄関の鍵を「開けっ放し」にしていないか? SSHブルートフォースからサーバーを守る現場の鉄則

深夜、ふとログを確認すると auth.log が真っ赤に染まっている——。世界中のどこかのボットネットが、君のサーバーの TCP/22 を執拗に叩き続けている。エンジニアなら誰もが一度は経験する、いわゆる「SSHブルートフォース攻撃」の洗礼だ。

今日は、教科書的な「セキュリティを強化しましょう」という抽象論ではなく、現場で我々が血を流しながら学んできた、SSHの防御術について話をしよう。

1. なぜ「パスワード認証」が最大の脆弱性なのか

SSH(Secure Shell)は、RFC 4251で定義された極めて強力なプロトコルだ。しかし、どんなに暗号化が強固でも、玄関の鍵が「推測可能なパスワード」であれば、それは無意味だ。

攻撃者は、辞書攻撃や総当たり攻撃(ブルートフォース)で、何万通りものパスワードを叩き込んでくる。君がどれほど複雑なパスワードを設定しても、相手は機械だ。疲れることもなければ、諦めることもない。

現場の教訓:パスワード認証は「即刻無効化」が正解だ。

2. 実践:SSH防御の「三種の神器」

まずは、/etc/ssh/sshd_config を開いてほしい。設定を変更したら、必ず sshd -t で構文チェックを行い、systemctl restart sshd を忘れないこと。

設定の核となる記述例

# /etc/ssh/sshd_config の設定例

# 1. ルートログインを禁止(踏み台にされても権限を制限する)
PermitRootLogin no

# 2. パスワード認証を完全に無効化(公開鍵認証のみ許可)
PasswordAuthentication no

# 3. チャレンジレスポンス認証も無効化
ChallengeResponseAuthentication no

# 4. 空パスワードを許可しない
PermitEmptyPasswords no

これだけで、ブルートフォース攻撃の99%は無効化できる。なぜなら、攻撃者は「パスワードを入力するプロンプト」すら表示されず、接続を拒否されるからだ。

3. 動的防御:Fail2banによる「門前払い」の自動化

設定を固めても、無駄な通信がパケットフィルターや認証プロセスを叩き続けるのはリソースの無駄だ。そこで登場するのが Fail2ban である。

Fail2banは、認証失敗のログをリアルタイムで監視し、閾値を超えた IPアドレス を iptables や nftables で自動的にブロックする。

# /etc/fail2ban/jail.local の設定例
[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 3          # 3回失敗したらアウト
bantime  = 3600       # 1時間はブロックする

この仕組みは、いわば「怪しい奴を自動的に入り口でブラックリストに載せる門番」だ。実運用では、誤って自分自身をブロックしないよう ignoreip で社内ネットワークや開発者の固定IPをホワイトリストに入れておくのが定石だ。

4. 運用サイドが知っておくべき「SSH通信の裏側」

エンジニアとして、クライアント側から ssh を叩く際や、自動化ツールで接続する際の挙動も理解しておこう。

例えば、Pythonの paramiko ライブラリを使ってSSH接続を自動化する場合、コード内には絶対にパスワードをハードコードしてはいけない。常に SSHKey を使用すること。

import paramiko

# 鍵認証を用いた接続のサンプル
key = paramiko.RSAKey.from_private_key_file("/home/user/.ssh/id_rsa")
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 接続時に鍵を渡す
client.connect(hostname='your.server.ip', username='deploy', pkey=key)
print("セキュアな接続が確立されました")
client.close()

5. まとめ:セキュリティは「多層」で考える

SSHのポートを空けておくことは、インターネットという荒野に自分の部屋を置くようなものだ。今回の対策をまとめるとこうなる。

1. 認証の強靭化: PasswordAuthentication no にし、RSAやEd25519の鍵認証を強制する。
2. 攻撃の無力化: Fail2ban で機械的な試行を遮断する。
3. 境界の最小化: 必要であれば SSH のポート番号を変更する(セキュリティ・バイ・オブスキュリティだが、ログのノイズ軽減には有効だ)。

セキュリティに「絶対」はない。だが、これらの設定を行うだけで、君のサーバーは「簡単に食い荒らせるカモ」から、「手を出すにはコストが見合わない堅牢な要塞」へと変わる。

サーバーのログが平穏を取り戻したとき、君はまた一つ、エンジニアとしての確かな「盾」を手に入れたことになるはずだ。何かトラブルがあれば、いつでもログを確認し、パケットの流れを追うこと。それが、最強の防衛術なのだから。

コメント

タイトルとURLをコピーしました