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
) を作成します。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: <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
以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
5.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: <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
以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
5.13.3. RHEL システムロール vpn を使用して 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 管理ノードでない場合は、
ホスト名
パラメーターにその完全修飾ドメイン名 (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 接続を設定します。接続の名前は
<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
$ 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
以外の値に設定する場合は、まず管理対象ノードで接続を手動でアクティブ化する必要がある場合があります。
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.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
-
複数ホスト間のオポチュニスティックメッシュを有効にします。
ポリシー
変数は、どのサブネットとホストのトラフィックを暗号化する必要があるか、または暗号化できるか、またどのサブネットとホストでプレーンテキスト接続を引き続き使用する必要があるかを定義します。 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