ネットワークのセキュリティー保護
セキュリティー保護されたネットワークおよびネットワーク通信の設定
概要
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 鍵ペアを生成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow パラメーターなしで
ssh-keygen
コマンドを使用して RSA 鍵ペアを生成することも、ssh-keygen -t ed25519
コマンドを入力して Ed25519 鍵ペアを生成することもできます。Ed25519 アルゴリズムは FIPS-140 に準拠しておらず、FIPS モードでは OpenSSH は Ed25519 鍵で機能しないことに注意してください。公開鍵をリモートマシンにコピーします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <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>
$ ssh -o PreferredAuthentications=publickey <username>@<ssh-server-example.com>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3. OpenSSH サーバーで鍵ベースの認証を唯一の方法として設定する リンクのコピーリンクがクリップボードにコピーされました!
システムのセキュリティーを強化するには、OpenSSH サーバーでパスワード認証を無効にして鍵ベースの認証を有効にします。
前提条件
-
openssh-server
パッケージがインストールされている。 -
サーバーで
sshd
デーモンが実行している。 鍵を使用して OpenSSH サーバーに接続できる。
詳細は、SSH 鍵ペアの生成 セクションを参照してください。
手順
テキストエディターで
/etc/ssh/sshd_config
設定を開きます。以下に例を示します。vi /etc/ssh/sshd_config
# vi /etc/ssh/sshd_config
Copy to Clipboard Copied! Toggle word wrap Toggle overflow PasswordAuthentication
オプションをno
に変更します。PasswordAuthentication no
PasswordAuthentication no
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
新しいデフォルトインストール以外のシステムでは、
PubkeyAuthentication
パラメーターが設定されていないか、yes
に設定されていることを確認します。 KbdInteractiveAuthentication
ディレクティブをno
に設定します。設定ファイル内では対応するエントリーがコメントアウトされていること、およびデフォルト値が
yes
であることに注意してください。NFS がマウントされたホームディレクトリーで鍵ベースの認証を使用するには、SELinux ブール値
use_nfs_home_dirs
を有効にします。setsebool -P use_nfs_home_dirs 1
# setsebool -P use_nfs_home_dirs 1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - リモートで接続している場合は、コンソールもしくは帯域外アクセスを使用せず、パスワード認証を無効にする前に、鍵ベースのログインプロセスをテストします。
sshd
デーモンを再読み込みし、変更を適用します。systemctl reload sshd
# systemctl reload sshd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4. ssh-agent を使用した SSH 認証情報のキャッシュ リンクのコピーリンクがクリップボードにコピーされました!
SSH 接続を開始するたびにパスフレーズを入力しなくても済むように、ssh-agent
ユーティリティーを使用して、ログインセッションの SSH 秘密鍵をキャッシュできます。エージェントが実行中で、鍵のロックが解除されている場合、鍵のパスワードを再入力することなく、この鍵を使用して SSH サーバーにログインできます。秘密鍵とパスフレーズのセキュリティーが確保されます。
前提条件
- SSH デーモンが実行されており、ネットワーク経由でアクセスできるリモートホストがある。
- リモートホストにログインするための IP アドレスまたはホスト名および認証情報を把握している。
パスフレーズで SSH キーペアを生成し、公開鍵をリモートマシンに転送している。
詳細は、SSH 鍵ペアの生成 セクションを参照してください。
手順
セッションで
ssh-agent
を自動的に起動するためのコマンドを~/.bashrc
ファイルに追加します。任意のテキストエディターで
~/.bashrc
を開きます。次に例を示します。vi ~/.bashrc
$ vi ~/.bashrc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の行をファイルに追加します。
eval $(ssh-agent)
eval $(ssh-agent)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 変更を保存し、エディターを終了します。
~/.ssh/config
ファイルに次の行を追加します。AddKeysToAgent yes
AddKeysToAgent yes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow セッションでこのオプションを使用して
ssh-agent
が起動されると、エージェントはホストに初めて接続するときにのみパスワードを要求します。
検証
エージェントにキャッシュされた秘密鍵に対応する公開鍵を使用するホストにログインします。次に例を示します。
ssh <example.user>@<ssh-server@example.com>
$ ssh <example.user>@<ssh-server@example.com>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow パスフレーズを入力する必要がないことに注意してください。
1.5. スマートカードに保存した SSH 鍵による認証 リンクのコピーリンクがクリップボードにコピーされました!
スマートカードに ECDSA 鍵と RSA 鍵を作成して保存し、そのスマートカードを使用して OpenSSH クライアントで認証することができます。スマートカード認証は、デフォルトのパスワード認証に代わるものです。
前提条件
-
クライアントで、
opensc
パッケージをインストールして、pcscd
サービスを実行している。
手順
PKCS #11 の URI を含む OpenSC PKCS #11 モジュールが提供する鍵のリストを表示し、その出力を
keys.pub
ファイルに保存します。ssh-keygen -D pkcs11: > keys.pub
$ ssh-keygen -D pkcs11: > keys.pub
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 公開鍵をリモートサーバーに転送します。
ssh-copy-id
コマンドを使用し、前の手順で作成したkeys.pub
ファイルを指定します。ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>
$ ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ECDSA 鍵を使用して <ssh-server-example.com> に接続します。鍵を一意に参照する URI のサブセットのみを使用することもできます。次に例を示します。
ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" <ssh-server-example.com>
$ 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] $
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenSSH は
p11-kit-proxy
ラッパーを使用し、OpenSC PKCS #11 モジュールがp11-kit
ツールに登録されているため、前のコマンドを簡略化できます。ssh -i "pkcs11:id=%01" <ssh-server-example.com>
$ ssh -i "pkcs11:id=%01" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
Copy to Clipboard Copied! Toggle word wrap Toggle overflow PKCS #11 の URI の
id=
の部分を飛ばすと、OpenSSH が、プロキシーモジュールで利用可能な鍵をすべて読み込みます。これにより、必要な入力の量を減らすことができます。ssh -i pkcs11: <ssh-server-example.com>
$ ssh -i pkcs11: <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション:
~/.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] $
$ 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] $
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ssh
クライアントユーティリティーが、この URI とスマートカードの鍵を自動的に使用するようになります。
1.6. OpenSSH のセキュリティーの強化 リンクのコピーリンクがクリップボードにコピーされました!
OpenSSH を使用すると、システムを調整してセキュリティーを強化できます。
OpenSSH サーバー設定ファイル /etc/ssh/sshd_config
の変更を有効にするには、sshd
デーモンを再ロードする必要があることに注意してください。
systemctl reload 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
# systemctl mask sshd-keygen@rsa.service # rm -f /etc/ssh/ssh_host_rsa_key* # systemctl restart sshd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記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_rsa_key # HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要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>
# semanage port -a -t ssh_port_t -p tcp <port-number>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow さらに、
firewalld
設定を更新します。firewall-cmd --add-port <port-number>/tcp firewall-cmd --remove-port=22/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port <port-number>/tcp # firewall-cmd --remove-port=22/tcp # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前のコマンドの <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
AllowUsers *@192.168.1.* *@10.0.0.* !*@192.168.1.2 AllowGroups example-group
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この設定では、次の条件がすべて満たされる場合にのみ接続が許可されます。
- 接続の送信元 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
# update-crypto-policies --set FUTURE Setting system policy to FUTURE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告システムがレガシーシステムと通信する場合、
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 -J <jump-1.example.com>,<jump-2.example.com>,<jump-3.example.com> <target-server-1.example.com>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ジャンプサーバーのユーザー名または 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 -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>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ジャンプサーバーを介してリモートサーバーに定期的に接続する場合は、ジャンプサーバーの設定を SSH 設定ファイルに保存します。
ローカルシステムの
~/.ssh/config
ファイルを編集してジャンプホストを定義します。以下に例を示します。Host <jump-server-1> HostName <jump-1.example.com>
Host <jump-server-1> HostName <jump-1.example.com>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Host
パラメーターは、ssh
コマンドで使用できるホストの名前またはエイリアスを定義します。値は実際のホスト名と一致可能ですが、任意の文字列にすることもできます。 -
HostName
パラメーターは、ジャンプホストの実際のホスト名または IP アドレスを設定します。
-
ProxyJump
ディレクティブを使用してリモートサーバーのジャンプ設定を、ローカルシステムの~/.ssh/config
ファイルに追加します。以下に例を示します。Host <remote-server-1> HostName <target-server-1.example.com> ProxyJump <jump-server-1>
Host <remote-server-1> HostName <target-server-1.example.com> ProxyJump <jump-server-1>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ローカルシステムを使用して、ジャンプサーバー経由でリモートサーバーに接続します。
ssh <remote-server-1>
$ ssh <remote-server-1>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、前の設定ステップを省略したときの
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 - '::'
sshd_ListenAddress:
- 0.0.0.0
- '::'
レンダリングは以下のようになります。
ListenAddress 0.0.0.0 ListenAddress ::
ListenAddress 0.0.0.0
ListenAddress ::
1.8.2. sshd RHEL システムロールを使用した OpenSSH サーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
sshd
RHEL システムロールを使用して、複数の OpenSSH サーバーを設定できます。OpenSSH サーバーは、主に次の機能により、リモートユーザーにセキュアな通信環境を提供します。
- リモートクライアントからの SSH 接続の管理
- 認証情報の検証
- セキュアなデータ転送とコマンド実行
sshd
RHEL システムロールは、Identity Management RHEL システムロールなど、SSHD 設定を変更する他の RHEL システムロールと併用できます。設定が上書きされないように、sshd
RHEL システムロールが名前空間 (RHEL 8 以前のバージョン) またはドロップインディレクトリー (RHEL 9) を使用することを確認してください。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル 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
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
SSH サーバーにログインします。
ssh <username>@<ssh_server>
$ ssh <username>@<ssh_server>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SSH サーバー上の
sshd_config
ファイルの内容を確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 192.0.2.0/24
サブネットから root としてサーバーに接続できることを確認します。IP アドレスを確認します。
hostname -I
$ hostname -I 192.0.2.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IP アドレスが
192.0.2.1
-192.0.2.254
範囲にある場合は、サーバーに接続できます。root
でサーバーに接続します。ssh root@<ssh_server>
$ ssh root@<ssh_server>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
- 403 localhost:4003
レンダリングは以下のようになります。
LocalForward 22 localhost:2222 LocalForward 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 システムロールは、Identity Management RHEL システムロールなど、SSH 設定を変更する他のシステムロールと併用できます。設定が上書きされないように、ssh
RHEL システムロールがドロップインディレクトリーを使用すること (RHEL 8 以降ではデフォルト) を確認してください。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル 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
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
SSH 設定ファイルを表示して、管理対象ノードの設定が正しいことを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.8.5. 非排他的設定に sshd RHEL システムロールを使用する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、sshd
RHEL システムロールを適用すると、設定全体が上書きされます。これは、たとえば別の RHEL システムロールや Playbook などを使用して、以前に設定を調整している場合に問題を生じる可能性があります。他のオプションを維持しながら、選択した設定オプションにのみ sshd
に問題を生じるシステムロールを適用するには、非排他的設定を使用できます。
非排他的設定は、以下を使用して適用できます。
- RHEL 8 以前では、設定スニペットを使用します。
-
RHEL 9 以降では、ドロップインディレクトリー内のファイルを使用します。デフォルトの設定ファイルは、
/etc/ssh/sshd_config.d/00-ansible_system_role.conf
としてドロップインディレクトリーにすでに配置されています。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。RHEL 8 以前を実行する管理対象ノードの場合:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow RHEL 9 以降を実行する管理対象ノードの場合:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル 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
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
SSH サーバーの設定を確認します。
RHEL 8 以前を実行する管理対象ノードの場合:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow RHEL 9 以降を実行する管理対象ノードの場合:
cat /etc/ssh/sshd_config.d/42-my-application.conf Ansible managed # AcceptEnv LANG LS_COLORS EDITOR
# cat /etc/ssh/sshd_config.d/42-my-application.conf # Ansible managed # AcceptEnv LANG LS_COLORS EDITOR
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第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 を使用したプライベート 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 genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <ca.key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow キー生成プロセスの時間は、ホストのハードウェアとエントロピー、選択したアルゴリズム、およびキーの長さによって異なります。
前のコマンドで生成された秘密鍵を使用して署名された証明書を作成します。
openssl req -key <ca.key> -new -x509 -days 3650 -addext keyUsage=critical,keyCertSign,cRLSign -subj "/CN=<Example_CA>" -out <ca.crt>
$ openssl req -key <ca.key> -new -x509 -days 3650 -addext keyUsage=critical,keyCertSign,cRLSign -subj "/CN=<Example_CA>" -out <ca.crt>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 生成された
ca.crt
ファイルは、10 年間、他の証明書の署名に使用できる自己署名 CA 証明書です。プライベート CA の場合、< Example_CA > を共通名(CN)として任意の文字列に置き換えることができます。CA の秘密鍵に安全なアクセス許可を設定します。次に例を示します。
chown <root>:<root> <ca.key> chmod 600 <ca.key>
# chown <root>:<root> <ca.key> # chmod 600 <ca.key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
自己署名 CA 証明書をクライアントシステムのトラストアンカーとして使用するには、CA 証明書をクライアントにコピーし、クライアントのシステム全体のトラストストアに
root
として追加します。trust anchor <ca.crt>
# trust anchor <ca.crt>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 詳細は、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>
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 詳細は、「OpenSSL でプライベート CA を使用して CSR の証明書を発行する」 を参照してください。
自己署名 CA に関する基本情報を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 秘密鍵の一貫性を確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3. OpenSSL を使用した TLS サーバー証明書の秘密鍵と CSR の作成 リンクのコピーリンクがクリップボードにコピーされました!
認証局 (CA) からの有効な TLS 証明書がある場合にのみ、TLS 暗号化通信チャネルを使用できます。証明書を取得するには、最初にサーバーの秘密鍵と証明書署名要求 (CSR) を作成する必要があります。
手順
以下のようにサーバーシステムで秘密鍵を生成します。
openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <server-private.key>
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <server-private.key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 次の例のように、選択したテキストエディターを使用して、CSR の作成を簡素化する設定ファイルを準備します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow extendedKeyUsage = serverAuth
オプションは、証明書の使用を制限します。前に作成した秘密鍵を使用して CSR を作成します。
openssl req -key <server-private.key> -config <example_server.cnf> -new -out <server-cert.csr>
$ openssl req -key <server-private.key> -config <example_server.cnf> -new -out <server-cert.csr>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -config
オプションを省略すると、req
ユーティリティーは次のような追加情報の入力を求めます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
- 署名のために選択した CA に CSR を送信します。または、信頼できるネットワーク内での内部使用シナリオでは、署名にプライベート CA を使用します。詳細は、「OpenSSL でプライベート CA を使用して CSR の証明書を発行する」 を参照してください。
検証
要求された証明書を CA から取得したら、次の例のように、証明書の中で人間が判読できる部分が要件と一致することを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4. OpenSSL を使用した TLS クライアント証明書の秘密鍵と CSR の作成 リンクのコピーリンクがクリップボードにコピーされました!
認証局 (CA) からの有効な TLS 証明書がある場合にのみ、TLS 暗号化通信チャネルを使用できます。証明書を取得するには、最初にクライアントの秘密鍵と証明書署名要求 (CSR) を作成する必要があります。
手順
次の例のように、クライアントシステムで秘密鍵を生成します。
openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <client-private.key>
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <client-private.key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 次の例のように、選択したテキストエディターを使用して、CSR の作成を簡素化する設定ファイルを準備します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow extendedKeyUsage = clientAuth
オプションは、証明書の使用を制限します。前に作成した秘密鍵を使用して CSR を作成します。
openssl req -key <client-private.key> -config <example_client.cnf> -new -out <client-cert.csr>
$ openssl req -key <client-private.key> -config <example_client.cnf> -new -out <client-cert.csr>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -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>
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>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
- 署名のために選択した CA に CSR を送信します。または、信頼できるネットワーク内での内部使用シナリオでは、署名にプライベート CA を使用します。詳細は、「OpenSSL でプライベート CA を使用して CSR の証明書を発行する」 を参照してください。
検証
次の例のように、証明書の中で人間が判読できる部分が要件と一致することを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.5. OpenSSL でプライベート CA を使用して CSR の証明書を発行する リンクのコピーリンクがクリップボードにコピーされました!
システムが TLS 暗号化通信チャネルを確立できるようにするには、認証局 (CA) が有効な証明書をシステムに提供する必要があります。プライベート CA がある場合は、システムからの証明書署名要求 (CSR) に署名することにより、要求された証明書を作成できます。
前提条件
- プライベート CA が設定済みである。詳細は、OpenSSL を使用したプライベート CA の作成 セクションを参照してください。
- CSR を含むファイルがある。CSR の作成例は、「OpenSSL を使用した TLS サーバー証明書の秘密鍵と CSR の作成」 セクションを参照してください。
手順
オプション: 任意のテキストエディターを使用して、証明書に拡張を追加するための OpenSSL 設定ファイルを準備します。次に例を示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前の例は原則のみを示しており、
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>
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6. GnuTLS を使用したプライベート CA の作成 リンクのコピーリンクがクリップボードにコピーされました!
プライベート証明機関 (CA) は、シナリオで内部ネットワーク内のエンティティーを検証する必要がある場合に役立ちます。たとえば、管理下にある CA によって署名された証明書に基づく認証を使用して VPN ゲートウェイを作成する場合、または商用 CA への支払いを希望しない場合は、プライベート CA を使用します。このようなユースケースで証明書に署名するために、プライベート CA は自己署名証明書を使用します。
前提条件
-
sudo
を使用して管理コマンドを入力するための root
権限または権限がある。そのような特権を必要とするコマンドは、#
でマークされています。 システムにはすでに GnuTLS がインストールされている。インストールしていない場合は、次のコマンドを使用できます。
dnf install gnutls-utils
$ dnf install gnutls-utils
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順
CA の秘密鍵を生成します。たとえば、次のコマンドは、256 ビットの楕円曲線デジタル署名アルゴリズム (ECDSA) キーを作成します。
certtool --generate-privkey --sec-param High --key-type=ecdsa --outfile <ca.key>
$ certtool --generate-privkey --sec-param High --key-type=ecdsa --outfile <ca.key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow キー生成プロセスの時間は、ホストのハードウェアとエントロピー、選択したアルゴリズム、およびキーの長さによって異なります。
証明書のテンプレートファイルを作成します。
任意のテキストエディターでファイルを作成します。以下に例を示します。
vi <ca.cfg>
$ vi <ca.cfg>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルを編集して、必要な証明書の詳細を含めます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順 1 で生成した秘密鍵を使用して署名された証明書を作成します。
生成された <ca.crt> ファイルは、1 年間他の証明書に署名するために使用できる自己署名 CA 証明書です。<ca.crt> ファイルは公開鍵 (証明書) です。ロードされたファイル <ca.key> が秘密鍵です。このファイルは安全な場所に保管してください。
certtool --generate-self-signed --load-privkey <ca.key> --template <ca.cfg> --outfile <ca.crt>
$ certtool --generate-self-signed --load-privkey <ca.key> --template <ca.cfg> --outfile <ca.crt>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow CA の秘密鍵に安全なアクセス許可を設定します。次に例を示します。
chown <root>:<root> <ca.key> chmod 600 <ca.key>
# chown <root>:<root> <ca.key> # chmod 600 <ca.key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
自己署名 CA 証明書をクライアントシステムのトラストアンカーとして使用するには、CA 証明書をクライアントにコピーし、クライアントのシステム全体のトラストストアに
root
として追加します。trust anchor <ca.crt>
# trust anchor <ca.crt>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 詳細は、3章共有システム証明書の使用 を参照してください。
検証
自己署名 CA に関する基本情報を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書署名要求 (CSR) を作成し、CA を使用して要求に署名します。CA は、CSR に基づいて証明書を正常に作成する必要があります。次に例を示します。
CA の秘密鍵を生成します。
certtool --generate-privkey --outfile <example-server.key>
$ certtool --generate-privkey --outfile <example-server.key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 任意のテキストエディターで新しい設定ファイルを開きます。以下に例を示します。
vi <example-server.cfg>
$ vi <example-server.cfg>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルを編集して、必要な証明書の詳細を含めます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以前に作成した秘密鍵を使用してリクエストを生成します
certtool --generate-request --load-privkey <example-server.key> --template <example-server.cfg> --outfile <example-server.crq>
$ certtool --generate-request --load-privkey <example-server.key> --template <example-server.cfg> --outfile <example-server.crq>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書を生成し、CA の秘密鍵で署名します。
certtool --generate-certificate --load-request <example-server.crq> --load-ca-certificate <ca.crt> --load-ca-privkey <ca.key> --outfile <example-server.crt>
$ certtool --generate-certificate --load-request <example-server.crq> --load-ca-certificate <ca.crt> --load-ca-privkey <ca.key> --outfile <example-server.crt>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7. GnuTLS を使用した TLS サーバー証明書の秘密鍵と CSR の作成 リンクのコピーリンクがクリップボードにコピーされました!
証明書を取得するには、最初にサーバーの秘密鍵と証明書署名要求 (CSR) を作成する必要があります。
手順
以下のようにサーバーシステムで秘密鍵を生成します。
certtool --generate-privkey --sec-param High --outfile <example-server.key>
$ certtool --generate-privkey --sec-param High --outfile <example-server.key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 次の例のように、選択したテキストエディターを使用して、CSR の作成を簡素化する設定ファイルを準備します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前に作成した秘密鍵を使用して CSR を作成します。
certtool --generate-request --template <example-server.cfg> --load-privkey <example-server.key> --outfile <example-server.crq>
$ certtool --generate-request --template <example-server.cfg> --load-privkey <example-server.key> --outfile <example-server.crq>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow --template
オプションを省略すると、certool
ユーティリティーは次のような追加情報の入力を求めます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
- 署名のために選択した CA に CSR を送信します。または、信頼できるネットワーク内での内部使用シナリオでは、署名にプライベート CA を使用します。詳細は、プライベート CA を使用した GnuTLS での CSR の証明書の発行 セクションを参照してください。
検証
要求された証明書を CA から取得したら、次の例のように、証明書の中で人間が判読できる部分が要件と一致することを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8. GnuTLS を使用した TLS クライアント証明書の秘密鍵と CSR の作成 リンクのコピーリンクがクリップボードにコピーされました!
証明書を取得するには、最初にクライアントの秘密鍵と証明書署名要求 (CSR) を作成する必要があります。
手順
次の例のように、クライアントシステムで秘密鍵を生成します。
certtool --generate-privkey --sec-param High --outfile <example-client.key>
$ certtool --generate-privkey --sec-param High --outfile <example-client.key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 次の例のように、選択したテキストエディターを使用して、CSR の作成を簡素化する設定ファイルを準備します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前に作成した秘密鍵を使用して CSR を作成します。
certtool --generate-request --template <example-client.cfg> --load-privkey <example-client.key> --outfile <example-client.crq>
$ certtool --generate-request --template <example-client.cfg> --load-privkey <example-client.key> --outfile <example-client.crq>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow --template
オプションを省略すると、certtool
ユーティリティーは次のような追加情報の入力を求めます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
- 署名のために選択した CA に CSR を送信します。または、信頼できるネットワーク内での内部使用シナリオでは、署名にプライベート CA を使用します。詳細は、「GnuTLS でプライベート CA を使用して CSR の証明書を発行する」 を参照してください。
検証
次の例のように、証明書の中で人間が判読できる部分が要件と一致することを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.9. GnuTLS でプライベート CA を使用して CSR の証明書を発行する リンクのコピーリンクがクリップボードにコピーされました!
システムが TLS 暗号化通信チャネルを確立できるようにするには、認証局 (CA) が有効な証明書をシステムに提供する必要があります。プライベート CA がある場合は、システムからの証明書署名要求 (CSR) に署名することにより、要求された証明書を作成できます。
前提条件
- プライベート CA が設定済みである。詳細は、「GnuTLS を使用したプライベート CA の作成」 を参照してください。
- CSR を含むファイルがある。CSR の作成例は、「GnuTLS を使用した TLS サーバー証明書の秘密鍵と CSR の作成」 にあります。
手順
オプション: 任意のテキストエディターを使用して、次の例のように、証明書に拡張機能を追加するための GnuTLS 設定ファイルを準備します。
vi <server-extensions.cfg>
$ vi <server-extensions.cfg> honor_crq_extensions ocsp_uri = "http://ocsp.example.com"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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>
$ 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>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第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 のみを許可します。詳細は、Using system-wide cryptographic policies を参照してください。
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
# 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
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
詳細は、Web サーバーとリバースプロキシーのデプロイ の Apache HTTP Server での TLS 暗号化の設定 の章を参照してください。
4.3.2. TLS を使用するように Nginx HTTP およびプロキシーサーバーを設定 リンクのコピーリンクがクリップボードにコピーされました!
Nginx
で TLS 1.3 サポートを有効にするには、/etc/nginx/nginx.conf
設定ファイルの server
セクションで、ssl_protocols
オプションに TLSv1.3
値を追加します。
詳細は、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
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 インストールコンテンツとキックスタートファイルの両方を指定する必要があります。インストーラーは DNS を使用してサーバーのホスト名を解決する必要があるため、リモート HTTP サーバーからキックスタートファイルをダウンロードできません。ご使用の環境で暗号化されていない 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
%certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem -----BEGIN CERTIFICATE----- <Base64-encoded_certificate_content> -----END CERTIFICATE----- %end
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 起動可能なインストールメディアを準備し、カスタム 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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
編集が終了したら、
Ctrl+X
を押して、指定したオプションを使用してインストールを開始します。
検証
eDNS 設定を確認します。
dnsconfd status
$ dnsconfd status
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 想定される出力:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow nslookup
を使用して DNS サーバーが応答することを確認します。nslookup <domain_name>
$ nslookup <domain_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <domain_name>
は、照会するドメインに置き換えます。
トラブルシューティング
unbound
で詳細なロギングを有効にします。unbound-control verbosity 5
# unbound-control verbosity 5
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 関連するサービスのログを確認します。
journalctl -xe -u <service_name>
$ journalctl -xe -u <service_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <service_name>
は、NetworkManager
、dnsconfd
、またはunbound
に置き換えます。
5.3. カスタム起動可能な ISO を使用して eDNS を有効化した RHEL のインストール リンクのコピーリンクがクリップボードにコピーされました!
カスタム起動可能な ISO を作成して、eDNS 強制
ポリシーを使用して RHEL をインストールします。これにより、インストール中およびインストール後にすべての DNS クエリーがプライベートおよび安全になります。カスタムの CA 証明書バンドルが必要な場合は、キックスタートファイルの %certificate
セクションを使用してインストールする必要があります。次に、このキックスタートファイルをスクリプトで参照して、厳格な DoT ポリシーを適用するカーネル引数を含む新しい ISO を構築します。ご使用の環境で暗号化されていない DNS へのフォールバックが許可されている場合は、標準の RHEL インストールを実行し、後で eDNS を設定できます。
前提条件
-
sudo
または root ユーザーアクセス権によって提供される管理者特権。これは先頭にコマンドプロンプト#
が付いているコマンドに必要です。sudo
アクセスの設定方法は、権限のないユーザーが特定のコマンドを実行する方法 を参照してください。 - 製品のダウンロード ページから、フルインストール用 DVD ISO または最小限のインストールブート ISO イメージをダウンロードし ている。
-
%certificate
セクションを含むキックスタートファイルがある (カスタム CA バンドルが必要な場合)。 -
lorax
パッケージがインストールされている。
手順
必要に応じて、最小インストールの起動 ISO イメージを使用する場合には、
rhsm
コマンドを使用してキックスタートファイルにインストールソースを設定します。Register the system and use CDN as the installation source
# Register the system and use CDN as the installation source rhsm --organization=<org_id> --activation-key=<activation_key>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記インストールソースを作成して、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
%certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem -----BEGIN CERTIFICATE----- <Base64-encoded_certificate_content> -----END CERTIFICATE----- %end
Copy to Clipboard Copied! Toggle word wrap Toggle overflow キックスタートファイルとカーネル引数を ISO に追加します。
次のスクリプト例は、eDNS が有効なカスタムの起動可能な ISO を作成する方法を示しています。このプロセスを自動化するには、スクリプトファイルを作成する必要があります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow スクリプトを実行します。
sh <script_filename>
# sh <script_filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - カスタマイズした ISO ファイルを使用して RHEL をインストールします。
検証
eDNS 設定を確認します。
dnsconfd status
$ dnsconfd status
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 想定される出力:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow nslookup
を使用して DNS サーバーが応答することを確認します。nslookup <domain_name>
$ nslookup <domain_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <domain_name>
は、照会するドメインに置き換えます。
トラブルシューティング
unbound
で詳細なロギングを有効にします。unbound-control verbosity 5
# unbound-control verbosity 5
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 関連するサービスのログを確認します。
journalctl -xe -u <service_name>
$ journalctl -xe -u <service_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <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 を設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: アップストリームの DoT サーバーを検証するためにカスタム CA バンドルを使用するには、PEM 形式のファイルを
/etc/pki/dns/extracted/pem/tls-ca-bundle.pem
ファイルにコピーします。注記/etc/pki/dns/extracted/pem
で証明書を追加または削除したら、変更を適用するためにdnsconfd
サービスを再起動してください。dnsconfd
サービスを有効にします。systemctl enable --now dnsconfd
# systemctl enable --now dnsconfd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NetworkManager をリロードします。
systemctl reload NetworkManager
# systemctl reload NetworkManager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow dnsconfd
とその設定が含まれるように、すべてのインストール済みカーネルのinitramfs
を再生成します。for kernel in `rpm -q kernel --qf '%{VERSION}-%{RELEASE}.%{ARCH}\n'`; do dracut -f --kver="$kernel" done
# for kernel in `rpm -q kernel --qf '%{VERSION}-%{RELEASE}.%{ARCH}\n'`; do dracut -f --kver="$kernel" done
Copy to Clipboard Copied! Toggle word wrap Toggle overflow カーネル引数を、現在のカーネルバージョンと新しくインストールされたカーネルバージョンに設定します。
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=ALL
# 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=ALL
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IBM Z の場合は、ブートメニューを更新します。
zipl
# zipl
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
eDNS 設定を確認します。
dnsconfd status
$ dnsconfd status
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 想定される出力:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow nslookup
を使用して DNS サーバーが応答することを確認します。nslookup <domain_name>
$ nslookup <domain_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <domain_name>
は、照会するドメインに置き換えます。
トラブルシューティング
unbound
で詳細なロギングを有効にします。unbound-control verbosity 5
# unbound-control verbosity 5
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 関連するサービスのログを確認します。
journalctl -xe -u <service_name>
$ journalctl -xe -u <service_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <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://<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=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 のセットアップ リンクのコピーリンクがクリップボードにコピーされました!
仮想プライベートネットワーク (VPN) は、インターネット経由でローカルネットワークに接続する方法です。Libreswan
により提供される IPsec
は、VPN を作成するための望ましい方法です。Libreswan
は、VPN のユーザー空間 IPsec
実装です。VPN は、インターネットなどの中間ネットワークにトンネルを設定して、使用中の LAN と別のリモート LAN との間の通信を可能にします。セキュリティー上の理由から、VPN トンネルは常に認証と暗号化を使用します。暗号化操作では、Libreswan
は NSS
ライブラリーを使用します。
6.1. IPsec VPN 実装としての Libreswan リンクのコピーリンクがクリップボードにコピーされました!
RHEL では、IPsec プロトコルを使用して仮想プライベートネットワーク (VPN) を設定できます。これは、Libreswan アプリケーションによりサポートされます。Libreswan は、Openswan アプリケーションの延長であり、Openswan ドキュメントの多くの例は Libreswan でも利用できます。
VPN の IPsec プロトコルは、IKE (Internet Key Exchange) プロトコルを使用して設定されます。IPsec と IKE は同義語です。IPsec VPN は、IKE VPN、IKEv2 VPN、XAUTH VPN、Cisco VPN、または IKE/IPsec VPN とも呼ばれます。Layer 2 Tunneling Protocol (L2TP) も使用する IPsec VPN のバリアントは、通常、L2TP/IPsec VPN と呼ばれ、optional
のリポジトリーによって提供される xl2tpd
パッケージが必要です。
Libreswan は、オープンソースのユーザー空間の IKE 実装です。IKE v1 および v2 は、ユーザーレベルのデーモンとして実装されます。IKE プロトコルも暗号化されています。IPsec プロトコルは Linux カーネルで実装され、Libreswan は、VPN トンネル設定を追加および削除するようにカーネルを設定します。
IKE プロトコルは、UDP ポート 500 および 4500 を使用します。IPsec プロトコルは、以下の 2 つのプロトコルで構成されます。
- 暗号セキュリティーペイロード (ESP) (プロトコル番号が 50)
- 認証ヘッダー (AH) (プロトコル番号 51)
AH プロトコルの使用は推奨されていません。AH のユーザーは、null 暗号化で ESP に移行することが推奨されます。
IPsec プロトコルは、以下の 2 つの操作モードを提供します。
- トンネルモード (デフォルト)
- トランスポートモード
IKE を使用せずに IPsec を使用してカーネルを設定できます。これは、手動キーリング と呼ばれます。また、ip xfrm
コマンドを使用して手動キーを設定できますが、これはセキュリティー上の理由からは強く推奨されません。Libreswan は、Netlink インターフェイスを使用して Linux カーネルと通信します。カーネルはパケットの暗号化と復号化を実行します。
Libreswan は、ネットワークセキュリティーサービス (NSS) 暗号化ライブラリーを使用します。NSS は、連邦情報処理標準 (FIPS) の公開文書 140-2 での使用が認定されています。
Libreswan および Linux カーネルが実装する IKE/IPsec の VPN は、RHEL で使用することが推奨される唯一の VPN 技術です。その他の VPN 技術は、そのリスクを理解せずに使用しないでください。
RHEL では、Libreswan はデフォルトで システム全体の暗号化ポリシー に従います。これにより、Libreswan は、デフォルトのプロトコルとして IKEv2 を含む現在の脅威モデルに対して安全な設定を使用するようになります。詳細は、システム全体の暗号化ポリシーの使用 を参照してください。
IKE/IPsec はピアツーピアプロトコルであるため、Libreswan では、"ソース" および "宛先"、または "サーバー" および "クライアント" という用語を使用しません。終了点 (ホスト) を参照する場合は、代わりに "左" と "右" という用語を使用します。これにより、ほとんどの場合、両方の終了点で同じ設定も使用できます。ただし、管理者は通常、ローカルホストに "左" を使用し、リモートホストに "右" を使用します。
leftid
と rightid
オプションは、認証プロセス内の各ホストの識別として機能します。詳細は、man ページの ipsec.conf(5)
を参照してください。
6.2. Libreswan の認証方法 リンクのコピーリンクがクリップボードにコピーされました!
Libreswan は複数の認証方法をサポートしますが、それぞれは異なるシナリオとなっています。
事前共有キー (PSK)
事前共有キー (PSK) は、最も簡単な認証メソッドです。セキュリティー上の理由から、PSK は 64 文字未満は使用しないでください。FIPS モードでは、PSK は、使用される整合性アルゴリズムに応じて、最低強度の要件に準拠する必要があります。authby=secret
接続を使用して PSK を設定できます。
Raw RSA 鍵
Raw RSA 鍵 は、静的なホスト間またはサブネット間の IPsec 設定で一般的に使用されます。各ホストは、他のすべてのホストのパブリック RSA 鍵を使用して手動で設定され、Libreswan はホストの各ペア間で IPsec トンネルを設定します。この方法は、多数のホストでは適切にスケーリングされません。
ipsec newhostkey
コマンドを使用して、ホストで Raw RSA 鍵を生成できます。ipsec showhostkey
コマンドを使用して、生成された鍵をリスト表示できます。leftrsasigkey=
の行は、CKA ID キーを使用する接続設定に必要です。Raw RSA 鍵に authby=rsasig
接続オプションを使用します。
X.509 証明書
X.509 証明書 は、共通の IPsec ゲートウェイに接続するホストが含まれる大規模なデプロイメントに一般的に使用されます。中央の 認証局 (CA) は、ホストまたはユーザーの RSA 証明書に署名します。この中央 CA は、個別のホストまたはユーザーの取り消しを含む、信頼のリレーを行います。
たとえば、openssl
コマンドおよび NSS certutil
コマンドを使用して X.509 証明書を生成できます。Libreswan は、leftcert=
設定オプションの証明書のニックネームを使用して NSS データベースからユーザー証明書を読み取るため、証明書の作成時にニックネームを指定します。
カスタム CA 証明書を使用する場合は、これを Network Security Services(NSS) データベースにインポートする必要があります。ipsec import
コマンドを使用して、PKCS #12 形式の証明書を Libreswan NSS データベースにインポートできます。
Libreswan は、section 3.1 of RFC 4945 で説明されているように、すべてのピア証明書のサブジェクト代替名 (SAN) としてインターネット鍵 Exchange(IKE) ピア ID を必要とします。require-id-on-certificate=no
接続オプションを設定してこのチェックを無効にすると、システムが中間者攻撃に対して脆弱になる可能性があります。
SHA-2 で RSA を使用した X.509 証明書に基づく認証に authby=rsasig
接続オプションを使用します。authby=
を ecdsa
に設定し、authby=rsa-sha2
を介した SHA-2 による RSA Probabilistic Signature Scheme (RSASSA-PSS) デジタル署名ベースの認証を設定することにより、SHA-2 を使用する ECDSA デジタル署名に対してさらに制限することができます。デフォルト値は authby=rsasig,ecdsa
です。
証明書と authby=
署名メソッドが一致する必要があります。これにより、相互運用性が向上し、1 つのデジタル署名システムでの認証が維持されます。
NULL 認証
NULL 認証 は、認証なしでメッシュ暗号化を実現するために使用されます。これは、パッシブ攻撃は防ぎますが、アクティブ攻撃は防ぎません。ただし、IKEv2 は非対称認証メソッドを許可するため、NULL 認証はインターネットスケールのオポチュニスティック IPsec にも使用できます。このモデルでは、クライアントはサーバーを認証しますが、サーバーはクライアントを認証しません。このモデルは、TLS を使用して Web サイトのセキュリティーを保護するのと似ています。NULL 認証に authby=null
を使用します。
量子コンピューターに対する保護
上記の認証方法に加えて、Post-quantum Pre-shared Key (PPK) メソッドを使用して、量子コンピューターによる潜在的な攻撃から保護することができます。個々のクライアントまたはクライアントグループは、帯域外で設定された事前共有鍵に対応する PPK ID を指定することにより、独自の PPK を使用できます。
事前共有キーで IKEv1 を使用すると、量子攻撃者から保護されます。IKEv2 の再設計は、この保護をネイティブに提供しません。Libreswan は、Post-quantum Pre-shared Key (PPK) を使用して、量子攻撃から IKEv2 接続を保護します。
任意の PPK 対応を有効にする場合は、接続定義に ppk=yes
を追加します。PPK が必要な場合は ppk=insist
を追加します。次に、各クライアントには、帯域外で通信する (および可能であれば量子攻撃に対して安全な) シークレット値を持つ PPK ID を付与できます。PPK はランダム性において非常に強力で、辞書の単語に基づいていません。PPK ID と PPK データは、次のように ipsec.secrets
ファイルに保存されます。
@west @east : PPKS "user1" "thestringismeanttobearandomstr"
@west @east : PPKS "user1" "thestringismeanttobearandomstr"
PPKS
オプションは、静的な PPK を参照します。実験的な関数は、ワンタイムパッドに基づいた動的 PPK を使用します。各接続では、ワンタイムパッドの新しい部分が PPK として使用されます。これを使用すると、ファイル内の動的な PPK の部分がゼロで上書きされ、再利用を防ぐことができます。複数のタイムパッドマテリアルが残っていないと、接続は失敗します。詳細は、man ページの ipsec.secrets(5)
を参照してください。
動的 PPK の実装はサポート対象外のテクノロジープレビューとして提供されます。注意して使用してください。
6.3. Libreswan のインストール リンクのコピーリンクがクリップボードにコピーされました!
Libreswan IPsec/IKE 実装を通じて VPN を設定する前に、対応するパッケージをインストールし、ipsec
サービスを開始して、ファイアウォールでサービスを許可する必要があります。
前提条件
-
AppStream
リポジトリーが有効になっている。
手順
libreswan
パッケージをインストールします。dnf install libreswan
# dnf install libreswan
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Libreswan を再インストールする場合は、古いデータベースファイルを削除し、新しいデータベースを作成します。
systemctl stop ipsec rm /var/lib/ipsec/nss/*db ipsec initnss
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db # ipsec initnss
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec
サービスを開始して有効にし、システムの起動時にサービスを自動的に開始できるようにします。systemctl enable ipsec --now
# systemctl enable ipsec --now
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイアウォールで、
ipsec
サービスを追加して、IKE プロトコル、ESP プロトコル、および AH プロトコルの 500/UDP ポートおよび 4500/UDP ポートを許可するように設定します。firewall-cmd --add-service="ipsec" firewall-cmd --runtime-to-permanent
# firewall-cmd --add-service="ipsec" # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.4. ホスト間の VPN の作成 リンクのコピーリンクがクリップボードにコピーされました!
raw RSA キーによる認証を使用して、左 および 右 と呼ばれる 2 つのホスト間に、ホストツーホスト IPsec VPN を作成するように Libreswan を設定できます。
前提条件
-
Libreswan がインストールされ、
ipsec
サービスが各ノードで開始している。
手順
各ホストで Raw RSA 鍵ペアを生成します。
ipsec newhostkey
# ipsec newhostkey
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前の手順で生成した鍵の
ckaid
を返します。左 で次のコマンドを実行して、そのckaid
を使用します。以下に例を示します。ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857d
# ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上のコマンドの出力により、設定に必要な
leftrsasigkey=
行が生成されます。次のホスト (右) でも同じ操作を行います。ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03
# ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/ipsec.d/
ディレクトリーで、新しいmy_host-to-host.conf
ファイルを作成します。上の手順のipsec showhostkey
コマンドの出力から、RSA ホストの鍵を新規ファイルに書き込みます。以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 鍵をインポートしたら、
ipsec
サービスを再起動します。systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接続を読み込みます。
ipsec auto --add mytunnel
# ipsec auto --add mytunnel
Copy to Clipboard Copied! Toggle word wrap Toggle overflow トンネルを確立します。
ipsec auto --up mytunnel
# ipsec auto --up mytunnel
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec
サービスの開始時に自動的にトンネルを開始するには、以下の行を接続定義に追加します。auto=start
auto=start
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルをバイパスしないように、専用のルーティングテーブルへの VPN 接続の割り当て を参照し てください。
6.5. サイト間 VPN の設定 リンクのコピーリンクがクリップボードにコピーされました!
2 つのネットワークを結合してサイト間の IPsec VPN を作成する場合は、その 2 つのホスト間の IPsec トンネルが作成されます。これにより、ホストは終了点として動作し、1 つまたは複数のサブネットからのトラフィックが通過できるように設定されます。したがって、ホストを、ネットワークのリモート部分にゲートウェイとして見なすことができます。
サイト間の VPN の設定は、設定ファイル内で複数のネットワークまたはサブネットを指定する必要がある点のみが、ホスト間の VPN とは異なります。
前提条件
- ホスト間の VPN が設定されている。
手順
ホスト間の VPN の設定が含まれるファイルを、新規ファイルにコピーします。以下に例を示します。
cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.conf
# cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上の手順で作成したファイルに、サブネット設定を追加します。以下に例を示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルをバイパスしないように、専用のルーティングテーブルへの VPN 接続の割り当て を参照し てください。
6.6. リモートアクセスの VPN の設定 リンクのコピーリンクがクリップボードにコピーされました!
ロードウォーリアーとは、モバイルクライアントと動的に割り当てられた IP アドレスを使用する移動するユーザーのことです。モバイルクライアントは、X.509 証明書を使用して認証します。
以下の例では、IKEv2
の設定を示しています。IKEv1
XAUTH プロトコルは使用していません。
サーバー上では以下の設定になります。
ロードウォーリアーのデバイスであるモバイルクライアントでは、上記の設定に多少変更を加えて使用します。
DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策については、接続がトンネルをバイパスしないように、専用のルーティングテーブルへの VPN 接続の割り当て を参照し てください。
6.7. メッシュ VPN の設定 リンクのコピーリンクがクリップボードにコピーされました!
any-to-any VPN とも呼ばれるメッシュ VPN ネットワークは、全ノードが IPsec を使用して通信するネットワークです。この設定では、IPsec を使用できないノードの例外が許可されます。メッシュの VPN ネットワークは、以下のいずれかの方法で設定できます。
- IPSec を必要とする。
- IPsec を優先するが、平文通信へのフォールバックを可能にする。
ノード間の認証は、X.509 証明書または DNSSEC (DNS Security Extensions) を基にできます。
これらの接続は通常の Libreswan 設定であるため、オポチュニスティック IPsec に通常の IKEv2 認証方法を使用できます。ただし、right=%opportunisticgroup
エントリーで定義されるオポチュニスティック IPsec を除きます。一般的な認証方法は、一般に共有される認証局 (CA) を使用して、X.509 証明書に基づいてホストを相互に認証させる方法です。クラウドデプロイメントでは通常、標準の手順の一部として、クラウド内の各ノードに証明書を発行します。
1 つのホストが侵害されると、グループの PSK シークレットも侵害されるため、PreSharedKey (PSK) 認証は使用しないでください。
NULL 認証を使用すると、認証なしでノード間に暗号化をデプロイできます。これを使用した場合、受動的な攻撃者からのみ保護されます。
以下の手順では、X.509 証明書を使用します。この証明書は、Dogtag Certificate System などの任意の種類の CA 管理システムを使用して生成できます。Dogtag は、各ノードの証明書が PKCS #12 形式 (.p12
ファイル) で利用可能であることを前提としています。これには、秘密鍵、ノード証明書、およびその他のノードの X.509 証明書を検証するのに使用されるルート CA 証明書が含まれます。
各ノードでは、その X.509 証明書を除いて、同じ設定を使用します。これにより、ネットワーク内で既存ノードを再設定せずに、新規ノードを追加できます。PKCS #12 ファイルには "分かりやすい名前" が必要であるため、名前には "node" を使用します。これにより、すべてのノードに対して、この名前を参照する設定ファイルが同一になります。
前提条件
-
Libreswan がインストールされ、
ipsec
サービスが各ノードで開始している。 新しい NSS データベースが初期化されている。
すでに古い NSS データベースがある場合は、古いデータベースファイルを削除します。
systemctl stop ipsec rm /var/lib/ipsec/nss/*db
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを使用して、新しいデータベースを初期化できます。
ipsec initnss
# ipsec initnss
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順
各ノードで PKCS #12 ファイルをインポートします。この手順では、PKCS #12 ファイルの生成に使用するパスワードが必要になります。
ipsec import nodeXXX.p12
# ipsec import nodeXXX.p12
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IPsec required
(private)、IPsec optional
(private-or-clear)、およびNo IPsec
(clear) プロファイルに、以下のような 3 つの接続定義を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
auto
変数にはいくつかのオプションがあります。ondemand
接続オプションは、IPsec 接続を開始するオポチュニスティック IPsec や、常にアクティブにする必要のない明示的に設定した接続に使用できます。このオプションは、カーネル内にトラップ XFRM ポリシーを設定し、そのポリシーに一致する最初のパケットを受信したときに IPsec 接続を開始できるようにします。オポチュニスティック IPsec を使用する場合も、明示的に設定した接続を使用する場合も、次のオプションを使用すると、IPsec 接続を効果的に設定および管理できます。
add
オプション-
接続設定をロードし、リモート開始に応答できるように準備します。ただし、接続はローカル側から自動的に開始されません。コマンド
ipsec auto --up
を使用して、IPsec 接続を手動で開始できます。 start
オプション- 接続設定をロードし、リモート開始に応答できるように準備します。さらに、リモートピアへの接続を即座に開始します。このオプションは、永続的かつ常にアクティブな接続に使用できます。
- 2
leftid
変数とrightid
変数は、IPsec トンネル接続の右チャネルと左チャネルを指定します。これらの変数を使用して、ローカル IP アドレスの値、またはローカル証明書のサブジェクト DN を取得できます (設定している場合)。- 3
leftcert
変数は、使用する NSS データベースのニックネームを定義します。
ネットワークの IP アドレスを対応するカテゴリーに追加します。たとえば、すべてのノードが
10.15.0.0/16
ネットワーク内に存在し、すべてのノードで IPsec 暗号化を使用する必要がある場合は、次のコマンドを実行します。echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
# echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 特定のノード (
10.15.34.0/24
など) を IPsec の有無にかかわらず機能させるには、そのノードを private-or-clear グループに追加します。echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
# echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ホストを、
10.15.1.2
など、IPsec の機能がない clear グループに定義する場合は、次のコマンドを実行します。echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear
# echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/ipsec.d/policies
ディレクトリーのファイルは、各新規ノードのテンプレートから作成することも、Puppet または Ansible を使用してプロビジョニングすることもできます。すべてのノードでは、例外のリストが同じか、異なるトラフィックフローが期待される点に注意してください。したがって、あるノードで IPsec が必要になり、別のノードで IPsec を使用できないために、ノード間の通信ができない場合もあります。
ノードを再起動して、設定したメッシュに追加します。
systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。
検証
ping
コマンドを使用して IPsec トンネルを開きます。ping <nodeYYY>
# ping <nodeYYY>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow インポートされた証明書を含む NSS データベースを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ノード上の開いているトンネルを確認します。
ipsec trafficstatus
# ipsec trafficstatus 006 #2: "private#10.15.0.0/16"[1] ...<nodeYYY>, type=ESP, add_time=1691399301, inBytes=512, outBytes=512, maxBytes=2^63B, id='C=US, ST=NC, O=Example Organization, CN=east'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8. FIPS 準拠の IPsec VPN のデプロイ リンクのコピーリンクがクリップボードにコピーされました!
Libreswan を使用して、FIPS 準拠の IPsec VPN ソリューションをデプロイできます。これを行うには、FIPS モードの Libreswan で使用できる暗号化アルゴリズムと無効になっている暗号化アルゴリズムを特定します。
前提条件
-
AppStream
リポジトリーが有効になっている。
手順
libreswan
パッケージをインストールします。dnf install libreswan
# dnf install libreswan
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Libreswan を再インストールする場合は、古い NSS データベースを削除します。
systemctl stop ipsec rm /var/lib/ipsec/nss/*db
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec
サービスを開始して有効にし、システムの起動時にサービスを自動的に開始できるようにします。systemctl enable ipsec --now
# systemctl enable ipsec --now
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイアウォールで、
ipsec
サービスを追加して、IKE プロトコル、ESP プロトコル、および AH プロトコルの500
および4500
UDP ポートを許可するように設定します。firewall-cmd --add-service="ipsec" firewall-cmd --runtime-to-permanent
# firewall-cmd --add-service="ipsec" # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! Toggle word wrap Toggle overflow システムを FIPS モードに切り替えます。
fips-mode-setup --enable
# fips-mode-setup --enable
Copy to Clipboard Copied! Toggle word wrap Toggle overflow システムを再起動して、カーネルを FIPS モードに切り替えます。
reboot
# reboot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
Libreswan が FIPS モードで実行されていることを確認します。
ipsec whack --fipsstatus
# ipsec whack --fipsstatus 000 FIPS mode enabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow または、
systemd
ジャーナルでipsec
ユニットのエントリーを確認します。journalctl -u ipsec
$ journalctl -u ipsec ... Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Mode: YES
Copy to Clipboard Copied! Toggle word wrap Toggle overflow FIPS モードで使用可能なアルゴリズムを表示するには、次のコマンドを実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow FIPS モードで無効化されたアルゴリズムをクエリーするには、次のコマンドを実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow FIPS モードで許可されているすべてのアルゴリズムと暗号のリストを表示するには、次のコマンドを実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.9. パスワードによる IPsec NSS データベースの保護 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、IPsec サービスは、初回起動時に空のパスワードを使用して Network Security Services (NSS) データベースを作成します。セキュリティーを強化するために、パスワード保護を追加できます。
前提条件
-
/var/lib/ipsec/nss/
ディレクトリーには NSS データベースファイルが含まれます。
手順
Libreswan の
NSS
データベースのパスワード保護を有効にします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前の手順で設定したパスワードを含む
/etc/ipsec.d/nsspassword
ファイルを作成します。以下はその例です。cat /etc/ipsec.d/nsspassword NSS Certificate DB:_<password>_
# cat /etc/ipsec.d/nsspassword NSS Certificate DB:_<password>_
Copy to Clipboard Copied! Toggle word wrap Toggle overflow nsspassword
ファイルは次の構文を使用します。<token_1>:<password1> <token_2>:<password2>
<token_1>:<password1> <token_2>:<password2>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトの NSS ソフトウェアトークンは
NSS Certificate DB
です。システムが FIPS モードで実行し場合は、トークンの名前がNSS FIPS 140-2 Certificate DB
になります。選択したシナリオに応じて、
nsspassword
ファイルの完了後にipsec
サービスを起動または再起動します。systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
NSS データベースに空でないパスワードを追加した後に、
ipsec
サービスが実行中であることを確認します。systemctl status ipsec
# systemctl status ipsec ● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disable> Active: active (running)...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Journal
ログに初期化が成功したことを確認するエントリーが含まれていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.10. TCP を使用するように IPsec VPN を設定 リンクのコピーリンクがクリップボードにコピーされました!
Libreswan は、RFC 8229 で説明されているように、IKE パケットおよび IPsec パケットの TCP カプセル化に対応します。この機能により、UDP 経由でトラフィックが転送されないように、IPsec VPN をネットワークに確立し、セキュリティーのペイロード (ESP) を強化できます。フォールバックまたはメインの VPN トランスポートプロトコルとして TCP を使用するように VPN サーバーおよびクライアントを設定できます。TCP カプセル化にはパフォーマンスコストが大きくなるため、UDP がシナリオで永続的にブロックされている場合に限り、TCP を主な VPN プロトコルとして使用してください。
前提条件
- リモートアクセス VPN が設定されている。
手順
config setup
セクションの/etc/ipsec.conf
ファイルに以下のオプションを追加します。listen-tcp=yes
listen-tcp=yes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow UDP で最初の試行に失敗した場合に TCP カプセル化をフォールバックオプションとして使用するには、クライアントの接続定義に以下の 2 つのオプションを追加します。
enable-tcp=fallback tcp-remoteport=4500
enable-tcp=fallback tcp-remoteport=4500
Copy to Clipboard Copied! Toggle word wrap Toggle overflow または、UDP を永続的にブロックしている場合は、クライアントの接続設定で以下のオプションを使用します。
enable-tcp=yes tcp-remoteport=4500
enable-tcp=yes tcp-remoteport=4500
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.11. IPsec 接続を高速化するために、ESP ハードウェアオフロードの自動検出と使用を設定 リンクのコピーリンクがクリップボードにコピーされました!
Encapsulating Security Payload (ESP) をハードウェアにオフロードすると、Ethernet で IPsec 接続が加速します。デフォルトでは、Libreswan は、ハードウェアがこの機能に対応しているかどうかを検出するため、ESP ハードウェアのオフロードを有効にします。機能が無効になっているか、明示的に有効になっている場合は、自動検出に戻すことができます。
前提条件
- ネットワークカードは、ESP ハードウェアオフロードに対応します。
- ネットワークドライバーは、ESP ハードウェアのオフロードに対応します。
- IPsec 接続が設定され、動作する。
手順
-
ESP ハードウェアオフロードサポートの自動検出を使用する接続の
/etc/ipsec.d/
ディレクトリーにある Libreswan 設定ファイルを編集します。 -
接続の設定で
nic-offload
パラメーターが設定されていないことを確認します。 nic-offload
を削除した場合は、ipsec
を再起動します。systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
IPsec 接続が使用するイーサネットデバイスの
tx_ipsec
およびrx_ipsec
カウンターを表示します。ethtool -S enp1s0 | grep -E "_ipsec"
# ethtool -S enp1s0 | grep -E "_ipsec" tx_ipsec: 10 rx_ipsec: 10
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IPsec トンネルを介してトラフィックを送信します。たとえば、リモート IP アドレスに ping します。
ping -c 5 remote_ip_address
# ping -c 5 remote_ip_address
Copy to Clipboard Copied! Toggle word wrap Toggle overflow イーサネットデバイスの
tx_ipsec
およびrx_ipsec
カウンターを再度表示します。ethtool -S enp1s0 | grep -E "_ipsec"
# ethtool -S enp1s0 | grep -E "_ipsec" tx_ipsec: 15 rx_ipsec: 15
Copy to Clipboard Copied! Toggle word wrap Toggle overflow カウンターの値が増えると、ESP ハードウェアオフロードが動作します。
6.12. IPsec 接続を加速化するためにボンディングでの ESP ハードウェアオフロードの設定 リンクのコピーリンクがクリップボードにコピーされました!
Encapsulating Security Payload (ESP) をハードウェアにオフロードすると、IPsec 接続が加速します。フェイルオーバーの理由でネットワークボンディングを使用する場合、ESP ハードウェアオフロードを設定する要件と手順は、通常のイーサーネットデバイスを使用する要件と手順とは異なります。たとえば、このシナリオでは、ボンディングでオフロードサポートを有効にし、カーネルはボンディングのポートに設定を適用します。
前提条件
-
ボンディングのすべてのネットワークカードが、ESP ハードウェアオフロードをサポートしている。各ボンディングポートがこの機能をサポートしているかどうかを確認するには、
ethtool -k <interface_name> | grep "esp-hw-offload"
コマンドを使用します。 - ボンディングが設定されており動作する。
-
ボンディングで
active-backup
モードを使用している。ボンディングドライバーは、この機能の他のモードはサポートしていません。 - IPsec 接続が設定され、動作する。
手順
ネットワークボンディングで ESP ハードウェアオフロードのサポートを有効にします。
nmcli connection modify bond0 ethtool.feature-esp-hw-offload on
# nmcli connection modify bond0 ethtool.feature-esp-hw-offload on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、
bond0
接続での ESP ハードウェアオフロードのサポートが有効になります。bond0
接続を再度アクティブにします。nmcli connection up bond0
# nmcli connection up bond0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ESP ハードウェアオフロードに使用すべき接続の
/etc/ipsec.d/
ディレクトリーにある Libreswan 設定ファイルを編集し、nic-offload=yes
ステートメントを接続エントリーに追加します。conn example ... nic-offload=yes
conn example ... nic-offload=yes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec
サービスを再起動します。systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
検証方法は、カーネルのバージョンやドライバーなど、さまざまな要素によって異なります。たとえば、一部のドライバーはカウンターを備えていますが、その名前はさまざまです。詳細は、お使いのネットワークドライバーのドキュメントを参照してください。
次の検証手順は、Red Hat Enterprise Linux 9 上の ixgbe
ドライバーに対して使用できます。
ボンディングのアクティブなポートを表示します。
grep "Currently Active Slave" /proc/net/bonding/bond0
# grep "Currently Active Slave" /proc/net/bonding/bond0 Currently Active Slave: enp1s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アクティブなポートの
tx_ipsec
カウンターおよびrx_ipsec
カウンターを表示します。ethtool -S enp1s0 | grep -E "_ipsec"
# ethtool -S enp1s0 | grep -E "_ipsec" tx_ipsec: 10 rx_ipsec: 10
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IPsec トンネルを介してトラフィックを送信します。たとえば、リモート IP アドレスに ping します。
ping -c 5 remote_ip_address
# ping -c 5 remote_ip_address
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アクティブなポートの
tx_ipsec
カウンターおよびrx_ipsec
カウンターを再度表示します。ethtool -S enp1s0 | grep -E "_ipsec"
# ethtool -S enp1s0 | grep -E "_ipsec" tx_ipsec: 15 rx_ipsec: 15
Copy to Clipboard Copied! Toggle word wrap Toggle overflow カウンターの値が増えると、ESP ハードウェアオフロードが動作します。
6.13. RHEL システムロールを使用した IPsec VPN 接続の設定 リンクのコピーリンクがクリップボードにコピーされました!
仮想プライベートネットワーク (VPN) を使用すると、インターネットなどの信頼できないネットワーク上で、セキュアで暗号化されたトンネルを確立できます。このようなトンネルにより、転送中のデータの機密性と整合性が確保されます。一般的なユースケースとしては、支社と本社を接続することなどが挙げられます。
vpn
RHEL システムロールを使用すると、Libreswan IPsec VPN 設定の作成プロセスを自動化できます。
vpn
RHEL システムロールで作成できるのは、事前共有鍵 (PSK) または証明書を使用してピアを相互に認証する VPN 設定だけです。
6.13.1. vpn RHEL システムロールを使用して PSK 認証による IPsec ホスト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
ホスト間 VPN は、2 つのデバイス間で直接、安全で暗号化された接続を確立し、アプリケーションはインターネットなどの安全でないネットワーク上で安全に通信できるようにします。
認証の場合、事前共有キー(PSK)は、2 つのピアにのみ知られている単一の共有秘密を使用する簡単な方法です。このアプローチは、デプロイメントの容易さが優先される基本的なセットアップに設定が簡単で、理想的です。ただし、キーは厳密に機密に保つ必要があります。鍵にアクセスできる攻撃者は、接続が危険にさらされる可能性があります。
vpn
RHEL システムロールを使用すると、PSK 認証による IPsec ホスト間接続を作成するプロセスを自動化できます。デフォルトでは、このロールはトンネルベースの VPN を作成します。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル Playbook で指定されている設定は次のとおりです。
hosts: <list>
VPN を設定するピアを含む YAML ディクショナリーを定義します。エントリーが Ansible 管理対象ノードでない場合は、
hostname
パラメーターに完全修飾ドメイン名 (FQDN) または IP アドレスを指定する必要があります。次に例を示します。... - hosts: ... external-host.example.com: hostname: 192.0.2.1
... - hosts: ... external-host.example.com: hostname: 192.0.2.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このロールは、各管理対象ノード上の 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: & lt;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
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
接続が正常に開始されたことを確認します。次に例を示します。
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
# 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'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の
auto
変数をstart
以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
6.13.2. vpn RHEL システムロールを使用して、個別のデータプレーンとコントロールプレーンおよび PSK 認証による IPsec ホスト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
ホスト間 VPN は、2 つのデバイス間で直接、安全で暗号化された接続を確立し、アプリケーションはインターネットなどの安全でないネットワーク上で安全に通信できるようにします。
認証の場合、事前共有キー(PSK)は、2 つのピアにのみ知られている単一の共有秘密を使用する簡単な方法です。このアプローチは、デプロイメントの容易さが優先される基本的なセットアップに設定が簡単で、理想的です。ただし、キーは厳密に機密に保つ必要があります。鍵にアクセスできる攻撃者は、接続が危険にさらされる可能性があります。
たとえば、制御メッセージが傍受または中断されるリスクを最小限に抑えることでセキュリティーを強化するために、データトラフィックと制御トラフィックの両方に個別の接続を設定できます。vpn
RHEL システムロールを使用すると、個別のデータプレーンとコントロールプレーンおよび PSK 認証を使用して IPsec ホスト間接続を作成するプロセスを自動化できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル 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: & lt;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
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
接続が正常に開始されたことを確認します。次に例を示します。
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
# 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'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の
auto
変数をstart
以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
6.13.3. vpn RHEL システムロールを使用した PSK 認証による IPsec サイト間 VPN の設定 リンクのコピーリンクがクリップボードにコピーされました!
サイト間 VPN は、2 つの異なるネットワーク間で安全で暗号化されたトンネルを確立し、インターネットなどの安全でないパブリックネットワーク全体でシームレスにリンクします。たとえば、これにより、分岐オフィスのデバイスは、同じローカルネットワークのすべての一部であるかのように、企業ヘッドクーティーのリソースにアクセスできるようになります。
認証の場合、事前共有キー(PSK)は、2 つのピアにのみ知られている単一の共有秘密を使用する簡単な方法です。このアプローチは、デプロイメントの容易さが優先される基本的なセットアップに設定が簡単で、理想的です。ただし、キーは厳密に機密に保つ必要があります。鍵にアクセスできる攻撃者は、接続が危険にさらされる可能性があります。
vpn
RHEL システムロールを使用すると、PSK 認証を使用して IPsec サイト間接続を作成するプロセスを自動化できます。デフォルトでは、このロールはトンネルベースの VPN を作成します。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル Playbook で指定されている設定は次のとおりです。
hosts: <list>
VPN を設定するゲートウェイを使用して YAML ディクショナリーを定義します。エントリーが Ansible 管理ノードではない場合、以下のように
hostname
パラメーターに完全修飾ドメイン名(FQDN)または IP アドレスを指定する必要があります。... - hosts: ... external-host.example.com: hostname: 192.0.2.1
... - hosts: ... external-host.example.com: hostname: 192.0.2.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このロールは、各管理対象ノード上の VPN 接続を設定します。接続の名前は to
-to-
です。たとえば、managed-node-01.example.com-to-managed-node-02.example.com
です。ロールは、外部(管理対象外)ノードで Libreswan を設定できないことに注意してください。そのようなピアでは手動で設定を作成する必要があります。サブネット:& lt;yaml_list_of_subnets>
- トンネルを介して接続するドメイン間ルーティング(CIDR)形式でサブネットを定義します。
auth_method: psk
-
ピア間の PSK 認証を有効にします。ロールはコントロールノードで
openssl
を使用して PSK を作成します。 auto: & lt;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
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
接続が正常に開始されたことを確認します。次に例を示します。
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
# 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'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の
auto
変数をstart
以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
6.13.4. vpn RHEL システムロールを使用して証明書ベースの認証による IPsec メッシュ VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
IPsec メッシュは、すべてのサーバーがセキュアで、他のすべてのサーバーと直接通信できる、完全に相互接続されたネットワークを作成します。これは、複数のデータセンターやクラウドプロバイダーにまたがる分散データベースクラスターまたは高可用性環境に適しています。各サーバー間で直接暗号化されたトンネルを確立することで、中央のボトルネックなしに通信をセキュアにすることができます。
認証には、認証局(CA)によって管理されるデジタル証明書を使用すると、安全性が高く、スケーラブルなソリューションが提供されます。メッシュの各ホストは、信頼できる CA によって署名された証明書を表示します。このメソッドは、強力な検証可能な認証を提供し、ユーザー管理を簡素化します。アクセスは CA で一元的に付与または取り消でき、Libreswan は、証明書失効リスト(CRL)に対して各証明書をチェックし、証明書がリストに表示されている場合はアクセスを拒否することで、これを強制します。
vpn
RHEL システムロールを使用すると、証明書ベースの認証による管理対象ノード間の VPN メッシュの設定を自動化できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
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.com
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.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cert_name
変数は、各ホストの証明書で使用されるコモンネーム (CN) フィールドの値に設定します。通常、CN フィールドは完全修飾ドメイン名 (FQDN) に設定します。機密性の高い変数を暗号化されたファイルに保存します。
vault を作成します。
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ansible-vault create
コマンドでエディターが開いたら、機密データを<key>: <value>
形式で入力します。pkcs12_pwd: <password>
pkcs12_pwd: <password>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル 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
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
メッシュ内のノードで、別のノードに ping を送信して接続をアクティブ化します。
ping managed-node-02.example.com
[root@managed-node-01]# ping managed-node-02.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接続がアクティブであることを確認します。
ipsec trafficstatus
[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'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.14. システム全体の暗号化ポリシーをオプトアウトする IPsec 接続の設定 リンクのコピーリンクがクリップボードにコピーされました!
接続向けのシステム全体の暗号化ポリシーのオーバーライド
RHEL のシステム全体の暗号化ポリシーでは、%default
と呼ばれる特別な接続が作成されます。この接続には、ikev2
オプション、esp
オプション、および ike
オプションのデフォルト値が含まれます。ただし、接続設定ファイルに上記のオプションを指定すると、デフォルト値を上書きできます。
たとえば、次の設定では、AES および SHA-1 または SHA-2 で IKEv1 を使用し、AES-GCM または AES-CBC で IPsec (ESP) を使用する接続が可能です。
AES-GCM は IPsec (ESP) および IKEv2 で利用できますが、IKEv1 では利用できません。
全接続向けのシステム全体の暗号化ポリシーの無効化
すべての IPsec 接続のシステム全体の暗号化ポリシーを無効にするには、/etc/ipsec.conf
ファイルで次の行をコメントアウトします。
include /etc/crypto-policies/back-ends/libreswan.config
include /etc/crypto-policies/back-ends/libreswan.config
次に、接続設定ファイルに ikev2=never
オプションを追加してください。
6.15. IPsec VPN 設定のトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
IPsec VPN 設定に関連する問題は主に、一般的な理由が原因で発生する可能性が高くなっています。このような問題が発生した場合は、問題の原因が以下のシナリオのいずれかに該当するかを確認して、対応するソリューションを適用します。
基本的な接続のトラブルシューティング
VPN 接続関連の問題の多くは、管理者が不適当な設定オプションを指定してエンドポイントを設定した新しいデプロイメントで発生します。また、互換性のない値が新たに実装された場合に、機能していた設定が突然動作が停止する可能性があります。管理者が設定を変更した場合など、このような結果になることがあります。また、管理者が暗号化アルゴリズムなど、特定のオプションに異なるデフォルト値を使用して、ファームウェアまたはパッケージの更新をインストールした場合などです。
IPsec VPN 接続が確立されていることを確認するには、次のコマンドを実行します。
ipsec trafficstatus
# 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=100.64.13.5/32
出力が空の場合や、エントリーで接続名が表示されない場合など、トンネルが破損します。
接続に問題があることを確認するには、以下を実行します。
vpn.example.com 接続をもう一度読み込みます。
ipsec auto --add vpn.example.com
# ipsec auto --add vpn.example.com 002 added connection description "vpn.example.com"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次に、VPN 接続を開始します。
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ファイアウォール関連の問題
最も一般的な問題は、IPSec エンドポイントの 1 つ、またはエンドポイント間にあるルーターにあるファイアウォールで Internet Key Exchange (IKE) パケットがドロップされるという点が挙げられます。
IKEv2 の場合には、以下の例のような出力は、ファイアウォールに問題があることを示しています。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IKEv1 の場合は、最初のコマンドの出力は以下のようになります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
IPsec の設定に使用される IKE プロトコルは暗号化されているため、tcpdump
ツールを使用して、トラブルシューティングできるサブセットは一部のみです。ファイアウォールが IKE パケットまたは IPsec パケットをドロップしている場合は、tcpdump
ユーティリティーを使用して原因を見つけることができます。ただし、tcpdump
は IPsec VPN 接続に関する他の問題を診断できません。
eth0
インターフェイスで VPN および暗号化データすべてのネゴシエーションを取得するには、次のコマンドを実行します。tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500
# tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
アルゴリズム、プロトコル、およびポリシーが一致しない場合
VPN 接続では、エンドポイントが IKE アルゴリズム、IPsec アルゴリズム、および IP アドレス範囲に一致する必要があります。不一致が発生した場合には接続は失敗します。以下の方法のいずれかを使用して不一致を特定した場合は、アルゴリズム、プロトコル、またはポリシーを調整して修正します。
リモートエンドポイントが IKE/IPsec を実行していない場合は、そのパケットを示す ICMP パケットが表示されます。以下に例を示します。
ipsec auto --up vpn.example.com
# 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)] ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IKE アルゴリズムが一致しない例:
ipsec auto --up vpn.example.com
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IPsec アルゴリズムが一致しない例:
ipsec auto --up vpn.example.com
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow また、IKE バージョンが一致しないと、リモートエンドポイントが応答なしの状態でリクエストをドロップする可能性がありました。これは、すべての IKE パケットをドロップするファイアウォールと同じです。
IKEv2 (Traffic Selectors - TS) の IP アドレス範囲が一致しない例:
ipsec auto --up vpn.example.com
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IKEv1 の IP アドレス範囲で一致しない例:
ipsec auto --up vpn.example.com
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IKEv1 で PreSharedKeys (PSK) を使用する場合には、どちらでも同じ PSK に配置されなければ、IKE メッセージ全体の読み込みができなくなります。
ipsec auto --up vpn.example.com
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IKEv2 では、mismatched-PSK エラーが原因で AUTHENTICATION_FAILED メッセージが表示されます。
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.com ... 002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
最大伝送単位
ファイアウォールが IKE または IPSec パケットをブロックする以外で、ネットワークの問題の原因として、暗号化パケットのパケットサイズの増加が最も一般的です。ネットワークハードウェアは、最大伝送単位 (MTU) を超えるパケットを 1500 バイトなどのサイズに断片化します。多くの場合、断片化されたパケットは失われ、パケットの再アセンブルに失敗します。これにより、小さいサイズのパケットを使用する ping テスト時には機能し、他のトラフィックでは失敗するなど、断続的な問題が発生します。このような場合に、SSH セッションを確立できますが、リモートホストに 'ls -al /usr' コマンドに入力した場合など、すぐにターミナルがフリーズします。
この問題を回避するには、トンネル設定ファイルに mtu=1400
のオプションを追加して、MTU サイズを縮小します。
または、TCP 接続の場合は、MSS 値を変更する iptables ルールを有効にします。
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
各シナリオで上記のコマンドを使用して問題が解決されない場合は、set-mss
パラメーターで直接サイズを指定します。
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380
ネットワークアドレス変換 (NAT)
IPsec ホストが NAT ルーターとしても機能すると、誤ってパケットが再マッピングされる可能性があります。以下の設定例はこの問題を示しています。
アドレスが 172.16.0.1 のシステムには NAT ルールが 1 つあります。
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
アドレスが 10.0.2.33 のシステムがパケットを 192.168.0.1 に送信する場合に、ルーターは IPsec 暗号化を適用する前にソースを 10.0.2.33 から 172.16.0.1 に変換します。
次に、ソースアドレスが 10.0.2.33 のパケットは conn myvpn
設定と一致しなくなるので、IPsec ではこのパケットが暗号化されません。
この問題を解決するには、ルーターのターゲット IPsec サブネット範囲の NAT を除外するルールを挿入します。以下に例を示します。
iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN
iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN
カーネル IPsec サブシステムのバグ
たとえば、バグが原因で IKE ユーザー空間と IPsec カーネルの同期が解除される場合など、カーネル IPsec サブシステムに問題が発生する可能性があります。このような問題がないかを確認するには、以下を実行します。
cat /proc/net/xfrm_stat XfrmInError 0 XfrmInBufferError 0 ...
$ cat /proc/net/xfrm_stat
XfrmInError 0
XfrmInBufferError 0
...
上記のコマンドの出力でゼロ以外の値が表示されると、問題があることを示しています。この問題が発生した場合は、新しい サポートケース を作成し、1 つ前のコマンドの出力と対応する IKE ログを添付してください。
Libreswan のログ
デフォルトでは、Libreswan は syslog
プロトコルを使用してログに記録します。journalctl
コマンドを使用して、IPsec に関連するログエントリーを検索できます。ログへの対応するエントリーは pluto
IKE デーモンにより送信されるため、以下のように、キーワード "pluto" を検索します。
journalctl -b | grep pluto
$ journalctl -b | grep pluto
ipsec
サービスのライブログを表示するには、次のコマンドを実行します。
journalctl -f -u ipsec
$ journalctl -f -u ipsec
ロギングのデフォルトレベルで設定問題が解決しない場合は、/etc/ipsec.conf
ファイルの config setup
セクションに plutodebug=all
オプションを追加してデバッグログを有効にします。
デバッグロギングは多くのエントリーを生成し、journald
サービスまたは syslogd
サービスレートのいずれかが syslog
メッセージを制限する可能性があることに注意してください。完全なログを取得するには、ロギングをファイルにリダイレクトします。/etc/ipsec.conf
を編集し、config setup
セクションに logfile=/var/log/pluto.log
を追加します。
6.16. control-center による VPN 接続の確立 リンクのコピーリンクがクリップボードにコピーされました!
グラフィカルインターフェイスで Red Hat Enterprise Linux を使用する場合は、この VPN 接続を GNOME control-center
で設定できます。
前提条件
-
NetworkManager-libreswan-gnome
パッケージがインストールされている。
手順
-
Super キーを押して
Settings
と入力し、Enter を押してcontrol-center
アプリケーションを開きます。 -
左側の
Network
エントリーを選択します。 - + アイコンをクリックします。
-
VPN
を選択します。 Identity
メニューエントリーを選択して、基本的な設定オプションを表示します。全般
Gateway
- リモート VPN ゲートウェイの名前またはIP
アドレスです。認証
Type
-
IKEv2 (証明書)
- クライアントは、証明書により認証されます。これはより安全です (デフォルト)。 IKEv1(XAUTH)
: クライアントは、ユーザー名とパスワード、または事前共有キー (PSK) で認証されます。Advanced
セクションでは、以下の設定が可能です。図6.1 VPN 接続の詳細なオプション
警告gnome-control-center
アプリケーションを使用して IPsec ベースの VPN 接続を設定すると、Advanced
ダイアログには設定が表示されますが、変更することはできません。したがって、詳細な IPsec オプションを変更できません。nm-connection-editor
ツールまたはnmcli
ツールを使用して、詳細なプロパティーの設定を実行します。識別
Domain
- 必要な場合は、ドメイン名を入力します。セキュリティー
-
Phase1 Algorithms
- Libreswan パラメーターike
に対応します。暗号化チャネルの認証およびセットアップに使用するアルゴリズムを入力します。 Phase2 Algorithms
- Libreswan パラメーターesp
に対応します。IPsec
ネゴシエーションに使用するアルゴリズムを入力します。Disable PFS
フィールドで PFS (Perfect Forward Secrecy) を無効にし、PFS に対応していない古いサーバーとの互換性があることを確認します。-
Phase1 Lifetime
- Libreswan パラメーターikelifetime
に対応します。このパラメーターは、トラフィックの暗号化に使用される鍵がどのぐらい有効であるかどうかを示します。 Phase2 Lifetime
- Libreswan パラメーターsalifetime
に対応します。このパラメーターは、接続の特定インスタンスが期限切れになるまでの持続時間を指定します。セキュリティー上の理由から、暗号化キーは定期的に変更する必要があります。
Remote network
- Libreswan パラメーターrightsubnet
に対応します。このパラメーターは、VPN から到達できる宛先のプライベートリモートネットワークです。絞り込むことのできる
narrowing
フィールドを確認します。これは IKEv2 ネゴシエーションの場合にのみ有効であることに注意してください。-
Enable fragmentation
- Libreswan パラメーターのfragmentation
に対応します。IKE 断片化を許可するかどうかを指定します。有効な値は、yes
(デフォルト) またはno
です。 -
Enable Mobike
- Libreswan パラメーターmobike
に対応します。最初から接続を再起動しなくても、接続がエンドポイントを移行することを Mobility and Multihoming Protocol (MOBIKE, RFC 4555) が許可するかどうかを設定します。これは、有線、無線、またはモバイルデータの接続の切り替えを行うモバイルデバイスで使用されます。値は、no
(デフォルト) またはyes
です。
-
IPv4 Method
-
Automatic (DHCP)
- 接続しているネットワークが動的IP
アドレスの割り当てにDHCP
サーバーを使用する場合は、このオプションを選択します。 -
Link-Local Only
- 接続しているネットワークにDHCP
サーバーがなく、IP
アドレスを手動で割り当てない場合は、このオプションを選択します。接頭辞169.254/16
付きのランダムなアドレスが、RFC 3927 に従って割り当てられます。 -
Manual
-IP
アドレスを手動で割り当てたい場合は、このオプションを選択します。 Disable
- この接続ではIPv4
は無効化されています。DNS
DNS
セクションでは、Automatic
がON
になっているときに、これをOFF
に切り替えて、使用する DNS サーバーの IP アドレスを入力します。IP アドレスはコンマで区切ります。Routes
Routes
セクションでは、Automatic
がON
になっている場合は、DHCP からのルートが使用されますが、他の静的ルートを追加することもできることに注意してください。OFF
の場合は、静的ルートだけが使用されます。-
Address
- リモートネットワークまたはホストのIP
アドレスを入力します。 -
Netmask
- 上記で入力したIP
アドレスのネットマスクまた接頭辞長。 -
Gateway
- 上記で入力したリモートネットワーク、またはホストにつながるゲートウェイのIP
アドレス。 Metric
- このルートに与える優先値であるネットワークコスト。数値が低い方が優先されます。Use this connection only for resources on its network (この接続はネットワーク上のリソースのためだけに使用)
このチェックボックスを選択すると、この接続はデフォルトルートになりません。このオプションを選択すると、この接続で自動的に学習したルートを使用することが明確なトラフィックか、手動で入力したトラフィックのみがこの接続を経由します。
-
VPN
接続のIPv6
設定を設定するには、 メニューエントリーを選択します。IPv6 Method
-
Automatic
-IPv6
ステートレスアドレス自動設定 (SLAAC) を使用して、ハードウェアのアドレスとルーター通知 (RA) に基づくステートレスの自動設定を作成するには、このオプションを選択します。 -
Automatic, DHCP only
- RA を使用しないで、DHCPv6
からの情報を直接要求してステートフルな設定を作成する場合は、このオプションを選択します。 -
Link-Local Only
- 接続しているネットワークにDHCP
サーバーがなく、IP
アドレスを手動で割り当てない場合は、このオプションを選択します。接頭辞FE80::0
付きのランダムなアドレスが、RFC 4862 に従って割り当てられます。 -
Manual
-IP
アドレスを手動で割り当てたい場合は、このオプションを選択します。 Disable
- この接続ではIPv6
は無効化されています。DNS
、Routes
、Use this connection only for resources on its network
が、一般的なIPv4
設定となることに注意してください。
-
-
VPN
接続の編集が終了したら、 ボタンをクリックして設定をカスタマイズするか、 ボタンをクリックして、既存の接続に保存します。 -
プロファイルを
ON
に切り替え、VPN
接続をアクティブにします。 - DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。
6.17. nm-connection-editor による VPN 接続の設定 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux をグラフィカルインターフェイスで使用する場合は、nm-connection-editor
アプリケーションを使用して VPN 接続を設定できます。
前提条件
-
NetworkManager-libreswan-gnome
パッケージがインストールされている。 インターネット鍵交換バージョン 2 (IKEv2) 接続を設定する場合は、以下のようになります。
- 証明書が、IPsec ネットワークセキュリティーサービス (NSS) データベースにインポートされている。
- NSS データベースの証明書のニックネームが知られている。
手順
ターミナルを開き、次のコマンドを入力します。
nm-connection-editor
$ nm-connection-editor
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ボタンをクリックして、新しい接続を追加します。
-
IPsec ベースの VPN
接続タイプを選択し、 をクリックします。 VPN
タブで、以下を行います。Gateway
フィールドに VPN ゲートウェイのホスト名または IP アドレスを入力し、認証タイプを選択します。認証タイプに応じて、異なる追加情報を入力する必要があります。-
IKEv2 (Certifiate)
は、証明書を使用してクライアントを認証します。これは、より安全です。この設定には、IPsec NSS データベースの証明書のニックネームが必要です。 IKEv1 (XAUTH)
は、ユーザー名とパスワード (事前共有鍵) を使用してユーザーを認証します。この設定は、以下の値を入力する必要があります。- ユーザー名
- Password
- グループ名
- シークレット
-
リモートサーバーが IKE 交換のローカル識別子を指定する場合は、
Remote ID
フィールドに正確な文字列を入力します。リモートサーバーで Libreswan を実行すると、この値はサーバーのleftid
パラメーターに設定されます。オプション:
ボタンをクリックして、追加設定を行います。以下の設定を指定できます。識別
-
Domain
- 必要な場合は、ドメイン名を入力します。
-
セキュリティー
-
Phase1 アルゴリズム
は、Libreswan パラメーターike
に対応します。暗号化チャンネルの認証および設定に使用するアルゴリズムを入力します。 Phase2 アルゴリズム
は、Libreswan パラメーターesp
に対応します。IPsec
ネゴシエーションに使用するアルゴリズムを入力します。Disable PFS
フィールドで PFS (Perfect Forward Secrecy) を無効にし、PFS に対応していない古いサーバーとの互換性があることを確認します。-
Phase1 ライフタイム
は、Libreswan パラメーターikelifetime
に対応します。このパラメーターは、トラフィックの暗号化に使用される鍵が有効である期間を定義します。 -
Phase2 ライフタイム
は、Libreswan パラメーターsalifetime
に対応します。このパラメーターは、セキュリティー関連が有効である期間を定義します。
-
接続性
リモートネットワーク
は、Libreswan パラメーターrightsubnet
に対応し、VPN から到達できる宛先のプライベートリモートネットワークです。絞り込むことのできる
narrowing
フィールドを確認します。これは IKEv2 ネゴシエーションの場合にのみ有効であることに注意してください。-
フラグメンテーションの有効化
は、Libreswan パラメーターの断片化
に対応します。IKE 断片化を許可するかどうかを指定します。有効な値は、yes
(デフォルト) またはno
です。 -
Mobike の有効化
は、Libreswan パラメーターmobike
に対応します。パラメーターは、最初から接続を再起動しなくても、接続がエンドポイントを移行することを Mobility and Multihoming Protocol (MOBIKE) (RFC 4555) が許可するかどうかを定義します。これは、有線、無線、またはモバイルデータの接続の切り替えを行うモバイルデバイスで使用されます。値は、no
(デフォルト) またはyes
です。
IPv4 設定
タブで、IP 割り当て方法を選択し、必要に応じて、追加の静的アドレス、DNS サーバー、検索ドメイン、ルートを設定します。- 接続を読み込みます。
-
nm-connection-editor
を閉じます。 - DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。
NetworkManager により、その接続用の新しい設定が作成され、既存の接続の編集に使用するのと同じダイアログが表示されます。このダイアログの違いは、既存の接続プロファイルに Details メニューエントリーがあることです。
ボタンをクリックして新しい接続を追加する場合は、6.18. nmstatectl を使用して IPsec ベースの VPN 接続を設定する リンクのコピーリンクがクリップボードにコピーされました!
仮想プライベートネットワーク (VPN) を使用すると、インターネットなどの信頼できないネットワーク上で、セキュアで暗号化されたトンネルを確立できます。このようなトンネルにより、転送中のデータの機密性と整合性が確保されます。一般的なユースケースとしては、支社と本社を接続することなどが挙げられます。
nmstatectl
ユーティリティーを使用して、Nmstate API を介して Libreswan IPsec VPN 接続を設定できます。nmstatectl
ユーティリティーは、宣言型 Nmstate API を介してホストネットワークを管理するコマンドラインツールです。複数の命令的なコマンドを実行してインターフェイスを設定する代わりに、YAML ファイルで予想される状態を定義します。nmstate はこの定義を取り、システムに適用します。このアプローチの主な利点は、アトミックな結果です。nmstate は、作成される設定が YAML 定義と正確に一致することを確認します。設定の一部の適用に失敗した場合は、すべての変更を自動的にロールバックし、システムが誤ったネットワーク状態や破損の状態に入るのを防ぎます。
NetworkManager-libreswan
プラグインの設計により、nmstatectl
は 1 つのピアでのみ使用でき、他のピアで Libreswan を手動で設定する必要があります。
6.18.1. nmstatectlを使用した raw RSA 鍵認証を使用した IPsec ホスト間 VPN の設定 リンクのコピーリンクがクリップボードにコピーされました!
ホスト間 VPN は、2 つのデバイス間で直接、安全で暗号化された接続を確立し、アプリケーションはインターネットなどの安全でないネットワーク上で安全に通信できるようにします。
認証の場合、非対称暗号化により共有秘密のリスクが排除されるため、RSA キーは事前共有鍵(PSK)よりも安全です。また、RSA キーを使用すると、強力なピアツーピア認証を提供しながら、認証局(CA)の必要がなくなるため、デプロイメントが簡素化されます。
Nmstate API を使用して、既存の Libreswan IPsec ホストとの接続を設定できます。この場合、Nmstate は、生成される設定が YAML ファイルの定義と一致することを確認するか、変更を自動的にロールバックしてシステムの誤った状態を回避します。Nmstate は状態のみを検証し、間違った設定に対して保護されないことに注意してください。
通常、left という名前が付けられ、right を選択する方法は任意です。ただし、NetworkManager は常に ローカルホスト に left という用語を使用し、リモートホストには 右 という用語を使用します。
前提条件
リモートピアは Libreswan IPsec を実行し、ホスト間接続に準備さ れます。
NetworkManager-libreswan
プラグインの設計により、Nmstate は、同じ接続にこのプラグインも使用する他のピアと通信できません。
手順
Libreswan がインストールされていない場合は、以下の手順を実行します。
必要なパッケージをインストールします。
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswan
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NetworkManager サービスを再起動します。
systemctl restart NetworkManager
# systemctl restart NetworkManager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Network Security Services (NSS)データベースを初期化します。
ipsec initnss
# ipsec initnss
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、
/var/lib/ipsec/nss/
ディレクトリーにデータベースが作成されます。ファイアウォールで IPsec ポートおよびプロトコルを開きます。
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
RSA キーペアを作成します。
ipsec newhostkey
# ipsec newhostkey
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec
ユーティリティーは、キーペアを NSS データベースに保存します。左側のピアと右のピアの両方に証明書キー属性 ID (CKAID)を表示します。
ipsec showhostkey --list
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の手順では、両方のピアの CKAID が必要です。
公開鍵を表示します。
左側のピアで、次のように入力します。
ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 正しいピアで、次のように入力します。
ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
コマンドは、公開鍵を、設定ファイルで使用する必要がある対応するパラメーターとともに表示します。
以下の内容を含む YAML ファイルを作成します(例:
~/ipsec-host-to-host-rsa-auth.yml
)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例で指定されている設定は次のとおりです。
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>
andrightid= <id>
-
インターネット鍵交換(IKE)ネゴシエーションプロセス中に各ピアを識別する方法を定義します。IP アドレスまたはリテラル文字列を指定できます。NetworkManager は、IP アドレス以外のすべての値をリテラル文字列として解釈し、内部的に先頭の
@
記号を追加することに注意してください。これには、Libreswan ピアが ID または認証の失敗としてリテラル文字列も使用する必要があります。 leftrsasigkey= <public_key>
およびrightrsasigkey= <public_key>
-
ピアの公開鍵を指定します。直前の手順で
ipsec showhostkey
コマンドで表示される値を使用します。 leftmodecfgclient: false
- このホストでの動的設定を無効にします。この設定は、Nmstate のホスト間設定では必須です。
rightsubnet: & lt;ip_address_of_right_peer> /32
- ホストがこのピアのみにアクセスできることを定義します。この設定は、Nmstate のホスト間設定では必須です。
設定をシステムに適用します。
nmstatectl apply ~/ipsec-host-to-host-rsa-auth.yml
# nmstatectl apply ~/ipsec-host-to-host-rsa-auth.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
IPsec のステータスを表示します。
ipsec status
# ipsec status
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接続が正常に確立された場合、出力には以下のような行が含まれます。
インターネット鍵交換バージョン 2 (IKEv2)ネゴシエーションのフェーズ 1 が正常に完了しています。
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow セキュリティー関連付け(SA)は、子 SAs または Phase 2 SAs として知られる実際のデータ暗号化トンネルをネゴシエートできるようになりました。
子 SA が確立されました。
000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、データトラフィックが流れる実際のトンネルです。
トラブルシューティング
NetworkManager が Libreswan に渡す実際の設定を表示するには、次のコマンドを実行します。
nmcli connection export <connection_name>
# nmcli connection export <connection_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力では、リモートホストの Libreswan 設定と比較すると、ID やキーなどの開発設定を特定することができます。
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。
6.18.2. nmstatectlを使用した raw RSA 鍵認証を使用した IPsec サイト間 VPN の設定 リンクのコピーリンクがクリップボードにコピーされました!
サイト間 VPN は、2 つの異なるネットワーク間で安全で暗号化されたトンネルを確立し、インターネットなどの安全でないパブリックネットワーク全体でシームレスにリンクします。たとえば、これにより、分岐オフィスのデバイスは、同じローカルネットワークのすべての一部であるかのように、企業ヘッドクツーのリソースにアクセスできるようになります。
ゲートウェイデバイスを認証する場合、非対称暗号化により共有秘密のリスクが排除されるため、RSA 鍵は事前共有鍵(PSK)よりも安全です。また、RSA キーを使用すると、強力なピアツーピア認証を提供しながら、認証局(CA)の必要がなくなるため、デプロイメントが簡素化されます。
Nmstate API を使用して、既存の Libreswan IPsec ゲートウェイで接続を設定できます。この場合、Nmstate は、生成される設定が YAML ファイルの定義と一致することを確認するか、変更を自動的にロールバックしてシステムの誤った状態を回避します。Nmstate は状態のみを検証し、間違った設定に対して保護されないことに注意してください。
通常、left という名前で right の名前は任意になります。ただし、NetworkManager は常に ローカルホスト に left という用語を使用し、リモートホストには 右 という用語を使用します。
前提条件
リモートゲートウェイは Libreswan IPsec を実行し、サイト間接続に準備さ れます。
NetworkManager-libreswan
プラグインの設計により、Nmstate は、同じ接続にこのプラグインも使用する他のピアと通信できません。
手順
Libreswan がインストールされていない場合は、以下の手順を実行します。
必要なパッケージをインストールします。
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswan
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NetworkManager サービスを再起動します。
systemctl restart NetworkManager
# systemctl restart NetworkManager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Network Security Services (NSS)データベースを初期化します。
ipsec initnss
# ipsec initnss
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、
/var/lib/ipsec/nss/
ディレクトリーにデータベースが作成されます。ファイアウォールで IPsec ポートおよびプロトコルを開きます。
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
RSA キーペアを作成します。
ipsec newhostkey
# ipsec newhostkey
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec
ユーティリティーは、キーペアを NSS データベースに保存します。左側のピアと右のピアの両方に Certificate Key Attribute ID (CKAID)を表示します。
ipsec showhostkey --list
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の手順で、両方のピアの CKAID が必要です。
公開鍵を表示します。
左側のピアで、次のように入力します。
ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 正しいピアで、次のように入力します。
ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
コマンドは、公開鍵を、設定ファイルで使用する必要がある対応するパラメーターとともに表示します。
以下の内容を含む YAML ファイルを作成します(例:
~/ipsec-site-to-site-rsa-auth.yml
)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例で指定されている設定は次のとおりです。
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>
andrightid= <id>
-
インターネット鍵交換(IKE)ネゴシエーションプロセス中に各ピアを識別する方法を定義します。IP アドレスまたはリテラル文字列を指定できます。NetworkManager は、IP アドレス以外のすべての値をリテラル文字列として解釈し、内部的に先頭の
@
記号を追加することに注意してください。これには、Libreswan ピアが ID または認証の失敗としてリテラル文字列も使用する必要があります。 leftrsasigkey= <public_key>
およびrightrsasigkey= <public_key>
-
ピアの公開鍵を指定します。直前の手順で
ipsec showhostkey
コマンドで表示される値を使用します。 leftmodecfgclient: false
- このホストでの動的設定を無効にします。この設定は、Nmstate のサイト間設定では必須です。
leftsubnet= <subnet>
andrightsubnet= <subnet>
- トンネルを介して接続するドメイン間ルーティング(CIDR)形式でサブネットを定義します。
パケット転送を有効にします。
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 設定をシステムに適用します。
nmstatectl apply ~/ipsec-site-to-site-rsa-auth.yml
# nmstatectl apply ~/ipsec-site-to-site-rsa-auth.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
IPsec のステータスを表示します。
ipsec status
# ipsec status
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接続が正常に確立された場合、出力には以下のような行が含まれます。
インターネット鍵交換バージョン 2 (IKEv2)ネゴシエーションのフェーズ 1 が正常に完了しています。
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow セキュリティー関連付け(SA)は、子 SAs または Phase 2 SAs として知られる実際のデータ暗号化トンネルをネゴシエートできるようになりました。
子 SA が確立されました。
000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、データトラフィックが流れる実際のトンネルです。
- ローカルサブネットのクライアントから、リモートサブネットのクライアントに ping 送信を行います。
トラブルシューティング
NetworkManager が Libreswan に渡す実際の設定を表示するには、次のコマンドを実行します。
nmcli connection export <connection_name>
# nmcli connection export <connection_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力では、リモートホストの Libreswan 設定と比較すると、ID やキーなどの開発設定を特定することができます。
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。
6.18.3. nmstatectlを使用して IPsec VPN ゲートウェイに接続するようにクライアントを設定する リンクのコピーリンクがクリップボードにコピーされました!
リモートプライベート ネットワーク上のリソースにアクセスするには、まず IPsec VPN 接続を設定する必要があります。Nmstate API を使用して、既存の Libreswan IPsec ゲートウェイで接続を設定できます。この場合、Nmstate は、生成される設定が YAML ファイルの定義と一致することを確認するか、変更を自動的にロールバックしてシステムの誤った状態を回避します。Nmstate は状態のみを検証し、間違った設定に対して保護されないことに注意してください。
通常、left という名前が付けられ、right を選択する方法は任意です。ただし、NetworkManager は常に ローカルホスト に left という用語を使用し、リモートホストには 右 という用語を使用します。
前提条件
リモートゲートウェイは 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-libreswan
# dnf install nmstate libreswan NetworkManager-libreswan
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NetworkManager サービスを再起動します。
systemctl restart NetworkManager
# systemctl restart NetworkManager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Network Security Services (NSS)データベースを初期化します。
ipsec initnss
# ipsec initnss
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、
/var/lib/ipsec/nss/
ディレクトリーにデータベースが作成されます。ファイアウォールで IPsec ポートおよびプロトコルを開きます。
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
PKCS #12 ファイルを NSS データベースにインポートします。
ipsec import ~/file.p12
# ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CA
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ユーザーおよび CA 証明書のニックネームを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この情報は Nmstate YAML ファイルで必要になります。
以下の内容を含む YAML ファイル(例:
~/ipsec-host-to-site-cert-auth.yml
)を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例で指定されている設定は次のとおりです。
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
andrightid=%fromcert
- 証明書の識別名(DN)フィールドからアイデンティティーを取得するように Libreswan を設定します。
leftcert=" <server_certificate_nickname>"
- NSS データベースで使用されるサーバーの証明書のニックネームを設定します。
rightsubnet: < subnet>
- ゲートウェイに接続されたドメイン間ルーティング(CIDR)形式でサブネットを定義します。
設定をシステムに適用します。
nmstatectl apply ~/ipsec-host-to-site-cert-auth.yml
# nmstatectl apply ~/ipsec-host-to-site-cert-auth.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
- リモートネットワークでホストへの接続を確立するか、ping します。
トラブルシューティング
NetworkManager が Libreswan に渡す実際の設定を表示するには、次のコマンドを実行します。
nmcli connection export <connection_name>
# nmcli connection export <connection_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力では、リモートホストの Libreswan 設定と比較すると、ID やキーなどの開発設定を特定することができます。
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。
6.19. 接続がトンネルを回避しないように 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.route-table 75 ipv6.route-table 75
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記のコマンドで使用したテーブルに低い優先度値を設定します。
nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all 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"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 優先度の値は 1 - 32766 の範囲で指定できます。値が低いほど、優先度が高くなります。
VPN 接続を再接続します。
nmcli connection down <vpn_connection_profile> nmcli connection up <vpn_connection_profile>
# nmcli connection down <vpn_connection_profile> # nmcli connection up <vpn_connection_profile>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
テーブル 75 の IPv4 ルートを表示します。
ip route show table 75
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 75 に割り当てられており、すべてのトラフィックがトンネルを介してルーティングされることを確認できます。VPN 接続プロファイルで
ipv4.never-default true
を設定すると、デフォルトルートが作成されず、この出力には表示されません。テーブル 75 の IPv6 ルートを表示します。
ip -6 route show table 75
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力から、リモートネットワークへのルートとデフォルトゲートウェイの両方がルーティングテーブル 75 に割り当てられており、すべてのトラフィックがトンネルを介してルーティングされることを確認できます。VPN 接続プロファイルで
ipv4.never-default true
を設定すると、デフォルトルートが作成されず、この出力には表示されません。
第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'
# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow TCP 接続を制限し、
111
ポート経由のローカルホストからのパッケージだけを受け入れます。firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'
# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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'
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="111" protocol="udp" source address="192.168.0.0/24" invert="True" drop'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイアウォール設定を永続化するには、ファイアウォールルールを追加するときに
--permanent
オプションを使用します。
ファイアウォールをリロードして、新しいルールを適用します。
firewall-cmd --reload
# firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
ファイアウォールルールをリストします。
firewall-cmd --list-rich-rule
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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'
# firewall-cmd --add-rich-rule 'rule family="ipv4" service name="mountd" source address="192.168.0.0/24" invert="True" drop'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ローカルホストからの
mountd
接続を受け入れます。firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" service name="mountd" accept'
# firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" service name="mountd" accept'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイアウォール設定を永続化するには、ファイアウォールルールを追加するときに
--permanent
オプションを使用します。
ファイアウォールをリロードして、新しいルールを適用します。
firewall-cmd --reload
# firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
ファイアウォールルールをリストします。
firewall-cmd --list-rich-rule
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
/gid
0 からの要求を匿名の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)
/tmp/nfs/ bob.example.com(rw)
以下の例は上記と同じになりますが、同じディレクトリーを読み取り専用パーミッションで bob.example.com
ホストに共有し、ホスト名の後の 1 つのスペース文字が原因で読み取りと書き込み権限で すべてのユーザー に共有します。
/tmp/nfs/ bob.example.com (rw)
/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
$ rpcinfo -p
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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.
ftpd_banner=Hello, all activity on ftp.example.com is logged.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 別のファイルでメッセージを定義するには以下を実行します。
バナーメッセージを含む
.msg
ファイルを作成します。(例:/etc/banners/ftp.msg
)######### Hello, all activity on ftp.example.com is logged. #########
######### Hello, all activity on ftp.example.com is logged. #########
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 複数のバナーの管理を簡素化するには、すべてのバナーを
/etc/banners/
ディレクトリーに配置します。バナーファイルへのパスを
/etc/vsftpd/vsftpd.conf
ファイルのbanner_file
オプションに追加します。banner_file=/etc/banners/ftp.msg
banner_file=/etc/banners/ftp.msg
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
変更されたバナーを表示します。
ftp localhost
$ ftp localhost Trying ::1… Connected to localhost (::1). Hello, all activity on ftp.example.com is logged.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/vsftpd/vsftpd.conf
ファイルに以下の行を追加します。anon_upload_enable=YES anonymous_enable=YES
anon_upload_enable=YES anonymous_enable=YES
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
オプション: システムで 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
local_enable=NO
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
/etc/pam.d/vsftpd
PAM 設定ファイルにユーザー名を追加して、特定のアカウントまたは特定のアカウントグループ (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>
# 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.2
Apache/2.4.37 (Red Hat Enterprise Linux) MyMod/1.2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Full-Release
以下のように、利用可能なすべての情報をリリースバージョンとともに指定します。
Apache/2.4.37 (Red Hat Enterprise Linux) (Release 41.module+el8.5.0+11772+c8e0c271)
Apache/2.4.37 (Red Hat Enterprise Linux) (Release 41.module+el8.5.0+11772+c8e0c271)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Prod / ServerTokens ProductOnly
以下のように、Web サーバー名を指定します。
Apache
Apache
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Major
以下のように、Web サーバーのメジャーリリースバージョンを指定します。
Apache/2
Apache/2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Minor
以下のように、Web サーバーのマイナーリリースバージョンを指定します。
Apache/2.4
Apache/2.4
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Min
/ServerTokens Minimal
以下のように、Web サーバーの最小リリースバージョンを指定します。
Apache/2.4.37
Apache/2.4.37
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens OS
以下のように、Web サーバーのリリースバージョンとオペレーティングシステムを指定します。
Apache/2.4.37 (Red Hat Enterprise Linux)
Apache/2.4.37 (Red Hat Enterprise Linux)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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;
server_tokens off;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このオプションは、サーバーのバージョン番号などの追加の情報表示を停止します。以下のようにこの設定では、Nginx によって処理されるすべての要求のサーバー名のみが表示されます。
curl -sI http://localhost | grep Server
$ curl -sI http://localhost | grep Server Server: nginx
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 特定の
/etc/nginx/
conf ファイルに、特定の既知の Web アプリケーションの脆弱性を軽減するセキュリティーヘッダーを追加します。たとえば、
X-Frame-Options
ヘッダーオプションは、Nginx が提供するコンテンツのフレーム化がされないように、ドメイン外のページを拒否して、クリックジャッキング攻撃を軽減します。add_header X-Frame-Options "SAMEORIGIN";
add_header X-Frame-Options "SAMEORIGIN";
Copy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、
x-content-type
ヘッダーは、特定の古いブラウザーでの MIME タイプのスニッフィングを防ぎます。add_header X-Content-Type-Options nosniff;
add_header X-Content-Type-Options nosniff;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow また、
X-XSS-Protection
ヘッダーは、クロスサイトスクリプティング (XSS) フィルタリングを有効にし、Nginx での応答に含まれる可能性がある、悪意のあるコンテンツをブラウザーがレンダリングしないようにします。add_header X-XSS-Protection "1; mode=block";
add_header X-XSS-Protection "1; mode=block";
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
たとえば、一般に公開されるサービスを制限し、訪問者からのサービスと受け入れを制限できます。
limit_except GET { allow 192.168.1.0/32; deny all; }
limit_except GET { allow 192.168.1.0/32; deny all; }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow スニペットは、
GET
とHEAD
を除くすべてのメソッドへのアクセスを制限します。以下のように、HTTP メソッドを無効にできます。
Allow GET, PUT, POST; return "405 Method Not Allowed" for all others.
# Allow GET, PUT, POST; return "405 Method Not Allowed" for all others. if ( $request_method !~ ^(GET|PUT|POST)$ ) { return 405; }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
# yum install postgresql-server
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のいずれかのオプションを使用して、データベースストレージ領域を初期化します。
initdb
ユーティリティーの使用:initdb -D /home/postgresql/db1/
$ initdb -D /home/postgresql/db1/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -D
オプションを指定したinitdb
コマンドを実行すると、指定したディレクトリーがまだ存在しない場合は作成します (例:/home/postgresql/db1/
)。このディレクトリーには、データベースに保存されているすべてのデータと、クライアント認証設定ファイルが含まれています。postgresql-setup
スクリプトの使用:postgresql-setup --initdb
$ postgresql-setup --initdb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、スクリプトは
/var/lib/pgsql/data/
ディレクトリーを使用します。このスクリプトは、基本的なデータベースクラスター管理でシステム管理者を支援します。
認証されたローカルユーザーが自分のユーザー名でデータベースにアクセスできるようにするには、
pg_hba.conf
ファイルの以下の行を変更します。local all all trust
local all all trust
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、データベースユーザーを作成し、ローカルユーザーを作成しないレイヤー型アプリケーションを使用する場合に、問題となることがあります。システム上のすべてのユーザー名を明示的に制御しない場合は、
pg_hba.conf
ファイルからlocal
の行を削除してください。データベースを再起動して、変更を適用します。
systemctl restart postgresql
# systemctl restart postgresql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前のコマンドはデータベースを更新し、設定ファイルの構文も検証します。
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
# firewall-cmd --remove-port=11211/udp # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションと同じマシン上で 1 台の Memcached サーバーを使用する場合は、localhost トラフィックのみをリッスンするように
memcached
を設定します。/etc/sysconfig/memcached
ファイルのOPTIONS
値を変更します。OPTIONS="-l 127.0.0.1,::1"
OPTIONS="-l 127.0.0.1,::1"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Simple Authentication and Security Layer (SASL) 認証を有効にします。
/etc/sasl2/memcached.conf
ファイルで、以下のように修正または追加します。sasldb_path: /path.to/memcached.sasldb
sasldb_path: /path.to/memcached.sasldb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SASL データベースにアカウントを追加します。
saslpasswd2 -a memcached -c cacheuser -f /path.to/memcached.sasldb
# saslpasswd2 -a memcached -c cacheuser -f /path.to/memcached.sasldb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow memcached
のユーザーとグループがデータベースにアクセスできることを確認します。chown memcached:memcached /path.to/memcached.sasldb
# chown memcached:memcached /path.to/memcached.sasldb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/sysconfig/memcached
ファイルのOPTIONS
パラメーターに-S
値を追加して、Memcached で SASL サポートを有効にします。OPTIONS="-S"
OPTIONS="-S"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Memcached サーバーを再起動して、変更を適用します。
systemctl restart memcached
# systemctl restart memcached
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SASL データベースで作成したユーザー名とパスワードを、お使いのアプリケーションの Memcached クライアント設定に追加します。
Memcached クライアントとサーバー間の通信を TLS で暗号化します。
/etc/sysconfig/memcached
ファイルのOPTIONS
パラメーターに-Z
値を追加して、TLS を使用した Memcached クライアントとサーバー間の暗号化通信を有効にします。OPTIONS="-Z"
OPTIONS="-Z"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
-o ssl_chain_cert
オプションを使用して、証明書チェーンファイルパスを PEM 形式で追加します。 -
-o ssl_key
オプションを使用して、秘密鍵ファイルのパスを追加します。
第8章 MACsec を使用した同じ物理ネットワーク内のレイヤー 2 トラフィックの暗号化 リンクのコピーリンクがクリップボードにコピーされました!
MACsec を使用して、2 つのデバイス間の通信を (ポイントツーポイントで) セキュリティー保護できます。たとえば、ブランチオフィスがメトロイーサネット接続を介してセントラルオフィスに接続されている場合、オフィスを接続する 2 つのホストで MACsec を設定して、セキュリティーを強化できます。
8.1. MACsec がセキュリティーを強化する方法 リンクのコピーリンクがクリップボードにコピーされました!
Media Access Control Security (MACsec) は、イーサーネットリンクで異なるトラフィックタイプを保護するレイヤー 2 プロトコルです。これには以下が含まれます。
- Dynamic Host Configuration Protocol (DHCP)
- アドレス解決プロトコル (ARP)
- IPv4 および IPv6 トラフィック
- TCP や UDP などの IP 経由のトラフィック
MACsec はデフォルトで、LAN 内のすべてのトラフィックを GCM-AES-128 アルゴリズムで暗号化および認証し、事前共有キーを使用して参加者ホスト間の接続を確立します。事前共有キーを変更するには、MACsec を使用するすべてのネットワークホストで NM 設定を更新する必要があります。
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"'
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 32 バイトの 16 進 CKN を作成します。
dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 両方のホストで、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
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前の手順で生成された 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'
# 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'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 modify macsec0 ipv6.method manual ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
接続をアクティベートします。
nmcli connection up macsec0
# nmcli connection up macsec0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
トラフィックが暗号化されていることを確認します。
tcpdump -nn -i enp1s0
# tcpdump -nn -i enp1s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 暗号化されていないトラフィックを表示します。
tcpdump -nn -i macsec0
# tcpdump -nn -i macsec0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow MACsec の統計を表示します。
ip macsec show
# ip macsec show
Copy to Clipboard Copied! Toggle word wrap Toggle overflow integrity-only (encrypt off) および encryption (encrypt on) の各タイプの保護に対して個々のカウンターを表示します。
ip -s macsec show
# ip -s macsec show
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3. nmstatectl を使用した MACsec 接続の設定 リンクのコピーリンクがクリップボードにコピーされました!
nmstatectl
ユーティリティーを宣言的に使用して、イーサネットインターフェイスが MACsec を使用するように設定できます。たとえば、YAML ファイルでは、ネットワークの望ましい状態を記述します。ネットワークでは、イーサネット経由で接続された 2 つのホスト間に MACsec 接続があることが想定されます。nmstatectl
ユーティリティーは、YAML ファイルを解釈し、ホスト間に永続的かつ一貫したネットワーク設定をデプロイします。
前提条件
- 物理または仮想イーサネットネットワークインターフェイスコントローラー (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"'
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 32 バイトの 16 進 CKN を作成します。
dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
MACsec 接続を介して接続するホストの両方で、次の手順を実行します。
次の設定を含む YAML ファイル (例:
create-macsec-connection.yml
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
前の手順で生成された 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
# nmstatectl apply create-macsec-connection.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
現在の状態を YAML 形式で表示します。
nmstatectl show macsec0
# nmstatectl show macsec0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow トラフィックが暗号化されていることを確認します。
tcpdump -nn -i enp0s1
# tcpdump -nn -i enp0s1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 暗号化されていないトラフィックを表示します。
tcpdump -nn -i macsec0
# tcpdump -nn -i macsec0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow MACsec の統計を表示します。
ip macsec show
# ip macsec show
Copy to Clipboard Copied! Toggle word wrap Toggle overflow integrity-only (encrypt off) および encryption (encrypt on) の各タイプの保護に対して個々のカウンターを表示します。
ip -s macsec show
# ip -s macsec show
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第9章 Postfix サービスを保護する リンクのコピーリンクがクリップボードにコピーされました!
Postfix は、SMTP (Simple Mail Transfer Protocol) を使用して他の MTA 間で電子メッセージを配信したり、クライアントや配信エージェントにメールを送信したりするメール転送エージェント (MTA) です。MTA は相互間のトラフィックを暗号化できますが、デフォルトではそうしない場合があります。設定をより安全な値に変更することで、さまざまな攻撃に対するリスクを軽減することもできます。
9.2. DoS 攻撃を制限するための Postfix 設定オプション リンクのコピーリンクがクリップボードにコピーされました!
攻撃者は、トラフィックでサーバーをあふれさせたり、クラッシュを引き起こす情報を送信したりして、サービス拒否 (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) ベースの 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
ファイルに次の行を含めます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前の例では、Postfix と Dovecot の間の通信に UNIX ドメインソケットを使用しています。また、
/var/spool/postfix/
ディレクトリーにあるメールキュー、およびpostfix
ユーザーとグループの下で実行しているアプリケーションを含む Postfix SMTP サーバーのデフォルト設定を想定しています。オプション: TCP 経由で Postfix 認証リクエストをリッスンするように Dovecot をセットアップします。
service auth { inet_listener { port = <port-number> } }
service auth { inet_listener { port = <port-number> } }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/dovecot/conf.d/10-auth.conf
ファイルのauth_mechanisms
パラメーターを編集して、メールクライアントが Dovecot での認証に使用する方法を指定します。auth_mechanisms = plain login
auth_mechanisms = plain login
Copy to Clipboard Copied! Toggle word wrap Toggle overflow auth_mechanisms
パラメーターは、さまざまなプレーンテキストおよび非プレーンテキストの認証方法をサポートしています。
/etc/postfix/main.cf
ファイルを変更して Postfix をセットアップします。Postfix SMTP サーバーで SMTP 認証を有効にします。
smtpd_sasl_auth_enable = yes
smtpd_sasl_auth_enable = yes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SMTP 認証用の Dovecot SASL 実装の使用を有効にします。
smtpd_sasl_type = dovecot
smtpd_sasl_type = dovecot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Postfix キューディレクトリーに相対的な認証パスを指定します。相対パスを使用すると、Postfix サーバーが
chroot
で実行しているかどうかに関係なく、設定が確実に機能することに注意してください。smtpd_sasl_path = private/auth
smtpd_sasl_path = private/auth
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この手順では、Postfix と Dovecot の間の通信に UNIX ドメインソケットを使用します。
通信に TCP ソケットを使用する場合に、別のマシンで Dovecot を探すように Postfix を設定するには、次のような設定値を使用します。
smtpd_sasl_path = inet: <IP_address> : <port_number>
smtpd_sasl_path = inet: <IP_address> : <port_number>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前の例で、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
smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前のディレクティブは、暗号化されていないセッションでは匿名認証が許可されず、暗号化されていないユーザー名またはパスワードを送信するメカニズムが許可されていないことを指定しています。暗号化セッション (TLS を使用) の場合、非匿名認証メカニズムのみが許可されます。