Skip to Content

SSH セキュリティ

Warning

26.10: rc 状態の OpenSSH パッケージを一括パージしないでください。 置換パッケージはまだ古い構成を使用している可能性があり、パージすると SSH が壊れる可能性があります。 26.10 既知の問題 を確認し、リモート メンテナンスの前に回復アクセスを保持します。

SSH は、リモート Linux サーバー管理の中核ツールであり、攻撃者の最も一般的なターゲットの 1 つです。この記事では、Ubuntu 26.04 上で SSH のセキュリティを包括的に強化する方法について説明します。

キー認証

SSH キー ペアの生成

クライアント (ローカル コンピューター) でキー ペアを生成します。

# Generate an Ed25519 key (recommended, more secure and faster) ssh-keygen -t ed25519 -C "your_email@example.com" # If you need compatibility with older systems, use RSA 4096-bit ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # You will be prompted: # Enter file in which to save the key (/home/user/.ssh/id_ed25519): # Enter passphrase (empty for no passphrase): # It is strongly recommended to set a passphrase

公開キーをサーバーに展開する

# Method 1: Using ssh-copy-id (recommended) ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server # Method 2: Manual copy cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" # Method 3: Manual operation # On the server: mkdir -p ~/.ssh chmod 700 ~/.ssh nano ~/.ssh/authorized_keys # Paste the public key content chmod 600 ~/.ssh/authorized_keys

キーログインのテスト

# Log in using the key ssh -i ~/.ssh/id_ed25519 user@server # If configured as the default key, log in directly ssh user@server

SSH エージェントキー管理

# Start SSH Agent eval "$(ssh-agent -s)" # Add a key to the Agent (enter the passphrase once to cache it) ssh-add ~/.ssh/id_ed25519 # List loaded keys ssh-add -l # Remove all cached keys ssh-add -D
Warning

SSH 構成を変更する前に、キー認証が正常にテストされていることを確認し、現在の SSH セッションを開いたままにしてください。新しい端末から正常にログインできることを確認した後でのみ古い接続を閉じてください。閉じないと、設定ミスによりサーバーから永久にロックアウトされる可能性があります。

SSH サーバー構成の強化

SSH サーバー構成ファイルを編集します。

sudo nano /etc/ssh/sshd_config

パスワードログインを無効にする

キーログインが機能することを確認した後でのみ、パスワードログインを無効にします。

# Disable password authentication PasswordAuthentication no # Disable empty passwords PermitEmptyPasswords no # Disable keyboard-interactive authentication KbdInteractiveAuthentication no

rootログインの無効化

# Completely prohibit root from logging in via SSH PermitRootLogin no # Or only allow root to log in with keys (not recommended) # PermitRootLogin prohibit-password

デフォルトのポートの変更

# Use a non-standard port (reduces automated scanning) Port 2222

ポートを変更した後、ファイアウォール ルールを更新します。

sudo ufw allow 2222/tcp sudo ufw delete allow 22/tcp

ログインユーザーを制限する

# Only allow specific users to log in AllowUsers admin deployer # Only allow specific groups to log in AllowGroups sshusers # Deny specific users DenyUsers guest test

その他のセキュリティ設定

# Limit authentication attempts MaxAuthTries 3 # Limit concurrent unauthenticated connections MaxStartups 3:50:10 # Session timeout (disconnect after 300 seconds of inactivity) ClientAliveInterval 300 ClientAliveCountMax 2 # Disable X11 forwarding (servers usually don't need it) X11Forwarding no # Disable Agent forwarding (unless actually needed) AllowAgentForwarding no # Disable TCP forwarding (unless actually needed) AllowTcpForwarding no # Use strong encryption algorithms # Note: OpenSSH 10.2 (26.04) already prefers the post-quantum KEX mlkem768x25519-sha256 by default. # Avoid overriding KexAlgorithms — hardcoding a list freezes the algorithm set # and may end up dropping newly added post-quantum defaults in the future. Keep the secure defaults. # # Only override for troubleshooting or temporary interop with old clients, and always put the post-quantum algorithm first: # KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512@openssh.com,curve25519-sha256@libssh.org,curve25519-sha256 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com # Display a login banner Banner /etc/ssh/banner.txt # Login grace time LoginGraceTime 30

設定の適用

# Check configuration syntax sudo sshd -t # Restart SSH service (on Ubuntu the unit is ssh.service; sshd is just an alias) sudo systemctl restart ssh # Note: on 26.04 ssh listens via socket activation by default, # so after changing the port you must reload the socket unit: sudo systemctl daemon-reload sudo systemctl restart ssh.socket # Important: Test the connection in a new terminal window -- do not close the current one! ssh -p 2222 user@server

フェイル 2 バン保護

failed2ban はログ ファイルを監視し、ログイン試行が複数回失敗した IP アドレスを自動的に禁止します。

インストールと構成

# Install sudo apt install fail2ban # Start and enable at boot sudo systemctl enable --now fail2ban

ローカル構成の作成

/etc/fail2ban/jail.conf を直接編集しないでください。代わりにローカル構成を作成します。

sudo nano /etc/fail2ban/jail.local
[DEFAULT] # Ban duration (seconds) bantime = 3600 # Detection time window (seconds) findtime = 600 # Maximum failed attempts maxretry = 3 # Ban action banaction = ufw # Ignored IPs (whitelist) ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 # Email notifications # destemail = admin@example.com # sendername = Fail2Ban # mta = sendmail # action = %(action_mwl)s [sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600

フェイル2バンの管理

# View status sudo fail2ban-client status # View SSH jail status sudo fail2ban-client status sshd # View banned IPs sudo fail2ban-client status sshd | grep "Banned IP" # Manually ban an IP sudo fail2ban-client set sshd banip 203.0.113.50 # Manually unban an IP sudo fail2ban-client set sshd unbanip 203.0.113.50 # View fail2ban logs sudo tail -f /var/log/fail2ban.log # Reload configuration sudo fail2ban-client reload

高度なfail2ban構成

他のサービスを保護します。

# Nginx authentication protection [nginx-http-auth] enabled = true filter = nginx-http-auth port = http,https logpath = /var/log/nginx/error.log maxretry = 3 # Nginx malicious requests [nginx-botsearch] enabled = true filter = nginx-botsearch port = http,https logpath = /var/log/nginx/access.log maxretry = 2

SSH クライアント構成

接続を簡素化するために、クライアント上に SSH 構成ファイルを作成します。

nano ~/.ssh/config
# Global settings Host * ServerAliveInterval 60 ServerAliveCountMax 3 AddKeysToAgent yes # Production server Host prod HostName 203.0.113.10 User admin Port 2222 IdentityFile ~/.ssh/id_ed25519_prod # Jump host Host bastion HostName 203.0.113.20 User jump Port 2222 IdentityFile ~/.ssh/id_ed25519 # Connect to an internal server via jump host Host internal HostName 10.0.1.50 User admin ProxyJump bastion IdentityFile ~/.ssh/id_ed25519

構成後の接続の簡素化:

ssh prod ssh internal

二要素認証

Google Authenticator の 2 要素認証を SSH に追加します。

# Install sudo apt install libpam-google-authenticator # Each user runs the initialization google-authenticator # Follow the prompts to complete setup and scan the QR code # Configure PAM sudo nano /etc/pam.d/sshd # Add: # auth required pam_google_authenticator.so # Configure SSH sudo nano /etc/ssh/sshd_config # Set: # AuthenticationMethods publickey,keyboard-interactive # KbdInteractiveAuthentication yes sudo systemctl restart ssh

OpenSSH 量子後鍵交換

Ubuntu 26.04 には OpenSSH 10.2 が同梱されており、デフォルトの鍵交換では ポスト量子ハイブリッド スキーム mlkem768x25519-sha256 (ML-KEM-768 と X25519 の組み合わせ) が優先され、 「今収穫して後で復号化」攻撃。

# Confirm the KEX algorithms supported by your OpenSSH (should include mlkem768x25519-sha256) ssh -Q kex # Inspect the KEX algorithm actually negotiated for a connection ssh -v user@server 2>&1 | grep "kex:"
Note

ポスト量子 KEX は、双方がサポートしている場合にのみ使用されます。古いクライアント/サーバー (9.0 以下の OpenSSH) と相互運用する場合、手動構成は必要なく、自動的に従来の curve25519-sha256 アルゴリズムに戻ります。実際の互換性の問題がない限り、ポスト量子保護を誤って削除しないように、デフォルトの KexAlgorithms をオーバーライドしないでください。

監視と監査

# View successful login records last -n 20 # View failed login records lastb -n 20 # View SSH authentication logs journalctl -u ssh.service --since today | grep -E "Accepted|Failed" # Count failed login IPs journalctl -u ssh.service | grep "Failed" | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20 # View current SSH connections who w ss -tnp | grep :22

セキュリティチェックリスト

変更を適用する前に、次のことを確認してください。

  1. キー認証が構成され、テストされています
  2. バックアップ アクセス方法 (コンソール アクセス、別のユーザーなど) があること
  3. ファイアウォールは、対応するポート ルールで更新されました
  4. failed2ban ホワイトリストには、一般的に使用される IP が含まれます
  5. 古い端末を閉じる前に、新しい端末からの接続をテストしました
  6. SSH 構成構文は sshd -t で検証されました