SSH セキュリティ
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@serverSSH エージェントキー管理
# 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 -DSSH 構成を変更する前に、キー認証が正常にテストされていることを確認し、現在の SSH セッションを開いたままにしてください。新しい端末から正常にログインできることを確認した後でのみ古い接続を閉じてください。閉じないと、設定ミスによりサーバーから永久にロックアウトされる可能性があります。
SSH サーバー構成の強化
SSH サーバー構成ファイルを編集します。
sudo nano /etc/ssh/sshd_configパスワードログインを無効にする
キーログインが機能することを確認した後でのみ、パスワードログインを無効にします。
# Disable password authentication
PasswordAuthentication no
# Disable empty passwords
PermitEmptyPasswords no
# Disable keyboard-interactive authentication
KbdInteractiveAuthentication norootログインの無効化
# 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 = 2SSH クライアント構成
接続を簡素化するために、クライアント上に 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 sshOpenSSH 量子後鍵交換
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:"ポスト量子 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セキュリティチェックリスト
変更を適用する前に、次のことを確認してください。
- キー認証が構成され、テストされています
- バックアップ アクセス方法 (コンソール アクセス、別のユーザーなど) があること
- ファイアウォールは、対応するポート ルールで更新されました
- failed2ban ホワイトリストには、一般的に使用される IP が含まれます
- 古い端末を閉じる前に、新しい端末からの接続をテストしました
- SSH 構成構文は
sshd -tで検証されました