5.13. RHEL システムロールを使用して IPsec VPN 接続を設定する
仮想プライベートネットワーク (VPN) を使用すると、インターネットなどの信頼できないネットワーク上で、セキュアで暗号化されたトンネルを確立できます。このようなトンネルにより、転送中のデータの機密性と整合性が確保されます。一般的なユースケースとしては、支社と本社を接続することなどが挙げられます。
vpn RHEL システムロールを使用すると、Libreswan IPsec VPN 設定の作成プロセスを自動化できます。
vpn RHEL システムロールで作成できるのは、事前共有鍵 (PSK) または証明書を使用してピアを相互に認証する VPN 設定だけです。
5.13.1. vpn RHEL システムロールを使用して PSK 認証による IPsec ホスト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
ホスト間 VPN は、2 つのデバイス間に直接的で安全な暗号化された接続を確立し、アプリケーションがインターネットなどの安全でないネットワーク経由で安全に通信できるようにします。
認証の場合、事前共有鍵 (PSK) は、2 つのピアのみが知っている単一の共有秘密を使用する簡単な方法です。このアプローチは設定が簡単で、デプロイメントの容易さが優先される基本的なセットアップに最適です。ただし、キーは厳重に秘密にしておく必要があります。キーにアクセスできる攻撃者は接続を危険にさらす可能性があります。
vpn RHEL システムロールを使用すると、PSK 認証による IPsec ホスト間接続を作成するプロセスを自動化できます。デフォルトでは、このロールはトンネルベースの VPN を作成します。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: managed-node-02.example.com: auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: trueサンプル Playbook で指定されている設定は次のとおりです。
hosts: <list>VPN を設定するピアを含む YAML ディクショナリーを定義します。エントリーが Ansible 管理対象ノードでない場合は、
hostnameパラメーターに完全修飾ドメイン名 (FQDN) または IP アドレスを指定する必要があります。次に例を示します。... - hosts: ... external-host.example.com: hostname: 192.0.2.1このロールは、各管理対象ノード上の VPN 接続を設定します。接続の名前は
<peer_A>-to-<peer_B>です (例:managed-node-01.example.com-to-managed-node-02.example.com)。このロールは、外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなピアでは手動で設定を作成する必要があります。auth_method: psk-
ピア間の PSK 認証を有効にします。ロールはコントロールノードで
opensslを使用して PSK を作成します。 auto: <startup_method>-
接続の起動方法を指定します。有効な値は
add、ondemand、start、およびignoreです。詳細は、Libreswan がインストールされているシステム上のipsec.conf(5)man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。 vpn_manage_firewall: true-
ロールにより、管理対象ノード上の
firewalldサービスで必要なポートを開くことを指定します。 vpn_manage_selinux: true- ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.vpn/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
接続が正常に開始されたことを確認します。次に例を示します。
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"' ... 006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の
auto変数をstart以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
5.13.2. vpn RHEL システムロールを使用して、個別のデータプレーンとコントロールプレーンおよび PSK 認証による IPsec ホスト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
ホスト間 VPN は、2 つのデバイス間に直接的で安全な暗号化された接続を確立し、アプリケーションがインターネットなどの安全でないネットワーク経由で安全に通信できるようにします。
認証の場合、事前共有鍵 (PSK) は、2 つのピアのみが知っている単一の共有秘密を使用する簡単な方法です。このアプローチは設定が簡単で、デプロイメントの容易さが優先される基本的なセットアップに最適です。ただし、キーは厳重に秘密にしておく必要があります。キーにアクセスできる攻撃者は接続を危険にさらす可能性があります。
たとえば、制御メッセージが傍受されたり妨害されたりするリスクを最小限に抑えてセキュリティーを強化するために、データトラフィックと制御トラフィックの両方に個別の接続を設定できます。vpn RHEL システムロールを使用すると、個別のデータプレーンとコントロールプレーンおよび PSK 認証を使用して IPsec ホスト間接続を作成するプロセスを自動化できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - name: control_plane_vpn hosts: managed-node-01.example.com: hostname: 203.0.113.1 # IP address for the control plane managed-node-02.example.com: hostname: 198.51.100.2 # IP address for the control plane auth_method: psk auto: start - name: data_plane_vpn hosts: managed-node-01.example.com: hostname: 10.0.0.1 # IP address for the data plane managed-node-02.example.com: hostname: 172.16.0.2 # IP address for the data plane auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: trueサンプル Playbook で指定されている設定は次のとおりです。
hosts: <list>VPN を設定するホストを含む YAML ディクショナリーを定義します。接続の名前は
<name>-<IP_address_A>-to-<IP_address_B>です (例:control_plane_vpn-203.0.113.1-to-198.51.100.2)。このロールは、各管理対象ノード上の VPN 接続を設定します。このロールは、外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなホストでは手動で設定を作成する必要があります。
auth_method: psk-
ホスト間の PSK 認証を有効にします。ロールはコントロールノードで
opensslを使用して事前共有鍵を作成します。 auto: <startup_method>-
接続の起動方法を指定します。有効な値は
add、ondemand、start、およびignoreです。詳細は、Libreswan がインストールされているシステム上のipsec.conf(5)man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。 vpn_manage_firewall: true-
ロールにより、管理対象ノード上の
firewalldサービスで必要なポートを開くことを指定します。 vpn_manage_selinux: true- ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.vpn/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
接続が正常に開始されたことを確認します。次に例を示します。
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"' ... 006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の
auto変数をstart以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
5.13.3. RHEL システムロール vpn を使用して PSK 認証による IPsec サイト間 VPN を設定する リンクのコピーリンクがクリップボードにコピーされました!
サイト間 VPN は、2 つの異なるネットワーク間に安全な暗号化トンネルを確立し、インターネットなどの安全でないパブリックネットワークを介してそれらをシームレスにリンクします。たとえば、これにより、支社のデバイスはすべて同じローカルネットワークの一部であるかのように、企業本社のリソースにアクセスできるようになります。
認証の場合、事前共有鍵 (PSK) は、2 つのピアのみが知っている単一の共有秘密を使用する簡単な方法です。このアプローチは設定が簡単で、デプロイメントの容易さが優先される基本的なセットアップに最適です。ただし、キーは厳重に秘密にしておく必要があります。キーにアクセスできる攻撃者は接続を危険にさらす可能性があります。
vpn RHEL システムロールを使用すると、PSK 認証による IPsec サイト間接続の作成プロセスを自動化できます。デフォルトでは、このロールはトンネルベースの VPN を作成します。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: subnets: - 192.0.2.0/24 managed-node-02.example.com: subnets: - 198.51.100.0/24 - 203.0.113.0/24 auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: trueサンプル Playbook で指定されている設定は次のとおりです。
hosts: <list>VPN を設定するゲートウェイを含む YAML 辞書を定義します。エントリーが Ansible 管理ノードでない場合は、
ホスト名パラメーターにその完全修飾ドメイン名 (FQDN) または IP アドレスを指定する必要があります。次に例を示します。... - hosts: ... external-host.example.com: hostname: 192.0.2.1このロールは、各管理対象ノード上の VPN 接続を設定します。接続の名前は
<gateway_A> -to- <gateway_B>です (例:managed-node-01.example.com-to-managed-node-02.example.com)。このロールは、外部 (管理対象外) ノード上で Libreswan を設定することはできないことに注意してください。そのようなピアでは手動で設定を作成する必要があります。subnets: <yaml_list_of_subnets>- トンネルを介して接続されるサブネットを Classless Inter-Domain Routing (CIDR) 形式で定義します。
auth_method: psk-
ピア間の PSK 認証を有効にします。ロールはコントロールノードで
opensslを使用して PSK を作成します。 auto: <startup_method>-
接続の起動方法を指定します。有効な値は
add、ondemand、start、およびignoreです。詳細は、Libreswan がインストールされているシステム上のipsec.conf(5)man ページを参照してください。この変数のデフォルト値は null です。この値は自動起動操作を実行しないことを示します。 vpn_manage_firewall: true-
ロールにより、管理対象ノード上の
firewalldサービスで必要なポートを開くことを指定します。 vpn_manage_selinux: true- ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.vpn/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
接続が正常に開始されたことを確認します。次に例を示します。
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"' ... 006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'このコマンドは、VPN 接続がアクティブでないと成功しないことに注意してください。Playbook 内の
auto変数をstart以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
5.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.comcert_name変数は、各ホストの証明書で使用されるコモンネーム (CN) フィールドの値に設定します。通常、CN フィールドは完全修飾ドメイン名 (FQDN) に設定します。機密性の高い変数を暗号化されたファイルに保存します。
vault を作成します。
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>ansible-vault createコマンドでエディターが開いたら、機密データを<key>: <value>形式で入力します。pkcs12_pwd: <password>- 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。- name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com vars_files: - ~/vault.yml tasks: - name: Install LibreSwan ansible.builtin.package: name: libreswan state: present - name: Identify the path to IPsec NSS database ansible.builtin.set_fact: nss_db_dir: "{{ '/etc/ipsec.d/' if ansible_distribution in ['CentOS', 'RedHat'] and ansible_distribution_major_version is version('8', '=') else '/var/lib/ipsec/nss/' }}" - name: Locate IPsec NSS database files ansible.builtin.find: paths: "{{ nss_db_dir }}" patterns: "*.db" register: db_files - name: Initialize IPsec NSS database if not initialized ansible.builtin.command: cmd: ipsec initnss when: db_files.matched == 0 - name: Copy PKCS #12 file to the managed node ansible.builtin.copy: src: "~/{{ inventory_hostname }}.p12" dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12" mode: 0600 - name: Import PKCS #12 file in IPsec NSS database ansible.builtin.shell: cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"' - name: Remove PKCS #12 file ansible.builtin.file: path: "/etc/ipsec.d/{{ inventory_hostname }}.p12" state: absent - name: Opportunistic mesh IPsec VPN with certificate-based authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - opportunistic: true auth_method: cert policies: - policy: private cidr: default - policy: private cidr: 192.0.2.0/24 - policy: clear cidr: 192.0.2.1/32 vpn_manage_firewall: true vpn_manage_selinux: trueサンプル Playbook で指定されている設定は次のとおりです。
opportunistic: true-
複数ホスト間のオポチュニスティックメッシュを有効にします。
ポリシー変数は、どのサブネットとホストのトラフィックを暗号化する必要があるか、または暗号化できるか、またどのサブネットとホストでプレーンテキスト接続を引き続き使用する必要があるかを定義します。 auth_method: cert- 証明書ベースの認証を有効にします。これを行うには、インベントリーで各管理対象ノードの証明書のニックネームを指定する必要があります。
policies: <list_of_policies>Libreswan ポリシーを YAML リスト形式で定義します。
デフォルトのポリシーは
private-or-clearです。これをprivateに変更するには、上記の Playbook に、デフォルトのcidrエントリーに応じた適切なポリシーを含めます。Ansible コントロールノードが管理対象ノードと同じ IP サブネットにある場合は、Playbook の実行中に SSH 接続が失われるのを防ぐために、コントロールノードの IP アドレスに
clearポリシーを追加します。たとえば、メッシュを192.0.2.0/24サブネット用に設定する必要があり、コントロールノードが IP アドレス192.0.2.1を使用する場合、Playbook に示されているように、192.0.2.1/32のclearポリシーが必要です。ポリシーの詳細は、Libreswan がインストールされているシステム上の
ipsec.conf(5)man ページを参照してください。vpn_manage_firewall: true-
ロールにより、管理対象ノード上の
firewalldサービスで必要なポートを開くことを指定します。 vpn_manage_selinux: true- ロールにより、IPsec ポートに必要な SELinux ポートタイプを設定することを指定します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.vpn/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook --ask-vault-pass ~/playbook.yml
検証
メッシュ内のノードで、別のノードに ping を送信して接続をアクティブ化します。
[root@managed-node-01]# ping managed-node-02.example.com接続がアクティブであることを確認します。
[root@managed-node-01]# ipsec trafficstatus 006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'