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