6.6. 証明書ベースの認証を使用した IPsec メッシュ VPN の手動設定
IPsec メッシュは、すべてのサーバーが他のすべてのサーバーとセキュアに直接通信できる、完全に相互接続されたネットワークを形成するものです。これは、複数のデータセンターやクラウドプロバイダーにまたがる分散データベースクラスターや高可用性環境に最適です。各サーバーペア間に暗号化されたトンネルを直接確立することで、通信の集中によるボトルネックを避けつつ、セキュアな通信を実現できます。
認証のために、認証局 (CA) によって管理されるデジタル証明書を使用すると、非常にセキュアでスケーラブルなソリューションが実現します。メッシュ内のホストが、それぞれ信頼できる CA によって署名された証明書を提示します。この方法により、強力で検証可能な認証が実現し、ユーザー管理が簡素化されます。アクセス権の付与または失効は、CA で一元的に行うことができます。Libreswan は、各証明書を証明書失効リスト (CRL) と照合し、証明書がリストに掲載されていればアクセスを拒否することで、付与や失効を強制します。
前提条件
メッシュ内の各ピアに、次の内容を含む公開鍵暗号化標準 #12 (PKCS #12) ファイルが存在する。
- サーバーの秘密鍵
- サーバー証明書
- CA 証明書
- 中間証明書 (必要な場合)
秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。
サーバー証明書には次のフィールドを含めます。
-
Extended Key Usage (EKU) を
TLS Web Server Authentication
に設定します。 - コモンネーム (CN) またはサブジェクト代替名 (SAN) を、ホストの完全修飾ドメイン名 (FQDN) に設定します。
- X509v3 CRL 配布ポイントに、証明書失効リスト (CRL) への URL を含めます。
-
Extended Key Usage (EKU) を
手順
Libreswan がまだインストールされていない場合は、次の手順を実行します。
libreswan
パッケージをインストールします。dnf install libreswan
# dnf install libreswan
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ネットワークセキュリティーサービス (NSS) データベースを初期化します。
ipsec initnss
# ipsec initnss
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、
/var/lib/ipsec/nss/
ディレクトリーにデータベースが作成されます。ipsec
サービスを有効にして起動します。systemctl enable --now ipsec
# systemctl enable --now ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイアウォールで 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 この情報は設定ファイルに必要です。
/etc/ipsec.d/
ディレクトリーに接続用の.conf
ファイルを作成します。たとえば、次の設定で/etc/ipsec.d/mesh.conf
ファイルを作成します。CRL チェックを有効にするために、
config setup
セクションを追加します。config setup crl-strict=yes crlcheckinterval=1h
config setup crl-strict=yes crlcheckinterval=1h
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例で指定されている設定は次のとおりです。
crl-strict=yes
- CRL チェックを有効にします。NSS データベース内で CRL が利用できない場合、認証中のピアが拒否されます。
crlcheckinterval=1h
- 指定期間後に、サーバーの証明書に指定された URL から CRL を再取得します。
メッシュ内のメンバー間のトラフィックを強制的に制御するセクションを追加します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例で指定されている設定は次のとおりです。
left=%defaultroute
-
ipsec
サービスの起動時に、デフォルトルートインターフェイスの IP アドレスを動的に設定します。left
パラメーターは、ホストの IP アドレスまたは FQDN に設定することもできます。 leftid=%fromcert
およびrightid=%fromcert
- 証明書の識別名 (DN) フィールドからアイデンティティーを取得するように Libreswan を設定します。
leftcert="<server_certificate_nickname>"
- NSS データベースで使用されるサーバーの証明書のニックネームを設定します。
leftrsasigkey=%cert
- 証明書に埋め込まれた RSA 公開鍵を使用するように Libreswan を設定します。
leftsendcert=always
- ピアが CA 証明書に照らして証明書を検証できるように、ピアに証明書を常に送信するように指示します。
failureshunt=drop
- 暗号化を強制し、IPsec ネゴシエーションが失敗した場合はトラフィックを破棄します。これはメッシュのセキュリティーにとって重要です。
right=%opportunisticgroup
- ポリシーファイルで定義されているリモートピアの動的グループに接続を適用することを指定します。これにより、Libreswan は、そのグループにリストされている各 IP またはサブネットに対して、必要に応じて IPsec トンネルをインスタンス化できるようになります。
例で使用されているすべてのパラメーターの詳細は、システム上の
ipsec.conf(5)
man ページを参照してください。Classless Inter-Domain Routing (CIDR) 形式でピアまたはサブネットを指定する
/etc/ipsec.d/policies/server-mesh
ポリシーファイルを作成します。192.0.2.0/24 198.51.100.0/24
192.0.2.0/24 198.51.100.0/24
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これらの設定により、これらのサブネット内のホスト間トラフィックが
ipsec
サービスによって暗号化されます。ホストが IPsec メッシュのメンバーとして設定されていない場合、このホストとメッシュメンバー間の通信が失敗します。ipsec
サービスを再起動します。systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ポリシーファイルで指定したサブネット内のすべてのホストでこの手順を繰り返します。
検証
メッシュ内のホストにトラフィックを送信してトンネルを確立します。たとえば、ホストに ping を実行します。
ping -c3 <peer_in_mesh>
# ping -c3 <peer_in_mesh>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow IPsec ステータスを表示します。
ipsec status
# ipsec status
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接続が正常に確立されていれば、ピアに関する次の行が出力に含まれています。
Internet Key Exchange バージョン 2 (IKEv2) ネゴシエーションのフェーズ 1 が正常に完了しています。
#1: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 12822s; REPLACE in 13875s; newest; idle;
#1: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 12822s; REPLACE in 13875s; newest; idle;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これで、セキュリティーアソシエーション (SA) が、実際のデータ暗号化トンネル (子 SA またはフェーズ 2 SA と呼ばれる) をネゴシエートする準備が整いました。
子 SA が確立されています。
#2: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_CHILD_SA (established Child SA); REKEY in 13071s; REPLACE in 13875s; newest; eroute owner; IKE SA #1; idle;
#2: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_CHILD_SA (established Child SA); REKEY in 13071s; REPLACE in 13875s; newest; eroute owner; IKE SA #1; idle;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、データトラフィックが通過する実際のトンネルです。
サービスが CRL をロードし、エントリーを NSS データベースに追加したかどうかを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
- DHCP またはステートレスアドレス自動設定 (SLAAC) が設定されたネットワークでこのホストを使用すると、接続がリダイレクトされる危険性があります。詳細と軽減策は、接続がトンネルを回避しないように VPN 接続を専用ルーティングテーブルに割り当てる を参照してください。