1.6. OpenSSH のセキュリティーの強化
OpenSSH を使用すると、システムを調整してセキュリティーを強化できます。
OpenSSH サーバー設定ファイル /etc/ssh/sshd_config
の変更を有効にするには、sshd
デーモンを再ロードする必要があることに注意してください。
# systemctl reload sshd
ほとんどのセキュリティー強化の設定変更により、最新のアルゴリズムまたは暗号スイートに対応していないクライアントとの互換性が低下します。
- 安全ではない接続プロトコルの無効化
- SSH を本当の意味で有効なものにするため、OpenSSH スイートに置き換えられる安全ではない接続プロトコルを使用しないようにします。このような接続プロトコルを使用すると、ユーザーのパスワード自体は SSH を使用した 1 回のセッションで保護されても、その後に Telnet を使用してログインした時に傍受されてしまうためです。
- パスワードベースの認証の無効化
- 認証用のパスワードを無効にし、鍵ペアのみを許可すると、攻撃対象領域が縮小されます。詳細は、OpenSSH サーバーで鍵ベースの認証を唯一の方法として設定する セクションを参照してください。
- より強力な鍵タイプ
ssh-keygen
コマンドはデフォルトで RSA キーのペアを生成しますが、-t
オプションを使用すると、Elliptic Curve Digital Signature Algorithm (ECDSA) 鍵または Edwards-Curve 25519 (Ed25519) 鍵を生成するように指定できます。ECDSA は、同等の対称鍵強度において RSA よりも優れたパフォーマンスを実現します。また、より短い鍵を生成します。Ed25519 公開鍵アルゴリズムは、RSA、DSA、ECDSA よりもセキュアで高速な Twisted Edwards 曲線の実装です。サーバーホストの鍵の RSA、ECDSA、および Ed25519 がない場合は、OpenSSH が自動的に作成します。RHEL でホストの鍵の作成を設定するには、インスタンス化したサービス
sshd-keygen@.service
を使用します。たとえば、RSA 鍵タイプの自動作成を無効にするには、次のコマンドを実行します。# systemctl mask sshd-keygen@rsa.service # rm -f /etc/ssh/ssh_host_rsa_key* # systemctl restart sshd
注記cloud-init
方式が有効になっているイメージでは、ssh-keygen
ユニットが自動的に無効になります。これは、ssh-keygen template
サービスがcloud-init
ツールに干渉し、ホストキーの生成で問題が発生する可能性があるためです。これらの問題を回避するには、cloud-init
が実行している場合に、etc/systemd/system/sshd-keygen@.service.d/disable-sshd-keygen-if-cloud-init-active.conf
ドロップイン設定ファイルによりssh-keygen
ユニットが無効になります。SSH 接続に特定の鍵タイプのみを許可するには、
/etc/ssh/sshd_config
の該当する行の先頭のコメントを削除し、sshd
サービスを再ロードします。たとえば、Ed25519 ホスト鍵のみを許可する場合、対応する行は次のようになります。# HostKey /etc/ssh/ssh_host_rsa_key # HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key
重要Ed25519 アルゴリズムは FIPS-140 に準拠しておらず、FIPS モードでは OpenSSH は Ed25519 鍵で機能しません。
- デフォルト以外のポート
デフォルトでは、
sshd
デーモンは TCP ポート 22 をリッスンします。ポートを変更すると、システムがデフォルトポートで自動ネットワークスキャンに基づく攻撃にさらされる可能性が減るため、匿名化によってセキュリティーが強化されます。ポートは、/etc/ssh/sshd_config
設定ファイルのPort
ディレクティブを使用して指定できます。また、デフォルト以外のポートを使用できるように、デフォルトの SELinux ポリシーも更新する必要があります。そのためには、
policycoreutils-python-utils
パッケージのsemanage
ツールを使用します。# semanage port -a -t ssh_port_t -p tcp <port-number>
さらに、
firewalld
設定を更新します。# firewall-cmd --add-port <port-number>/tcp # firewall-cmd --remove-port=22/tcp # firewall-cmd --runtime-to-permanent
前のコマンドの <port-number> は、
Port
ディレクティブを使用して指定した新しいポート番号に置き換えます。- Root ログイン
PermitRootLogin
はデフォルトでprohibit-password
に設定されています。これにより、root としてログインしてパスワードを使用する代わりに鍵ベースの認証が使用され、ブルートフォース攻撃を防ぐことでリスクが軽減します。警告root ユーザーとしてログインを有効にすることは、どのユーザーがどの特権コマンドを実行するかを監査できないため、安全ではありません。管理コマンドを使用するには、ログインして、代わりに
sudo
を使用します。- X セキュリティー拡張機能の使用
Red Hat Enterprise Linux クライアントの X サーバーは、X セキュリティー拡張を提供しません。そのため、クライアントは X11 転送を使用して信頼できない SSH サーバーに接続するときに別のセキュリティー層を要求できません。ほとんどのアプリケーションは、この拡張機能を有効にしても実行できません。
デフォルトでは、
/etc/ssh/ssh_config.d/50-redhat.conf
ファイルのForwardX11Trusted
オプションがyes
に設定され、ssh -X remote_machine
コマンド (信頼できないホスト) とssh -Y remote_machine
コマンド (信頼できるホスト) には違いがありません。シナリオで X11 転送機能を必要としない場合は、
/etc/ssh/sshd_config
設定ファイルのX11Forwarding
ディレクティブをno
に設定します。- 特定のユーザー、グループ、または IP 範囲への SSH アクセスの制限
/etc/ssh/sshd_config
設定ファイルのAllowUsers
ディレクティブおよびAllowGroups
ディレクティブを使用すると、特定のユーザー、ドメイン、またはグループのみが OpenSSH サーバーに接続することを許可できます。AllowUsers
およびAllowGroups
を組み合わせて、アクセスをより正確に制限できます。以下に例を示します。AllowUsers *@192.168.1.* *@10.0.0.* !*@192.168.1.2 AllowGroups example-group
この設定では、次の条件がすべて満たされる場合にのみ接続が許可されます。
- 接続の送信元 IP が、192.168.1.0/24 または 10.0.0.0/24 サブネット内にある。
- 送信元 IP が 192.168.1.2 ではない。
- ユーザーが example-group グループのメンバーである。
OpenSSH サーバーは、
/etc/ssh/sshd_config
内のすべての Allow および Deny ディレクティブを渡す接続のみを許可します。たとえば、AllowUsers
ディレクティブに、AllowGroups
ディレクティブにリストされているグループの一部ではないユーザーがリストされている場合、そのユーザーはログインできません。許可リストは、許可されていない新しいユーザーまたはグループもブロックするため、許可リスト (Allow で始まるディレクティブ) の使用は、拒否リスト (Deny で始まるオプション) を使用するよりも安全です。
- システム全体の暗号化ポリシーの変更
OpenSSH は、RHEL のシステム全体の暗号化ポリシーを使用し、デフォルトのシステム全体の暗号化ポリシーレベルは、現在の脅威モデルに安全な設定を提供します。暗号化の設定をより厳格にするには、現在のポリシーレベルを変更します。
# update-crypto-policies --set FUTURE Setting system policy to FUTURE
警告システムがレガシーシステムと通信する場合、
FUTURE
ポリシーの厳格な設定により相互運用性の問題が発生する可能性があります。
システム全体の暗号化ポリシーにより、SSH プロトコルの特定の暗号のみを無効にすることもできます。詳細は、「セキュリティーの強化」ドキュメントの サブポリシーを使用したシステム全体の暗号化ポリシーのカスタマイズ セクションを参照してください。
- システム全体の暗号化ポリシーのオプトアウト
OpenSSH サーバーのシステム全体の暗号化ポリシーをオプトアウトするには、
/etc/ssh/sshd_config.d/
ディレクトリーにあるドロップイン設定ファイルに暗号化ポリシーを指定します。このとき、辞書式順序で50-redhat.conf
ファイルよりも前に来るように、50 未満の 2 桁の数字接頭辞と、.conf
という接尾辞を付けます (例:49-crypto-policy-override.conf
)。詳細は、
sshd_config(5)
の man ページを参照してください。OpenSSH クライアントのシステム全体の暗号化ポリシーをオプトアウトするには、次のいずれかのタスクを実行します。
-
指定のユーザーの場合は、
~/.ssh/config
ファイルのユーザー固有の設定でグローバルのssh_config
を上書きします。 -
システム全体の場合は、
/etc/ssh/ssh_config.d/
ディレクトリーにあるドロップイン設定ファイルに暗号化ポリシーを指定します。このとき、辞書式順序で50-redhat.conf
ファイルよりも前に来るように、50 未満の 2 桁の接頭辞と、.conf
という接尾辞を付けます (例:49-crypto-policy-override.conf
)。
-
指定のユーザーの場合は、
関連情報
-
システム上の
sshd_config(5)
、ssh-keygen(1)
、crypto-policies(7)
、およびupdate-crypto-policies(8)
man ページ - 「セキュリティー強化」ドキュメントの システム全体の暗号化ポリシーの使用
- How to disable specific algorithms and ciphers for ssh service only (Red Hat ナレッジベース)