4.6. Libreswan を使用した仮想プライベートネットワーク (VPN) のセキュリティー保護

Red Hat Enterprise Linux 7 では、仮想プライベートネットワーク (VPN) は、Libreswan アプリケーションがサポートしている IPsec プロトコルを使用して設定できます。Libreswan は、Openswan アプリケーションの延長で、Openswan ドキュメント内の多くの例は Libreswan と交換可能なものです。NetworkManager IPsec プラグインは、NetworkManager-libreswan と呼ばれます。GNOME Shell のユーザーは、NetworkManager-libreswan-gnome パッケージをインストールしてください。これには、依存関係として NetworkManager-libreswan が含まれています。NetworkManager-libreswan-gnome パッケージは、Optional チャンネルからのみ入手可能です。『Enabling Supplementary and Optional Repositories』 を参照してください。
VPN の IPsec プロトコルは、Internet Key Exchange (IKE) プロトコルを使用して設定されます。IPsec および IKE は交換可能です。IPsec VPN は、IKE VPN、IKEv2 VPN、XAUTH VPN、Cisco VPN、または IKE/IPsec VPN とも呼ばれます。Level 2 Tunneling Protocol (L2TP) も使用する IPsec VPN のバリアントは、通常 L2TP/IPsec VPN と呼ばれます。これは、Optional チャンネルの xl2tpd アプリケーションを必要とします。
Libreswan は、Red Hat Enterprise Linux 7 で利用可能なオープンソースでユーザースペースの IKE 実装です。IKE バージョン 1 および 2 は、ユーザーレベルデーモンとして実装されます。IKE プロトコルそのものは暗号化されています。IPsec プロトコルは Linux カーネルにより実装されており、Libreswan は、VPN トンネル設定の追加または削除を行うようにカーネルを設定します。
IKE プロトコルは、UDP ポート 500 および 4500 を使用します。IPsec プロトコルは、プロトコル番号 50 の Encapsulated Security Payload (ESP) とプロトコル番号 51 の Authenticated Header (AH) の、2 つの異なるプロトコルから構成されます。AH プロトコルの使用は推奨されません。AH を使用している場合は、null 暗号化を使用して ESP に移動することが推奨されます。
IPsec プロトコルには、動作のモードが 2 つ (トンネルモード (デフォルト) および トランスポートモード) があります。カーネルを、IKE がない IPsec を持つカーネルを設定することができます。これは、Manual Keying と呼ばれます。ただし、ip xfrm コマンドは、セキュリティー上の理由から使用しないことが強く推奨されます。netlink を使用して Linux カーネルを使用する Libreswan インターフェースにおいては、パケットの暗号化および複号は Linux カーネルで発生します。
Libreswan は、ネットワークセキュリティーサービス (NSS) 暗号化ライブラリーを使用します。米連邦情報処理規格 (FIPS) 公開文書 140-2 で、libreswan および NSS の両方の使用が認証されます。

重要

Libreswan および Linux カーネルが実装する IKE/IPsec VPN は、Red Hat Enterprise Linux 7 で使用することが推奨される唯一の VPN テクノロジーです。その他の VPN テクノロジーを使用するリスクを理解せずに使用しないでください。

4.6.1. Libreswan のインストール

Libreswan をインストールするには、root で以下のコマンドを実行します。
~]# yum install libreswan
Libreswan がインストールされていることを確認するには、以下を行います。
~]$ yum info libreswan
Libreswan を新規にインストールしたあと、NSS データベースはインストールプロセスの一部として初期化する必要があります。新しいデータベースを開始する前に、以下のように古いデータベースを削除します。
~]# systemctl stop ipsec
~]# rm /etc/ipsec.d/*db
次に、新しい NSS データベースを初期化するには、root で以下のコマンドを実行します。
~]# ipsec initnss
Initializing NSS database
FIPS モードで動作する場合に限り、NSS データベースをパスワードで保護する必要があります。FIPS モードでデータベースを初期化するには、上のコマンドの代わりに、次のコマンドを使用します。
~]# certutil -N -d sql:/etc/ipsec.d
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password: 
Re-enter password:
Libreswan が提供する ipsec デーモンを起動するには、root で以下のコマンドを実行します。
~]# systemctl start ipsec
デーモンが稼働していることを確認します。
~]$ systemctl status ipsec
* ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
   Loaded: loaded (/usr/lib/systemd/system/ipsec.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2018-03-18 18:44:43 EDT; 3s ago
     Docs: man:ipsec(8)
           man:pluto(8)
           man:ipsec.conf(5)
  Process: 20358 ExecStopPost=/usr/sbin/ipsec --stopnflog (code=exited, status=0/SUCCESS)
  Process: 20355 ExecStopPost=/sbin/ip xfrm state flush (code=exited, status=0/SUCCESS)
  Process: 20352 ExecStopPost=/sbin/ip xfrm policy flush (code=exited, status=0/SUCCESS)
  Process: 20347 ExecStop=/usr/libexec/ipsec/whack --shutdown (code=exited, status=0/SUCCESS)
  Process: 20634 ExecStartPre=/usr/sbin/ipsec --checknflog (code=exited, status=0/SUCCESS)
  Process: 20631 ExecStartPre=/usr/sbin/ipsec --checknss (code=exited, status=0/SUCCESS)
  Process: 20369 ExecStartPre=/usr/libexec/ipsec/_stackmanager start (code=exited, status=0/SUCCESS)
  Process: 20366 ExecStartPre=/usr/libexec/ipsec/addconn --config /etc/ipsec.conf --checkconfig (code=exited, status=0/SUCCESS)
 Main PID: 20646 (pluto)
   Status: "Startup completed."
   CGroup: /system.slice/ipsec.service
           └─20646 /usr/libexec/ipsec/pluto --leak-detective --config /etc/ipsec.conf --nofork
システム起動時に Libreswan が起動するようにするには、root で以下のコマンドを実行します。
~]# systemctl enable ipsec
中間およびホストベースのファイアウォールが ipsec サービスを許可するように設定します。ファイアウォールおよび特定サービスの通過を許可することに関する詳細情報は、5章ファイアウォールの使用 を参照してください。Libreswan の使用には、以下のパケットがファイアウォールを通過できるようにしておく必要があります。
  • Internet Key Exchange (IKE) プロトコルに対する UDP ポート 500 および 4500
  • Encapsulated Security Payload (ESP) IPsec パケット用に プロトコル 50
  • Authenticated Header (AH) IPsec パケット用にプロトコル 51 (一般的でない)
Libreswan を使用して IPsec VPN を設定する例を 3 つ紹介します。1 つ目は、2 つのホストを接続してセキュアな通信ができるようにします。2 つ目は、2 つのサイトを接続して 1 つのネットワークを形成します。3 つ目は、このコンテキストでは ロードウォリアー と呼ばれるリモートユーザーをサポートします。

4.6.2. Libreswan を使用して VPN 設定の作成

IKE/IPsec は、ピアツーピアプロトコルであるため、Libreswan は、ソース および 宛先、または サーバー および クライアント を使用しません。代わりに、エンドポイント (ホスト) を参照するのに、 および という用語を使用します。これにより、多くの場合、両方のエンドポイントで同じ設定を使用できます。ただし、多くの管理者は、常に、ローカルホストに を使用し、リモートホストには を使用するようにします。
エンドポイントの認証には、一般的に使用される方法が 4 つあります。
  • Pre-Shared Keys (PSK) は、最も簡単な認証メソッドです。PSK は、20 文字以上のランダムな文字からなります。FIPS モードで、PSK が、使用するインテグリティーアルゴリズムによる最低強化要件に従う必要があります。ランダムな 64 文字より短い PSK を使用しないことが推奨されます。
  • 生 RSA 鍵は、静的なホスト間またはサブネット間で一般的に使用される IPsec 設定です。ホストは、それぞれの公開 RSA 鍵で手動で設定されます。この方法は、12 以上のホストで相互に IPsec トンネルを設定する必要がある場合には、うまく拡張できません。
  • X.509 証明書は、共通の IPsec ゲートウェイに接続する必要のあるホストが多数ある大型の導入案件でよく使用されます。ホストまたはユーザーの RSA 証明書の署名には、中央の 認証機関 (CA) が使用されます。この中央 CA は、個別ホストまたはユーザーの取り消しを含む信頼の中継を担当します。
  • NULL 認証は、認証なしでメッシュ暗号を取得するために使用されます。受動的攻撃は保護しますが、能動的攻撃は保護しません。ただし、IKEv2 は、非対称の認証方法を許可しますが、NULL 認証をインターネット規模の日和見 IPsec に対しても使用できます。ここでは、クライアントはサーバーを認証しますが、サーバーはクライアントを認証しません。このモデルは、TLS を使用して Web サイトを保護する (https:// websites としても知られています) のに似ています。
この認証方式に加え、追加の認証は、量子コンピューターによる可能な攻撃に対して保護するために追加認証を追加できます。この追加認証方法は Postquantum Preshared Keys (PPK) と呼ばれています。個々のクライアント、またはクライアントのグループは、帯域幅を設定した事前共有鍵に対応する (PPKID) を指定することで、独自の PPK を使用できます。「量子コンピューターに対する保護の使用」 を参照してください。

4.6.3. Libreswan を使用したホスト間の VPN の作成

Libreswan および と呼ばれる 2 台のホスト間で IPsec VPN を作成するように設定するには、両方のホスト上 ( および ) で root として以下のコマンドを実行し、新たな生 RSA 鍵のペアを作成します。
~]# ipsec newhostkey --output /etc/ipsec.d/hostkey.secrets
Generated RSA key pair with CKAID 14936e48e756eb107fa1438e25a345b46d80433f was stored in the NSS database
これでホストの RSA 鍵のペアが生成されます。エントロピーが低い仮想マシンでは特に、RSA 鍵の生成プロセスは時間が長くかかる場合があります。
ホストの公開鍵を表示するには、 サイドの設定に指定できるため、newhostkey コマンドが返した CKAID を使用して、新しいホストキーが追加されるホストに root で以下のコマンドを実行します。
~]# ipsec showhostkey --left --ckaid 14936e48e756eb107fa1438e25a345b46d80433f
	# rsakey AQPFKElpV
	leftrsasigkey=0sAQPFKElpV2GdCF0Ux9Kqhcap53Kaa+uCgduoT2I3x6LkRK8N+GiVGkRH4Xg+WMrzRb94kDDD8m/BO/Md+A30u0NjDk724jWuUU215rnpwvbdAob8pxYc4ReSgjQ/DkqQvsemoeF4kimMU1OBPNU7lBw4hTBFzu+iVUYMELwQSXpremLXHBNIamUbe5R1+ibgxO19l/PAbZwxyGX/ueBMBvSQ+H0UqdGKbq7UgSEQTFa4/gqdYZDDzx55tpZk2Z3es+EWdURwJOgGiiiIFuBagasHFpeu9Teb1VzRyytnyNiJCBVhWVqsB4h6eaQ9RpAMmqBdBeNHfXwb6/hg+JIKJgjidXvGtgWBYNDpG40fEFh9USaFlSdiHO+dmGyZQ74Rg9sWLtiVdlH1YEBUtQb8f8FVry9wSn6AZqPlpGgUdtkTYUCaaifsYH4hoIA0nku4Fy/Ugej89ZdrSN7Lt+igns4FysMmBOl9Wi9+LWnfl+dm4Nc6UNgLE8kZc+8vMJGkLi4SYjk2/MFYgqGX/COxSCPBFUZFiNK7Wda0kWea/FqE1heem7rvKAPIiqMymjSmytZI9hhkCD16pCdgrO3fJXsfAUChYYSPyPQClkavvBL/wNK9zlaOwssTaKTj4Xn90SrZaxTEjpqUeQ==
以下に示すように、両方のホストで設定ファイルを追加するためにこの鍵が必要です。CKAID が分からない場合は、以下のコマンドを使用してホストキーの一覧を取得できます。
~]# ipsec showhostkey --list
< 1 >  RSA keyid: AQPFKElpV ckaid: 14936e48e756eb107fa1438e25a345b46d80433f
鍵ペアの秘密部分は、/etc/ipsec.d/*.db に置かれた NSS database に保存されます。
このホスト間のトンネルに対して設定ファイルを作成するには、上記の leftrsasigkey= 行および rightrsasigkey= 行を、/etc/ipsec.d/ ディレクトリーに保存されているカスタムの設定ファイルに追加されます。
root でエディターを使用して以下の形式で適切な名前のファイルを作成します。
/etc/ipsec.d/my_host-to-host.conf
以下のようにファイルを編集します。
conn mytunnel
    leftid=@west.example.com
    left=192.1.2.23
    leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ==
    rightid=@east.example.com
    right=192.1.2.45
    rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ==
    authby=rsasig
    # load and initiate automatically
    auto=start
また、公開鍵は、RSAID の代わりに CKAID を設定できます。この場合、leftrsasigkey= の代わりに leftckaid= を使用します。
左右両方のホストに同じ設定ファイルを使用できます。Libreswan は、指定した IP アドレスまたはホスト名に基づいて、 または である場合は自動的に検出します。ホストのいずれかがモバイルホストであり、IP アドレスが事前に分からない場合は、モバイルクライアントで %defaultrouteIP アドレスとして使用します。これにより、自動的に動的 IP アドレスを選択します。モバイルホストから接続を受け付ける静的サーバーホストの場合は、%any をその IP アドレスに対して使用してモバイルホストを指定します。
leftrsasigkey の値は left ホストから、そして rightrsasigkey 値は right ホストから取得していることを確認します。leftckaid および rightckaid を使用する場合も同様です。
ipsec を再起動し、新しい設定を読み込んでいることを確認します。システムの起動時に設定している場合は、トンネルが確立されていることを確認するには、以下のコマンドを実行します。
~]# systemctl restart ipsec
auto=start オプションを使用している場合は、数秒以内に IPsec トンネルを確立する必要があります。root で以下のコマンドを実行して、トンネルを手動でロードおよび起動できます。
~]# ipsec auto --add mytunnel
~]# ipsec auto --up mytunnel

4.6.3.1. Libreswan を使用したホスト間の VPN の検証

IKE ネゴシエーションが、UDP ポート 500 および 4500 で行われます。IPsec パケットは、Encapsulated Security Payload (ESP) パケットとして現れます。ESP プロトコルにはポートがありません。VPN 接続が NAT ルーターを通過する必要がある場合に、ESP パケットは、ポート 4500 の UDP パケットにカプセル化されます。
パケットが VPN トンネル経由で送信されていることを確認するには、root で以下の形式のコマンドを実行します。
~]# tcpdump -n -i interface esp or udp port 500 or udp port 4500
00:32:32.632165 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1a), length 132
00:32:32.632592 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1a), length 132
00:32:32.632592 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 7, length 64
00:32:33.632221 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1b), length 132
00:32:33.632731 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1b), length 132
00:32:33.632731 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 8, length 64
00:32:34.632183 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1c), length 132
00:32:34.632607 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1c), length 132
00:32:34.632607 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 9, length 64
00:32:35.632233 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1d), length 132
00:32:35.632685 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1d), length 132
00:32:35.632685 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 10, length 64
ここでの interface は、トラフィックを監視するインターフェースになります。tcpdump での表示を終了するには、Ctrl+C を押します。

注記

tcpdump コマンドと IPsec のインタラクションはやや予想外のものになります。見えるのは暗号化された送信パケットのみで、プレーンテキストの送信パケットは見えません。受信パケットは、暗号化および暗号解読された両方を表示します。可能であれば、tcpdump コマンドはどちらかのエンドポイント上ではなく、2 台のマシン間にあるルーター上で実行してください。VTI (Virtual Tunnel Interface) を使用している場合は、物理インターフェースの tcpdump が ESP パケットを表示しますが、VTI インターフェースの tcpdump はクリアテキストトラフィックを表示します。
トンネルがアップしているかどうか、そのトラフィックがどのぐらいトンネルを通過したかを確認するには、以下のコマンドを root で実行します。
~]# ipsec whack --trafficstatus
006 #2: "mytunnel", type=ESP, add_time=1234567890, inBytes=336, out Bytes=336, id='@east'

4.6.4. Libreswan を使用したサイト間の VPN の設定

Libreswan が 2 つのネットワークを結合させるサイト間の IPsec VPN を作成するようにするには、エンドポイントとなる 2 つのホスト間に IPsec トンネルを作成します。これらのホストは、1 つ以上のサブネットからのトラフィック通過を許可するよう設定します。このため、これらはネットワークのリモート部分にはゲートウェイのように見えます。サイト間 VPN とホスト間 VPN の唯一の違いは、前者では 1 つ以上のネットワークまたはサブネットを設定ファイルで指定する必要があるという点です。
サイト間の IPsec VPN を作成するように Libreswan を設定するには、まず 「Libreswan を使用したホスト間の VPN の作成」 にあるようにホスト間の IPsec VPN を設定し、その設定ファイルを /etc/ipsec.d/my_site-to-site.conf などの適切なファイル名にコピーまたは移動します。root 権限でエディターを使用して、カスタム設定ファイルである /etc/ipsec.d/my_site-to-site.conf を以下のように編集します。
conn mysubnet
    also=mytunnel
    leftsubnet=192.0.1.0/24
    rightsubnet=192.0.2.0/24
    auto=start

conn mysubnet6
    also=mytunnel
    connaddrfamily=ipv6
    leftsubnet=2001:db8:0:1::/64
    rightsubnet=2001:db8:0:2::/64
    auto=start

conn mytunnel
    leftid=@west.example.com
    left=192.1.2.23
    leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ==
    rightid=@east.example.com
    right=192.1.2.45
    rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ==
    authby=rsasig
トンネルを表示するには、Libreswan を再起動するか、root で以下のコマンドを実行して手動ですべての接続を読み込み、開始します。
~]# ipsec auto --add mysubnet
~]# ipsec auto --add mysubnet6
~]# ipsec auto --up mysubnet
104 "mysubnet" #1: STATE_MAIN_I1: initiate
003 "mysubnet" #1: received Vendor ID payload [Dead Peer Detection]
003 "mytunnel" #1: received Vendor ID payload [FRAGMENTATION]
106 "mysubnet" #1: STATE_MAIN_I2: sent MI2, expecting MR2
108 "mysubnet" #1: STATE_MAIN_I3: sent MI3, expecting MR3
003 "mysubnet" #1: received Vendor ID payload [CAN-IKEv2]
004 "mysubnet" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG cipher=aes_128 prf=oakley_sha group=modp2048}
117 "mysubnet" #2: STATE_QUICK_I1: initiate
004 "mysubnet" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x9414a615 <0x1a8eb4ef xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none}
~]# ipsec auto --up mysubnet6
003 "mytunnel" #1: received Vendor ID payload [FRAGMENTATION]
117 "mysubnet" #2: STATE_QUICK_I1: initiate
004 "mysubnet" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x06fe2099 <0x75eaa862 xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none}

4.6.4.1. Libreswan を使用するサイト間の VPN の検証

VPN トンネル経由でパケットが送られたことを検証する手順は、「Libreswan を使用したホスト間の VPN の検証」 と同じです。

4.6.5. Libreswan を使用するサイト間のシングルトンネル VPN の設定

サイト間のトンネルを構築する際に、ゲートウェイは公開 IP アドレスではなく、内部の IP アドレスを使用して相互に通信する必要が多くあります。これは、1 つのトンネルを使用することで実行できます。ホスト名が west の左のホストの内部 IP アドレスが 192.0.1.254 で、ホスト名が east の右のホストの IP アドレスが 192.0.2.254 の場合、1 つのトンネルを使用した以下の設定が使用できます。
conn mysubnet
    leftid=@west.example.com
    leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ==
    left=192.1.2.23
    leftsourceip=192.0.1.254
    leftsubnet=192.0.1.0/24
    rightid=@east.example.com
    rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ==
    right=192.1.2.45
    rightsourceip=192.0.2.254
    rightsubnet=192.0.2.0/24
    auto=start
    authby=rsasig

4.6.6. Libreswan を使用したサブネット押し出しの設定

IPsec は、ハブおよびスポークのアーキテクチャーにデプロイされることがよくあります。各リーフノードは、広い範囲の一部である IP 範囲があります。ハブを通して互いに通信します。これは サブネットの押出 と呼ばれます。

例4.2 サブネット押出の簡易設定

以下の例では、本社に 10.0.0.0/8 を設定し、より小さい /24 サブネットを使用する支店を 2 つ設定します。
本社では以下のようになります。
conn branch1
    left=1.2.3.4
    leftid=@headoffice
    leftsubnet=0.0.0.0/0
    leftrsasigkey=0sA[...]
    #
    right=5.6.7.8
    rightid=@branch1
    rightsubnet=10.0.1.0/24
    rightrsasigkey=0sAXXXX[...]
    #
    auto=start
    authby=rsasig

conn branch2
    left=1.2.3.4
    leftid=@headoffice
    leftsubnet=0.0.0.0/0
    leftrsasigkey=0sA[...]
    #
    right=10.11.12.13
    rightid=@branch2
    rightsubnet=10.0.2.0/24
    rightrsasigkey=0sAYYYY[...]
    #
    auto=start
    authby=rsasig
branch1 オフィスでは、同一の接続を使用します。さらに、パススルー (pass-through) 接続を使用して、ローカル LAN トラフィックをトンネル経由の送信から除外します。
conn branch1
    left=1.2.3.4
    leftid=@headoffice
    leftsubnet=0.0.0.0/0
    leftrsasigkey=0sA[...]
    #
    right=10.11.12.13
    rightid=@branch2
    rightsubnet=10.0.1.0/24
    rightrsasigkey=0sAYYYY[...]
    #
    auto=start
    authby=rsasig

conn passthrough
    left=1.2.3.4
    right=0.0.0.0
    leftsubnet=10.0.1.0/24
    rightsubnet=10.0.1.0/24
    authby=never
    type=passthrough
    auto=route

4.6.7. IKEv2 リモートアクセスの VPN Libreswan の設定

ロードウォーリアーとは、ノート PC など、IP アドレスを動的に割り当てられるモバイルクライアントを持ち運ぶユーザーのことで、認証は、証明書を使用して行います。以前の IKEv1 XAUTH プロトコルを使用する必要がないように、以下の例では IKEv2 が使用されています。
サーバー上では以下の設定になります。
conn roadwarriors
    ikev2=insist
    # Support (roaming) MOBIKE clients (RFC 4555)
    mobike=yes
    fragmentation=yes
    left=1.2.3.4
    # if access to the LAN is given, enable this, otherwise use 0.0.0.0/0
    # leftsubnet=10.10.0.0/16
    leftsubnet=0.0.0.0/0
    leftcert=gw.example.com
    leftid=%fromcert
    leftxauthserver=yes
    leftmodecfgserver=yes
    right=%any
    # trust our own Certificate Agency
    rightca=%same
    # pick an IP address pool to assign to remote users
    # 100.64.0.0/16 prevents RFC1918 clashes when remote users are behind NAT
    rightaddresspool=100.64.13.100-100.64.13.254
    # if you want remote clients to use some local DNS zones and servers
    modecfgdns="1.2.3.4, 5.6.7.8"
    modecfgdomains="internal.company.com, corp"
    rightxauthclient=yes
    rightmodecfgclient=yes
    authby=rsasig
    # optionally, run the client X.509 ID through pam to allow/deny client
    # pam-authorize=yes
    # load connection, don't initiate
    auto=add
    # kill vanished roadwarriors
    dpddelay=1m
    dpdtimeout=5m
    dpdaction=%clear
ロードウォーリアーのデバイスであるモバイルクライアントでは、上記の設定に多少変更を加えて使用します。
conn to-vpn-server
    ikev2=insist
    # pick up our dynamic IP
    left=%defaultroute
    leftsubnet=0.0.0.0/0
    leftcert=myname.example.com
    leftid=%fromcert
    leftmodecfgclient=yes
    # right can also be a DNS hostname
    right=1.2.3.4
    # if access to the remote LAN is required, enable this, otherwise use 0.0.0.0/0
    # rightsubnet=10.10.0.0/16
    rightsubnet=0.0.0.0/0
    # trust our own Certificate Agency
    rightca=%same
    authby=rsasig
    # allow narrowing to the server’s suggested assigned IP and remote subnet
    narrowing=yes
    # Support (roaming) MOBIKE clients (RFC 4555)
    mobike=yes
    # Initiate connection
    auto=start

4.6.8. X.509 を使用した IKEv1 リモートアクセスの VPN Libreswan および XAUTH の設定

Libreswan は、接続確立の際に XAUTH IPsec 拡張機能を使用して、ローミング VPN クライアントに対してネイティブに IP アドレスと DNS 情報を割り当てる方法を提供します。XAUTH は、PSK または X.509 証明書を使用してデプロイできます。X.509 を使用してデプロイの方がより安全です。クライアントの証明書は、証明書失効リストまたは Online Certificate Status Protocol (OCSP) で失効させることができます。X.509 証明書を使用すると、個別のクライアントはサーバーを偽装することができません。グループパスワードとも呼ばれる PSK を使用すると、これは理論上は可能になります。
XAUTH は、それ自体とユーザー名およびパスワードを新たに確認するために、VPN クライアントを必要とします。Google 認証システムや RSA SecureID トークンなどのワンタイムパスワード (OTP) では、ユーザーパスワードにワンタイムトークンが付けられます。
XAUTH に可能なバックエンドは 3 つあります。
xauthby=pam
これは、/etc/pam.d/pluto にある設定を使用してユーザーを認証します。Pam は、それ自体で様々なバックエンドを使用するように設定できます。システムアカウントのユーザーパスワードスキーム、LDAP ディレクトリー、RADIUS サーバー、カスタムパスワード認証モジュールなどが使用可能です。
xauthby=file
これは、設定ファイル /etc/ipsec.d/passwd (/etc/ipsec.d/nsspassword と混同しないこと) を使用します。このファイルの形式は Apache .htpasswd ファイルと同様のもので、Apache htpasswd コマンドはこのファイルのエントリー作成に使用できます。ただし、ユーザー名とパスワードの後に、使用する IPsec 接続の接続名が 3 番目のコラムに必要になります。たとえば、conn remoteusers を使用してリモートユーザーに VPN を提供する場合、パスワードファイルのエントリーは以下のようになります。
user1:$apr1$MIwQ3DHb$1I69LzTnZhnCT2DPQmAOK.:remoteusers

注記

htpasswd コマンドを使用している場合に、各行で user:password 部分の後に手動で追加する必要があります。
xauthby=alwaysok
サーバーは常に、XAUTH ユーザーとパスワードの組み合わせが適切であるように装います。サーバーはユーザー名とパスワードを無視しますが、クライアントはこれらを指定する必要があります。これは、ユーザーが X.509 証明書で既に特定されている場合、もしくは XAUTH バックエンドが不要な VPN をテストしている場合にのみ使用します。
X.509 証明書を使用した設定例を以下に示します。
conn xauth-rsa
    ikev2=never
    auto=add
    authby=rsasig
    pfs=no
    rekey=no
    left=ServerIP
    leftcert=vpn.example.com
    #leftid=%fromcert
    leftid=vpn.example.com
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    rightaddresspool=10.234.123.2-10.234.123.254
    right=%any
    rightrsasigkey=%cert
    modecfgdns1=1.2.3.4
    modecfgdns2=8.8.8.8
    modecfgdomain=example.com
    modecfgbanner="Authorized Access is allowed"
    leftxauthserver=yes
    rightxauthclient=yes
    leftmodecfgserver=yes
    rightmodecfgclient=yes
    modecfgpull=yes
    xauthby=pam
    dpddelay=30
    dpdtimeout=120
    dpdaction=clear
    ike_frag=yes
    # for walled-garden on xauth failure
    # xauthfail=soft
    # leftupdown=/custom/_updown
xauthfail を hard ではなく soft に設定すると認証失敗は無視され、VPN はユーザーが適切に認証したかのように設定されます。カスタムのアップダウンスクリプトを使用すると、環境変数 XAUTH_FAILED をチェックできます。このようなユーザーは、たとえば iptables DNAT を使用して walled garden にリダイレクトすることが可能です。リダイレクト先では管理者への問い合わせ、サービスの有料サブスクリプションの更新などができます。
VPN クライアントは、modecfgdomain 値および DNS エントリーを使用して、指定したネームサーバーに指定したドメインに対するクエリーをリダイレクトします。これにより、ローミングユーザーが、内部 DNS 名を使用し内部のみのリソースにアクセスできます。IKEv2 は、modecfgdomains および modecfgdns を使用してドメイン名およびネームサーバー IP アドレスのコンマ区切りリストをサポートしますが、IKEv1 プロトコルは 1 つのドメイン名だけをサポートし、libreswan はネームサーバーの IP アドレスを 2 つまでしかサポートしません。
leftsubnet0.0.0.0/0 でない場合は、分割トンネリング設定要求が自動的にクライアントに送信されます。たとえば、leftsubnet=10.0.0.0/8 を使用すると、VPN クライアントは 10.0.0.0/8 のトラフィックのみを VPN 経由で送信します。

4.6.9. 量子コンピューターに対する保護の使用

事前共有鍵を持つ IKEv1 を使用すると、量子攻撃者に対する保護が可能になります。IKEv2 の再設計により、この保護はネイティブに提供されなくなりました。Libreswan は、Postquantum Preshared Keys (PPK) を使用して、量子攻撃に対する IKEv2 接続を保護します。
任意の PPK サポートを有効にするには、接続定義に ppk=yes を追加します。PPK を要求するには、ppk=insist を追加します。次に、各クライアントには、帯域幅 (および望ましくは量子安全) に通信する秘密値を持つ PPK ID が付与されます。PPK はランダム性で非常に強く、辞書の用語は選択されません。PPK ID および PPK データそのものは、以下のように ipsec.secrets に保存されています。
@west @east : PPKS "user1" "thestringismeanttobearandomstr"
PPKS オプションは、静的 PPK を参照します。動的 PPK に基づいてワンタイムパットを使用する実験的機能です。各接続で、ワンタイムパッドの新しい部分を PPK として使用します。これを使用すると、ファイル内の動的 PPK では、再利用しないようにゼロで上書きされます。ワンタイムパットマテリアルが残っていないと、接続に失敗します。詳細は man ページの ipsec.secrets(5) を参照してください。

警告

動的 PPK の実装はテクノロジープレビューとして提供されており、この機能は注意して使用する必要があります。詳細は 『Red Hat Enterprise Linux 7.5 リリースノート』 を参照してください。

4.6.10. その他のリソース

以下のドキュメントは、Libreswan および ipsec デーモンに関する追加リソースを提供します。

4.6.10.1. インストールされているドキュメント

  • ipsec(8) の man ページ - ipsec のコマンドオプションを説明しています。
  • ipsec.conf(5) の man ページ - ipsec の設定情報が含まれています。
  • ipsec.secrets(5) の man ページ - ipsec.secrets ファイルの形式を説明しています。
  • ipsec_auto(8) の man ページ - 鍵の自動交換を使用して確立された Libreswan IPsec 接続を操作する auto コマンドラインクライアントの使用方法を説明しています。
  • ipsec_rsasigkey(8) man ページ - RSA 署名鍵の生成に使用するツールを説明しています。
  • /usr/share/doc/libreswan-version/

4.6.10.2. オンラインのドキュメント

https://libreswan.org
アップストリームプロジェクトの Web サイトです。
https://libreswan.org/wiki
Libreswan プロジェクトの Wiki です。
https://libreswan.org/man/
Libreswan に関する全 man ページ