ネットワークのセキュリティー保護
セキュリティー保護されたネットワークおよびネットワーク通信の設定
概要
Red Hat ドキュメントへのフィードバック (英語のみ) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat は質の高いドキュメントを提供することに尽力しており、皆様からのフィードバックを大切にしています。改善にご協力いただくため、Red Hat Jira トラッキングシステムを通じてご提案やエラー報告をお寄せください。
手順
Jira の Web サイトにログインします。
アカウントがない場合、アカウント作成オプションを選択します。
- 上部のナビゲーションバーで Create をクリックします。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ダイアログの下部にある Create をクリックします。
第1章 2 台のシステム間で OpenSSH を使用した安全な通信の使用 リンクのコピーリンクがクリップボードにコピーされました!
SSH (Secure Shell) は、クライアント/サーバーアーキテクチャーを使用する 2 つのシステム間で安全な通信を提供し、ユーザーがリモートでサーバーホストシステムにログインできるようにするプロトコルです。FTP や Telnet などの他のリモート通信プロトコルとは異なり、SSH はログインセッションを暗号化します。これにより、侵入者が接続から暗号化されていないパスワードを収集するのを防ぎます。
1.1. SSH と OpenSSH リンクのコピーリンクがクリップボードにコピーされました!
SSH (Secure Shell) は、リモートマシンにログインしてそのマシンでコマンドを実行するプログラムです。SSH プロトコルは、安全でないネットワーク上で、信頼されていないホスト間で安全な通信を提供します。また、X11 接続と任意の TCP/IP ポートを安全なチャンネルで転送することもできます。
SSH プロトコルは、リモートシェルのログインやファイルコピー用に使用する場合に、システム間の通信の傍受や特定ホストの偽装など、セキュリティーの脅威を軽減します。これは、SSH クライアントとサーバーがデジタル署名を使用してそれぞれの ID を確認するためです。さらに、クライアントシステムとサーバーシステムとの間の通信はすべて暗号化されます。
ホストキーは、SSH プロトコルのホストを認証します。ホストキーは、OpenSSH が初めて起動したたとき、またはホストが初めて起動したときに自動的に生成される暗号鍵です。
OpenSSH は、Linux、UNIX、および同様のオペレーティングシステムでサポートされている SSH プロトコルの実装です。OpenSSH クライアントとサーバー両方に必要なコアファイルが含まれます。OpenSSH スイートは、以下のユーザー空間ツールで構成されます。
-
SSHは、リモートログインプログラム (SSH クライアント) です。 -
sshdは、OpenSSH SSH デーモンです。 -
scpは、安全なリモートファイルコピープログラムです。 -
sftpは、安全なファイル転送プログラムです。 -
ssh-agentは、秘密鍵をキャッシュする認証エージェントです。 -
ssh-addは、秘密鍵の ID をssh-agentに追加します。 -
ssh-keygenが、sshの認証キーを生成、管理、および変換します。 -
ssh-copy-idは、ローカルの公開鍵をリモート SSH サーバーのauthorized_keysファイルに追加するスクリプトです。 -
ssh-keyscan- SSH パブリックホストキーを収集します。
RHEL 9 では、Secure copy protocol (SCP) がデフォルトで SSH File Transfer Protocol (SFTP) に置き換えられています。これは、CVE-2020-15778 など、SCP が原因のセキュリティーの問題が発生しているためです。
SFTP が使用できないか互換性がない場合は、-O オプションを指定した scp コマンドを使用すると、元の SCP/RCP プロトコルの使用を強制できます。
詳細は、記事 OpenSSH SCP protocol deprecation in Red Hat Enterprise Linux 9 を参照してください。
RHEL の OpenSSH スイートは、SSH バージョン 2 のみをサポートします。このスイートは、旧バージョン (バージョン 1) の既知のエクスプロイトに対して脆弱ではない拡張キー交換アルゴリズムを備えています。
Red Hat Enterprise Linux には、OpenSSH パッケージが (一般的な openssh パッケージ、openssh-server パッケージ、openssh-clients パッケージ) が含まれています。OpenSSH パッケージには、OpenSSL パッケージ (openssl-libs) が必要です。このパッケージは、重要な暗号化ライブラリーをいくつかインストールして、暗号化通信を提供する OpenSSH を有効にします。
RHEL コア暗号化サブシステムの 1 つである OpenSSH は、システム全体の暗号化ポリシーを使用します。これにより、弱い暗号スイートおよび暗号化アルゴリズムがデフォルト設定で無効になります。ポリシーを変更するには、管理者が update-crypto-policies コマンドを使用して設定を調節するか、システム全体の暗号化ポリシーを手動でオプトアウトする必要があります。詳細は、システム全体の暗号化ポリシーに従わないようにアプリケーションを除外 セクションを参照してください。
OpenSSH スイートは、2 セットの設定ファイルを使用します。1 つはクライアントプログラム (つまり、ssh、scp、および sftp) 用で、もう 1 つはサーバー (sshd デーモン) 用です。
システム全体の SSH 設定情報が /etc/ssh/ ディレクトリーに保存されます。/etc/ssh/ssh_config ファイルには、クライアント設定が含まれています。/etc/ssh/sshd_config ファイルは、デフォルトの OpenSSH サーバー設定ファイルです。
ユーザー固有の SSH 設定情報は、ユーザーのホームディレクトリーの ~/.ssh/ に保存されます。OpenSSH 設定ファイルの詳細なリストは、システム上の sshd(8) の man ページの FILES セクションを参照してください。
1.2. SSH 鍵ペアの生成 リンクのコピーリンクがクリップボードにコピーされました!
ローカルシステムで SSH 鍵ペアを生成し、生成された公開鍵を OpenSSH サーバーにコピーすることで、パスワードを入力せずに OpenSSH サーバーにログインできます。鍵を作成する各ユーザーは、この手順を実行する必要があります。
システムを再インストールした後も以前に生成した鍵ペアを保持するには、新しい鍵を作成する前に ~/.ssh/ ディレクトリーをバックアップします。再インストール後に、このディレクトリーをホームディレクトリーにコピーします。これは、(root を含む) システムの全ユーザーで実行できます。
前提条件
- OpenSSH サーバーに鍵を使用して接続するユーザーとしてログインしている。
- OpenSSH サーバーが鍵ベースの認証を許可するように設定されている。
手順
ECDSA 鍵ペアを生成します。
$ ssh-keygen -t ecdsa Generating public/private ecdsa key pair. Enter file in which to save the key (/home/<username>/.ssh/id_ecdsa): Enter passphrase (empty for no passphrase): <password> Enter same passphrase again: <password> Your identification has been saved in /home/<username>/.ssh/id_ecdsa. Your public key has been saved in /home/<username>/.ssh/id_ecdsa.pub. The key fingerprint is: SHA256:Q/x+qms4j7PCQ0qFd09iZEFHA+SqwBKRNaU72oZfaCI <username>@<localhost.example.com> The key's randomart image is: +---[ECDSA 256]---+ |.oo..o=++ | |.. o .oo . | |. .. o. o | |....o.+... | |o.oo.o +S . | |.=.+. .o | |E.*+. . . . | |.=..+ +.. o | | . oo*+o. | +----[SHA256]-----+パラメーターなしで
ssh-keygenコマンドを使用して RSA 鍵ペアを生成することも、ssh-keygen -t ed25519コマンドを入力して Ed25519 鍵ペアを生成することもできます。Ed25519 アルゴリズムは FIPS-140 に準拠しておらず、FIPS モードでは OpenSSH は Ed25519 鍵で機能しないことに注意してください。公開鍵をリモートマシンにコピーします。
$ ssh-copy-id <username>@<ssh-server-example.com> /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed <username>@<ssh-server-example.com>'s password: … Number of key(s) added: 1 Now try logging into the machine, with: "ssh '<username>@<ssh-server-example.com>'" and check to make sure that only the key(s) you wanted were added.<username>@<ssh-server-example.com>は、認証情報に置き換えます。セッションで
ssh-agentプログラムを使用しない場合は、上記のコマンドで、最後に変更した~/.ssh/id*.pub公開鍵をコピーします (インストールされていない場合)。別の公開キーファイルを指定したり、ssh-agentにより、メモリーにキャッシュされた鍵よりもファイル内の鍵の方が優先順位を高くするには、-iオプションを指定してssh-copy-idコマンドを使用します。
検証
鍵ファイルを使用して OpenSSH サーバーにログインします。
$ ssh -o PreferredAuthentications=publickey <username>@<ssh-server-example.com>
1.3. OpenSSH サーバーで鍵ベースの認証を唯一の方法として設定する リンクのコピーリンクがクリップボードにコピーされました!
システムのセキュリティーを強化するには、OpenSSH サーバーでパスワード認証を無効にして鍵ベースの認証を有効にします。
前提条件
-
openssh-serverパッケージがインストールされている。 -
サーバーで
sshdデーモンが実行している。 鍵を使用して OpenSSH サーバーに接続できる。
詳細は、SSH 鍵ペアの生成 セクションを参照してください。
手順
テキストエディターで
/etc/ssh/sshd_config設定を開きます。以下に例を示します。# vi /etc/ssh/sshd_configPasswordAuthenticationオプションをnoに変更します。PasswordAuthentication no-
新しいデフォルトインストール以外のシステムでは、
PubkeyAuthenticationパラメーターが設定されていないか、yesに設定されていることを確認します。 KbdInteractiveAuthenticationディレクティブをnoに設定します。設定ファイル内では対応するエントリーがコメントアウトされていること、およびデフォルト値が
yesであることに注意してください。NFS がマウントされたホームディレクトリーで鍵ベースの認証を使用するには、SELinux ブール値
use_nfs_home_dirsを有効にします。# setsebool -P use_nfs_home_dirs 1- リモートで接続している場合は、コンソールもしくは帯域外アクセスを使用せず、パスワード認証を無効にする前に、鍵ベースのログインプロセスをテストします。
sshdデーモンを再読み込みし、変更を適用します。# systemctl reload sshd
1.4. ssh-agent を使用した SSH 認証情報のキャッシュ リンクのコピーリンクがクリップボードにコピーされました!
SSH 接続を開始するたびにパスフレーズを入力しなくても済むように、ssh-agent ユーティリティーを使用して、ログインセッションの SSH 秘密鍵をキャッシュできます。エージェントが実行中で、鍵のロックが解除されている場合、鍵のパスワードを再入力することなく、この鍵を使用して SSH サーバーにログインできます。秘密鍵とパスフレーズのセキュリティーが確保されます。
前提条件
- SSH デーモンが実行されており、ネットワーク経由でアクセスできるリモートホストがある。
- リモートホストにログインするための IP アドレスまたはホスト名および認証情報を把握している。
パスフレーズで SSH キーペアを生成し、公開鍵をリモートマシンに転送している。
詳細は、SSH 鍵ペアの生成 セクションを参照してください。
手順
セッションで
ssh-agentを自動的に起動するためのコマンドを~/.bashrcファイルに追加します。任意のテキストエディターで
~/.bashrcを開きます。次に例を示します。$ vi ~/.bashrc以下の行をファイルに追加します。
eval $(ssh-agent)- 変更を保存し、エディターを終了します。
~/.ssh/configファイルに次の行を追加します。AddKeysToAgent yesセッションでこのオプションを使用して
ssh-agentが起動されると、エージェントはホストに初めて接続するときにのみパスワードを要求します。
検証
エージェントにキャッシュされた秘密鍵に対応する公開鍵を使用するホストにログインします。次に例を示します。
$ ssh <example.user>@<ssh-server@example.com>パスフレーズを入力する必要がないことに注意してください。
1.5. スマートカードに保存した SSH 鍵による認証 リンクのコピーリンクがクリップボードにコピーされました!
スマートカードに ECDSA 鍵と RSA 鍵を作成して保存し、そのスマートカードを使用して OpenSSH クライアントで認証することができます。スマートカード認証は、デフォルトのパスワード認証に代わるものです。
前提条件
-
クライアントで、
openscパッケージをインストールして、pcscdサービスを実行している。
手順
PKCS #11 の URI を含む OpenSC PKCS #11 モジュールが提供する鍵のリストを表示し、その出力を
keys.pubファイルに保存します。$ ssh-keygen -D pkcs11: > keys.pub公開鍵をリモートサーバーに転送します。
ssh-copy-idコマンドを使用し、前の手順で作成したkeys.pubファイルを指定します。$ ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>ECDSA 鍵を使用して <ssh-server-example.com> に接続します。鍵を一意に参照する URI のサブセットのみを使用することもできます。次に例を示します。
$ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $OpenSSH は
p11-kit-proxyラッパーを使用し、OpenSC PKCS #11 モジュールがp11-kitツールに登録されているため、前のコマンドを簡略化できます。$ ssh -i "pkcs11:id=%01" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $PKCS #11 の URI の
id=の部分を飛ばすと、OpenSSH が、プロキシーモジュールで利用可能な鍵をすべて読み込みます。これにより、必要な入力の量を減らすことができます。$ ssh -i pkcs11: <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $オプション:
~/.ssh/configファイルで同じ URI 文字列を使用して、設定を永続的にすることができます。$ cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $sshクライアントユーティリティーが、この URI とスマートカードの鍵を自動的に使用するようになります。
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)。
-
指定のユーザーの場合は、
1.7. SSH ジャンプホストを介したリモートサーバーへの接続 リンクのコピーリンクがクリップボードにコピーされました!
ローカルシステムから中間サーバー (ジャンプホストとも呼ばれます) を介してリモートサーバーに接続できます。ジャンプサーバーは、さまざまなセキュリティーゾーンのホストをブリッジし、複数のクライアントサーバー接続を管理できます。
前提条件
- ジャンプホストでローカルシステムからの SSH 接続に対応している。
- リモートサーバーがジャンプホストからの SSH 接続を受け入れる。
手順
ジャンプサーバーまたは複数の中間サーバーを経由して一度に接続する場合は、
ssh -Jコマンドを使用してジャンプサーバーを直接指定します。次に例を示します。$ ssh -J <jump-1.example.com>,<jump-2.example.com>,<jump-3.example.com> <target-server-1.example.com>ジャンプサーバーのユーザー名または SSH ポートが、リモートサーバーの名前およびポートと異なる場合は、上記のコマンドのホスト名のみの表記を変更します。以下に例を示します。
$ ssh -J <example.user.1>@<jump-1.example.com>:<75>,<example.user.2>@<jump-2.example.com>:<75>,<example.user.3>@<jump-3.example.com>:<75> <example.user.f>@<target-server-1.example.com>:<220>ジャンプサーバーを介してリモートサーバーに定期的に接続する場合は、ジャンプサーバーの設定を SSH 設定ファイルに保存します。
ローカルシステムの
~/.ssh/configファイルを編集してジャンプホストを定義します。以下に例を示します。Host <jump-server-1> HostName <jump-1.example.com>-
Hostパラメーターは、sshコマンドで使用できるホストの名前またはエイリアスを定義します。値は実際のホスト名と一致可能ですが、任意の文字列にすることもできます。 -
HostNameパラメーターは、ジャンプホストの実際のホスト名または IP アドレスを設定します。
-
ProxyJumpディレクティブを使用してリモートサーバーのジャンプ設定を、ローカルシステムの~/.ssh/configファイルに追加します。以下に例を示します。Host <remote-server-1> HostName <target-server-1.example.com> ProxyJump <jump-server-1>ローカルシステムを使用して、ジャンプサーバー経由でリモートサーバーに接続します。
$ ssh <remote-server-1>このコマンドは、前の設定ステップを省略したときの
ssh -J jump-server1 remote-serverコマンドと同じです。
1.8. ssh システムロールを使用したセキュアな通信の設定 リンクのコピーリンクがクリップボードにコピーされました!
管理者は、Ansible Core パッケージを使用すると、sshd システムロールを使用して SSH サーバーを設定できます。また、ssh システムロールを使用して任意の数の RHEL システムで SSH クライアントを一貫して同時に設定できます。
1.8.1. sshd RHEL システムロールによって Playbook の設定を設定ファイルにマッピングする方法 リンクのコピーリンクがクリップボードにコピーされました!
sshd RHEL システムロール Playbook では、サーバー SSH 設定ファイルのパラメーターを定義できます。これらの設定を指定しない場合、RHEL のデフォルトに一致する sshd_config ファイルがロールによって生成されます。
いずれの場合も、ブール値は、管理対象ノードの最終設定で、yes および no として適切にレンダリングされます。リストを使用して複数行の設定項目を定義できます。以下に例を示します。
sshd_ListenAddress:
- 0.0.0.0
- '::'
レンダリングは以下のようになります。
ListenAddress 0.0.0.0
ListenAddress ::
1.8.2. sshd RHEL システムロールを使用した OpenSSH サーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
sshd RHEL システムロールを使用すると、セキュアなリモートアクセスを実現するために、複数の OpenSSH サーバーを設定できます。
このロールは、具体的には次のような機能を提供することで、リモートユーザーにとってセキュアな通信環境を確保します。
- リモートクライアントからの SSH 接続の管理
- 認証情報の検証
- セキュアなデータ転送とコマンド実行
sshd RHEL システムロールは、SSHD 設定を変更する他の RHEL システムロール (たとえば、Red Hat Enterprise Linux RHEL システムロールの Identity Management など) と併用できます。設定が上書きされないように、sshd RHEL システムロールが名前空間 (RHEL 8 以前のバージョン) またはドロップインディレクトリー (RHEL 9) を使用することを確認してください。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: SSH server configuration hosts: managed-node-01.example.com tasks: - name: Configure sshd to prevent root and password login except from particular subnet ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config: PermitRootLogin: no PasswordAuthentication: no Match: - Condition: "Address 192.0.2.0/24" PermitRootLogin: yes PasswordAuthentication: yesサンプル Playbook で指定されている設定は次のとおりです。
PasswordAuthentication: yes|no-
ユーザー名とパスワードの組み合わせを使用するクライアントからの認証を OpenSSH サーバー (
sshd) が受け入れるかどうかを制御します。 Match:-
この Match ブロックは、サブネット
192.0.2.0/24からの接続に限り、rootユーザーがパスワードを使用してログインすることを許可します。
Playbook で使用されるロール変数と OpenSSH 設定オプションの詳細は、
/usr/share/ansible/roles/rhel-system-roles.sshd/README.mdファイルと、コントロールノードのsshd_config(5)man ページを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
SSH サーバーにログインします。
$ ssh <username>@<ssh_server>SSH サーバー上の
sshd_configファイルの内容を確認します。$ cat /etc/ssh/sshd_config.d/00-ansible_system_role.conf # # Ansible managed # PasswordAuthentication no PermitRootLogin no Match Address 192.0.2.0/24 PasswordAuthentication yes PermitRootLogin yes192.0.2.0/24サブネットから root としてサーバーに接続できることを確認します。IP アドレスを確認します。
$ hostname -I 192.0.2.1IP アドレスが
192.0.2.1-192.0.2.254範囲にある場合は、サーバーに接続できます。rootでサーバーに接続します。$ ssh root@<ssh_server>
1.8.3. ssh RHEL システムロールによって Playbook の設定を設定ファイルにマッピングする方法 リンクのコピーリンクがクリップボードにコピーされました!
ssh RHEL システムロール Playbook では、クライアント SSH 設定ファイルのパラメーターを定義できます。これらの設定を指定しない場合、RHEL のデフォルトに一致するグローバルの ssh_config ファイルがロールによって生成されます。
いずれの場合も、ブール値は、管理対象ノードの最終設定で、yes または no として適切にレンダリングされます。リストを使用して複数行の設定項目を定義できます。以下に例を示します。
LocalForward:
- 22 localhost:2222
- 403 localhost:4003
レンダリングは以下のようになります。
LocalForward 22 localhost:2222
LocalForward 403 localhost:4003
設定オプションでは、大文字と小文字が区別されます。
1.8.4. ssh RHEL システムロールを使用した OpenSSH クライアントの設定 リンクのコピーリンクがクリップボードにコピーされました!
ssh RHEL システムロールを使用して、複数の OpenSSH クライアントを設定できます。
OpenSSH クライアントは、以下を提供することで、ローカルユーザーがリモート OpenSSH サーバーとのセキュアな接続を確立することを可能にします。
- セキュアな接続の開始
- 認証情報のプロビジョニング
- セキュアな通信チャネルに使用される暗号化方式に関する OpenSSH サーバーとのネゴシエーション
- OpenSSH サーバーとの間でセキュアにファイルを送受信する機能
ssh RHEL システムロールは、SSH 設定を変更する他のシステムロール (たとえば、Red Hat Enterprise Linux RHEL システムロールの Identity Management など) と併用できます。設定が上書きされないように、ssh RHEL システムロールがドロップインディレクトリーを使用すること (RHEL 8 以降ではデフォルト) を確認してください。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: SSH client configuration hosts: managed-node-01.example.com tasks: - name: Configure ssh clients ansible.builtin.include_role: name: redhat.rhel_system_roles.ssh vars: ssh_user: root ssh: Compression: true GSSAPIAuthentication: no ControlMaster: auto ControlPath: ~/.ssh/.cm%C Host: - Condition: example Hostname: server.example.com User: user1 ssh_ForwardX11: noサンプル Playbook で指定されている設定は次のとおりです。
ssh_user: root-
特定の設定の詳細を使用して、管理対象ノード上の
rootユーザーの SSH クライアント設定を指定します。 Compression: true- 圧縮が有効になります。
ControlMaster: auto-
ControlMaster の多重化が
autoに設定されます。 Host-
user1というユーザーとしてserver.example.comホストに接続するためのエイリアスexampleを作成します。 ssh_ForwardX11: no- X11 転送が無効になります。
Playbook で使用されるロール変数と OpenSSH 設定オプションの詳細は、
/usr/share/ansible/roles/rhel-system-roles.ssh/README.mdファイルと、コントロールノードのssh_config(5)man ページを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
SSH 設定ファイルを表示して、管理対象ノードの設定が正しいことを確認します。
# cat ~/root/.ssh/config # Ansible managed Compression yes ControlMaster auto ControlPath ~/.ssh/.cm%C ForwardX11 no GSSAPIAuthentication no Host example Hostname example.com User user1
1.8.5. 非排他的設定に sshd RHEL システムロールを使用する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、sshd RHEL システムロールを適用すると、設定全体が上書きされます。以前に別の Playbook で設定を調整したことがある場合は、問題が発生する可能性があります。非排他的設定を使用すると、選択した設定オプションにのみ変更を適用できます。
非排他的設定は、以下を使用して適用できます。
- RHEL 8 以前では、設定スニペットを使用します。
-
RHEL 9 以降では、ドロップインディレクトリー内のファイルを使用します。デフォルトの設定ファイルは、
/etc/ssh/sshd_config.d/00-ansible_system_role.confとしてドロップインディレクトリーにすでに配置されています。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。RHEL 8 以前を実行する管理対象ノードの場合:
--- - name: Non-exclusive sshd configuration hosts: managed-node-01.example.com tasks: - name: Configure SSHD to accept environment variables ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config_namespace: <my-application> sshd_config: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITORRHEL 9 以降を実行する管理対象ノードの場合:
- name: Non-exclusive sshd configuration hosts: managed-node-01.example.com tasks: - name: Configure sshd to accept environment variables ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config_file: /etc/ssh/sshd_config.d/<42-my-application>.conf sshd_config: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITORサンプル Playbook で指定されている設定は次のとおりです。
sshd_config_namespace: <my-application>- このロールは、Playbook で指定した設定を、特定の名前空間配下にある既存の設定ファイルの設定スニペットに配置します。異なるコンテキストからこのロールを実行する場合は、別の名前空間を選択する必要があります。
sshd_config_file: /etc/ssh/sshd_config.d/<42-my-application>.conf-
sshd_config_file変数では、sshdシステムロールによる設定オプションの書き込み先の.confファイルを定義します。設定ファイルが適用される順序を指定するには、2 桁の接頭辞 (例:42-) を使用します。 AcceptEnv:OpenSSH サーバー (
sshd) がクライアントから受け入れる環境変数を制御します。-
LANG: 言語とロケールの設定を定義します。 -
LS_COLORS: ターミナルのlsコマンドの表示カラースキームを定義します。 -
EDITOR: エディターを開く必要があるコマンドラインプログラムのデフォルトのテキストエディターを指定します。
-
Playbook で使用されるロール変数と OpenSSH 設定オプションの詳細は、
/usr/share/ansible/roles/rhel-system-roles.sshd/README.mdファイルと、コントロールノードのsshd_config(5)man ページを参照してください。
Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
SSH サーバーの設定を確認します。
RHEL 8 以前を実行する管理対象ノードの場合:
# cat /etc/ssh/sshd_config ... # BEGIN sshd system role managed block: namespace <my-application> Match all AcceptEnv LANG LS_COLORS EDITOR # END sshd system role managed block: namespace <my-application>RHEL 9 以降を実行する管理対象ノードの場合:
# cat /etc/ssh/sshd_config.d/42-my-application.conf # Ansible managed # AcceptEnv LANG LS_COLORS EDITOR
第2章 TLS キーと証明書の作成と管理 リンクのコピーリンクがクリップボードにコピーされました!
TLS (Transport Layer Security) プロトコルを使用して、2 つのシステム間で送信される通信を暗号化できます。この標準は、秘密鍵と公開鍵、デジタル署名、および証明書を用いた非対称暗号化を使用します。
2.1. TLS 証明書 リンクのコピーリンクがクリップボードにコピーされました!
TLS (Transport Layer Security) は、クライアントサーバーアプリケーションが情報を安全に受け渡すことを可能にするプロトコルです。TLS は、公開鍵と秘密鍵のペアのシステムを使用して、クライアントとサーバー間で送信される通信を暗号化します。TLS は、SSL (Secure Sockets Layer) の後継プロトコルです。
TLS は、X.509 証明書を使用して、ホスト名や組織などの ID を、デジタル署名を使用する公開鍵にバインドします。X.509 は、公開鍵証明書の形式を定義する標準です。
セキュアなアプリケーションの認証は、アプリケーションの証明書の公開鍵値の整合性によって異なります。攻撃者が公開鍵を独自の公開鍵に置き換えると、真のアプリケーションになりすまして安全なデータにアクセスできるようになります。この種の攻撃を防ぐには、すべての証明書が証明局 (CA) によって署名されている必要があります。CA は、証明書の公開鍵値の整合性を確認する信頼できるノードです。
CA はデジタル署名を追加して公開鍵に署名し、証明書を発行します。デジタル署名は、CA の秘密鍵でエンコードされたメッセージです。CA の公開鍵は、CA の証明書を配布することによって、アプリケーションで使用できるようになります。アプリケーションは、CA の公開鍵を使用して CA のデジタル署名をデコードして、証明書が有効で署名されていることを確認します。
CA によって署名された証明書を取得するには、公開鍵を生成し、署名のために CA に送信する必要があります。これは、証明書署名要求 (CSR) と呼ばれます。CSR には、証明書の識別名 (DN) も含まれています。どちらのタイプの証明書にも提供できる DN 情報には、国を表す 2 文字の国コード、州または県の完全な名前、市または町、組織の名前、メールアドレスを含めることも、空にすることもできます。現在の商用 CA の多くは、Subject Alternative Name 拡張を好み、CSR の DN を無視します。
RHEL は、TLS 証明書を操作するための 2 つの主要なツールキット (GnuTLS と OpenSSL) を提供します。openssl パッケージの openssl ユーティリティーを使用して、証明書を作成、読み取り、署名、および検証できます。gnutls-utils パッケージで提供される certtool ユーティリティーは、異なる構文を使用して同じ操作を行うことができ、特にバックエンドの異なるライブラリーセットを使用できます。
2.2. OpenSSL の耐量子計算機暗号アルゴリズム リンクのコピーリンクがクリップボードにコピーされました!
OpenSSL 3.5 を搭載した RHEL 9.7 以降では、OpenSSL TLS ツールキットを使用して、鍵の生成、メッセージの署名、署名の検証、および ML-DSA ポスト量子アルゴリズムを使用した X.509 証明書の作成を行うことができます。
OpenSSL 3.5 以降からは、TLS 1.3 ハンドシェイクで、ハイブリッド型の ML-KEM (Module-Lattice-Based Key-Encapsulation Mechanism) 方式が優先的に使用されます。OpenSSL には、従来のアルゴリズムと ML-KEM の両方を使用した鍵を組み込んでいます。ML-KEM を使用すると、TLS 接続の開始にわずかな遅延が生じます。しかし、この遅延はハンドシェイク後のパフォーマンスには影響しません。その後の通信ではより効率的な対称鍵が使用されるためです。
RHEL 9 で PQC アルゴリズムを使用するには、たとえば update-crypto-policies --set DEFAULT:PQ コマンドを使用して、現在のシステム全体の暗号化ポリシーに PQ サブポリシーを適用する必要があります。
例2.1 OpenSSL の鍵に対する ML-DSA の使用
$ openssl genpkey -algorithm mldsa65 -out <mldsa-privatekey.pem>- ML-DSA-65 アルゴリズムを使用して秘密鍵を作成します。
$ openssl pkey -in <mldsa-privatekey.pem> -pubout -out <mldsa-publickey.pem>- ML-DSA-65 で暗号化された秘密鍵に基づいて公開鍵を作成します。
$ openssl dgst -sign <mldsa-privatekey.pem> -out <signature_message>- 秘密鍵を使用してメッセージに署名します。
$ openssl dgst -verify <mldsa-publickey.pem> -signature <signature_message>- 公開鍵を使用して ML-DSA-65 署名を検証します。
例2.2 OpenSSL の証明書に対する ML-DSA の使用
現在、耐量子計算機署名をサポートする公開認証局 (CA) はないため、使用できるのはローカル CA または ML-DSA 署名を使用した自己署名証明書のみです。以下に例を示します。
$ openssl req \
-x509 \
-newkey mldsa65 \
-keyout <localhost-mldsa.key> \
-subj /CN=<localhost> \
-addext subjectAltName=DNS:<localhost> \
-days <30> \
-nodes \
-out <localhost-mldsa.crt>
例2.3 PQC 鍵交換と PQC 証明書による接続の確立
OpenSSL サーバーとクライアントは、量子攻撃に耐える接続と、従来のアルゴリズムのみを使用する接続を確立できます。
$ openssl s_server \
-cert <localhost-mldsa.crt> -key <localhost-mldsa.key> \
-dcert <localhost-rsa.crt> -dkey <localhost-rsa.key> >/dev/null &
$ openssl s_client \
-connect <localhost:4433> \
-CAfile <localhost-mldsa.crt> </dev/null \
|& grep -E '(Peer signature type|Negotiated TLS1.3 group)'
Peer signature type: mldsa65
Negotiated TLS1.3 group: X25519MLKEM768
例2.4 耐量子計算機暗号アルゴリズムではないアルゴリズムのみを使用する接続の確立
$ openssl s_client \
-connect <localhost:4433> \
-CAfile <localhost-rsa.crt> \
-sigalgs 'rsa_pss_pss_sha256:rsa_pss_rsae_sha256' \
-groups 'X25519:secp256r1:X448:secp521r1:secp384r1' </dev/null \
|& grep -E '(Peer signature type|Server Temp Key)'
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
従来の証明書 (RSA、ECDSA、EdDSA) と耐量子計算機証明書を同時に使用するようにサーバーを設定することもできます。サーバーは、クライアントが優先およびサポートする証明書 (新しいクライアントの場合は耐量子計算機証明書、従来のクライアントの場合は従来の証明書) を自動的かつ透過的に選択します。
詳細は、システム上の openssl(1)、openssl-genpkey(1)、openssl-pkey(1)、openssl-dgst(1)、および openssl-verify(1) man ページを参照してください。
2.3. OpenSSL を使用したプライベート CA の作成 リンクのコピーリンクがクリップボードにコピーされました!
プライベート証明機関 (CA) は、シナリオで内部ネットワーク内のエンティティーを検証する必要がある場合に役立ちます。たとえば、管理下にある CA によって署名された証明書に基づく認証を使用して VPN ゲートウェイを作成する場合、または商用 CA への支払いを希望しない場合は、プライベート CA を使用します。このようなユースケースで証明書に署名するために、プライベート CA は自己署名証明書を使用します。
前提条件
-
sudoを使用して管理コマンドを入力するための root権限または権限がある。そのような特権を必要とするコマンドは、#でマークされています。
手順
CA の秘密鍵を生成します。たとえば、次のコマンドは、256 ビットの楕円曲線デジタル署名アルゴリズム (ECDSA) キーを作成します。
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <ca.key>キー生成プロセスの時間は、ホストのハードウェアとエントロピー、選択したアルゴリズム、およびキーの長さによって異なります。
前のコマンドで生成された秘密鍵を使用して署名された証明書を作成します。
$ openssl req -key <ca.key> -new -x509 -days 3650 -addext keyUsage=critical,keyCertSign,cRLSign -subj "/CN=<Example_CA>" -out <ca.crt>生成された
ca.crtファイルは、10 年間、他の証明書の署名に使用できる自己署名 CA 証明書です。プライベート CA の場合、<example_CA> をコモンネーム (CN) として任意の文字列に置き換えることができます。CA の秘密鍵に安全なアクセス許可を設定します。次に例を示します。
# chown <root>:<root> <ca.key> # chmod 600 <ca.key>
次のステップ
自己署名 CA 証明書をクライアントシステムのトラストアンカーとして使用するには、CA 証明書をクライアントにコピーし、クライアントのシステム全体のトラストストアに
rootとして追加します。# trust anchor <ca.crt>詳細は、3章共有システム証明書の使用 を参照してください。
検証
証明書署名要求 (CSR) を作成し、CA を使用して要求に署名します。CA は、CSR に基づいて証明書を正常に作成する必要があります。次に例を示します。
$ openssl x509 -req -in <client-cert.csr> -CA <ca.crt> -CAkey <ca.key> -CAcreateserial -days 365 -extfile <openssl.cnf> -extensions <client-cert> -out <client-cert.crt> Signature ok subject=C = US, O = Example Organization, CN = server.example.com Getting CA Private Key詳細は、「OpenSSL でプライベート CA を使用して CSR の証明書を発行する」 を参照してください。
自己署名 CA に関する基本情報を表示します。
$ openssl x509 -in <ca.crt> -text -noout Certificate: … X509v3 extensions: … X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: critical Certificate Sign, CRL Sign …秘密鍵の一貫性を確認します。
$ openssl pkey -check -in <ca.key> Key is valid -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgcagSaTEBn74xZAwO 18wRpXoCVC9vcPki7WlT+gnmCI+hRANCAARb9NxIvkaVjFhOoZbGp/HtIQxbM78E lwbDP0BI624xBJ8gK68ogSaq2x4SdezFdV1gNeKScDcU+Pj2pELldmdF -----END PRIVATE KEY-----
2.4. OpenSSL を使用した TLS サーバー証明書の秘密鍵と CSR の作成 リンクのコピーリンクがクリップボードにコピーされました!
認証局 (CA) からの有効な TLS 証明書がある場合にのみ、TLS 暗号化通信チャネルを使用できます。証明書を取得するには、最初にサーバーの秘密鍵と証明書署名要求 (CSR) を作成する必要があります。
手順
以下のようにサーバーシステムで秘密鍵を生成します。
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <server-private.key>オプション: 次の例のように、選択したテキストエディターを使用して、CSR の作成を簡素化する設定ファイルを準備します。
$ vim <example_server.cnf> [server-cert] keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement extendedKeyUsage = serverAuth subjectAltName = @alt_name [req] distinguished_name = dn prompt = no [dn] C = <US> O = <Example Organization> CN = <server.example.com> [alt_name] DNS.1 = <example.com> DNS.2 = <server.example.com> IP.1 = <192.168.0.1> IP.2 = <::1> IP.3 = <127.0.0.1>extendedKeyUsage = serverAuthオプションは、証明書の使用を制限します。前に作成した秘密鍵を使用して CSR を作成します。
$ openssl req -key <server-private.key> -config <example_server.cnf> -new -out <server-cert.csr>-configオプションを省略すると、reqユーティリティーは次のような追加情報の入力を求めます。You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]: <US> State or Province Name (full name) []: <Washington> Locality Name (eg, city) [Default City]: <Seattle> Organization Name (eg, company) [Default Company Ltd]: <Example Organization> Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []: <server.example.com> Email Address []: <server@example.com>
次のステップ
- 署名のために選択した CA に CSR を送信します。または、信頼できるネットワーク内での内部使用シナリオでは、署名にプライベート CA を使用します。詳細は、「OpenSSL でプライベート CA を使用して CSR の証明書を発行する」 を参照してください。
検証
要求された証明書を CA から取得したら、次の例のように、証明書の中で人間が判読できる部分が要件と一致することを確認します。
$ openssl x509 -text -noout -in <server-cert.crt> Certificate: … Issuer: CN = Example CA Validity Not Before: Feb 2 20:27:29 2023 GMT Not After : Feb 2 20:27:29 2024 GMT Subject: C = US, O = Example Organization, CN = server.example.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) … X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Subject Alternative Name: DNS:example.com, DNS:server.example.com, IP Address:192.168.0.1, IP …
2.5. OpenSSL を使用した TLS クライアント証明書の秘密鍵と CSR の作成 リンクのコピーリンクがクリップボードにコピーされました!
認証局 (CA) からの有効な TLS 証明書がある場合にのみ、TLS 暗号化通信チャネルを使用できます。証明書を取得するには、最初にクライアントの秘密鍵と証明書署名要求 (CSR) を作成する必要があります。
手順
次の例のように、クライアントシステムで秘密鍵を生成します。
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <client-private.key>オプション: 次の例のように、選択したテキストエディターを使用して、CSR の作成を簡素化する設定ファイルを準備します。
$ vim <example_client.cnf> [client-cert] keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth subjectAltName = @alt_name [req] distinguished_name = dn prompt = no [dn] CN = <client.example.com> [clnt_alt_name] email= <client@example.com>extendedKeyUsage = clientAuthオプションは、証明書の使用を制限します。前に作成した秘密鍵を使用して CSR を作成します。
$ openssl req -key <client-private.key> -config <example_client.cnf> -new -out <client-cert.csr>-configオプションを省略すると、reqユーティリティーは次のような追加情報の入力を求めます。You are about to be asked to enter information that will be incorporated into your certificate request. … Common Name (eg, your name or your server's hostname) []: <client.example.com> Email Address []: <client@example.com>
次のステップ
- 署名のために選択した CA に CSR を送信します。または、信頼できるネットワーク内での内部使用シナリオでは、署名にプライベート CA を使用します。詳細は、「OpenSSL でプライベート CA を使用して CSR の証明書を発行する」 を参照してください。
検証
次の例のように、証明書の中で人間が判読できる部分が要件と一致することを確認します。
$ openssl x509 -text -noout -in <client-cert.crt> Certificate: … X509v3 Extended Key Usage: TLS Web Client Authentication X509v3 Subject Alternative Name: email:client@example.com …
2.6. OpenSSL でプライベート CA を使用して CSR の証明書を発行する リンクのコピーリンクがクリップボードにコピーされました!
システムが TLS 暗号化通信チャネルを確立できるようにするには、認証局 (CA) が有効な証明書をシステムに提供する必要があります。プライベート CA がある場合は、システムからの証明書署名要求 (CSR) に署名することにより、要求された証明書を作成できます。
前提条件
- プライベート CA が設定済みである。詳細は、OpenSSL を使用したプライベート CA の作成 セクションを参照してください。
- CSR を含むファイルがある。CSR の作成例については、「OpenSSL を使用した TLS サーバー証明書の秘密鍵と CSR の作成」 セクションを参照してください。
手順
オプション: 任意のテキストエディターを使用して、証明書に拡張を追加するための OpenSSL 設定ファイルを準備します。次に例を示します。
$ vim <openssl.cnf> [server-cert] extendedKeyUsage = serverAuth [client-cert] extendedKeyUsage = clientAuth前の例は原則のみを示しており、
opensslはすべての拡張を証明書に自動的に追加するわけではないことに注意してください。必要な拡張を CNF ファイルに追加するか、opensslコマンドのパラメーターに追加する必要があります。x509ユーティリティーを使用して、CSR に基づいて証明書を作成します。次に例を示します。$ openssl x509 -req -in <server-cert.csr> -CA <ca.crt> -CAkey <ca.key> -days 365 -extfile <openssl.cnf> -extensions <server-cert> -out <server-cert.crt> Signature ok subject=C = US, O = Example Organization, CN = server.example.com Getting CA Private Key
2.7. GnuTLS を使用したプライベート CA の作成 リンクのコピーリンクがクリップボードにコピーされました!
プライベート証明機関 (CA) は、シナリオで内部ネットワーク内のエンティティーを検証する必要がある場合に役立ちます。たとえば、管理下にある CA によって署名された証明書に基づく認証を使用して VPN ゲートウェイを作成する場合、または商用 CA への支払いを希望しない場合は、プライベート CA を使用します。このようなユースケースで証明書に署名するために、プライベート CA は自己署名証明書を使用します。
前提条件
-
sudoを使用して管理コマンドを入力するための root権限または権限がある。そのような特権を必要とするコマンドは、#でマークされています。 システムにはすでに GnuTLS がインストールされている。インストールしていない場合は、次のコマンドを使用できます。
$ dnf install gnutls-utils
手順
CA の秘密鍵を生成します。たとえば、次のコマンドは、256 ビットの楕円曲線デジタル署名アルゴリズム (ECDSA) キーを作成します。
$ certtool --generate-privkey --sec-param High --key-type=ecdsa --outfile <ca.key>キー生成プロセスの時間は、ホストのハードウェアとエントロピー、選択したアルゴリズム、およびキーの長さによって異なります。
証明書のテンプレートファイルを作成します。
任意のテキストエディターでファイルを作成します。以下に例を示します。
$ vi <ca.cfg>ファイルを編集して、必要な証明書の詳細を含めます。
organization = "Example Inc." state = "Example" country = EX cn = "Example CA" serial = 007 expiration_days = 365 ca cert_signing_key crl_signing_key
手順 1 で生成した秘密鍵を使用して署名された証明書を作成します。
生成された <ca.crt> ファイルは、1 年間他の証明書に署名するために使用できる自己署名 CA 証明書です。<ca.crt> ファイルは公開鍵 (証明書) です。ロードされたファイル <ca.key> が秘密鍵です。このファイルは安全な場所に保管してください。
$ certtool --generate-self-signed --load-privkey <ca.key> --template <ca.cfg> --outfile <ca.crt>CA の秘密鍵に安全なアクセス許可を設定します。次に例を示します。
# chown <root>:<root> <ca.key> # chmod 600 <ca.key>
次のステップ
自己署名 CA 証明書をクライアントシステムのトラストアンカーとして使用するには、CA 証明書をクライアントにコピーし、クライアントのシステム全体のトラストストアに
rootとして追加します。# trust anchor <ca.crt>詳細は、3章共有システム証明書の使用 を参照してください。
検証
自己署名 CA に関する基本情報を表示します。
$ certtool --certificate-info --infile <ca.crt> Certificate: … X509v3 extensions: … X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: critical Certificate Sign, CRL Sign証明書署名要求 (CSR) を作成し、CA を使用して要求に署名します。CA は、CSR に基づいて証明書を正常に作成する必要があります。次に例を示します。
CA の秘密鍵を生成します。
$ certtool --generate-privkey --outfile <example-server.key>任意のテキストエディターで新しい設定ファイルを開きます。以下に例を示します。
$ vi <example-server.cfg>ファイルを編集して、必要な証明書の詳細を含めます。
signing_key encryption_key key_agreement tls_www_server country = "US" organization = "Example Organization" cn = "server.example.com" dns_name = "example.com" dns_name = "server.example.com" ip_address = "192.168.0.1" ip_address = "::1" ip_address = "127.0.0.1"以前に作成した秘密鍵を使用してリクエストを生成します
$ certtool --generate-request --load-privkey <example-server.key> --template <example-server.cfg> --outfile <example-server.crq>証明書を生成し、CA の秘密鍵で署名します。
$ certtool --generate-certificate --load-request <example-server.crq> --load-ca-certificate <ca.crt> --load-ca-privkey <ca.key> --outfile <example-server.crt>
2.8. GnuTLS を使用した TLS サーバー証明書の秘密鍵と CSR の作成 リンクのコピーリンクがクリップボードにコピーされました!
証明書を取得するには、最初にサーバーの秘密鍵と証明書署名要求 (CSR) を作成する必要があります。
手順
以下のようにサーバーシステムで秘密鍵を生成します。
$ certtool --generate-privkey --sec-param High --outfile <example-server.key>オプション: 次の例のように、選択したテキストエディターを使用して、CSR の作成を簡素化する設定ファイルを準備します。
$ vim <example_server.cnf> signing_key encryption_key key_agreement tls_www_server country = "US" organization = "Example Organization" cn = "server.example.com" dns_name = "example.com" dns_name = "server.example.com" ip_address = "192.168.0.1" ip_address = "::1" ip_address = "127.0.0.1"前に作成した秘密鍵を使用して CSR を作成します。
$ certtool --generate-request --template <example-server.cfg> --load-privkey <example-server.key> --outfile <example-server.crq>--templateオプションを省略すると、certoolユーティリティーは次のような追加情報の入力を求めます。You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Generating a PKCS #10 certificate request... Country name (2 chars): <US> State or province name: <Washington> Locality name: <Seattle> Organization name: <Example Organization> Organizational unit name: Common name: <server.example.com>
次のステップ
- 署名のために選択した CA に CSR を送信します。または、信頼できるネットワーク内での内部使用シナリオでは、署名にプライベート CA を使用します。詳細は、OpenSSL でプライベート CA を使用して CSR の証明書を発行する セクションを参照してください。
検証
要求された証明書を CA から取得したら、次の例のように、証明書の中で人間が判読できる部分が要件と一致することを確認します。
$ certtool --certificate-info --infile <example-server.crt> Certificate: … Issuer: CN = Example CA Validity Not Before: Feb 2 20:27:29 2023 GMT Not After : Feb 2 20:27:29 2024 GMT Subject: C = US, O = Example Organization, CN = server.example.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) … X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Subject Alternative Name: DNS:example.com, DNS:server.example.com, IP Address:192.168.0.1, IP …
2.9. GnuTLS を使用した TLS クライアント証明書の秘密鍵と CSR の作成 リンクのコピーリンクがクリップボードにコピーされました!
証明書を取得するには、最初にクライアントの秘密鍵と証明書署名要求 (CSR) を作成する必要があります。
手順
次の例のように、クライアントシステムで秘密鍵を生成します。
$ certtool --generate-privkey --sec-param High --outfile <example-client.key>オプション: 次の例のように、選択したテキストエディターを使用して、CSR の作成を簡素化する設定ファイルを準備します。
$ vim <example_client.cnf> signing_key encryption_key tls_www_client cn = "client.example.com" email = "client@example.com"前に作成した秘密鍵を使用して CSR を作成します。
$ certtool --generate-request --template <example-client.cfg> --load-privkey <example-client.key> --outfile <example-client.crq>--templateオプションを省略すると、certtoolユーティリティーは次のような追加情報の入力を求めます。Generating a PKCS #10 certificate request... Country name (2 chars): <US> State or province name: <Washington> Locality name: <Seattle> Organization name: <Example Organization> Organizational unit name: Common name: <server.example.com>
次のステップ
- 署名のために選択した CA に CSR を送信します。または、信頼できるネットワーク内での内部使用シナリオでは、署名にプライベート CA を使用します。詳細は、「GnuTLS でプライベート CA を使用して CSR の証明書を発行する」 を参照してください。
検証
次の例のように、証明書の中で人間が判読できる部分が要件と一致することを確認します。
$ certtool --certificate-info --infile <example-client.crt> Certificate: … X509v3 Extended Key Usage: TLS Web Client Authentication X509v3 Subject Alternative Name: email:client@example.com …
2.10. GnuTLS でプライベート CA を使用して CSR の証明書を発行する リンクのコピーリンクがクリップボードにコピーされました!
システムが TLS 暗号化通信チャネルを確立できるようにするには、認証局 (CA) が有効な証明書をシステムに提供する必要があります。プライベート CA がある場合は、システムからの証明書署名要求 (CSR) に署名することにより、要求された証明書を作成できます。
前提条件
- プライベート CA が設定済みである。詳細は、「GnuTLS を使用したプライベート CA の作成」 を参照してください。
- CSR を含むファイルがある。CSR の作成例は、「GnuTLS を使用した TLS サーバー証明書の秘密鍵と CSR の作成」 にあります。
手順
オプション: 任意のテキストエディターを使用して、次の例のように、証明書に拡張機能を追加するための GnuTLS 設定ファイルを準備します。
$ vi <server-extensions.cfg> honor_crq_extensions ocsp_uri = "http://ocsp.example.com"certtoolユーティリティーを使用して、CSR に基づいて証明書を作成します。次に例を示します。$ certtool --generate-certificate --load-request <example-server.crq> --load-ca-privkey <ca.key> --load-ca-certificate <ca.crt> --template <server-extensions.cfg> --outfile <example-server.crt>
第4章 TLS の計画および実施 リンクのコピーリンクがクリップボードにコピーされました!
TLS (トランスポート層セキュリティー) は、ネットワーク通信のセキュリティー保護に使用する暗号化プロトコルです。優先する鍵交換プロトコル、認証方法、および暗号化アルゴリズムを設定してシステムのセキュリティー設定を強化する際には、対応するクライアントの範囲が広ければ広いほど、セキュリティーのレベルが低くなることを認識しておく必要があります。反対に、セキュリティー設定を厳密にすると、クライアントとの互換性が制限され、システムからロックアウトされるユーザーが出てくる可能性もあります。可能な限り厳密な設定を目指し、互換性に必要な場合に限り、設定を緩めるようにしてください。
4.1. SSL プロトコルおよび TLS プロトコル リンクのコピーリンクがクリップボードにコピーされました!
Secure Sockets Layer (SSL) プロトコルは、元々はインターネットを介した安全な通信メカニズムを提供するために、Netscape Corporation により開発されました。その後、このプロトコルは、Internet Engineering Task Force (IETF) により採用され、Transport Layer Security (TLS) に名前が変更になりました。
TLS プロトコルは、アプリケーションプロトコル層と、TCP/IP などの信頼性の高いトランスポート層の間にあります。これは、アプリケーションプロトコルから独立しているため、HTTP、FTP、SMTP など、さまざまなプロトコルの下に階層化できます。
| プロトコルのバージョン | 推奨される使用方法 |
|---|---|
| SSL v2 | 使用しないでください。深刻なセキュリティー上の脆弱性があります。RHEL 7 以降、コア暗号ライブラリーから削除されました。 |
| SSL v3 | 使用しないでください。深刻なセキュリティー上の脆弱性があります。RHEL 8 以降、コア暗号ライブラリーから削除されました。 |
| TLS 1.0 | 使用は推奨されません。相互運用性を保証した方法では軽減できない既知の問題があり、最新の暗号スイートには対応しません。RHEL 9 では、すべての暗号化ポリシーで無効になります。 |
| TLS 1.1 | 必要に応じて相互運用性の目的で使用します。最新の暗号スイートには対応しません。RHEL 9 では、すべての暗号化ポリシーで無効になります。 |
| TLS 1.2 | 最新の AEAD 暗号スイートに対応します。このバージョンは、システム全体のすべての暗号化ポリシーで有効になっていますが、このプロトコルの必須ではない部分に脆弱性があります。また、TLS 1.2 では古いアルゴリズムも使用できます。 |
| TLS 1.3 | 推奨されるバージョン。TLS 1.3 は、既知の問題があるオプションを取り除き、より多くのネゴシエーションハンドシェイクを暗号化することでプライバシーを強化し、最新の暗号アルゴリズムをより効果的に使用することで速度を速めることができます。TLS 1.3 は、システム全体のすべての暗号化ポリシーでも有効になっています。 |
4.2. RHEL 9 における TLS のセキュリティー上の検討事項 リンクのコピーリンクがクリップボードにコピーされました!
RHEL 9 では、TLS 設定はシステム全体の暗号化ポリシーメカニズムを使用して実行されます。1.2 未満の TLS バージョンはサポートされなくなりました。DEFAULT、FUTURE、および LEGACY 暗号化ポリシーは、TLS 1.2 および 1.3 のみを許可します。詳細は、システム全体の暗号化ポリシーの使用を 参照してください。
RHEL 9 に含まれるライブラリーが提供するデフォルト設定は、ほとんどのデプロイメントで十分に安全です。TLS 実装は、可能な場合は、安全なアルゴリズムを使用する一方で、レガシーなクライアントまたはサーバーとの間の接続は妨げません。セキュリティー要件が厳格な環境、つまりセキュアなアルゴリズムやプロトコルをサポートしていない従来のクライアントやサーバーの接続が想定または許可されていない環境では、セキュリティーを強化した設定を適用してください。
TLS 設定を強化する最も簡単な方法は、update-crypto-policies --set FUTURE コマンドを実行して、システム全体の暗号化ポリシーレベルを FUTURE に切り替えます。
LEGACY 暗号化ポリシーで無効にされているアルゴリズムは、Red Hat の RHEL 9 セキュリティーのビジョンに準拠しておらず、それらのセキュリティープロパティーは信頼できません。これらのアルゴリズムを再度有効化するのではなく、使用しないようにすることを検討してください。たとえば、古いハードウェアとの相互運用性のためにそれらを再度有効化することを決めた場合は、それらを安全でないものとして扱い、ネットワークの相互作用を個別のネットワークセグメントに分離するなどの追加の保護手段を適用します。パブリックネットワーク全体では使用しないでください。
RHEL システム全体の暗号化ポリシーに従わない場合、またはセットアップに適したカスタム暗号化ポリシーを作成する場合は、カスタム設定で必要なプロトコル、暗号スイート、および鍵の長さについて、以下の推奨事項を使用します。
4.2.1. プロトコル リンクのコピーリンクがクリップボードにコピーされました!
最新バージョンの TLS は、最高のセキュリティーメカニズムを提供します。TLS 1.2 は、LEGACY 暗号化ポリシーを使用する場合でも最小バージョンになりました。古いプロトコルバージョンを再度有効にするには、暗号化ポリシーをオプトアウトするか、カスタムポリシーを提供することで可能ですが、この結果生成される設定はサポートされません。
RHEL 9 は TLS バージョン 1.3 をサポートしていますが、このプロトコルのすべての機能が RHEL 9 コンポーネントで完全にサポートされているわけではない点に注意してください。たとえば、接続レイテンシーを短縮する 0-RTT (Zero Round Trip Time) 機能は、Apache Web サーバーではまだ完全にはサポートされていません。
FIPS モードで実行されている RHEL 9.2 以降のシステムでは、FIPS 140-3 標準の要件に従って、TLS 1.2 接続で Extended Master Secret (EMS) 拡張機能 (RFC 7627) を使用する必要があります。したがって、EMS または TLS 1.3 をサポートしていないレガシークライアントは、FIPS モードで実行されている RHEL 9 サーバーに接続できません。FIPS モードの RHEL 9 クライアントは、EMS なしで TLS 1.2 のみをサポートするサーバーに接続できません。詳細は、Red Hat ナレッジベースのソリューション TLS Extension "Extended Master Secret" enforced with Red Hat Enterprise Linux 9.2 を参照してください。
4.2.2. 暗号スイート リンクのコピーリンクがクリップボードにコピーされました!
旧式で、安全ではない暗号化スイートではなく、最近の、より安全なものを使用してください。暗号化スイートの eNULL および aNULL は、暗号化や認証を提供しないため、常に無効にしてください。RC4 や HMAC-MD5 をベースとした暗号化スイートには深刻な欠陥があるため、可能な場合はこれも無効にしてください。いわゆるエクスポート暗号化スイートも同様です。エクスポート暗号化スイートは意図的に弱くなっているため、侵入が容易になっています。
128 ビット未満のセキュリティーしか提供しない暗号化スイートでは直ちにセキュリティーが保護されなくなるというわけではありませんが、使用できる期間が短いため考慮すべきではありません。アルゴリズムが 128 ビット以上のセキュリティーを使用している場合は、少なくとも数年間は解読不可能であることが期待されているため、強く推奨されます。3DES 暗号は 168 ビットを使用していると言われていますが、実際に提供されているのは 112 ビットのセキュリティーであることに注意してください。
サーバーの鍵が危険にさらされた場合でも、暗号化したデータの機密性を保証する (完全な) 前方秘匿性 (PFS) に対応する暗号スイートを常に優先します。ここでは、速い RSA 鍵交換は除外されますが、ECDHE および DHE は使用できます。この 2 つを比べると、ECDHE の方が速いため推奨されます。
また、AES-GCM などの AEAD 暗号は、パディングオラクル攻撃の影響は受けないため、CBC モード暗号よりも推奨されます。さらに、多くの場合、特にハードウェアに AES 用の暗号化アクセラレーターがある場合、AES-GCM は CBC モードの AES よりも高速です。
ECDSA 証明書で ECDHE 鍵交換を使用すると、トランザクションは純粋な RSA 鍵交換よりもさらに高速になります。レガシークライアントに対応するため、サーバーには証明書と鍵のペアを 2 つ (新しいクライアント用の ECDSA 鍵と、レガシー用の RSA 鍵) インストールできます。
4.2.3. 公開鍵の長さ リンクのコピーリンクがクリップボードにコピーされました!
RSA 鍵を使用する際は、SHA-256 以上で署名され、鍵の長さが 3072 ビット以上のものが常に推奨されます (これは、実際に 128 ビットであるセキュリティーに対して十分な大きさです)。
システムのセキュリティー強度は、チェーンの中の最も弱いリンクが示すものと同じになります。たとえば、強力な暗号化だけではすぐれたセキュリティーは保証されません。鍵と証明書も同様に重要で、認証機関 (CA) が鍵の署名に使用するハッシュ機能と鍵もまた重要になります。
4.3. アプリケーションで TLS 設定の強化 リンクのコピーリンクがクリップボードにコピーされました!
RHEL では、システム全体の暗号化ポリシー は、暗号化ライブラリーを使用するアプリケーションが、既知の安全でないプロトコル、暗号化、またはアルゴリズムを許可しないようにするための便利な方法を提供します。
暗号化設定をカスタマイズして、TLS 関連の設定を強化する場合は、このセクションで説明する暗号化設定オプションを使用して、必要最小量でシステム全体の暗号化ポリシーを上書きできます。
いずれの設定を選択しても、サーバーアプリケーションが サーバー側が指定した順序 で暗号を利用することを確認し、使用される暗号化スイートの選択がサーバーでの設定順に行われるように設定してください。
4.3.1. TLS を使用するように Apache HTTP サーバーを設定する リンクのコピーリンクがクリップボードにコピーされました!
Apache HTTP Server は、TLS のニーズに OpenSSL ライブラリーおよび NSS ライブラリーの両方を使用できます。RHEL 9 では、mod_ss パッケージで mod_ssl 機能が提供されます。
# dnf install mod_ssl
mod_ssl パッケージは、/etc/httpd/conf.d/ssl.conf 設定ファイルをインストールします。これは、Apache HTTP Server の TLS 関連の設定を変更するのに使用できます。
httpd-manual パッケージをインストールして、TLS 設定を含む Apache HTTP Server の完全ドキュメントを取得します。/etc/httpd/conf.d/ssl.conf 設定ファイルで利用可能なディレクティブの詳細は、/usr/share/httpd/manual/mod/mod_ssl.html を参照してください。さまざまな設定の例は、/usr/share/httpd/manual/ssl/ssl_howto.html ファイルに記載されています。
/etc/httpd/conf.d/ssl.conf 設定ファイルの設定を修正する場合は、少なくとも下記の 3 つのディレクティブを確認してください。
SSLProtocol- このディレクティブを使用して、許可する TLS または SSL のバージョンを指定します。
SSLCipherSuite- 優先する暗号化スイートを指定する、もしくは許可しないスイートを無効にするディレクティブです。
SSLHonorCipherOrder-
コメントを解除して、このディレクティブを
onに設定すると、接続先のクライアントは指定した暗号化の順序に従います。
たとえば、TLS 1.2 プロトコルおよび 1.3 プロトコルだけを使用する場合は、以下を実行します。
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
詳細は、Web サーバーとリバースプロキシーのデプロイ ドキュメントの Apache HTTP サーバーでの TLS 暗号化の設定の 章を参照してください。
4.3.2. TLS を使用するように Nginx HTTP およびプロキシーサーバーを設定 リンクのコピーリンクがクリップボードにコピーされました!
Nginx で TLS 1.3 サポートを有効にするには、/etc/nginx/nginx.conf 設定ファイルの server セクションで、ssl_protocols オプションに TLSv1.3 値を追加します。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
....
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers
....
}
詳細は、Web サーバーとリバースプロキシーのデプロイ ドキュメントの Nginx Web サーバーへの TLS 暗号化の追加の 章を参照してください。
4.3.3. TLS を使用するように Dovecot メールサーバーを設定 リンクのコピーリンクがクリップボードにコピーされました!
Dovecot メールサーバーのインストールが TLS を使用するように設定するには、/etc/dovecot/conf.d/10-ssl.conf 設定ファイルを修正します。このファイルで利用可能な基本的な設定ディレクティブの一部は、/usr/share/doc/dovecot/wiki/SSL.DovecotConfiguration.txt ファイルで説明されています。このファイルは Dovecot の標準インストールに含まれています。
/etc/dovecot/conf.d/10-ssl.conf 設定ファイルの設定を修正する場合は、少なくとも下記の 3 つのディレクティブを確認してください。
ssl_protocols- このディレクティブを使用して、許可または無効にする TLS または SSL のバージョンを指定します。
ssl_cipher_list- 優先する暗号化スイートを指定する、もしくは許可しないスイートを無効にするディレクティブです。
ssl_prefer_server_ciphers-
コメントを解除して、このディレクティブを
yesに設定すると、接続先のクライアントは指定した暗号化の順序に従います。
たとえば、/etc/dovecot/conf.d/10-ssl.conf 内の次の行が、TLS 1.1 以降だけを許可します。
ssl_protocols = !SSLv2 !SSLv3 !TLSv1
第5章 暗号化された DNS を使用したシステムの DNS トラフィックの保護 リンクのコピーリンクがクリップボードにコピーされました!
暗号化された DNS を有効にすると、DNS-over-TLS (DoT) プロトコルを使用する DNS 通信を保護できます。暗号化された DNS (eDNS) は、セキュアでないプロトコルにフォールバックすることなく、すべての DNS トラフィックをエンドツーエンドで暗号化し、ゼロトラストアーキテクチャー (ZTA) の原則に準拠します。
RHEL における eDNS の現在の実装では、DoT プロトコルのみが使用されます。eDNS を有効にして RHEL をインストールするには、主に 2 つの方法があります。ローカルメディアから対話型インストールを実行することも、カスタムの起動可能な ISO をビルドして、インストール中およびインストール後に enforce ポリシーで eDNS を確実に設定することも可能です。または、既存の RHEL インストール環境を eDNS を使用するように変換することもできます。
暗号化された DNS はテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat では、実稼働環境での使用を推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
5.1. RHEL の eDNS コンポーネントの概要 リンクのコピーリンクがクリップボードにコピーされました!
RHEL の eDNS 設定は次のコンポーネントで構成されています。各コンポーネントは階層的に相互作用します。
- NetworkManager
-
NetworkManager は、設定されたポリシーに基づいて、eDNS を有効にし、暗号化された DNS プロトコルの使用を強制します。バックエンドの DNS リゾルバーとして
dnsconfdを使用するように設定されています。 dnsconfd-
dnsconfdはローカル DNS キャッシュ設定デーモンです。DNS キャッシング、スプリット DNS、DNS over TLS (DoT) のセットアップを簡素化します。 unbound-
unboundは、検証、再帰、およびキャッシング DNS リゾルバーです。eDNS セットアップでは、dnsconfdのランタイムキャッシュサービスとして機能します。unboundはアップストリームへの DNS クエリーに TLS を使用します。これは、外部の DoT サーバーへの DNS トラフィックを暗号化するために不可欠です。また、unboundは DNS 応答を保存するためのさまざまなキャッシュを管理します。そのため、外部クエリーの繰り返しの必要性が減り、パフォーマンスが向上します。
5.1.1. eDNS の解決プロセスと中核となる相互作用 リンクのコピーリンクがクリップボードにコピーされました!
- アプリケーションがホスト名の解決を要求します。
-
システムが
/etc/resolv.confファイルを読み取り、クエリーをローカルのunboundサービスに送信します。 -
unboundが、まず内部キャッシュをチェックして、キャッシュされた有効な応答があるかどうかを確認します。 -
要求のレコードが見つからない場合、
unboundは TLS を使用して DNS クエリーを暗号化し、設定されたアップストリームの DoT 対応 DNS サーバーに送信します。 -
アップストリームの DoT サーバーはクエリーを処理し、暗号化された DNS 応答を
unboundに返します。 -
unboundは応答を復号、検証、キャッシュします。 -
最後に、
unboundは解決された DNS 応答をアプリケーションに返します。
5.2. ローカルインストールメディアから eDNS が有効な RHEL をインストールする リンクのコピーリンクがクリップボードにコピーされました!
eDNS の enforce ポリシーを使用して RHEL システムをインストールします。このポリシーにより、インストール中およびインストール後に、すべての DNS クエリーがプライベートかつセキュアな状態に保たれます。カスタムの CA 証明書バンドルが必要な場合は、キックスタートファイルの %certificate セクションを使用してバンドルをインストールする必要があります。
インストール時に、RHEL インストールコンテンツとキックスタートファイルの両方を、ローカルメディアから提供する必要があります。リモートの HTTP サーバーからキックスタートファイルをダウンロードすることはできません。その場合、インストーラーがそのサーバーのホスト名を解決するために DNS を使用する必要があるためです。環境で暗号化されていない DNS へのフォールバックが許可されている場合は、標準の RHEL インストールを実行し、その後で eDNS を設定できます。
前提条件
-
sudoまたは root ユーザーアクセス権によって提供される管理者特権。これは先頭にコマンドプロンプト#が付いているコマンドに必要です。sudo アクセス権を設定する方法については、非特権ユーザーが特定のコマンドを実行できるようにする を参照してください。 - RHEL インストールメディアがローカルで使用可能である。
-
カスタムの CA バンドルが必要な場合は、
%certificateセクションを含むキックスタートファイルがローカルで使用可能である。
手順
オプション:
%certificateセクションを含むキックスタートファイルを作成します。証明書がtls-ca-bundle.pemという名前のファイルに保存されていることを確認します。%certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem -----BEGIN CERTIFICATE----- <Base64-encoded_certificate_content> -----END CERTIFICATE----- %end- 起動可能なインストールメディアを準備します。カスタムの CA バンドルが必要な場合は、キックスタートファイルを含めます。
- インストールメディアを起動します。
-
ブートメニューウィンドウから必要なオプションを選択し、
eキーを押してブートパラメーターを編集します。 eDNS カーネル引数を追加します。
linux ($root)/vmlinuz-6.12.0-0.el10_0.x86_64 root=/dev/mapper/rhel-root ro crashkernel=2G-64G:256M,64G-:512M resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet emergency ip=dhcp rd.net.dns=dns+tls://<server_ip>#<dns_server_hostname> rd.net.dns-resolve-mode=exclusive rd.net.dns-backend=dnsconfd inst.ks=hd:/dev/sdb1/mykickstart.ks-
編集が完了したら、
Ctrl+Xを押して、指定したオプションを使用してインストールを開始します。
検証
eDNS 設定を確認します。
$ dnsconfd status想定される出力:
Running cache service: unbound Resolving mode: exclusive Config present in service: { ".": [ "dns+tls://198.51.100.143#dot.dns.example.com" ] } State of Dnsconfd: RUNNING Info about servers: [ { "address": "198.51.100.143", "port": 853, "name": "dot.dns.example.com", "routing_domains": [ "." ], "search_domains": [], "interface": null, "protocol": "dns+tls", "dnssec": true, "networks": [], "firewall_zone": null } ]nslookupを使用して DNS サーバーが応答することを確認します。$ nslookup <domain_name><domain_name>は、照会するドメインに置き換えます。
トラブルシューティング
unboundで詳細なロギングを有効にします。# unbound-control verbosity 5関連するサービスのログを確認します。
$ journalctl -xe -u <service_name><service_name>は、NetworkManager、dnsconfd、またはunboundに置き換えます。
5.3. カスタムの起動可能な ISO を使用して eDNS が有効な RHEL をインストールする リンクのコピーリンクがクリップボードにコピーされました!
eDNS の enforce ポリシーを使用して RHEL をインストールするためのカスタムの起動可能な ISO を作成します。このポリシーにより、インストール中およびインストール後に、すべての DNS クエリーがプライベートかつセキュアな状態に保たれます。カスタムの CA 証明書バンドルが必要な場合は、キックスタートファイルの %certificate セクションを使用してバンドルをインストールする必要があります。その後、スクリプトでこのキックスタートファイルを参照して、厳格な DoT ポリシーを適用するためのカーネル引数を含む新しい ISO をビルドします。環境で暗号化されていない DNS へのフォールバックが許可されている場合は、標準の RHEL インストールを実行し、その後で eDNS を設定できます。
前提条件
-
sudoまたは root ユーザーアクセス権によって提供される管理者特権。これは先頭にコマンドプロンプト#が付いているコマンドに必要です。sudo アクセス権を設定する方法については、非特権ユーザーが特定のコマンドを実行できるようにする を参照してください。 - Product Downloads ページからフルインストール用の DVD ISO または最小インストール用の Boot ISO イメージをダウンロードした。
-
%certificateセクションを含むキックスタートファイルがある (カスタム CA バンドルが必要な場合)。 -
loraxパッケージがインストールされている。
手順
必要に応じて、最小インストールの起動 ISO イメージを使用する場合には、
rhsmコマンドを使用してキックスタートファイルにインストールソースを設定します。# Register the system and use CDN as the installation source rhsm --organization=<org_id> --activation-key=<activation_key>注記インストールソースを作成して、HTTP、FTP、または NFS で利用できるようにすることもできます。詳細は、ネットワークベースのリポジトリーの準備 を参照してください。
オプション:
%certificateセクションを含むキックスタートファイルを作成します。証明書がtls-ca-bundle.pemという名前のファイルに保存されていることを確認します。%certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem -----BEGIN CERTIFICATE----- <Base64-encoded_certificate_content> -----END CERTIFICATE----- %endキックスタートファイルとカーネル引数を ISO に追加します。
次のスクリプト例は、eDNS が有効なカスタムの起動可能な ISO を作成する方法を示しています。このプロセスを自動化するには、スクリプトファイルを作成する必要があります。
!/bin/bash set -ex KERNELARGS="" # Enable network KERNELARGS+="ip=dhcp " # Set DoT DNS server KERNELARGS+="rd.net.dns=dns+tls://<server_ip><dns_server_hostname> " # Set to 'exclusive' to disable fallback to unencrypted DNS. Other values: 'backup', 'prefer'. KERNELARGS+="rd.net.dns-resolve-mode=exclusive " # Set the dnsconfd plugin for NetworkManager KERNELARGS+="rd.net.dns-backend=dnsconfd " # Remove any existing ISO to prevent conflicts with the new build rm -f <output_iso_filename> # Create a new bootable ISO with the Kickstart config file and kernel arguments mkksiso --ks <kickstart_file> --cmdline "$KERNELARGS" <input_iso_filename> <output_iso_filename>スクリプトを実行します。
# sh <script_filename>- カスタマイズした ISO ファイルを使用して RHEL をインストールします。
検証
eDNS 設定を確認します。
$ dnsconfd status想定される出力:
Running cache service: unbound Resolving mode: exclusive Config present in service: { ".": [ "dns+tls://198.51.100.143#dot.dns.example.com" ] } State of Dnsconfd: RUNNING Info about servers: [ { "address": "198.51.100.143", "port": 853, "name": "dot.dns.example.com", "routing_domains": [ "." ], "search_domains": [], "interface": null, "protocol": "dns+tls", "dnssec": true, "networks": [], "firewall_zone": null } ]nslookupを使用して DNS サーバーが応答することを確認します。$ nslookup <domain_name><domain_name>は、照会するドメインに置き換えます。
トラブルシューティング
unboundで詳細なロギングを有効にします。# unbound-control verbosity 5関連するサービスのログを確認します。
$ journalctl -xe -u <service_name><service_name>は、NetworkManager、dnsconfd、またはunboundに置き換えます。
5.4. 既存の RHEL インストールにおける eDNS の有効化 リンクのコピーリンクがクリップボードにコピーされました!
既存の RHEL インストールで暗号化された DNS (eDNS) を有効にして、DNS-over-TLS を使用してすべての DNS トラフィックを処理できます。
前提条件
-
sudoまたは root ユーザーアクセス権によって提供される管理者特権。これは先頭にコマンドプロンプト#が付いているコマンドに必要です。sudo アクセス権を設定する方法については、非特権ユーザーが特定のコマンドを実行できるようにする を参照してください。
- 既存の RHEL インストールがある。
次のパッケージがシステムにインストールされている。
-
dnsconfd -
dnsconfd-dracut -
grubby
-
-
IBM Z システムの場合は、
ziplユーティリティーがインストールされている。
手順
/etc/NetworkManager/conf.d/global-dot.confファイルで NetworkManager を設定します。[main] dns=dnsconfd [global-dns] resolve-mode=exclusive [global-dns-domain-*] servers=dns+tls://<server_ip_1><dns_server_hostname_1>,dns+tls://<server_ip_2><dns_server_hostname_2>オプション: アップストリームの DoT サーバーを検証するためにカスタム CA バンドルを使用するには、PEM 形式のファイルを
/etc/pki/dns/extracted/pem/tls-ca-bundle.pemファイルにコピーします。注記/etc/pki/dns/extracted/pemで証明書を追加または削除したら、変更を適用するためにdnsconfdサービスを再起動してください。dnsconfdサービスを有効にします。# systemctl enable --now dnsconfdNetworkManager をリロードします。
# systemctl reload NetworkManagerdnsconfdとその設定が含まれるように、すべてのインストール済みカーネルのinitramfsを再生成します。# for kernel in `rpm -q kernel --qf '%{VERSION}-%{RELEASE}.%{ARCH}\n'`; do dracut -f --kver="$kernel" doneカーネル引数を、現在のカーネルバージョンと新しくインストールされたカーネルバージョンに設定します。
# grubby --args="rd.net.dns=dns+tls://<server_ip>#<dns_server_hostname> rd.net.dns-resolve-mode=exclusive rd.net.dns-backend=dnsconfd" --update-kernel=ALLIBM Z の場合は、ブートメニューを更新します。
# zipl
検証
eDNS 設定を確認します。
$ dnsconfd status想定される出力:
Running cache service: unbound Resolving mode: exclusive Config present in service: { ".": [ "dns+tls://198.51.100.143#dot.dns.example.com" ] } State of Dnsconfd: RUNNING Info about servers: [ { "address": "198.51.100.143", "port": 853, "name": "dot.dns.example.com", "routing_domains": [ "." ], "search_domains": [], "interface": null, "protocol": "dns+tls", "dnssec": true, "networks": [], "firewall_zone": null } ]nslookupを使用して DNS サーバーが応答することを確認します。$ nslookup <domain_name><domain_name>は、照会するドメインに置き換えます。
トラブルシューティング
unboundで詳細なロギングを有効にします。# unbound-control verbosity 5関連するサービスのログを確認します。
$ journalctl -xe -u <service_name><service_name>は、NetworkManager、dnsconfd、またはunboundに置き換えます。
5.5. DNS 設定のカーネルパラメーター リンクのコピーリンクがクリップボードにコピーされました!
カーネル引数を使用すると、起動時に DNS over TLS (DoT) を有効にし、システムの DNS 解決動作を設定できます。
rd.net.dns-resolve-mode
解決時にグローバル設定の DNS サーバーをどのように使用するかを定義します。次のモードは、カーネル引数と NetworkManager.conf のグローバル設定の両方に関連します。
exclusive-
カーネル引数または
NetworkManager.confで指定された DNS サーバーのみを使用します。接続から取得された DNS サーバーへのフォールバックを禁止します。このモードは現在dnsconfdプラグインにのみ関連します。 prefer- 一般的なクエリーの接続から取得された DNS サーバーを使用することを禁止します。ただし、クエリーが接続によって設定されたドメインのサブドメインである場合を除きます。
backup- グローバル設定とネットワーク接続の両方から取得された DNS サーバーをマージして、同じ目的で使用します。
rd.net.dns-servers
使用する DNS サーバーのリストを設定します。複数の DNS サーバーを定義するには、rd.net.dns を複数回設定します。
rd.net.dns=dns+tls://<server_ip_1>#<dns_server_hostname_1> rd.net.dns=dns+tls://<server_ip_2>#<dns_server_hostname_2>
以下に例を示します。
rd.net.dns=dns+tls://198.51.100.143#dot.dns.example.com rd.net.dns=dns+tls://203.0.113.1#dot.dns.example.net
rd.net.dns-backend
バックエンド DNS リゾルバーを指定します。dnsconfd に設定すると、システムが dnsconfd をローカル DNS キャッシュ設定デーモンとして使用します。
第6章 IPsec VPN のセットアップ リンクのコピーリンクがクリップボードにコピーされました!
Libreswan の IPsec プロトコルスイート実装を使用してセキュアな仮想プライベートネットワーク (VPN) を設定および管理し、インターネット経由でセキュアにデータを転送するための暗号化されたトンネルを作成します。
IPsec トンネルにより、転送中のデータの機密性と完全性が確保されます。一般的なユースケースとしては、支社を本社に接続したり、リモートユーザーに企業ネットワークへのセキュアなアクセスを提供したりすることが挙げられます。
RHEL では、次のようにさまざまな方法で Libreswan を設定できます。
- Libreswan 設定ファイルを手動で編集して、高度なオプションを細かく制御する
-
vpnRHEL システムロールを使用して、Libreswan VPN 設定の作成プロセスを自動化する。 - Nmstate を使用して、宣言型 API を通じて Libreswan 接続を設定する。
Libreswan では、"クライアント" や "サーバー" などの用語は使用しません。代わりに、IPsec ではエンドポイントを "left (左)" と "right (右)" で表します。Libreswan がどちらの役割を担うかを動的に決定するため、この設計により、多くの場合、両方のホストで同じ設定を使用できるようになります。慣例として、管理者は通常、ローカルホストの場合は "left"、リモートホストの場合は "right" を使用します。
Libreswan は、RHEL でサポートされている唯一の VPN テクノロジーです。
IPsec は、Internet Key Exchange (IKE) などの標準化されたプロトコルを利用して、さまざまなシステム間の効率的な通信を実現します。ただし、実際には、ベンダーがこれらの標準を実装する方法がわずかに違うため、互換性の問題が発生する可能性があります。Libreswan をサードパーティーの IPsec ピアに接続する際に、このような相互運用性の問題が発生した場合は、Red Hat サポートにお問い合わせください。
6.1. IPsec VPN の構成要素 リンクのコピーリンクがクリップボードにコピーされました!
IPsec VPN を設定する前に、その主な構成要素を理解することが重要です。主な構成要素とは、認証とネゴシエーションのための Internet Key Exchange (IKE) と、データの暗号化と転送のための IPsec です。
IKE は、2 つのエンドポイントが相互に認証し、暗号化アルゴリズムを含む接続ルールをネゴシエートするために使用するプロトコルです。Libreswan は、pluto と呼ばれるデーモンで IKE を実装します。
IPsec は、IKE ネゴシエーション中に合意されたポリシーに従って、実際にデータを暗号化して転送するプロトコルの部分です。Linux カーネルは IPsec プロトコルスイートを実装しています。
6.2. Libreswan の認証方法 リンクのコピーリンクがクリップボードにコピーされました!
セキュアな VPN 接続を確立するために、セキュリティーのニーズとネットワーク環境に基づいて、適切な認証方法を選択してください。
Libreswan は次の認証方法をサポートしています。
- 事前共有鍵
- 事前共有鍵 (PSK) 方式では、両方のエンドポイントが同じシークレットを使用して相互に認証します。PSK はシンプルさと幅広い互換性を備えているため、小規模なデプロイメントに適しています。ただし、鍵が再利用される場合や、頻繁にローテーションされない場合、PSK の管理は危険です。セキュリティー上、PSK は 64 文字を超えるランダムな文字で構成されている必要があり、ホストが FIPS モードで動作している場合は FIPS の強度要件を満たしている必要があります。
- raw RSA 鍵
- この方法では、相互識別のために各ピアで RSA 公開鍵と秘密鍵のペアを使用します。raw RSA 鍵は PSK よりも強力なセキュリティーを提供し、完全な証明書インフラストラクチャーが不要な環境に最適です。
- X.509 証明書
- この方法では、信頼済み認証局 (CA) によって発行された X.509 証明書が使用されます。各ピアが証明書と秘密鍵を使用して自身のアイデンティティーを証明し、相手がそれを信頼できる CA に対して検証します。この方法は、エンタープライズ向けの最高レベルのセキュリティーとスケーラビリティーを提供します。ただし、公開鍵基盤 (PKI) の導入と維持が必要となるため、より複雑です。
- NULL 認証
- この方法では、ピア間の認証を行わずに暗号化のみを行います。NULL 認証はリモートエンドポイントのアイデンティティーを検証しないため、セキュアではなく、中間者攻撃に対する保護を提供しません。
- 量子コンピューターに対する保護
- Libreswan はスタンドアロンの認証方法ではありませんが、将来の量子コンピューターによる攻撃から最新の IKEv2 接続を保護するために、Post-quantum Pre-shared Keys (PPK) を提供します。この機能が必要なのは、古い IKEv1 プロトコルも標準 IKEv2 も、それ自体では量子攻撃に対する耐性がないためです。PPK は、主要な認証方法の上にもう 1 つのセキュリティーレイヤーを追加するものです。そのセキュリティーは、外部の通信チャネルを通じてセキュアに配布された暗号的に強力な鍵の使用に依存します。
6.3. raw RSA 鍵認証を使用した IPsec ホスト間 VPN の手動設定 リンクのコピーリンクがクリップボードにコピーされました!
ホスト間 VPN は、2 つのデバイス間に直接的でセキュアな暗号化された接続を確立し、アプリケーションがインターネットなどのセキュアでないネットワーク経由でセキュアに通信できるようにします。
認証に関しては、RSA 鍵は事前共有鍵 (PSK) よりもセキュアです。非対称暗号化によって秘密情報共有のリスクが排除されるためです。また、RSA 鍵を使用すると、強力なピアツーピア認証を提供しつつも、認証局 (CA) が不要になるため、デプロイが容易になります。
両方のホストで次の手順を実行してください。
手順
Libreswan がまだインストールされていない場合は、次の手順を実行します。
libreswanパッケージをインストールします。# dnf install libreswanネットワークセキュリティーサービス (NSS) データベースを初期化します。
# ipsec initnssこのコマンドにより、
/var/lib/ipsec/nss/ディレクトリーにデータベースが作成されます。ipsecサービスを有効にして起動します。# systemctl enable --now ipsecファイアウォールで IPsec ポートとプロトコルを開きます。
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
RSA 鍵ペアを作成します。
# ipsec newhostkeyipsecユーティリティーにより、鍵ペアが NSS データベースに保存されます。- ピアを指定します。IPsec トンネルでは、一方のホストを left に、もう一方のホストを right に指定する必要があります。これは任意に選択できます。一般的には、ローカルホストを left、リモートホストを right と呼びます。
left と right 両方のピアの Certificate Key Attribute ID (CKAID) を表示します。
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>以降のステップで、両方のピアの CKAID が必要になります。
公開鍵を表示します。
left ピアで次のように入力します。
# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...right ピアで次のように入力します。
# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
これらのコマンドにより、設定ファイルで使用する必要がある対応するパラメーターとともに、公開鍵が表示されます。
/etc/ipsec.d/ディレクトリーに接続用の.confファイルを作成します。たとえば、次の設定で/etc/ipsec.d/host-to-host.confファイルを作成します。conn <connection_name> # General setup and authentication type auto=start authby=rsasig # Peer A left=<ip_address_or_fqdn_of_left_peer> leftid=@peer_a leftrsasigkey=<public_key_of_left_peer> # Peer B right=<ip_address_or_fqdn_of_right_peer> rightid=@peer_b rightrsasigkey=<public_key_of_right_peer>注記両方のホストで同じ設定ファイルを使用できます。Libreswan は内部情報を使用して、自身が left ホストで動作しているか、right ホストで動作しているかを識別します。ただし、
left*パラメーターのすべての値が一方のピアに属し、right*パラメーターの値がもう一方のピアに属することが重要です。この例で指定されている設定は次のとおりです。
conn <connection_name>- 接続名を定義します。名前は任意であり、Libreswan はこれを使用して接続を識別します。この接続のパラメーターは、少なくとも 1 つのスペースまたはタブでインデントする必要があります。
auto=<type>-
接続の開始方法を制御します。値を
startに設定すると、Libreswan はサービスの起動時に自動的に接続をアクティブ化します。 authby=rsasig- この接続に対して RSA 署名認証を有効にします。
left=<ip_address_or_fqdn_of_left_peer>およびright=<ip_address_or_fqdn_of_right_peer>- ピアの IP アドレスまたは DNS 名を定義します。
leftid=<id>およびrightid=<id>-
Internet Key Exchange (IKE) ネゴシエーションプロセス中に各ピアを識別する方法を定義します。これには、完全修飾ドメイン名 (FQDN)、IP アドレス、またはリテラル文字列を使用できます。後者の場合、文字列の前に
@記号を付けます。 leftrsasigkey=<public_key>およびrightrsasigkey=<public_key>-
ピアの公開鍵を指定します。前のステップで
ipsec showhostkeyコマンドによって表示された値を使用します。
ipsecサービスを再起動します。# systemctl restart ipsec設定ファイルで
auto=startを使用すると、接続が自動的にアクティブになります。他の方法の場合、接続をアクティブ化するために追加の手順が必要です。詳細は、システム上のipsec.conf(5)man ページを参照してください。
検証
IPsec ステータスを表示します。
# ipsec status接続が正常に確立されていれば、出力に次の行が含まれています。
Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。
子 SA が確立されています。
000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;これは、データトラフィックが通過する実際のトンネルです。
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細および緩和策手順については、VPN 接続を専用ルーティングテーブルに割り当てて、接続がトンネルを迂回するのを防ぐ を参照してください。
6.4. raw RSA 鍵認証を使用した IPsec サイト間 VPN の手動設定 リンクのコピーリンクがクリップボードにコピーされました!
サイト間 VPN は、2 つの異なるネットワーク間にセキュアな暗号化トンネルを確立し、インターネットなどのセキュアでないパブリックネットワークを介してそれらをシームレスにリンクします。
たとえば、サイト間 VPN を使用すると、支社のデバイスがすべて同じローカルネットワークの一部であるかのように、企業本社のリソースにアクセスできるようになります。
ゲートウェイデバイスの認証に関しては、RSA 鍵は事前共有鍵 (PSK) よりもセキュアです。非対称暗号化によって秘密情報共有のリスクが排除されるためです。また、RSA 鍵を使用すると、強力なピアツーピア認証を提供しつつも、認証局 (CA) が不要になるため、デプロイが容易になります。
両方のゲートウェイデバイスで次の手順を実行してください。
前提条件
- 両方のネットワークのルートにより、リモートネットワークへのトラフィックがローカル VPN ゲートウェイデバイスを介して送信されるようになっている。
手順
Libreswan がまだインストールされていない場合は、次の手順を実行します。
libreswanパッケージをインストールします。# dnf install libreswanネットワークセキュリティーサービス (NSS) データベースを初期化します。
# ipsec initnssこのコマンドにより、
/var/lib/ipsec/nss/ディレクトリーにデータベースが作成されます。ipsecサービスを有効にして起動します。# systemctl enable --now ipsecファイアウォールで IPsec ポートとプロトコルを開きます。
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
RSA 鍵ペアを作成します。
# ipsec newhostkeyipsecユーティリティーにより、鍵ペアが NSS データベースに保存されます。- ピアを指定します。IPsec トンネルでは、一方のホストを left に、もう一方のホストを right に指定する必要があります。これは任意に選択できます。一般的には、ローカルホストを left、リモートホストを right と呼びます。
left と right 両方のピアの Certificate Key Attribute ID (CKAID) を表示します。
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>以降のステップで、両方のピアの CKAID が必要になります。
公開鍵を表示します。
left ピアで次のように入力します。
# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...right ピアで次のように入力します。
# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
これらのコマンドにより、設定ファイルで使用する必要がある対応するパラメーターとともに、公開鍵が表示されます。
/etc/ipsec.d/ディレクトリーに接続用の.confファイルを作成します。たとえば、次の設定で/etc/ipsec.d/site-to-site.confファイルを作成します。conn <connection_name> # General setup and authentication type auto=start authby=rsasig # Site A left=<ip_address_or_fqdn_of_left_peer> leftid=@site_a leftrsasigkey=<public_key_of_left_peer> leftsubnet=192.0.2.0/24 # Site B right=<ip_address_or_fqdn_of_right_peer> rightid=@site_b rightrsasigkey=<public_key_of_right_peer> rightsubnet={198.51.100.0/24, 203.0.113.0/24}注記両方のゲートウェイデバイスで同じ設定ファイルを使用できます。Libreswan は内部情報を使用して、自身が left ホストで動作しているか、right ホストで動作しているかを識別します。ただし、
left*パラメーターのすべての値が一方のピアに属し、right*パラメーターの値がもう一方のピアに属することが重要です。この例で指定されている設定は次のとおりです。
conn <connection_name>- 接続名を定義します。名前は任意であり、Libreswan はこれを使用して接続を識別します。この接続のパラメーターは、少なくとも 1 つのスペースまたはタブでインデントする必要があります。
auto=<type>-
接続の開始方法を制御します。値を
startに設定すると、Libreswan はサービスの起動時に自動的に接続をアクティブ化します。 authby=rsasig- この接続に対して RSA 署名認証を有効にします。
left=<ip_address_or_fqdn_of_left_peer>およびright=<ip_address_or_fqdn_of_right_peer>- ピアの IP アドレスまたは DNS 名を定義します。
leftid=<id>およびrightid=<id>-
Internet Key Exchange (IKE) ネゴシエーションプロセス中に各ピアを識別する方法を定義します。これには、完全修飾ドメイン名 (FQDN)、IP アドレス、またはリテラル文字列を使用できます。後者の場合、文字列の前に
@記号を付けます。 leftrsasigkey=<public_key>およびrightrsasigkey=<public_key>-
ピアの公開鍵を指定します。前のステップで
ipsec showhostkeyコマンドによって表示された値を使用します。 leftsubnet=<subnet>およびrightsubnet=<subnet>- トンネルを介して接続されるサブネットを Classless Inter-Domain Routing (CIDR) 形式で定義します。片側で複数のサブネットをトンネリングする場合は、それらを中括弧で囲み、コンマで区切って指定します。
パケット転送を有効にします。
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.confipsecサービスを再起動します。# systemctl restart ipsec設定ファイルで
auto=startを使用すると、接続が自動的にアクティブになります。他の方法の場合、接続をアクティブ化するために追加の手順が必要です。詳細は、システム上のipsec.conf(5)man ページを参照してください。
検証
IPsec ステータスを表示します。
# ipsec status接続が正常に確立されていれば、出力に次の行が含まれています。
Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。
000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。
子 SA が確立されています。
000 #3: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #2; idle;これは、データトラフィックが通過する実際のトンネルです。
- ローカルサブネット内のクライアントから、リモートサブネット内のクライアントに ping を実行します。
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細および緩和策手順については、VPN 接続を専用ルーティングテーブルに割り当てて、接続がトンネルを迂回するのを防ぐ を参照してください。
6.5. 証明書ベースの認証を使用した IPsec ホスト/サイト間 VPN の手動設定 リンクのコピーリンクがクリップボードにコピーされました!
ホスト/サイト間 VPN は、個々のリモートコンピューターとプライベートネットワークの間にセキュアで暗号化された接続を確立し、インターネットなどのセキュアでないパブリックネットワークを介してそれらをシームレスにリンクできるようにします。
ホスト/サイト間 VPN は、物理的にオフィスにいるかのように、自分のコンピューターから会社の内部ネットワーク上のリソースにアクセスする必要があるリモート従業員に最適です。
認証のために、認証局 (CA) によって管理されるデジタル証明書を使用すると、非常にセキュアでスケーラブルなソリューションが実現します。接続元ホストとゲートウェイが、それぞれ信頼できる CA によって署名された証明書を提示します。この方法により、強力で検証可能な認証が実現し、ユーザー管理が簡素化されます。アクセス権の付与または失効は、CA で一元的に行うことができます。Libreswan は、各証明書を証明書失効リスト (CRL) と照合し、証明書がリストに掲載されていればアクセスを拒否することで、付与や失効を強制します。
6.5.1. IPsec ゲートウェイの手動設定 リンクのコピーリンクがクリップボードにコピーされました!
セキュアなリモートアクセスを可能にするには、Libreswan IPsec ゲートウェイを適切に設定する必要があります。Libreswan は、ネットワークセキュリティーサービス (NSS) データベースからサーバー証明書、秘密鍵、および CA 証明書を読み取ります。
次の例では、認証されたクライアントが内部 192.0.2.0/24 サブネットにアクセスすることを許可し、仮想 IP プールから各クライアントに IP アドレスを動的に割り当てます。セキュリティーを維持するために、ゲートウェイはクライアント証明書が同じ信頼できる CA によって発行されていることを確認し、失効した証明書へのアクセスが拒否されるように、証明書失効リスト (CRL) を自動的に使用します。
前提条件
ゲートウェイに、次の内容を含む公開鍵暗号化標準 #12 (PKCS #12) ファイル
~/file.p12が存在する。- サーバーの秘密鍵
- サーバー証明書
- CA 証明書
- 中間証明書 (必要な場合)
秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。
サーバー証明書には次のフィールドを含めます。
-
Extended Key Usage (EKU) を
TLS Web Server Authenticationに設定します。 - コモンネーム (CN) またはサブジェクト代替名 (SAN) を、ゲートウェイの完全修飾ドメイン名 (FQDN) に設定します。
- X509v3 CRL 配布ポイントに、証明書失効リスト (CRL) への URL を含めます。
-
Extended Key Usage (EKU) を
- VPN クライアントトラフィックの戻りのルートが、VPN ゲートウェイを指すように内部ネットワーク上に設定されている。
手順
Libreswan がまだインストールされていない場合は、以下を実行します。
libreswanパッケージをインストールします。# dnf install libreswanネットワークセキュリティーサービス (NSS) データベースを初期化します。
# ipsec initnssこのコマンドにより、
/var/lib/ipsec/nss/ディレクトリーにデータベースが作成されます。ipsecサービスを有効にして起動します。# systemctl enable --now ipsecファイアウォールで IPsec ポートとプロトコルを開きます。
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
PKCS #12 ファイルを NSS データベースにインポートします。
# ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CAサーバーと CA 証明書のニックネームを表示します。
# certutil -L -d /var/lib/ipsec/nss/ Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI vpn-gateway u,u,u Example-CA CT,, ...この情報は設定ファイルに必要です。
/etc/ipsec.d/ディレクトリーに接続用の.confファイルを作成します。たとえば、次の設定で/etc/ipsec.d/host-to-site.confファイルを作成します。CRL チェックを有効にするために、
config setupセクションを追加します。config setup crl-strict=yes crlcheckinterval=1hこの例で指定されている設定は次のとおりです。
crl-strict=yes- CRL チェックを有効にします。NSS データベース内で CRL が利用できない場合、認証中のクライアントが拒否されます。
crlcheckinterval=1h- 指定期間後に、サーバーの証明書に指定された URL から CRL を再取得します。
ゲートウェイのセクションを追加します。
conn <connection_name> # General setup and authentication type auto=start ikev2=insist authby=rsasig # VPN gateway settings left=%defaultroute leftid=%fromcert leftcert="<server_certificate_nickname>" leftrsasigkey=%cert leftsendcert=always leftsubnet=192.0.2.0/24 rekey=no mobike=yes narrowing=yes # Client-related settings right=%any rightid=%fromcert rightrsasigkey=%cert rightaddresspool=198.51.100.129-198.51.100.254 rightmodecfgclient=yes modecfgclient=yes modecfgdns=192.0.2.5 modecfgdomains="example.com" # Dead Peer Detection dpddelay=30 dpdtimeout=120 dpdaction=clearこの例で指定されている設定は次のとおりです。
ikev2=insist- 最新の IKEv2 プロトコルを、IKEv1 へのフォールバックなしで、唯一許可されるプロトコルとして定義します。
left=%defaultroute-
ipsecサービスの起動時に、デフォルトルートインターフェイスの IP アドレスを動的に設定します。leftパラメーターは、ホストの IP アドレスまたは FQDN に設定することもできます。 leftid=%fromcertおよびrightid=%fromcert- 証明書の識別名 (DN) フィールドからアイデンティティーを取得するように Libreswan を設定します。
leftcert="<server_certificate_nickname>"- NSS データベースで使用されるサーバーの証明書のニックネームを設定します。
leftrsasigkey=%certおよびrightrsasigkey=%cert- 証明書に埋め込まれた RSA 公開鍵を使用するように Libreswan を設定します。
leftsendcert=always- クライアントが CA 証明書に照らして証明書を検証できるように、ゲートウェイに証明書を常に送信するように指示します。
leftsubnet=<subnets>- クライアントがトンネル経由でアクセスできるゲートウェイに接続されているサブネットを指定します。
mobike=yes- クライアントがネットワーク間をシームレスにローミングできるようにします。
rightaddresspool=<ip_range>- ゲートウェイがクライアントに IP アドレスを割り当てることができる範囲を指定します。
modecfgclient=yes-
クライアントが
modecfgdnsパラメーターで設定された DNS サーバー IP とmodecfgdomainsで設定された DNS 検索ドメインを受信できるようにします。
例で使用されているすべてのパラメーターの詳細は、システム上の
ipsec.conf(5)man ページを参照してください。パケット転送を有効にします。
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.confipsecサービスを再起動します。# systemctl restart ipsec設定ファイルで
auto=startを使用すると、接続が自動的にアクティブになります。他の方法の場合、接続をアクティブ化するために追加の手順が必要です。詳細は、システム上のipsec.conf(5)man ページを参照してください。
検証
- クライアントを設定し、VPN ゲートウェイに接続します。
サービスが CRL をロードし、エントリーを NSS データベースに追加したかどうかを確認します。
# ipsec auto --listcrls 000 000 List of CRLs: 000 000 issuer: CN=Example-CA 000 revoked certs: 1 000 updates: this Tue Jul 15 10:22:36 2025 000 next Sun Jan 11 10:22:36 2026 000 000 List of CRL fetch requests: 000 000 Jul 15 15:13:56 2025, trials: 1 000 issuer: 'CN=Example-CA' 000 distPts: 'https://ca.example.com/crl.pem'
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細および緩和策手順については、VPN 接続を専用ルーティングテーブルに割り当てて、接続がトンネルを迂回するのを防ぐ を参照してください。
6.5.2. GNOME Settings を使用してクライアントを IPsec VPN ゲートウェイに接続するように設定する リンクのコピーリンクがクリップボードにコピーされました!
リモートのプライベートネットワーク上のリソースにアクセスするには、ユーザーはまず IPsec VPN 接続を設定する必要があります。GNOME Settings アプリケーションは、NetworkManager で IPsec VPN 接続プロファイルを作成し、トンネルを確立するためのグラフィカルなソリューションです。
前提条件
- IPsec VPN ゲートウェイを設定しました。
-
NetworkManager-libreswan-gnomeパッケージがインストールされている。 クライアントに、次の内容を含む PKCS #12 ファイル
~/file.p12が存在する。- ユーザーの秘密鍵
- ユーザー証明書
- CA 証明書
- 中間証明書 (必要な場合)
秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。
-
証明書の Extended Key Usage (EKU) が
TLS Web Client Authenticationに設定されている。
手順
ネットワークセキュリティーサービス (NSS) データベースを初期化します。
# ipsec initnssこのコマンドにより、
/var/lib/ipsec/nss/ディレクトリーにデータベースが作成されます。PKCS #12 ファイルを NSS データベースにインポートします。
# ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CAユーザーのニックネームと CA 証明書を表示します。
# certutil -L -d /var/lib/ipsec/nss/ Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI user u,u,u Example-CA CT,, ...この情報は設定ファイルに必要です。
- Super キーを押して Settings と入力し、Enter キーを押して GNOME Settings アプリケーションを開きます。
- VPN エントリーの横にある ボタンをクリックします。
- リストから IPsec based VPN を選択します。
Identity タブで、次のようにフィールドに入力します。
Expand 表6.1 Identity タブの設定 フィールド名 値 ipsec.confの対応するパラメーターName
<networkmanager_profile_name>該当なし
Gateway
<ip_address_or_fqdn_of_the_gateway>rightType
IKEv2 (certificate)authbyGroup name
%fromcertleftidCertificate name
<user_certificate_nickname>leftcertRemote ID
%fromcertrightid- Advanced をクリックします。
Advanced properties ウィンドウで、Connectivity タブのフィールドに次のように入力します。
Expand 表6.2 Connectivity タブの設定 フィールド名 値 ipsec.confの対応するパラメーターRemote Network
192.0.2.0/24rightsubnetNarrowing
選択済み
narrowingEnable MOBIKE
yesmobikeDelay
30dpddelayTimeout
120dpdtimeoutAction
Cleardpdaction- をクリックして接続設定に戻ります。
- をクリックして接続を保存します。
- Settings アプリケーションの Network タブで、VPN プロファイルの横にあるスイッチを切り替えて接続を有効にします。
検証
- リモートネットワーク内のホストへの接続を確立するか、ping を実行します。
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細および緩和策手順については、VPN 接続を専用ルーティングテーブルに割り当てて、接続がトンネルを迂回するのを防ぐ を参照してください。
6.6. 証明書ベースの認証を使用した IPsec メッシュ VPN の手動設定 リンクのコピーリンクがクリップボードにコピーされました!
IPsec メッシュは、すべてのサーバーが他のすべてのサーバーとセキュアに直接通信できる、完全に相互接続されたネットワークを形成するものです。これは、複数のデータセンターやクラウドプロバイダーにまたがる分散データベースクラスターや高可用性環境に最適です。
各サーバーペア間に暗号化されたトンネルを直接確立することで、通信の集中によるボトルネックを避けつつ、セキュアな通信を実現できます。認証のために、認証局 (CA) によって管理されるデジタル証明書を使用すると、非常にセキュアでスケーラブルなソリューションが実現します。メッシュ内のホストが、それぞれ信頼できる CA によって署名された証明書を提示します。この方法により、強力で検証可能な認証が実現し、ユーザー管理が簡素化されます。アクセス権の付与または失効は、CA で一元的に行うことができます。Libreswan は、各証明書を証明書失効リスト (CRL) と照合し、証明書がリストに掲載されていればアクセスを拒否することで、付与や失効を強制します。
前提条件
メッシュ内の各ピアに、次の内容を含む公開鍵暗号化標準 #12 (PKCS #12) ファイルが存在する。
- サーバーの秘密鍵
- サーバー証明書
- CA 証明書
- 中間証明書 (必要な場合)
秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。
サーバー証明書には次のフィールドを含めます。
-
Extended Key Usage (EKU) を
TLS Web Server Authenticationに設定します。 - コモンネーム (CN) またはサブジェクト代替名 (SAN) を、ホストの完全修飾ドメイン名 (FQDN) に設定します。
- X509v3 CRL 配布ポイントに、証明書失効リスト (CRL) への URL を含めます。
-
Extended Key Usage (EKU) を
手順
Libreswan がまだインストールされていない場合は、次の手順を実行します。
libreswanパッケージをインストールします。# dnf install libreswanネットワークセキュリティーサービス (NSS) データベースを初期化します。
# ipsec initnssこのコマンドにより、
/var/lib/ipsec/nss/ディレクトリーにデータベースが作成されます。ipsecサービスを有効にして起動します。# systemctl enable --now ipsecファイアウォールで IPsec ポートとプロトコルを開きます。
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
PKCS #12 ファイルを NSS データベースにインポートします。
# ipsec import <file>.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CAサーバーと CA 証明書のニックネームを表示します。
# certutil -L -d /var/lib/ipsec/nss/ Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI server1 u,u,u Example-CA CT,, ...この情報は設定ファイルに必要です。
/etc/ipsec.d/ディレクトリーに接続用の.confファイルを作成します。たとえば、次の設定で/etc/ipsec.d/mesh.confファイルを作成します。CRL チェックを有効にするために、
config setupセクションを追加します。config setup crl-strict=yes crlcheckinterval=1hこの例で指定されている設定は次のとおりです。
crl-strict=yes- CRL チェックを有効にします。NSS データベース内で CRL が利用できない場合、認証中のピアが拒否されます。
crlcheckinterval=1h- 指定期間後に、サーバーの証明書に指定された URL から CRL を再取得します。
メッシュ内のメンバー間のトラフィックを強制的に制御するセクションを追加します。
conn <connection_name> # General setup and authentication type auto=ondemand authby=rsasig # Local settings settings left=%defaultroute leftid=%fromcert leftcert="<server_certificate_nickname>" leftrsasigkey=%cert leftsendcert=always failureshunt=drop type=transport # Settings related to other peers in the mesh right=%opportunisticgroup rightid=%fromcertこの例で指定されている設定は次のとおりです。
left=%defaultroute-
ipsecサービスの起動時に、デフォルトルートインターフェイスの IP アドレスを動的に設定します。leftパラメーターは、ホストの IP アドレスまたは FQDN に設定することもできます。 leftid=%fromcertおよびrightid=%fromcert- 証明書の識別名 (DN) フィールドからアイデンティティーを取得するように Libreswan を設定します。
leftcert="<server_certificate_nickname>"- NSS データベースで使用されるサーバーの証明書のニックネームを設定します。
leftrsasigkey=%cert- 証明書に埋め込まれた RSA 公開鍵を使用するように Libreswan を設定します。
leftsendcert=always- ピアが CA 証明書に照らして証明書を検証できるように、ピアに証明書を常に送信するように指示します。
failureshunt=drop- 暗号化を強制し、IPsec ネゴシエーションが失敗した場合はトラフィックを破棄します。これはメッシュのセキュリティーにとって重要です。
right=%opportunisticgroup- ポリシーファイルで定義されているリモートピアの動的グループに接続を適用することを指定します。これにより、Libreswan は、そのグループにリストされている各 IP またはサブネットに対して、必要に応じて IPsec トンネルをインスタンス化できるようになります。
例で使用されているすべてのパラメーターの詳細は、システム上の
ipsec.conf(5)man ページを参照してください。Classless Inter-Domain Routing (CIDR) 形式でピアまたはサブネットを指定する
/etc/ipsec.d/policies/server-meshポリシーファイルを作成します。192.0.2.0/24 198.51.100.0/24これらの設定により、これらのサブネット内のホスト間トラフィックが
ipsecサービスによって暗号化されます。ホストが IPsec メッシュのメンバーとして設定されていない場合、このホストとメッシュメンバー間の通信が失敗します。ipsecサービスを再起動します。# systemctl restart ipsec- ポリシーファイルで指定したサブネット内のすべてのホストでこの手順を繰り返します。
検証
メッシュ内のホストにトラフィックを送信してトンネルを確立します。たとえば、ホストに ping を実行します。
# ping -c3 <peer_in_mesh>IPsec ステータスを表示します。
# ipsec status接続が正常に確立されていれば、ピアに関する次の行が出力に含まれています。
Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。
#1: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 12822s; REPLACE in 13875s; newest; idle;これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。
子 SA が確立されています。
#2: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_CHILD_SA (established Child SA); REKEY in 13071s; REPLACE in 13875s; newest; eroute owner; IKE SA #1; idle;これは、データトラフィックが通過する実際のトンネルです。
サービスが CRL をロードし、エントリーを NSS データベースに追加したかどうかを確認します。
# ipsec auto --listcrls 000 000 List of CRLs: 000 000 issuer: CN=Example-CA 000 revoked certs: 1 000 updates: this Tue Jul 15 10:22:36 2025 000 next Sun Jan 11 10:22:36 2026 000 000 List of CRL fetch requests: 000 000 Jul 15 15:13:56 2025, trials: 1 000 issuer: 'CN=Example-CA' 000 distPts: 'https://ca.example.com/crl.pem'
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細および緩和策手順については、VPN 接続を専用ルーティングテーブルに割り当てて、接続がトンネルを迂回するのを防ぐ を参照してください。
6.7. パスワードによる IPsec NSS データベースの保護 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、/var/lib/ipsec/nss/ ディレクトリー内の IPsec ネットワークセキュリティーサービス (NSS) データベースにアクセスできるのは root ユーザーのみです。さらに、このデータベースをパスワードで保護することもできます。これは RHEL を Federal Information Processing Standards (FIPS) モードで実行する場合に必要です。
前提条件
-
/var/lib/ipsec/nss/ディレクトリーに NSS データベースが含まれている。
手順
Libreswan NSS データベースのパスワード保護を有効にします。
# certutil -W -d /var/lib/ipsec/nss/現在のパスワードを入力します。
Enter Password or Pin for "NSS Certificate DB": <password>現在データベースがパスワードで保護されていない場合は、Enter を押します。
新しいパスワードを入力します。
Enter new password: <new_password> Re-enter password: <new_password>データベースのロックを解除するために、
ipsecサービスに/etc/ipsec.d/nsspasswordファイルが必要です。次の内容のファイルを作成します。ホストが FIPS モードで実行されていない場合:
NSS Certificate DB:<password>ホストが FIPS モードで実行されている場合:
NSS FIPS 140-2 Certificate DB:<password>
/etc/ipsec.d/nsspasswordファイルにセキュアな権限を設定します。# chmod 600 /etc/ipsec.d/nsspassword # chown root:root /etc/ipsec.d/nsspasswordipsecサービスを再起動します。# systemctl restart ipsec
検証
ipsecサービスが実行されていることを確認します。# systemctl is-active ipsecコマンドで
activeが返された場合、サービスはパスワードファイルを使用して NSS データベースのロックを正常に解除します。NSS データベースでパスワードを必要とするアクションを実行します。たとえば、秘密鍵を表示します。
# certutil -K -d /var/lib/ipsec/nss/ certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services" Enter Password or Pin for "NSS Certificate DB":コマンドによってパスワードが要求されることを確認します。
6.8. FIPS モードが有効なシステムでの IPsec の使用 リンクのコピーリンクがクリップボードにコピーされました!
Federal Information Processing Standards (FIPS) モードの RHEL は、検証済みの暗号化モジュールのみを使用し、レガシーのプロトコルと暗号を自動的に無効にします。FIPS モードの有効化は、多くの場合、連邦政府のコンプライアンス要件として求められ、有効にすることでシステムのセキュリティーが強化されます。
RHEL が提供する Libreswan の IPsec 実装は、完全に FIPS に準拠しています。システムが FIPS モードの場合、Libreswan は追加の設定を必要とせずに、認定済みの暗号化モジュールを自動的に使用します。これは、新しい FIPS 対応システムに Libreswan をインストールする場合でも、既存の Libreswan VPN があるシステムで FIPS モードを有効にする場合でも同様です。
FIPS モードが有効な場合は、Libreswan が FIPS モードで実行されていることを確認できます。
# ipsec whack --fipsstatus
000 FIPS mode enabled
FIPS モードの Libreswan で許可されているアルゴリズムと暗号をリスト表示するには、次のように入力します。
# ipsec pluto --selftest 2>&1
...
000 FIPS Encryption algorithms:
000 AES_CCM_16 {256,192,*128} IKEv1: ESP IKEv2: ESP FIPS aes_ccm, aes_ccm_c
000 AES_CCM_12 {256,192,*128} IKEv1: ESP IKEv2: ESP FIPS aes_ccm_b
000 AES_CCM_8 {256,192,*128} IKEv1: ESP IKEv2: ESP FIPS aes_ccm_a
000 ...
6.9. IPsec VPN 接続の TCP フォールバックの設定 リンクのコピーリンクがクリップボードにコピーされました!
標準の IPsec VPN は、UDP および Encapsulating Security Payload (ESP) プロトコルをブロックする制限付きネットワークでは、失敗する場合があります。このような環境での接続性を確保するために、Libreswan はすべての VPN トラフィックを TCP 接続内にカプセル化できます。
VPN パケットを TCP 内にカプセル化すると、スループットが低下し、レイテンシーが増加する可能性があります。このため、TCP カプセル化はフォールバックオプションとして使用するか、UDP ベースの接続が環境内で一貫してブロックされている場合にのみ使用してください。
前提条件
- IPsec 接続が設定されている。
手順
/etc/ipsec.confファイルを編集し、config setupセクションで次の変更を加えます。TCP ポートをリッスンするように Libreswan を設定します。
listen-tcp=yesデフォルトでは、Libreswan はポート 4500 をリッスンします。別のポートを使用する場合は、次のように入力します。
tcp-remoteport=<port_number>UDP が利用できない場合に TCP をフォールバックオプションとして使用するか、TCP を永続的に使用するかを決定します。
フォールバックオプションとして使用するには、次のように入力します。
enable-tcp=fallback retransmit-timeout=5sデフォルトでは、Libreswan は UDP を使用した接続の試行が失敗した後、TCP 経由の接続を再試行するまで 60 秒間待機します。
retransmit-timeout値を下げると遅延が短縮され、フォールバックプロトコルをより迅速に開始できるようになります。UDP の代わりに永続的に使用するには、次のように入力します。
enable-tcp=yes
ipsecサービスを再起動します。# systemctl restart ipsecデフォルトの 4500 以外の TCP ポートを設定した場合は、ファイアウォールでそのポートを開きます。
# firewall-cmd --permanent --add-port=<tcp_port>/tcp # firewall-cmd --reload- このゲートウェイを使用する各ピアでこの手順を繰り返します。
6.10. Libreswan でのレガシー暗号およびアルゴリズムの有効化 リンクのコピーリンクがクリップボードにコピーされました!
他の IPsec ピアとの下位互換性を確保するために、Libreswan でレガシーの暗号とアルゴリズムを有効にします。これにより、IPsec および Internet Key Exchange (IKE) に対して強力な暗号と暗号化アルゴリズムをデフォルトで適用する RHEL システム全体の暗号化ポリシーがオーバーライドされます。
RHEL のシステム全体の暗号化ポリシーでは、%default と呼ばれる特別な接続が作成されます。この接続により、keyexchange、esp、および ike パラメーターのデフォルト値が設定されます。
前提条件
- Libreswan がインストールされている。
手順
RHEL システム全体の暗号化ポリシーによって設定されたデフォルトをオーバーライドするには、接続設定に
keyexchange、esp、およびikeパラメーターを追加し、必要な値に設定します。以下に例を示します。conn <connection_name> ikev2=no ike=aes-sha2,aes-sha1;modp2048 esp=aes-sha2,aes-sha1 ...ipsecサービスを再起動します。# systemctl restart ipsec
6.11. 接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる リンクのコピーリンクがクリップボードにコピーされました!
トラフィックリダイレクト攻撃から VPN 接続を保護するには、接続を専用のルーティングテーブルに割り当てます。これにより、悪意のあるネットワークサーバーがセキュアなトンネルを回避してデータの完全性を侵害することが防止されます。
DHCP サーバーとステートレスアドレス自動設定 (SLAAC) はどちらも、クライアントのルーティングテーブルにルートを追加できます。悪意のある DHCP サーバーがこの機能を使用すると、たとえば、VPN 接続を使用するホストに対して、VPN トンネルではなく物理インターフェイス経由でトラフィックをリダイレクトするように強制できます。この脆弱性は TunnelVision とも呼ばれ、CVE-2024-3661 の脆弱性に関する記事で説明されています。
この脆弱性を軽減するために、VPN 接続を専用のルーティングテーブルに割り当てることができます。これを行うと、DHCP 設定または SLAAC が、VPN トンネル宛のネットワークパケットに関するルーティング決定を操作できなくなります。
次の条件が 1 つ以上環境に当てはまる場合は、この手順を実行してください。
- 少なくとも 1 つのネットワークインターフェイスが DHCP または SLAAC を使用している。
- ネットワークで、不正な DHCP サーバーを防ぐ DHCP スヌーピングなどのメカニズムが使用されていない。
トラフィック全体を VPN 経由でルーティングすると、ホストがローカルネットワークリソースにアクセスできなくなります。
前提条件
- NetworkManager 1.48.10-5 以降を使用している。
手順
- 使用するルーティングテーブルを決定します。次の手順ではテーブル 75 を使用します。デフォルトでは、RHEL はテーブル 1 - 254 を使用しないため、それらのテーブルのうちどれでも使用できます。
VPN ルートを専用のルーティングテーブルに割り当てるように VPN 接続プロファイルを設定します。
# nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75上記のコマンドで使用したテーブルに低い優先度値を設定します。
# nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"優先度の値は 1 - 32766 の範囲で指定できます。値が低いほど、優先度が高くなります。
VPN 接続を再接続します。
# nmcli connection down <vpn_connection_profile> # nmcli connection up <vpn_connection_profile>
検証
テーブル 75 の IPv4 ルートを表示します。
# ip route show table 75 ... 192.0.2.0/24 via 192.0.2.254 dev vpn_device proto static metric 50 default dev vpn_device proto static scope link metric 50この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 75 に割り当てられており、すべてのトラフィックがトンネルを介してルーティングされることを確認できます。VPN 接続プロファイルで
ipv4.never-default trueを設定すると、デフォルトルートが作成されず、この出力には表示されません。テーブル 75 の IPv6 ルートを表示します。
# ip -6 route show table 75 ... 2001:db8:1::/64 dev vpn_device proto kernel metric 50 pref medium default dev vpn_device proto static metric 50 pref mediumこの出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 75 に割り当てられており、すべてのトラフィックがトンネルを介してルーティングされることを確認できます。VPN 接続プロファイルで
ipv6.never-default trueを設定すると、デフォルトルートが作成されず、この出力には表示されません。
6.12. RHEL システムロールを使用した IPsec VPN 接続の設定 リンクのコピーリンクがクリップボードにコピーされました!
IPsec VPN 接続を設定して、信頼できないネットワーク上に暗号化されたトンネルを確立し、転送中のデータの完全性を確保します。RHEL システムロールを使用すると、支社を本社に接続するなどのユースケースのセットアップを自動化できます。
vpn RHEL システムロールで作成できるのは、事前共有鍵 (PSK) または証明書を使用してピアを相互に認証する VPN 設定だけです。
6.12.1. vpn RHEL システムロールを使用して PSK 認証による IPsec ホスト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
ホスト間 VPN は、2 つのデバイス間に暗号化された接続を確立し、アプリケーションがセキュアでないネットワーク経由でセキュアに通信できるようにします。vpn RHEL システムロールを使用すると、IPsec ホスト間接続を作成するプロセスを自動化できます。
認証には、事前共有鍵 (PSK) というシンプルな方式が使用されます。この方式では、2 つのピア間のみで共有される 1 つの秘密情報を使用します。この方式は設定が簡単で、デプロイの容易さが優先される基本的なセットアップに最適です。ただし、この鍵は厳重に保管する必要があります。攻撃者が鍵にアクセスすると、接続が侵害されるおそれがあります。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: managed-node-02.example.com: auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: trueサンプル Playbook で指定されている設定は次のとおりです。
hosts: <list>VPN を設定するピアを含む YAML ディクショナリーを定義します。エントリーが Ansible 管理対象ノードでない場合は、
hostnameパラメーターに完全修飾ドメイン名 (FQDN) または IP アドレスを指定する必要があります。次に例を示します。... - hosts: ... external-host.example.com: hostname: 192.0.2.1このロールは、各管理対象ノード上の VPN 接続を設定します。接続の名前は
<peer_A>-to-<peer_B>です (例:managed-node-01.example.com-to-managed-node-02.example.com)。このロールは外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなピアでは手動で設定を作成する必要があります。auth_method: psk-
ピア間の PSK 認証を有効にします。ロールはコントロールノードで
opensslを使用して PSK を作成します。 auto: <startup_method>-
接続の起動方法を指定します。有効な値は
add、ondemand、start、およびignoreです。詳細は、Libreswan がインストールされているシステム上のipsec.conf(5)man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。 vpn_manage_firewall: true-
ロールにより、管理対象ノード上の
firewalldサービスで必要なポートを開くことを指定します。 vpn_manage_selinux: true- ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.vpn/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
接続が正常に開始されたことを確認します。次に例を示します。
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"' ... 006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の
auto変数をstart以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
6.12.2. vpn RHEL システムロールを使用して、個別のデータプレーンとコントロールプレーンおよび PSK 認証による IPsec ホスト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
IPsec ホスト間 VPN を作成するプロセスを自動化するには、vpn RHEL システムロールを使用します。制御メッセージの傍受や妨害のリスクを最小限に抑えてセキュリティーを強化するには、データトラフィックと制御トラフィックの両方に個別の接続を設定してください。
ホスト間 VPN は、2 つのデバイス間に直接的でセキュアな暗号化された接続を確立し、アプリケーションがインターネットなどのセキュアでないネットワーク経由でセキュアに通信できるようにします。
認証には、事前共有鍵 (PSK) というシンプルな方式が使用されます。この方式では、2 つのピア間のみで共有される 1 つの秘密情報を使用します。この方式は設定が簡単で、デプロイの容易さが優先される基本的なセットアップに最適です。ただし、この鍵は厳重に保管する必要があります。攻撃者が鍵にアクセスすると、接続が侵害されるおそれがあります。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - name: control_plane_vpn hosts: managed-node-01.example.com: hostname: 203.0.113.1 # IP address for the control plane managed-node-02.example.com: hostname: 198.51.100.2 # IP address for the control plane auth_method: psk auto: start - name: data_plane_vpn hosts: managed-node-01.example.com: hostname: 10.0.0.1 # IP address for the data plane managed-node-02.example.com: hostname: 172.16.0.2 # IP address for the data plane auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: trueサンプル Playbook で指定されている設定は次のとおりです。
hosts: <list>VPN を設定するホストを含む YAML ディクショナリーを定義します。接続の名前は
<name>-<IP_address_A>-to-<IP_address_B>です (例:control_plane_vpn-203.0.113.1-to-198.51.100.2)。このロールは、各管理対象ノード上の VPN 接続を設定します。このロールは外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなホストでは手動で設定を作成する必要があります。
auth_method: psk-
ホスト間の PSK 認証を有効にします。ロールはコントロールノードで
opensslを使用して事前共有鍵を作成します。 auto: <startup_method>-
接続の起動方法を指定します。有効な値は
add、ondemand、start、およびignoreです。詳細は、Libreswan がインストールされているシステム上のipsec.conf(5)man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。 vpn_manage_firewall: true-
ロールにより、管理対象ノード上の
firewalldサービスで必要なポートを開くことを指定します。 vpn_manage_selinux: true- ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.vpn/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
接続が正常に開始されたことを確認します。次に例を示します。
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"' ... 006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の
auto変数をstart以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
6.12.3. vpn RHEL システムロールを使用して PSK 認証による IPsec サイト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
サイト間 VPN は、2 つの異なるネットワーク間に暗号化トンネルを確立し、セキュアでないパブリックネットワークを介してそれらをシームレスにリンクします。vpn RHEL システムロールを使用すると、IPsec サイト間 VPN 接続を作成するプロセスを自動化できます。
サイト間 VPN を使用すると、支社のデバイスがすべて同じローカルネットワークの一部であるかのように、企業本社のリソースにアクセスできるようになります。
認証には、事前共有鍵 (PSK) というシンプルな方式が使用されます。この方式では、2 つのピア間のみで共有される 1 つの秘密情報を使用します。この方式は設定が簡単で、デプロイの容易さが優先される基本的なセットアップに最適です。ただし、この鍵は厳重に保管する必要があります。攻撃者が鍵にアクセスすると、接続が侵害されるおそれがあります。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: subnets: - 192.0.2.0/24 managed-node-02.example.com: subnets: - 198.51.100.0/24 - 203.0.113.0/24 auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: trueサンプル Playbook で指定されている設定は次のとおりです。
hosts: <list>VPN を設定するゲートウェイを含む YAML ディクショナリーを定義します。エントリーが Ansible 管理対象ノードでない場合は、
hostnameパラメーターに完全修飾ドメイン名 (FQDN) または IP アドレスを指定する必要があります。次に例を示します。... - hosts: ... external-host.example.com: hostname: 192.0.2.1このロールは、各管理対象ノード上の VPN 接続を設定します。接続の名前は
<gateway_A>-to-<gateway_B>です (例:managed-node-01.example.com-to-managed-node-02.example.com)。このロールは外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなピアでは手動で設定を作成する必要があります。subnets: <yaml_list_of_subnets>- トンネルを介して接続されるサブネットを Classless Inter-Domain Routing (CIDR) 形式で定義します。
auth_method: psk-
ピア間の PSK 認証を有効にします。ロールはコントロールノードで
opensslを使用して PSK を作成します。 auto: <startup_method>-
接続の起動方法を指定します。有効な値は
add、ondemand、start、およびignoreです。詳細は、Libreswan がインストールされているシステム上のipsec.conf(5)man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。 vpn_manage_firewall: true-
ロールにより、管理対象ノード上の
firewalldサービスで必要なポートを開くことを指定します。 vpn_manage_selinux: true- ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.vpn/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
接続が正常に開始されたことを確認します。次に例を示します。
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"' ... 006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の
auto変数をstart以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
6.12.4. vpn RHEL システムロールを使用して証明書ベースの認証による IPsec メッシュ VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
IPsec メッシュは、すべてのサーバーが他のすべてのサーバーとセキュアに直接通信できる、完全に相互接続されたネットワークを形成するものです。vpn RHEL システムロールを使用すると、証明書ベースの認証による管理対象ノード間の VPN メッシュの設定を自動化できます。
IPsec メッシュは、複数のデータセンターやクラウドプロバイダーにまたがる分散データベースクラスターや高可用性環境に最適です。各サーバーペア間に暗号化されたトンネルを直接確立することで、通信の集中によるボトルネックを避けつつ、セキュアな通信を実現できます。
認証のために、認証局 (CA) によって管理されるデジタル証明書を使用すると、非常にセキュアでスケーラブルなソリューションが実現します。メッシュ内のホストが、それぞれ信頼できる CA によって署名された証明書を提示します。この方法により、強力で検証可能な認証が実現し、ユーザー管理が簡素化されます。アクセス権の付与または失効は、CA で一元的に行うことができます。Libreswan は、各証明書を証明書失効リスト (CRL) と照合し、証明書がリストに掲載されていればアクセスを拒否することで、付与や失効を強制します。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。 各管理対象ノード用に PKCS #12 ファイルを用意した。
各ファイルには次のものを含めます。
- サーバーの秘密鍵
- サーバー証明書
- CA 証明書
- 中間証明書 (必要な場合)
-
ファイル名は
<managed_node_name_as_in_the_inventory>.p12とします。 - ファイルは Playbook と同じディレクトリーに保存します。
サーバー証明書には次のフィールドを含めます。
-
Extended Key Usage (EKU) を
TLS Web Server Authenticationに設定します。 - コモンネーム (CN) またはサブジェクト代替名 (SAN) を、ホストの完全修飾ドメイン名 (FQDN) に設定します。
- X509v3 CRL 配布ポイントに、証明書失効リスト (CRL) への URL を含めます。
-
Extended Key Usage (EKU) を
手順
~/inventoryファイルを編集し、cert_name変数を追加します。managed-node-01.example.com cert_name=managed-node-01.example.com managed-node-02.example.com cert_name=managed-node-02.example.com managed-node-03.example.com cert_name=managed-node-03.example.comcert_name変数は、各ホストの証明書で使用されるコモンネーム (CN) フィールドの値に設定します。通常、CN フィールドは完全修飾ドメイン名 (FQDN) に設定します。機密性の高い変数を暗号化されたファイルに保存します。
vault を作成します。
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>ansible-vault createコマンドでエディターが開いたら、機密データを<key>: <value>形式で入力します。pkcs12_pwd: <password>- 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。- name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com vars_files: - ~/vault.yml tasks: - name: Install LibreSwan ansible.builtin.package: name: libreswan state: present - name: Identify the path to IPsec NSS database ansible.builtin.set_fact: nss_db_dir: "{{ '/etc/ipsec.d/' if ansible_distribution in ['CentOS', 'RedHat'] and ansible_distribution_major_version is version('8', '=') else '/var/lib/ipsec/nss/' }}" - name: Locate IPsec NSS database files ansible.builtin.find: paths: "{{ nss_db_dir }}" patterns: "*.db" register: db_files - name: Initialize IPsec NSS database if not initialized ansible.builtin.command: cmd: ipsec initnss when: db_files.matched == 0 - name: Copy PKCS #12 file to the managed node ansible.builtin.copy: src: "~/{{ inventory_hostname }}.p12" dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12" mode: 0600 - name: Import PKCS #12 file in IPsec NSS database ansible.builtin.shell: cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"' - name: Remove PKCS #12 file ansible.builtin.file: path: "/etc/ipsec.d/{{ inventory_hostname }}.p12" state: absent - name: Opportunistic mesh IPsec VPN with certificate-based authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - opportunistic: true auth_method: cert policies: - policy: private cidr: default - policy: private cidr: 192.0.2.0/24 - policy: clear cidr: 192.0.2.1/32 vpn_manage_firewall: true vpn_manage_selinux: trueサンプル Playbook で指定されている設定は次のとおりです。
opportunistic: true-
複数ホスト間のオポチュニスティックメッシュを有効にします。
policies変数は、どのサブネットとホストのトラフィックを暗号化する必要があるか、または暗号化できるか、またどのサブネットとホストでプレーンテキストでの接続の使用を継続するかを定義します。 auth_method: cert- 証明書ベースの認証を有効にします。これを行うには、インベントリーで各管理対象ノードの証明書のニックネームを指定する必要があります。
policies: <list_of_policies>Libreswan ポリシーを YAML リスト形式で定義します。
デフォルトのポリシーは
private-or-clearです。これをprivateに変更するには、上記の Playbook に、デフォルトのcidrエントリーに応じた適切なポリシーを含めます。Ansible コントロールノードが管理対象ノードと同じ IP サブネットにある場合は、Playbook の実行中に SSH 接続が失われるのを防ぐために、コントロールノードの IP アドレスに
clearポリシーを追加します。たとえば、メッシュを192.0.2.0/24サブネット用に設定する必要があり、コントロールノードが IP アドレス192.0.2.1を使用する場合、Playbook に示されているように、192.0.2.1/32のclearポリシーが必要です。ポリシーの詳細は、Libreswan がインストールされているシステム上の
ipsec.conf(5)man ページを参照してください。vpn_manage_firewall: true-
ロールにより、管理対象ノード上の
firewalldサービスで必要なポートを開くことを指定します。 vpn_manage_selinux: true- ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.vpn/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook --ask-vault-pass ~/playbook.yml
検証
メッシュ内のノードで、別のノードに ping を送信して接続をアクティブ化します。
[root@managed-node-01]# ping managed-node-02.example.com接続がアクティブであることを確認します。
[root@managed-node-01]# ipsec trafficstatus 006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'
6.13. nmstatectl を使用して IPsec ベースの VPN 接続を設定する リンクのコピーリンクがクリップボードにコピーされました!
IPsec VPN 接続を設定して、信頼できないネットワーク上に暗号化されたトンネルを確立し、転送中のデータの完全性を確保します。Nmstate を使用すると、宣言型の API を使用して IPsec VPN 接続を作成できます。
nmstatectl ユーティリティーを使用すると、Nmstate API を介して Libreswan IPsec VPN 接続を設定できます。nmstatectl ユーティリティーは、宣言型の Nmstate API を通じてホストネットワークを管理するためのコマンドラインツールです。ユーザーは複数の命令的なコマンドを実行してインターフェイスを設定するのではなく、YAML ファイルで目的の状態を定義します。Nmstate はこの定義を取得してシステムに適用します。このアプローチの主な利点は、アトミックな結果です。Nmstate は、最終的な設定を YAML 定義と正確に一致させます。設定の一部が適用に失敗した場合、すべての変更が自動的にロールバックされるため、システムで不適切なネットワーク状態や壊れたネットワーク状態が発生しません。
NetworkManager-libreswan プラグインの設計上、nmstatectl は一方のピアでのみ使用できます。他方のピアでは Libreswan を手動で設定する必要があります。
6.13.1. nmstatectl を使用して raw RSA 鍵認証による IPsec ホスト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
宣言型の Nmstate API を使用すると、2 つのデバイス間でホスト間 VPN を設定して、セキュアでないネットワーク経由でセキュアに通信することができます。Nmstate を使用すると、結果が必ず設定ファイルと一致したものになります。一致しない場合は、変更がロールバックされます。
認証に関しては、RSA 鍵は事前共有鍵 (PSK) よりもセキュアです。非対称暗号化によって秘密情報共有のリスクが排除されるためです。また、RSA 鍵を使用すると、強力なピアツーピア認証を提供しつつも、認証局 (CA) が不要になるため、デプロイが容易になります。
一般に、どちらのホストを left または right と呼ぶかは任意です。ただし、NetworkManager では、ローカルホストには常に left という用語を使用し、リモートホストには常に right という用語を使用します。
前提条件
リモート側のピアは Libreswan IPsec を実行しており、ホスト間 接続の準備ができています。
NetworkManager-libreswanプラグインの設計上、Nmstate は、同じ接続にこのプラグインを使用する他のピアと通信することはできません。
手順
Libreswan がまだインストールされていない場合は、次の手順を実行します。
必要なパッケージをインストールします。
# dnf install nmstate libreswan NetworkManager-libreswanNetworkManager サービスを再起動します。
# systemctl restart NetworkManagerネットワークセキュリティーサービス (NSS) データベースを初期化します。
# ipsec initnssこのコマンドにより、
/var/lib/ipsec/nss/ディレクトリーにデータベースが作成されます。ファイアウォールで IPsec ポートとプロトコルを開きます。
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
RSA 鍵ペアを作成します。
# ipsec newhostkeyipsecユーティリティーにより、鍵ペアが NSS データベースに保存されます。left と right 両方のピアの Certificate Key Attribute ID (CKAID) を表示します。
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>以降のステップで、両方のピアの CKAID が必要になります。
公開鍵を表示します。
left ピアで次のように入力します。
# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...right ピアで次のように入力します。
# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
これらのコマンドにより、設定ファイルで使用する必要がある対応するパラメーターとともに、公開鍵が表示されます。
次の内容を含む YAML ファイル (例:
~/ipsec-host-to-host-rsa-auth.yml) を作成します。--- interfaces: - name: '<connection_name>' type: ipsec libreswan: ikev2: insist left: <ip_address_or_fqdn_of_left_peer> leftid: peer_b leftrsasigkey: <public_key_of_left_peer> leftmodecfgclient: false right: <ip_address_or_fqdn_of_right_peer> rightid: peer_a rightrsasigkey: <public_key_of_right_peer> rightsubnet: <ip_address_of_right_peer>/32この例で指定されている設定は次のとおりです。
ikev2: insist- 最新の IKEv2 プロトコルを、IKEv1 へのフォールバックなしで、唯一許可されるプロトコルとして定義します。この設定は、Nmstate を使用したホスト間設定では必須です。
left=<ip_address_or_fqdn_of_left_peer>およびright=<ip_address_or_fqdn_of_right_peer>- ピアの IP アドレスまたは DNS 名を定義します。
leftid=<id>およびrightid=<id>-
Internet Key Exchange (IKE) ネゴシエーションプロセス中に各ピアを識別する方法を定義します。これには IP アドレスまたはリテラル文字列を指定できます。NetworkManager は、IP アドレス以外のすべての値をリテラル文字列として解釈し、内部的に先頭に
@記号を追加することに注意してください。そのため、Libreswan ピアも ID としてリテラル文字列を使用する必要があります。そうしないと、認証が失敗します。 leftrsasigkey=<public_key>およびrightrsasigkey=<public_key>-
ピアの公開鍵を指定します。前のステップで
ipsec showhostkeyコマンドによって表示された値を使用します。 leftmodecfgclient: false- このホストで動的設定を無効にします。この設定は、Nmstate を使用したホスト間設定では必須です。
rightsubnet: <ip_address_of_right_peer>/32- ホストがこのピアにのみアクセスできるように定義します。この設定は、Nmstate を使用したホスト間設定では必須です。
設定をシステムに適用します。
# nmstatectl apply ~/ipsec-host-to-host-rsa-auth.yml
検証
IPsec ステータスを表示します。
# ipsec status接続が正常に確立されていれば、出力に次の行が含まれています。
Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。
子 SA が確立されています。
000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;これは、データトラフィックが通過する実際のトンネルです。
トラブルシューティング
NetworkManager が Libreswan に渡す実際の設定を表示するには、次のように入力します。
# nmcli connection export <connection_name>この出力は、リモートホスト上の Libreswan 設定と比較する際に、ID や鍵などの設定の違いを特定するのに役立ちます。
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細および緩和策手順については、VPN 接続を専用ルーティングテーブルに割り当てて、接続がトンネルを迂回するのを防ぐ を参照してください。
6.13.2. nmstatectl を使用して raw RSA 鍵認証による IPsec サイト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
宣言型の Nmstate API を使用すると、2 つの異なるネットワーク間でサイト間 VPN を設定し、セキュアでないネットワークを介してそれらをシームレスにリンクできます。Nmstate を使用すると、結果が必ず設定ファイルと一致したものになります。一致しない場合は、変更がロールバックされます。
ゲートウェイデバイスの認証に関しては、RSA 鍵は事前共有鍵 (PSK) よりもセキュアです。非対称暗号化によって秘密情報共有のリスクが排除されるためです。また、RSA 鍵を使用すると、強力なピアツーピア認証を提供しつつも、認証局 (CA) が不要になるため、デプロイが容易になります。
一般に、どちらのホストを left または right と呼ぶかは任意です。ただし、NetworkManager では、ローカルホストには常に left という用語を使用し、リモートホストには常に right という用語を使用します。
前提条件
リモートゲートウェイは Libreswan IPsec を実行しており、サイト間 接続に対応しています。
NetworkManager-libreswanプラグインの設計上、Nmstate は、同じ接続にこのプラグインを使用する他のピアと通信することはできません。
手順
Libreswan がまだインストールされていない場合は、次の手順を実行します。
必要なパッケージをインストールします。
# dnf install nmstate libreswan NetworkManager-libreswanNetworkManager サービスを再起動します。
# systemctl restart NetworkManagerネットワークセキュリティーサービス (NSS) データベースを初期化します。
# ipsec initnssこのコマンドにより、
/var/lib/ipsec/nss/ディレクトリーにデータベースが作成されます。ファイアウォールで IPsec ポートとプロトコルを開きます。
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
RSA 鍵ペアを作成します。
# ipsec newhostkeyipsecユーティリティーにより、鍵ペアが NSS データベースに保存されます。left と right 両方のピアの Certificate Key Attribute ID (CKAID) を表示します。
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>以降のステップで、両方のピアの CKAID が必要になります。
公開鍵を表示します。
left ピアで次のように入力します。
# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...right ピアで次のように入力します。
# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
これらのコマンドにより、設定ファイルで使用する必要がある対応するパラメーターとともに、公開鍵が表示されます。
次の内容を含む YAML ファイル (例:
~/ipsec-site-to-site-rsa-auth.yml) を作成します。--- interfaces: - name: '<connection_name>' type: ipsec libreswan: ikev2: insist left: <ip_address_or_fqdn_of_left_peer> leftid: peer_b leftrsasigkey: <public_key_of_left_peer> leftmodecfgclient: false leftsubnet: 198.51.100.0/24 right: <ip_address_or_fqdn_of_right_peer> rightid: peer_a rightrsasigkey: <public_key_of_right_peer> rightsubnet: 192.0.2.0/24この例で指定されている設定は次のとおりです。
ikev2: insist- 最新の IKEv2 プロトコルを、IKEv1 へのフォールバックなしで、唯一許可されるプロトコルとして定義します。この設定は、Nmstate を使用したサイト間設定では必須です。
left=<ip_address_or_fqdn_of_left_peer>およびright=<ip_address_or_fqdn_of_right_peer>- ピアの IP アドレスまたは DNS 名を定義します。
leftid=<id>およびrightid=<id>-
Internet Key Exchange (IKE) ネゴシエーションプロセス中に各ピアを識別する方法を定義します。これには IP アドレスまたはリテラル文字列を指定できます。NetworkManager は、IP アドレス以外のすべての値をリテラル文字列として解釈し、内部的に先頭に
@記号を追加することに注意してください。そのため、Libreswan ピアも ID としてリテラル文字列を使用する必要があります。そうしないと、認証が失敗します。 leftrsasigkey=<public_key>およびrightrsasigkey=<public_key>-
ピアの公開鍵を指定します。前のステップで
ipsec showhostkeyコマンドによって表示された値を使用します。 leftmodecfgclient: false- このホストで動的設定を無効にします。この設定は、Nmstate を使用したサイト間設定では必須です。
leftsubnet=<subnet>およびrightsubnet=<subnet>- トンネルを介して接続されるサブネットを Classless Inter-Domain Routing (CIDR) 形式で定義します。
パケット転送を有効にします。
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf設定をシステムに適用します。
# nmstatectl apply ~/ipsec-site-to-site-rsa-auth.yml
検証
IPsec ステータスを表示します。
# ipsec status接続が正常に確立されていれば、出力に次の行が含まれています。
Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。
子 SA が確立されています。
000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;これは、データトラフィックが通過する実際のトンネルです。
- ローカルサブネット内のクライアントから、リモートサブネット内のクライアントに ping を実行します。
トラブルシューティング
NetworkManager が Libreswan に渡す実際の設定を表示するには、次のように入力します。
# nmcli connection export <connection_name>この出力は、リモートホスト上の Libreswan 設定と比較する際に、ID や鍵などの設定の違いを特定するのに役立ちます。
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細および緩和策手順については、VPN 接続を専用ルーティングテーブルに割り当てて、接続がトンネルを迂回するのを防ぐ を参照してください。
6.13.3. nmstatectl を使用してクライアントを IPsec VPN ゲートウェイに接続するように設定する リンクのコピーリンクがクリップボードにコピーされました!
リモートのプライベートネットワーク上のリソースにアクセスするには、ユーザーはまず IPsec VPN 接続を設定する必要があります。Nmstate を使用すると、宣言型の API を使用して既存の Libreswan IPsec ゲートウェイとの接続を作成できます。
一般に、どちらのホストを left または right と呼ぶかは任意です。ただし、NetworkManager では、ローカルホストには常に left という用語を使用し、リモートホストには常に right という用語を使用します。
前提条件
リモートゲートウェイは Libreswan IPsec を実行し、証明書ベースの認証による ホストとサイト間の 接続に対応しています。
NetworkManager-libreswanプラグインの設計上、Nmstate は、同じ接続にこのプラグインを使用する他のピアと通信することはできません。クライアントに、次の内容を含む PKCS#12 ファイル
~/file.p12が存在する。- ユーザーの秘密鍵
- ユーザー証明書
- CA 証明書
- 中間証明書 (必要な場合)
秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。
-
証明書の Extended Key Usage (EKU) が
TLS Web Client Authenticationに設定されている。
手順
Libreswan がまだインストールされていない場合は、以下を実行します。
必要なパッケージをインストールします。
# dnf install nmstate libreswan NetworkManager-libreswanNetworkManager サービスを再起動します。
# systemctl restart NetworkManagerネットワークセキュリティーサービス (NSS) データベースを初期化します。
# ipsec initnssこのコマンドにより、
/var/lib/ipsec/nss/ディレクトリーにデータベースが作成されます。ファイアウォールで IPsec ポートとプロトコルを開きます。
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
PKCS #12 ファイルを NSS データベースにインポートします。
# ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CAユーザーのニックネームと CA 証明書を表示します。
# certutil -L -d /var/lib/ipsec/nss/ Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI user u,u,u Example-CA CT,, ...この情報は Nmstate の YAML ファイルに必要です。
次の内容を含む YAML ファイル (例:
~/ipsec-host-to-site-cert-auth.yml) を作成します。--- interfaces: - name: '<connection_name>' type: ipsec libreswan: ikev2: insist left: <ip_address_or_fqdn_of_left_peer> leftid: '%fromcert' leftcert: <user_certificate_nickname> right: <ip_address_or_fqdn_of_right_peer> rightid: '%fromcert' rightsubnet: 192.0.2.0/24この例で指定されている設定は次のとおりです。
ikev2: insist- 最新の IKEv2 プロトコルを、IKEv1 へのフォールバックなしで、唯一許可されるプロトコルとして定義します。この設定は、Nmstate を使用したホスト/サイト設定では必須です。
left=<ip_address_or_fqdn_of_left_peer>およびright=<ip_address_or_fqdn_of_right_peer>- ピアの IP アドレスまたは DNS 名を定義します。
leftid=%fromcertおよびrightid=%fromcert- 証明書の識別名 (DN) フィールドからアイデンティティーを取得するように Libreswan を設定します。
leftcert="<server_certificate_nickname>"- NSS データベースで使用されるサーバーの証明書のニックネームを設定します。
rightsubnet: <subnet>- ゲートウェイに接続されているサブネットを Classless Inter-Domain Routing (CIDR) 形式で定義します。
設定をシステムに適用します。
# nmstatectl apply ~/ipsec-host-to-site-cert-auth.yml
検証
- リモートネットワーク内のホストへの接続を確立するか、ping を実行します。
トラブルシューティング
NetworkManager が Libreswan に渡す実際の設定を表示するには、次のように入力します。
# nmcli connection export <connection_name>この出力は、リモートホスト上の Libreswan 設定と比較する際に、ID や鍵などの設定の違いを特定するのに役立ちます。
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細および緩和策手順については、VPN 接続を専用ルーティングテーブルに割り当てて、接続がトンネルを迂回するのを防ぐ を参照してください。
6.14. IPsec 設定のトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
IPsec 設定の失敗の診断は困難な場合があります。設定の不一致、ファイアウォールルール、カーネルレベルのエラーによって問題が発生することがあるためです。以下では、IPsec VPN 接続に関する一般的な問題を解決するための体系的な方法を説明します。
6.14.1. 基本的な接続の問題 リンクのコピーリンクがクリップボードにコピーされました!
VPN 接続の問題は、エンドポイント間の設定の不一致が原因で発生することがよくあります。
IPsec 接続が確立されていることを確認するには、次のように入力します。
# ipsec trafficstatus
006 #8: "vpn.example.com"[1] 192.0.2.1, type=ESP, add_time=1595296930, inBytes=5999, outBytes=3231, id='@vpn.example.com', lease=198.51.100.1/32
接続が正常な場合、このコマンドで、接続の名前と詳細を含むエントリーが表示されます。出力が空の場合、トンネルが確立されていません。
6.14.3. 設定の不一致 リンクのコピーリンクがクリップボードにコピーされました!
各エンドポイントが、同じ Internet Key Exchange (IKE) バージョン、アルゴリズム、IP アドレス範囲、または事前共有鍵 (PSK) で設定されていない場合、VPN 接続は失敗します。不一致が見つかった場合は、両方のエンドポイントの設定を調整して問題を解決する必要があります。
- リモートピアが IKE/IPsec を実行していない
接続が拒否された場合、次の ICMP エラーが表示されます。
# ipsec auto --up vpn.example.com ... 000 "vpn.example.com"[1] 192.0.2.2 #16: ERROR: asynchronous network error report on wlp2s0 (192.0.2.2:500), complainant 198.51.100.1: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)]- IKE アルゴリズムの不一致
初期セットアップ中に
NO_PROPOSAL_CHOSEN通知が表示され、接続が失敗します。# ipsec auto --up vpn.example.com ... 003 "vpn.example.com"[1] 193.110.157.148 #3: dropping unexpected IKE_SA_INIT message containing NO_PROPOSAL_CHOSEN notification; message payloads: N; missing payloads: SA,KE,Ni- IPsec アルゴリズムの不一致
最初の交換後、
NO_PROPOSAL_CHOSENエラーで接続が失敗します。# ipsec auto --up vpn.example.com ... 182 "vpn.example.com"[1] 193.110.157.148 #5: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_256 group=MODP2048} 002 "vpn.example.com"[1] 193.110.157.148 #6: IKE_AUTH response contained the error notification NO_PROPOSAL_CHOSEN- IP アドレス範囲の不一致 (IKEv2)
リモートピアが
TS_UNACCEPTABLEエラーで応答します。# ipsec auto --up vpn.example.com ... 1v2 "vpn.example.com" #1: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=MODP2048} 002 "vpn.example.com" #2: IKE_AUTH response contained the error notification TS_UNACCEPTABLE- IP アドレス範囲の不一致 (IKEv1)
クイックモード中に接続がタイムアウトし、ピアがプロポーザルを受け入れなかったことを示すメッセージが表示されます。
# ipsec auto --up vpn.example.com ... 031 "vpn.example.com" #2: STATE_QUICK_I1: 60 second timeout exceeded after 0 retransmits. No acceptable response to our first Quick Mode message: perhaps peer likes no proposal- PSK の不一致 (IKEv2)
ピアが接続を拒否し、
AUTHENTICATION_FAILEDエラーが発生します。# ipsec auto --up vpn.example.com ... 003 "vpn.example.com" #1: received Hash Payload does not match computed value 223 "vpn.example.com" #1: sending notification INVALID_HASH_INFORMATION to 192.0.2.23:500- PSK の不一致 (IKEv1)
ハッシュペイロードが一致しないため、IKE メッセージが読み取り不能になり、
INVALID_HASH_INFORMATIONエラーが発生します。# ipsec auto --up vpn.example.com ... 002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
6.14.4. MTU の問題 リンクのコピーリンクがクリップボードにコピーされました!
最大転送単位 (MTU) の問題によって発生する断続的な IPsec 接続の障害を診断します。暗号化によりパケットサイズが大きくなり、パケットがネットワークの MTU を超えると断片化が発生し、データが失われることがあります。これは大規模なデータ転送でよく見られます。
一般的な症状としては、ping などの小さなパケットでは正常に動作するが、SSH セッションなどの大きなパケットではログイン後にフリーズすることなどが挙げられます。この問題を解決するには、設定ファイルに mtu=1400 オプションを追加して、トンネルの MTU を下げます。
6.14.5. NAT の競合 リンクのコピーリンクがクリップボードにコピーされました!
IPsec ホストが NAT ルーターとしても機能する場合に発生する NAT 競合を解決します。NAT の適用が不適切な場合、暗号化される前に送信元 IP アドレスが変換され、結果としてパケットが暗号化されずにネットワークに送信される可能性があります。
たとえば、IPsec 暗号化が適用される前に、パケットの送信元 IP アドレスがマスカレードルールによって変換されると、そのパケットの送信元が IPsec ポリシーと一致しなくなり、Libreswan がそのパケットを暗号化せずにネットワーク経由で送信してしまいます。
この問題を解決するには、IPsec サブネット間のトラフィックを NAT から除外するファイアウォールルールを追加します。このルールは、一般的な NAT ルールの前に処理されるように、POSTROUTING チェーンの先頭に挿入する必要があります。
例6.1 nftables フレームワークを使用した解決策
次の例では、nftables を使用して、192.0.2.0/24 サブネットと 198.51.100.0/24 サブネット間のトラフィックをアドレス変換から除外する基本的な NAT 環境を設定します。
# nft add table ip nat
# nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
# nft add rule ip nat postrouting ip saddr 192.0.2.0/24 ip daddr 198.51.100.0/24 return
6.14.6. カーネルレベルの IPsec の問題 リンクのコピーリンクがクリップボードにコピーされました!
VPN トンネルが確立されているように見えてもトラフィックが流れていない場合は、カーネルレベルの IPsec の問題をトラブルシューティングします。このような場合は、カーネルの IPsec の状態を調べて、トンネルポリシーと暗号鍵が正しくインストールされているかどうかを確認します。
このプロセスでは、次の 2 つのコンポーネントをチェックします。
- Security Policy Database (SPD): 暗号化するトラフィックをカーネルに指示するルール。
- Security Association Database (SAD): そのトラフィックを暗号化する方法をカーネルに指示する鍵。
まず、SPD に正しいポリシーが存在するかどうかを確認します。
# ip xfrm policy
src 192.0.2.1/32 dst 10.0.0.0/8
dir out priority 666 ptype main
tmpl src 198.51.100.13 dst 203.0.113.22
proto esp reqid 16417 mode tunnel
出力に、leftsubnet および rightsubnet パラメーターに一致するポリシーが、in 方向と out 方向の両方で含まれているはずです。トラフィックのポリシーが表示されない場合は、Libreswan がカーネルルールの作成に失敗しており、トラフィックは暗号化されていません。
ポリシーが存在する場合は、SAD 内に対応する鍵セットがあるかどうかを確認します。
# ip xfrm state
src 203.0.113.22 dst 198.51.100.13
proto esp spi 0xa78b3fdb reqid 16417 mode tunnel
auth-trunc hmac(sha1) 0x3763cd3b... 96
enc cbc(aes) 0xd9dba399...
このコマンドにより、秘密の暗号鍵が表示されます。この出力を共有しないでください。攻撃者がこの出力を使用して VPN トラフィックを復号するおそれがあります。
ポリシーが存在するにもかかわらず、同じ reqid を持つ対応する状態が表示されない場合は、通常、Internet Key Exchange (IKE) ネゴシエーションが失敗しています。2 つの VPN エンドポイントが、鍵セットについて合意できなかったということです。
より詳細な診断を行うには、いずれかのコマンドで -s オプションを使用します。このオプションはトラフィックカウンターを追加します。これは、カーネルが特定のルールに従ってパケットを処理しているかどうかを確認するのに役立ちます。
6.14.7. カーネル IPsec サブシステムのバグ リンクのコピーリンクがクリップボードにコピーされました!
カーネルの IPsec サブシステムに不具合があると、IKE デーモンとの同期が失われる可能性があります。これにより、ネゴシエートされたセキュリティーアソシエーションと実際の IPsec ポリシー適用との間に食い違いが生じ、セキュアなネットワーク通信が妨げられる可能性があります。
カーネルレベルのエラーを確認するには、変換 (XFRM) の統計情報を表示します。
# cat /proc/net/xfrm_stat
出力内のいずれかのカウンター (XfrmInError など) がゼロ以外の値を示している場合、カーネルサブシステムに問題があります。このような場合は、サポートケース を作成し、コマンドの出力と対応する IKE ログを添付してください。
6.14.8. Libreswan ログの表示 リンクのコピーリンクがクリップボードにコピーされました!
Libreswan ログを表示して、IPsec サービスのイベントと問題を診断およびトラブルシューティングします。ipsec サービスのジャーナルにアクセスして、接続のステータスと潜在的な問題に関する情報を取得します。
ジャーナルを表示するには、次のように入力します。
# journalctl -xeu ipsec
デフォルトのロギングレベルでは十分な詳細情報が得られない場合は、/etc/ipsec.conf ファイルの config setup セクションに次の設定を追加して、包括的なデバッグロギングを有効にします。
plutodebug=all
logfile=/var/log/pluto.log
デバッグロギングでは多数のエントリーが生成されることがあります。そのため、メッセージを専用のログファイルにリダイレクトすると、journald および systemd サービスによるメッセージのレート制限を防ぐことができます。
第7章 ネットワークサービスのセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux 9 は、さまざまな種類のネットワークサーバーをサポートしています。RHEL 9 ネットワークサービスを使用すると、システムのセキュリティーが DoS 攻撃 (Denial of Service)、DDoS 攻撃 (Distributed Denial of Service)、スクリプト脆弱性攻撃、バッファーオーバーフロー攻撃など、さまざまな種類の攻撃のリスクにさらされる可能性があります。
攻撃に対するシステムのセキュリティーを強化するには、使用しているアクティブなネットワークサービスを監視することが重要です。たとえば、ネットワークサービスがマシンで実行されている場合に、そのデーモンはネットワークポートでの接続をリッスンするのでセキュリティーが低下する可能性があります。ネットワークに対する攻撃に対する公開を制限するには、未使用のすべてのサービスをオフにする必要があります。
7.1. rpcbind サービスのセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
rpcbind サービスは、Network Information Service (NIS) や Network File System (NFS) などの Remote Procedure Calls (RPC) サービス用の動的ポート割り当てデーモンです。その認証メカニズムは弱く、制御するサービスに幅広いポート範囲を割り当てる可能性があるため、rpcbind をセキュア化することが重要です。
すべてのネットワークへのアクセスを制限し、サーバーのファイアウォールルールを使用して特定の例外を定義することにより、rpcbind のセキュリティーを確保できます。
-
NFSv3サーバーでは、rpcbindサービスが必要です。 -
NFSv4ではrpcbindサービスは必要ありません。
前提条件
-
rpcbindパッケージがインストールされている。 -
firewalldパッケージがインストールされ、サービスが実行されている。
手順
次に、ファイアウォールルールを追加します。
TCP 接続を制限し、
111ポート経由の192.168.0.0/24ホストからのパッケージだけを受け入れます。# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop'TCP 接続を制限し、
111ポート経由のローカルホストからのパッケージだけを受け入れます。# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'UDP 接続を制限し、
111ポート経由の192.168.0.0/24ホストからのパッケージだけを受け入れます。# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="111" protocol="udp" source address="192.168.0.0/24" invert="True" drop'ファイアウォール設定を永続化するには、ファイアウォールルールを追加するときに
--permanentオプションを使用します。
ファイアウォールをリロードして、新しいルールを適用します。
# firewall-cmd --reload
検証
ファイアウォールルールをリストします。
# firewall-cmd --list-rich-rule rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept rule family="ipv4" port port="111" protocol="udp" source address="192.168.0.0/24" invert="True" drop
7.2. rpc.mountd サービスのセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
rpc.mountd デーモンは、NFS マウントプロトコルのサーバー側を実装します。NFS マウントプロトコルは、NFS バージョン 3 (RFC 1813) で使用されます。
rpc.mountd サービスは、サーバーにファイアウォールルールを追加することでセキュリティー保護できます。すべてのネットワークへのアクセスを制限し、ファイアウォールルールを使用して特定の例外を定義できます。
前提条件
-
rpc.mountdパッケージがインストールされている。 -
firewalldパッケージがインストールされ、サービスが実行されている。
手順
以下のように、サーバーにファイアウォールルールを追加します。
192.168.0.0/24ホストからのmountd接続を許可します。# firewall-cmd --add-rich-rule 'rule family="ipv4" service name="mountd" source address="192.168.0.0/24" invert="True" drop'ローカルホストからの
mountd接続を受け入れます。# firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" service name="mountd" accept'ファイアウォール設定を永続化するには、ファイアウォールルールを追加するときに
--permanentオプションを使用します。
ファイアウォールをリロードして、新しいルールを適用します。
# firewall-cmd --reload
検証
ファイアウォールルールをリストします。
# firewall-cmd --list-rich-rule rule family="ipv4" service name="mountd" source address="192.168.0.0/24" invert="True" drop rule family="ipv4" source address="127.0.0.1" service name="mountd" accept
7.3. NFS サービスの保護 リンクのコピーリンクがクリップボードにコピーされました!
Kerberos を使用してすべてのファイルシステム操作を認証および暗号化して、ネットワークファイルシステムバージョン 4 (NFSv4) のセキュリティーを保護できます。ネットワークアドレス変換 (NAT) またはファイアウォールで NFSv4 を使用する場合に、/etc/default/nfs ファイルを変更することで委譲をオフにできます。委譲は、サーバーがファイルの管理をクライアントに委譲する手法です。
対照的に、NFSv3 ではファイルのロックとマウントに Kerberos は使用されません。
NFS サービスは、すべてのバージョンの NFS で TCP を使用してトラフィックを送信します。このサービスは、RPCSEC_GSS カーネルモジュールの一部として Kerberos ユーザーおよびグループ認証をサポートします。
NFS を利用すると、リモートのホストがネットワーク経由でファイルシステムをマウントし、そのファイルシステムを、ローカルにマウントしているファイルシステムのように操作できるようになります。集約サーバーのリソースを統合して、ファイルシステムを共有するときに /etc/nfsmount.conf ファイルの NFS マウントオプションをさらにカスタマイズできます。
7.3.1. NFS サーバーのセキュリティーを保護するエクスポートオプション リンクのコピーリンクがクリップボードにコピーされました!
NFS サーバーは、/etc/exports ファイル内のどのファイルシステムにどのファイルシステムをエクスポートするかなど、ディレクトリーとホストのリスト構造を決定します。
/etc/exports ファイルでは次のエクスポートオプションを使用できます。
ro- NFS ボリュームを読み取り専用としてエクスポートします。
rw-
NFS ボリュームに対する読み取りおよび書き込み要求を許可します。書き込みアクセスが許可されると攻撃のリスクが高まるため、このオプションは注意して使用してください。
rwオプションを使用してディレクトリーをマウントする必要がある場合は、起こりうるリスクを軽減するために、すべてのユーザーがディレクトリーに書き込み可能にしないようにしてください。 root_squash-
uid/gid0 からの要求を匿名のuid/gidにマップします。これは、binユーザーやstaffグループなど、同様に機密である可能性の高い他のuidまたはgidには適用されません。 no_root_squash-
root squash をオフにします。デフォルトでは、NFS 共有は
rootユーザーを、非特権ユーザーであるnobodyユーザーに変更します。これにより、rootが作成したすべてのファイルの所有者がnobodyに変更され、setuidビットが設定されたプログラムのアップロードができなくなります。no_root_squashオプションを使用すると、リモートの root ユーザーは共有ファイルシステムの任意のファイルを変更し、他のユーザーに対してアプリケーションが Trojans に感染した状態のままにします。 secure-
予約ポートへのエクスポートを制限します。デフォルトでは、サーバーは予約済みポートからのクライアント通信のみを許可します。ただし、多くのネットワークで、クライアント上で
rootユーザーになるのは簡単です。そのため、サーバーで予約されたポートからの通信が特権であると仮定することは安全ではありません。そのため、予約ポートの制限は効果が限定的です。Kerberos、ファイアウォール、および特定クライアントへのエクスポートを制限することに依存すると良いでしょう。
/etc/exports ファイルの構文に余分なスペースがあると、設定が大幅に変更される可能性があります。
以下の例では、/tmp/nfs/ ディレクトリーは bob.example.com ホストと共有され、読み取りおよび書き込みのパーミッションを持ちます。
/tmp/nfs/ bob.example.com(rw)
以下の例は上記と同じになりますが、同じディレクトリーを読み取り専用パーミッションで bob.example.com ホストに共有し、ホスト名の後の 1 つのスペース文字が原因で読み取りと書き込み権限で すべてのユーザー に共有します。
/tmp/nfs/ bob.example.com (rw)
showmount -e <hostname> コマンドを入力すると、システム上の共有ディレクトリーを確認できます。
また、NFS サーバーをエクスポートする際に、以下のベストプラクティスを考慮してください。
- 一部のアプリケーションでは、パスワードをプレーンテキストまたは弱い暗号化形式で保存するため、ホームディレクトリーをエクスポートすることはリスクがあります。アプリケーションコードを確認して改善することで、リスクを軽減できます。
- 一部のユーザーは SSH キーにパスワードを設定していないため、この場合もホームディレクトリーによるリスクが発生します。パスワードの使用を強制するか、Kerberos を使用することで、これらのリスクを軽減できます。
-
NFS エクスポートを必要なクライアントのみに制限します。NFS サーバーで
showmount -eコマンドを使用して、サーバーのエクスポート内容を確認します。特に必要のないものはエクスポートしないでください。 - 攻撃のリスクを減らすために、不要なユーザーがサーバーにログインできないようにしてください。サーバーにアクセスできるユーザーを定期的に確認してください。
ファイルシステムのサブディレクトリーをエクスポートするのはセキュアではないため、ファイルシステム全体をエクスポートしてください。攻撃者が、部分的にエクスポートされたファイルシステムのエクスポートされていない部分にアクセスする可能性があります。
7.3.2. NFS クライアントのセキュリティーを保護するマウントオプション リンクのコピーリンクがクリップボードにコピーされました!
mount コマンドに次のオプションを渡すと、NFS ベースのクライアントのセキュリティーを強化できます。
nosuid-
nosuidオプションを使用してset-user-identifierまたはset-group-identifierビットを無効にします。これにより、リモートユーザーがsetuidプログラムを実行してより高い特権を取得するのを防ぎ、setuidオプションの反対となるこのオプションを使用できます。 noexec-
noexecオプションを使用して、クライアント上の実行可能なファイルをすべて無効にします。これを使用して、ユーザーが共有ファイルシステムに配置されたファイルを誤って実行するのを防ぎます。 nodev-
nodevオプションを使用して、クライアントがデバイスファイルをハードウェアデバイスとして処理するのを防ぎます。 resvport-
resvportオプションを使用して、通信を予約済みポートに制限し、特権送信元ポートを使用してサーバーと通信できます。予約済みポートは、rootユーザーなどの特権ユーザーおよびプロセス用に予約されています。 秒-
NFS サーバーの
secオプションを使用して、マウントポイント上のファイルにアクセスするための RPCGSS セキュリティーフレーバーを選択します。有効なセキュリティーフレーバーは、none、sys、krb5、krb5i、およびkrb5pです。
krb5-libs パッケージが提供する MIT Kerberos ライブラリーは、新しいデプロイメントで Data Encryption Standard (DES) アルゴリズムに対応しなくなりました。DES は、セキュリティーと互換性の理由から、Kerberos ライブラリーでは非推奨であり、デフォルトで無効になっています。互換性の理由でご使用の環境で DES が必要な場合を除き、DES の代わりに新しくより安全なアルゴリズムを使用してください。
7.3.3. ファイアウォールでの NFS のセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
NFS サーバーでファイアウォールを保護するには、必要なポートのみを開いてください。他のサービスには NFS 接続ポート番号を使用しないでください。
前提条件
-
nfs-utilsパッケージがインストールされている。 -
firewalldパッケージがインストールされ、実行されている。
手順
-
NFSv4 では、ファイアウォールは TCP ポート
2049を開く必要があります。 NFSv3 では、
2049で 4 つのポートを追加で開きます。rpcbindサービスは NFS ポートを動的に割り当て、ファイアウォールルールの作成時に問題が発生する可能性があります。このプロセスを簡素化するには、/etc/nfs.confファイルを使用して、使用するポートを指定します。-
[mountd]セクションのmountd(rpc.mountd) の TCP および UDP ポートをport=<value>形式で設定します。 -
[statd]セクションのstatd(rpc.statd) の TCP および UDP ポートをport=<value>形式で設定します。
-
/etc/nfs.confファイルで NFS ロックマネージャー (nlockmgr) の TCP および UDP ポートを設定します。-
[lockd]セクションのnlockmgr(rpc.statd) の TCP ポートをport=value形式で設定します。または、/etc/modprobe.d/lockd.confファイルのnlm_tcpportオプションを使用することもできます。 -
[lockd]セクションのnlockmgr(rpc.statd) の UDP ポートをudp-port=value形式で設定します。または、/etc/modprobe.d/lockd.confファイルのnlm_udpportオプションを使用することもできます。
-
検証
NFS サーバー上のアクティブなポートと RPC プログラムをリスト表示します。
$ rpcinfo -p
7.4. FTP サービスのセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
ファイル転送プロトコル (FTP) を使用して、ネットワーク経由でファイルを転送できます。ユーザー認証を含むサーバーとの FTP トランザクションは、すべて暗号化されるわけではないため、サーバーがセキュアに設定されていることを確認してください。
RHEL 9 は、2 つの FTP サーバーを提供します。
- Red Hat Content Accelerator (
tux) - FTP 機能を備えたカーネル空間 Web サーバー。
- Very Secure FTP Daemon (
vsftpd) - セキュリティーを重視した、FTP サービスのスタンドアロンの実装。
vsftpd FTP サービスをセットアップするためのセキュリティーガイドラインを以下に示します。
7.4.1. FTP グリーティングバナーのセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
ユーザーが FTP サービスに接続すると、FTP はグリーティングバナーを表示します。このバナーには、デフォルトでバージョン情報が含まれています。攻撃者がこの情報を利用してシステムの弱点を特定する可能性があります。デフォルトのバナーを変更することで、この情報を非表示にすることができます。
/etc/banners/ftp.msg ファイルを編集して、単一行のメッセージを直接含めるか、複数行のメッセージを含めることができる別のファイルを参照して、カスタムバナーを定義できます。
手順
1 行のメッセージを定義するには、次のオプションを
/etc/vsftpd/vsftpd.confファイルに追加します。ftpd_banner=Hello, all activity on ftp.example.com is logged.別のファイルでメッセージを定義するには以下を実行します。
バナーメッセージを含む
.msgファイルを作成します。(例:/etc/banners/ftp.msg)######### Hello, all activity on ftp.example.com is logged. #########複数のバナーの管理を簡素化するには、すべてのバナーを
/etc/banners/ディレクトリーに配置します。バナーファイルへのパスを
/etc/vsftpd/vsftpd.confファイルのbanner_fileオプションに追加します。banner_file=/etc/banners/ftp.msg
検証
変更されたバナーを表示します。
$ ftp localhost Trying ::1… Connected to localhost (::1). Hello, all activity on ftp.example.com is logged.
7.4.2. FTP での匿名アクセスとアップロードの防止 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、vsftpd パッケージをインストールすると、/var/ftp/ ディレクトリーと、ディレクトリーに対する読み取り専用権限を持つ匿名ユーザー用のディレクトリーツリーが作成されます。匿名ユーザーはデータにアクセスできるため、これらのディレクトリーに機密データを保存しないでください。
システムのセキュリティーを強化するために、匿名ユーザーが特定のディレクトリーにファイルをアップロードできるが、データは読み取れないように、FTP サーバーを設定できます。次の手順では、匿名ユーザーが root ユーザー所有のディレクトリーにファイルをアップロードできるが変更できないようにする必要があります。
手順
/var/ftp/pub/ディレクトリーに書き込み専用ディレクトリーを作成します。# mkdir /var/ftp/pub/upload # chmod 730 /var/ftp/pub/upload # ls -ld /var/ftp/pub/upload drwx-wx---. 2 root ftp 4096 Nov 14 22:57 /var/ftp/pub/upload/etc/vsftpd/vsftpd.confファイルに以下の行を追加します。anon_upload_enable=YES anonymous_enable=YES-
オプション: システムで SELinux が有効で Enforcing に設定されている場合には、SELinux ブール属性
allow_ftpd_anon_writeおよびallow_ftpd_full_accessを有効にします。
匿名ユーザーによるディレクトリーの読み取りと書き込みを許可すると、盗まれたソフトウェアのリポジトリーになってしまう可能性があります。
7.4.3. FTP のユーザーアカウントのセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
FTP は、認証のために安全でないネットワークを介して暗号化されていないユーザー名とパスワードを送信します。システムユーザーが自分のユーザーアカウントからサーバーにアクセスできないようにして、FTP のセキュリティーを向上させることができます。
以下の手順のうち、お使いの設定に該当するものをできるだけ多く実行してください。
手順
/etc/vsftpd/vsftpd.confファイルに次の行を追加して、vsftpdサーバーのすべてのユーザーアカウントを無効にします。local_enable=NO-
/etc/pam.d/vsftpdPAM 設定ファイルにユーザー名を追加して、特定のアカウントまたは特定のアカウントグループ (rootユーザーやsudo権限を持つユーザーなど) の FTP アクセスを無効にします。 -
/etc/vsftpd/ftpusersファイルにユーザー名を追加して、ユーザーアカウントを無効にします。
7.5. HTTP サーバーのセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
7.5.1. httpd.conf のセキュリティー強化 リンクのコピーリンクがクリップボードにコピーされました!
/etc/httpd/conf/httpd.conf ファイルでセキュリティーオプションを設定して、Apache HTTP のセキュリティーを強化できます。
システムで実行されているすべてのスクリプトが正しく機能することを常に確認してから、本番環境に移行してください。
root ユーザーのみが、スクリプトまたは Common Gateway Interface (CGI) を含むディレクトリーへの書き込み権限を持っていることを確認してください。ディレクトリーの所有権を、書き込み権限を持つ root に変更するには、次のコマンドを入力します。
# chown root <directory_name>
# chmod 755 <directory_name>
/etc/httpd/conf/httpd.conf ファイルでは、次のオプションを設定できます。
FollowSymLinks- このディレクティブはデフォルトで有効になっており、ディレクトリー内のシンボリックリンクをたどります。
Indexes- このディレクティブはデフォルトで有効になっています。訪問者がサーバー上のファイルを閲覧できないようにするには、このディレクティブを削除してください。
UserDir-
このディレクティブは、システム上にユーザーアカウントが存在することを確認できるため、デフォルトでは無効になっています。
/root/以外のすべてのユーザーディレクトリーのユーザーディレクトリーブラウジングをアクティブにするには、UserDir enabledとUserDir disabledの root ディレクティブを使用します。無効化されたアカウントのリストにユーザーを追加するには、UserDir disabled行にスペースで区切られたユーザーのリストを追加します。 ServerTokensこのディレクティブは、クライアントに送り返されるサーバー応答ヘッダーフィールドを制御します。以下のパラメーターを使用するとログの出力をカスタマイズできます。
ServerTokens Full以下のように、Web サーバーのバージョン番号、サーバーのオペレーティングシステムの詳細、インストールされている Apache モジュールなど、利用可能なすべての情報を指定します。
Apache/2.4.37 (Red Hat Enterprise Linux) MyMod/1.2ServerTokens Full-Release以下のように、利用可能なすべての情報をリリースバージョンとともに指定します。
Apache/2.4.37 (Red Hat Enterprise Linux) (Release 41.module+el8.5.0+11772+c8e0c271)ServerTokens Prod / ServerTokens ProductOnly以下のように、Web サーバー名を指定します。
ApacheServerTokens Major以下のように、Web サーバーのメジャーリリースバージョンを指定します。
Apache/2ServerTokens Minor以下のように、Web サーバーのマイナーリリースバージョンを指定します。
Apache/2.4ServerTokens Min/ServerTokens Minimal以下のように、Web サーバーの最小リリースバージョンを指定します。
Apache/2.4.37ServerTokens OS以下のように、Web サーバーのリリースバージョンとオペレーティングシステムを指定します。
Apache/2.4.37 (Red Hat Enterprise Linux)ServerTokens Prodオプションを使用して、攻撃者がシステムに関する貴重な情報を入手するリスクを軽減します。
IncludesNoExec ディレクティブを削除しないでください。デフォルトでは、Server Side Include (SSI) モジュールはコマンドを実行できません。これを変更すると、攻撃者がシステムにコマンドを入力できるようになる可能性があります。
httpd モジュールの削除
httpd モジュールを削除して、HTTP サーバーの機能を制限できます。これを行うには、/etc/httpd/conf.modules.d/ または /etc/httpd/conf.d/ ディレクトリーの設定ファイルを編集します。たとえば、プロキシーモジュールを削除するためには、以下のコマンドを実行します。
echo '# All proxy modules disabled' > /etc/httpd/conf.modules.d/00-proxy.conf
7.5.2. Nginx サーバー設定のセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
Nginx は、高性能の HTTP およびプロキシーサーバーです。次の設定オプションを使用して、Nginx 設定を強化できます。
手順
バージョン文字列を無効にするには、
server_tokens設定オプションを変更します。server_tokens off;このオプションは、サーバーのバージョン番号などの追加の情報表示を停止します。以下のようにこの設定では、Nginx によって処理されるすべての要求のサーバー名のみが表示されます。
$ curl -sI http://localhost | grep Server Server: nginx特定の
/etc/nginx/conf ファイルに、特定の既知の Web アプリケーションの脆弱性を軽減するセキュリティーヘッダーを追加します。たとえば、
X-Frame-Optionsヘッダーオプションは、Nginx が提供するコンテンツのフレーム化がされないように、ドメイン外のページを拒否して、クリックジャッキング攻撃を軽減します。add_header X-Frame-Options "SAMEORIGIN";たとえば、
x-content-typeヘッダーは、特定の古いブラウザーでの MIME タイプのスニッフィングを防ぎます。add_header X-Content-Type-Options nosniff;また、
X-XSS-Protectionヘッダーは、クロスサイトスクリプティング (XSS) フィルタリングを有効にし、Nginx での応答に含まれる可能性がある、悪意のあるコンテンツをブラウザーがレンダリングしないようにします。add_header X-XSS-Protection "1; mode=block";
たとえば、一般に公開されるサービスを制限し、訪問者からのサービスと受け入れを制限できます。
limit_except GET { allow 192.168.1.0/32; deny all; }スニペットは、
GETとHEADを除くすべてのメソッドへのアクセスを制限します。以下のように、HTTP メソッドを無効にできます。
# Allow GET, PUT, POST; return "405 Method Not Allowed" for all others. if ( $request_method !~ ^(GET|PUT|POST)$ ) { return 405; }- Nginx Web サーバーによって提供されるデータを保護するように SSL を設定できます。これは、HTTPS 経由でのみ提供することを検討してください。さらに、Mozilla SSL Configuration Generator を使用して、Nginx サーバーで SSL を有効にするための安全な設定プロファイルを生成できます。生成された設定により、既知の脆弱なプロトコル (SSLv2 や SSLv3 など)、暗号、ハッシュアルゴリズム (3DES や MD5 など) が確実に無効化されます。また、SSL サーバーテストを使用して、設定した内容が最新のセキュリティー要件を満たしていることを確認できます。
7.6. 認証されたローカルユーザーへのアクセスを制限することによる PostgreSQL のセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
PostgreSQL は、オブジェクトリレーショナルデータベース管理システム (DBMS) です。Red Hat Enterprise Linux では、PostgreSQL は postgresql-server パッケージによって提供されます。
クライアント認証を設定して、攻撃のリスクを減らすことができます。データベースクラスターのデータディレクトリーに保存されている pg_hba.conf 設定ファイルは、クライアント認証を制御します。手順に従って、ホストベースの認証用に PostgreSQL を設定します。
手順
PostgreSQL をインストールします。
# yum install postgresql-server次のいずれかのオプションを使用して、データベースストレージ領域を初期化します。
initdbユーティリティーの使用:$ initdb -D /home/postgresql/db1/-Dオプションを指定したinitdbコマンドを実行すると、指定したディレクトリーがまだ存在しない場合は作成します (例:/home/postgresql/db1/)。このディレクトリーには、データベースに保存されているすべてのデータと、クライアント認証設定ファイルが含まれています。postgresql-setupスクリプトの使用:$ postgresql-setup --initdbデフォルトでは、スクリプトは
/var/lib/pgsql/data/ディレクトリーを使用します。このスクリプトは、基本的なデータベースクラスター管理でシステム管理者を支援します。
認証されたローカルユーザーが自分のユーザー名でデータベースにアクセスできるようにするには、
pg_hba.confファイルの以下の行を変更します。local all all trustこれは、データベースユーザーを作成し、ローカルユーザーを作成しないレイヤー型アプリケーションを使用する場合に、問題となることがあります。システム上のすべてのユーザー名を明示的に制御しない場合は、
pg_hba.confファイルからlocalの行を削除してください。データベースを再起動して、変更を適用します。
# systemctl restart postgresql前のコマンドはデータベースを更新し、設定ファイルの構文も検証します。
7.7. Memcached サービスのセキュリティー保護 リンクのコピーリンクがクリップボードにコピーされました!
Memcached は、オープンソースの高性能分散メモリーオブジェクトキャッシングシステムです。データベースの負荷を軽減して、動的 Web アプリケーションのパフォーマンスを向上させることができます。
Memcached は、データベース呼び出し、API 呼び出し、またはページレンダリングの結果から、文字列やオブジェクトなどの任意のデータの小さなチャンクを格納するメモリー内のキーと値のストアです。Memcached を使用すると、十分に活用されていない領域から、より多くのメモリーを必要とするアプリケーションにメモリーを割り当てることができます。
2018 年に、パブリックインターネットに公開されている Memcached サーバーを悪用することによる DDoS 増幅攻撃の脆弱性が発見されました。これらの攻撃は、トランスポートに UDP プロトコルを使用する Memcached 通信を利用します。この攻撃は増幅率が高いため、効果的です。数百バイトのサイズの要求は、数メガバイトまたは数百メガバイトのサイズの応答を生成することができます。
ほとんどの場合、memcached サービスはパブリックインターネットに公開する必要はありません。このような公開を行うと、固有のセキュリティー上の問題が発生し、リモートの攻撃者によって Memcached に保存されている情報が漏洩または変更される可能性があります。
7.7.1. DDoS に対する Memcached の強化 リンクのコピーリンクがクリップボードにコピーされました!
セキュリティーリスクを軽減するために、以下の手順のうち、お使いの設定に該当するものをできるだけ多く実行してください。
手順
LAN にファイアウォールを設定してください。Memcached サーバーにローカルネットワークだけでアクセスできるようにする必要がある場合は、
memcachedサービスで使用されるポートに外部トラフィックをルーティングしないでください。たとえば、許可されたポートのリストからデフォルトのポート11211を削除します。# firewall-cmd --remove-port=11211/udp # firewall-cmd --runtime-to-permanentアプリケーションと同じマシン上で 1 台の Memcached サーバーを使用する場合は、localhost トラフィックのみをリッスンするように
memcachedを設定します。/etc/sysconfig/memcachedファイルのOPTIONS値を変更します。OPTIONS="-l 127.0.0.1,::1"Simple Authentication and Security Layer (SASL) 認証を有効にします。
/etc/sasl2/memcached.confファイルで、以下のように修正または追加します。sasldb_path: /path.to/memcached.sasldbSASL データベースにアカウントを追加します。
# saslpasswd2 -a memcached -c cacheuser -f /path.to/memcached.sasldbmemcachedのユーザーとグループがデータベースにアクセスできることを確認します。# chown memcached:memcached /path.to/memcached.sasldb/etc/sysconfig/memcachedファイルのOPTIONSパラメーターに-S値を追加して、Memcached で SASL サポートを有効にします。OPTIONS="-S"Memcached サーバーを再起動して、変更を適用します。
# systemctl restart memcached- SASL データベースで作成したユーザー名とパスワードを、お使いのアプリケーションの Memcached クライアント設定に追加します。
Memcached クライアントとサーバー間の通信を TLS で暗号化します。
/etc/sysconfig/memcachedファイルのOPTIONSパラメーターに-Z値を追加して、TLS を使用した Memcached クライアントとサーバー間の暗号化通信を有効にします。OPTIONS="-Z"-
-o ssl_chain_certオプションを使用して、証明書チェーンファイルパスを PEM 形式で追加します。 -
-o ssl_keyオプションを使用して、秘密鍵ファイルのパスを追加します。
第8章 MACsec を使用した同じ物理ネットワーク内のレイヤー 2 トラフィックの暗号化 リンクのコピーリンクがクリップボードにコピーされました!
MACsec はデバイス間のポイントツーポイント通信を保護します。たとえば、メトロイーサネット接続を介して支社を本社を接続する 2 台のホストで MACsec を設定して、セキュリティーを強化できます。
8.1. MACsec がセキュリティーを強化する方法 リンクのコピーリンクがクリップボードにコピーされました!
Media Access Control Security (MACsec) は、すべての LAN トラフィックを暗号化して認証するレイヤー 2 プロトコルです。接続を確立するために事前共有鍵を使用します。事前共有鍵を変更するには、MACsec を使用するすべてのホストで NetworkManager 設定を更新する必要があります。
MACsec は、イーサネットリンク上で、以下を含むさまざまな種類のトラフィックを保護します。
- Dynamic Host Configuration Protocol (DHCP)
- アドレス解決プロトコル (ARP)
- IPv4 および IPv6 トラフィック
- TCP や UDP などの IP 経由のトラフィック
MACsec 接続は、イーサネットネットワークカード、仮想ローカルエリアネットワーク (VLAN)、トンネルデバイスなどのイーサネットデバイスを親として使用します。暗号化された接続のみを使用して他のホストと通信するように MACsec デバイスにのみ IP 設定を指定することも、親デバイスに IP 設定を設定することもできます。後者の場合、親デバイスを使用して、暗号化されていない接続と暗号化された接続用の MACsec デバイスで他のホストと通信できます。
MACsec には特別なハードウェアは必要ありません。たとえば、ホストとスイッチの間のトラフィックのみを暗号化する場合を除き、任意のスイッチを使用できます。このシナリオでは、スイッチが MACsec もサポートする必要があります。
つまり、次の 2 つの一般的なシナリオに合わせて MACsec を設定できます。
- ホストからホストへ
- ホストからスイッチへ、およびスイッチから他のホストへ
MACsec は、同じ物理 LAN または仮想 LAN 内にあるホスト間でのみ使用できます。
リンク層 (Open Systems Interconnection (OSI) モデルのレイヤー 2 とも呼ばれます) での通信を保護するために MACsec セキュリティー標準を使用すると、主に次のような利点が得られます。
- レイヤー 2 で暗号化することで、レイヤー 7 で個々のサービスを暗号化する必要がなくなります。これにより、各ホストの各エンドポイントで多数の証明書を管理することに関連するオーバーヘッドが削減されます。
- ルーターやスイッチなどの直接接続されたネットワークデバイス間のポイントツーポイントセキュリティー。
- アプリケーションや上位レイヤープロトコルに変更を加える必要がなくなります。
8.2. nmcli を使用した MACsec 接続の設定 リンクのコピーリンクがクリップボードにコピーされました!
nmcli ユーティリティーを使用して、MACsec を使用するようにイーサネットインターフェイスを設定できます。たとえば、イーサネット経由で接続された 2 つのホスト間に MACsec 接続を作成できます。
手順
MACsec を設定する最初のホストで:
事前共有鍵の接続アソシエーション鍵 (CAK) と接続アソシエーション鍵名 (CKN) を作成します。
16 バイトの 16 進 CAK を作成します。
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a32 バイトの 16 進 CKN を作成します。
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
- 両方のホストで、MACsec 接続を介して接続します。
MACsec 接続を作成します。
# nmcli connection add type macsec con-name macsec0 ifname macsec0 connection.autoconnect yes macsec.parent enp1s0 macsec.mode psk macsec.mka-cak 50b71a8ef0bd5751ea76de6d6c98c03a macsec.mka-ckn f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550前の手順で生成された CAK および CKN を
macsec.mka-cakおよびmacsec.mka-cknパラメーターで使用します。この値は、MACsec で保護されるネットワーク内のすべてのホストで同じである必要があります。MACsec 接続で IP を設定します。
IPv4設定を指定します。たとえば、静的IPv4アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーをmacsec0接続に設定するには、以下のコマンドを実行します。# nmcli connection modify macsec0 ipv4.method manual ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253'IPv6設定を指定しますたとえば、静的IPv6アドレス、ネットワークマスク、デフォルトゲートウェイ、および DNS サーバーをmacsec0接続に設定するには、以下のコマンドを実行します。# nmcli connection modify macsec0 ipv6.method manual ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd'
接続をアクティベートします。
# nmcli connection up macsec0
検証
トラフィックが暗号化されていることを確認します。
# tcpdump -nn -i enp1s0オプション: 暗号化されていないトラフィックを表示します。
# tcpdump -nn -i macsec0MACsec の統計を表示します。
# ip macsec showintegrity-only (encrypt off) および encryption (encrypt on) の各タイプの保護に対して個々のカウンターを表示します。
# ip -s macsec show
8.3. nmstatectl を使用した MACsec 接続の設定 リンクのコピーリンクがクリップボードにコピーされました!
宣言型の Nmstate API を使用して、MACsec を使用するようにイーサネットインターフェイスを設定できます。Nmstate を使用すると、結果が必ず設定ファイルと一致したものになります。一致しない場合は、変更がロールバックされます。
前提条件
- 物理または仮想イーサネットネットワークインターフェイスコントローラー (NIC) がサーバーに設定されている。
-
nmstateパッケージがインストールされている。
手順
MACsec を設定する最初のホストで、事前共有キー用の接続関連キー (CAK: connectivity association key) および接続関連キー名 (CKN: connectivity-association key name) を作成します。
16 バイトの 16 進 CAK を作成します。
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a32 バイトの 16 進 CKN を作成します。
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
MACsec 接続を介して接続するホストの両方で、次の手順を実行します。
次の設定を含む YAML ファイル (例:
create-macsec-connection.yml) を作成します。--- routes: config: - destination: 0.0.0.0/0 next-hop-interface: macsec0 next-hop-address: 192.0.2.2 table-id: 254 - destination: 192.0.2.2/32 next-hop-interface: macsec0 next-hop-address: 0.0.0.0 table-id: 254 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb interfaces: - name: macsec0 type: macsec state: up ipv4: enabled: true address: - ip: 192.0.2.1 prefix-length: 32 ipv6: enabled: true address: - ip: 2001:db8:1::1 prefix-length: 64 macsec: encrypt: true base-iface: enp0s1 mka-cak: 50b71a8ef0bd5751ea76de6d6c98c03a mka-ckn: f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550 port: 0 validation: strict send-sci: true-
前の手順で生成された CAK および CKN を
mka-cakおよびmka-cknパラメーターで使用します。この値は、MACsec で保護されるネットワーク内のすべてのホストで同じである必要があります。 オプション: 同じ YAML 設定ファイルで、以下も設定できます。
-
静的 IPv4 アドレス:
192.0.2.1(サブネットマスクが/32) -
静的 IPv6 アドレス:
2001:db8:1::1(サブネットマスクが/64) -
IPv4 デフォルトゲートウェイ -
192.0.2.2 -
IPv4 DNS サーバー -
192.0.2.200 -
IPv6 DNS サーバー -
2001:db8:1::ffbb -
DNS 検索ドメイン -
example.com
-
静的 IPv4 アドレス:
設定をシステムに適用します。
# nmstatectl apply create-macsec-connection.yml
検証
現在の状態を YAML 形式で表示します。
# nmstatectl show macsec0トラフィックが暗号化されていることを確認します。
# tcpdump -nn -i enp0s1オプション: 暗号化されていないトラフィックを表示します。
# tcpdump -nn -i macsec0MACsec の統計を表示します。
# ip macsec showintegrity-only (encrypt off) および encryption (encrypt on) の各タイプの保護に対して個々のカウンターを表示します。
# ip -s macsec show
第9章 Postfix サービスを保護する リンクのコピーリンクがクリップボードにコピーされました!
暗号化を使用するように設定し、さまざまな攻撃によるリスクを軽減する設定を適用することで、Postfix メール転送エージェントを保護します。これには、SASL を使用して SMTP 認証 (AUTH) を設定し、サービス拒否 (DoS) 攻撃に対する脆弱性を軽減するための制限を設定することが含まれます。
Postfix は、SMTP (Simple Mail Transfer Protocol) を使用して他の MTA 間で電子メッセージを配信したり、クライアントや配信エージェントにメールを送信したりするメール転送エージェント (MTA) です。MTA は相互間のトラフィックを暗号化できますが、デフォルトではそうしない場合があります。
9.2. DoS 攻撃を制限するための Postfix 設定オプション リンクのコピーリンクがクリップボードにコピーされました!
特定の Postfix オプションを設定することで、サービス拒否 (DoS) 攻撃を制限できます。これには、大量のトラフィックからサーバーを保護するために、レート制限とメッセージサイズ制限を厳格に設定することが含まれます。
攻撃者は、サーバーに大量のトラフィックを送り込んだり、クラッシュを引き起こすような情報を送信したりすることで、サービス拒否 (DoS) 攻撃を引き起こすことができる。/etc/postfix/main.cf ファイルで制限を設定することにより、このような攻撃のリスクを軽減するようにシステムを設定できます。既存のディレクティブの値を変更することも、<directive> = <value> という形式のカスタム値を使用して新しいディレクティブを追加することもできます。
DoS 攻撃を制限するには、次のディレクティブのリストを使用します。
smtpd_client_connection_rate_limit-
クライアントがこのサービスに対して時間単位あたりに実行できる接続試行の最大数を制限します。デフォルト値は
0です。これは、クライアントが時間単位で Postfix が受け入れることができる数と同じ数の接続を行うことができることを意味します。デフォルトでは、ディレクティブは信頼できるネットワークのクライアントを除外します。 anvil_rate_time_unit-
レート制限を計算するための時間単位を定義します。デフォルト値は
60秒です。 smtpd_client_event_limit_exceptions- 接続およびレート制限コマンドからクライアントを除外します。デフォルトでは、ディレクティブは信頼できるネットワークのクライアントを除外します。
smtpd_client_message_rate_limit- 時間単位あたりのクライアントからの要求に対するメッセージ配信の最大数を定義します (Postfix が実際にそれらのメッセージを受け入れるかどうかは関係ありません)。
default_process_limit-
特定のサービスを提供する Postfix 子プロセスのデフォルトの最大数を定義します。
master.cfファイル内の特定のサービスでは、このルールを無視できます。デフォルトでは、値は100です。 queue_minfree-
キューファイルシステムでメールを受信するために必要な最小の空き容量を定義します。このディレクティブは現在、Postfix SMTP サーバーがメールを受け入れるかどうかを決定するために使用されています。デフォルトでは、Postfix SMTP サーバーは、空き容量が
message_size_limitの 1.5 倍未満の場合に、MAIL FROMコマンドを拒否します。空き容量の最小値をこれよりも高く指定するには、message_size_limitの 1.5 倍以上のqueue_minfree値を指定します。デフォルトのqueue_minfree値は0です。 header_size_limit-
メッセージヘッダーを格納するためのメモリーの最大量をバイト単位で定義します。ヘッダーが大きい場合、余分なヘッダーは破棄されます。デフォルトでは、値は
102400バイトです。 message_size_limit-
エンベロープ情報を含むメッセージの最大サイズをバイト単位で定義します。デフォルトでは、値は
10240000バイトです。
9.3. Postfix が SASL を使用する設定 リンクのコピーリンクがクリップボードにコピーされました!
Postfix メール転送エージェントを、Simple Authentication and Security Layer (SASL) を使用するように設定できます。これにより、電子メッセージの送受信時の認証が強化されます。
Postfix は SASL ベースの SMTP 認証 (AUTH) をサポートしています。SMTP AUTH は Simple Mail Transfer Protocol の拡張です。現在、Postfix SMTP サーバーは次の方法で SASL 実装をサポートしています:
- Dovecot SASL
- Postfix SMTP サーバーは、UNIX ドメインソケットまたは TCP ソケットのいずれかを使用して、Dovecot SASL 実装と通信できます。Postfix と Dovecot アプリケーションが別のマシンで実行している場合は、この方法を使用します。
- Cyrus SASL
- 有効にすると、SMTP クライアントは、サーバーとクライアントの両方でサポートおよび受け入れられる認証方法を使用して、SMTP サーバーで認証する必要があります。
前提条件
-
dovecotパッケージがシステムにインストールされている
手順
Dovecot をセットアップします。
/etc/dovecot/conf.d/10-master.confファイルに次の行を含めます。service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } }前の例では、Postfix と Dovecot の間の通信に UNIX ドメインソケットを使用しています。また、
/var/spool/postfix/ディレクトリーにあるメールキュー、およびpostfixユーザーとグループの下で実行しているアプリケーションを含む Postfix SMTP サーバーのデフォルト設定を想定しています。オプション: TCP 経由で Postfix 認証リクエストをリッスンするように Dovecot をセットアップします。
service auth { inet_listener { port = <port-number> } }/etc/dovecot/conf.d/10-auth.confファイルのauth_mechanismsパラメーターを編集して、メールクライアントが Dovecot での認証に使用する方法を指定します。auth_mechanisms = plain loginauth_mechanismsパラメーターは、さまざまなプレーンテキストおよび非プレーンテキストの認証方法をサポートしています。
/etc/postfix/main.cfファイルを変更して Postfix をセットアップします。Postfix SMTP サーバーで SMTP 認証を有効にします。
smtpd_sasl_auth_enable = yesSMTP 認証用の Dovecot SASL 実装の使用を有効にします。
smtpd_sasl_type = dovecotPostfix キューディレクトリーに相対的な認証パスを指定します。相対パスを使用すると、Postfix サーバーが
chrootで実行しているかどうかに関係なく、設定が確実に機能することに注意してください。smtpd_sasl_path = private/authこの手順では、Postfix と Dovecot の間の通信に UNIX ドメインソケットを使用します。
通信に TCP ソケットを使用する場合に、別のマシンで Dovecot を探すように Postfix を設定するには、次のような設定値を使用します。
smtpd_sasl_path = inet: <IP_address> : <port_number>前の例で、ip-address を Dovecot マシンの IP アドレスに置き換え、port-number を Dovecot の
/etc/dovecot/conf.d/10-master.confファイルで指定されたポート番号に置き換えます。Postfix SMTP サーバーがクライアントに提供する SASL メカニズムを指定します。暗号化されたセッションと暗号化されていないセッションに異なるメカニズムを指定できることに注意してください。
smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous前のディレクティブは、暗号化されていないセッションでは匿名認証が許可されず、暗号化されていないユーザー名またはパスワードを送信するメカニズムが許可されていないことを指定しています。暗号化セッション (TLS を使用) の場合、非匿名認証メカニズムのみが許可されます。