Ubuntu 16.04 で証明書と事前共有キーを使用する StrongSwan ベースの IPsec VPN
このページでは
- Strongswan のインストール (バイナリとソース コード)
- ソースを使用したストロングスワンのコンパイル
- サイト間 VPN
- 事前共有鍵ベースのトンネル
- X.509 証明書ベースのトンネル
序章
この記事では、IPsec プロトコルのオープン ソース実装に焦点を当てます。ネットワーク層のセキュリティは、次の 2 つのコンポーネントで構成される IPsec プロトコルを使用して確保されます。
- 認証ヘッダー (AH)
- カプセル化セキュリティ ペイロード (ESP)
パケットの整合性と認証は AH を使用して保証され、ESP コンポーネントは機密性とセキュリティ機能を提供します。 IPsec のオープン ソース実装である StrongSwan (Strong Secure WAN) は、インターネット キー交換 (IKE v1/2) の両方のバージョンをサポートするよく知られたツールです。キー共有またはインターネット キー交換は、IPSec VPN (仮想プライベート ネットワーク) の一部です。 IKE メカニズムは、ESP プロトコルでデータを暗号化するために 2 つの当事者間でキーを共有するために使用されます。 OpenSSL の暗号化と整合性アルゴリズム (AES、SHA など) と暗号化ライブラリは、IKE ステップで使用されます。ただし、セキュリティ アルゴリズムの Linux カーネル実装は、IPSec の主要部分 (ESP & AH) で使用されます。ストロングスワン。
ストロングスワンの特徴
- 事前共有キー ベースの認証のサポート。
- 認証には X.509 形式の証明書がサポートされています。
- IKE v1/v2 の両方をサポートする単一のデーモン。
- サードパーティのプラグインとライブラリを簡単に統合できます。
- ハードウェア トークンは、openSC プロジェクトを使用してサポートされています。
ゲートウェイ間およびロード ウォリアー VPN は、strongswan によってサポートされています。ネットワーク トラフィックは、サイト間 VPN の組織のゲートウェイ デバイスで暗号化または復号化されます。ただし、ゲートウェイ デバイスからエンド ユーザー/クライアント マシンへの 2 つ目の安全なチャネルが確立されます。
この記事では、strongSwan ツールが Ubuntu 16.04 (LTS) にインストールされます。ハードウェア トークン用の OpenSC の統合と、最後に事前共有キーと x.509 証明書を使用したゲートウェイ間トンネルの作成について説明します。 .ハードウェア トークンまたはハードウェア セキュリティ モジュール(HSM)(USB やスマート カードなど)を strongswan で使用して、暗号化キー(公開および秘密)と証明書を保存できます。 strongswan でのハードウェア トークンのサポートは、オープンソース プロジェクトである OpenSC(ツールとライブラリのセット)を使用して提供されます。 PKCS#15 ベースのファイル構造と、PKCS#11 API を使用したスマート カードへのアクセスも、OpenSC ツールによって提供されます。次のスマート カードが openSC でサポートされています。
- WestCOS
- SetCOS
- CardO
- スターコス
- ASEPCOS
Strongswan のインストール (バイナリとソース コード)
strongswan のバイナリ パッケージ(deb/rpm)は、広く使用されているほぼすべての Linux ディストリビューションで利用できます。バイナリとソースコード (必要な機能を含む) を使用した strongswan のインストールについて、この記事で包括的に説明します。
strongswan のバイナリ パッケージは、Ubuntu 16.04 LTS で次のコマンドを使用してインストールできます。
aptitude install strongswan
Ubuntu リポジトリで利用可能な strongswan プラグインを以下に示します。
Ubuntu プラットフォームにインストールした後、構成ファイルとフォルダー (ipsec.conf、ipsec.secrets、ipsec.d、strongswan.conf、strongswan.d) は /etc ディレクトリに保存されます。
ソースを使用したストロングスワンのコンパイル
- opensc (strongswan での HSM のサポート用)。
- PC/SC(Ubuntu プラットフォームでのスマート カード リーダーのサポートに必要)。
- GMP ライブラリ (strongswan での数学演算に必要)。
- OpenSSL ツール (AES、SHA1 などの暗号化アルゴリズムのよく知られた実装)。
- PKCS (公開鍵暗号規格) 1、7、8、11、12。
この記事では、PCSC-Lite ツールを opensc と共に Ubuntu プラットフォームにインストールして、スマート カード リーダーのサポートを追加します。 PCSC-Lite は CCID リーダーに推奨されます。
strongswan のコンパイルを開始する前に、次のコマンドを実行して前提条件のソフトウェアをインストールします。
1. Opensc のインストール
aptitude install opensc
2. GMP ライブラリのインストール
aptitude install libgmp10
GMPの開発ライブラリをインストールします。
aptitude install libgmp-dev
OpenSSL libcrypto は、次のコマンドを使用してインストールされます。
apt-get install libssl-dev
コンパイル手順
/usr/src/ フォルダに移動し、wget コマンドを使用して strongswan の最新リリースをダウンロードします。
cd /usr/src
wget https://download.strongswan.org/strongswan-5.5.0.tar.gz
圧縮ファイルを解凍し、解凍したフォルダー内に移動して構成スクリプトを実行します。
tar –xzf strongswan-5.5.0.tar.gz
cd strongswan-5.5.0
configure スクリプトを実行して、strongswan の依存関係を確認します。 HSM サポートは、以下に示すように、strongswan の最新バージョンで既に有効になっています。
構成スクリプトを実行し、プレフィックス /usr/local を使用して、openssl サポートを有効にします。
./configure --prefix=/usr/local --enable-openssl
次のスナップショットは、必要なすべての依存関係が既にシステムにインストールされているため、configure スクリプトによってエラーが生成されなかったことを示しています。
次の 2 つのコマンドを実行して、/usr/local ディレクトリに strongswan をコンパイルしてインストールします。
make
make install
Ubuntu プラットフォームでの strongswan のコンパイルとインストールが完了し、いくつかの構成ファイル (strongswan.conf、ipsec.conf、および ipsec.secrets) とフォルダー (strongswan.d、ipsec.d) が /usr/local/etc パスの下にコピーされます。 . VPN ポリシーの構成は ipsec.conf ファイルに配置され、秘密の秘密は ipsec.secrets ファイルに格納されます。 Strongswan プラグインの構成は、strongswan.d ディレクトリに保存されます。
トランスポート VPN とトンネル VPN の両方が strongswan でサポートされています。トンネル モードでは、チャネルのサイト間セキュリティが提供され、cisco、huawei、juniper デバイスなどの他のベンダーと連携します。
サイト間 VPN
次の図は、ネットワーク内のストロングスワン ベースの VPN ゲートウェイ デバイスの配置を示しています。組織のプライベート ネットワーク 192.168.223.0/24 と 192.168.222.0/24 の間に、安全な通信チャネルが確立されます。
A と B のプライベート ネットワーク間で IPsec を使用する前に、A 側の VPN ゲートウェイがリモート側の VPN マシン (B) に ping を送信できるように、組織の VPN ゲートウェイ間のルーティングが機能していることを確認してください。これにより、ネットワーク接続が正常であることを確認できます。
以下に示すように、strongswan ツールのデフォルト設定は /usr/local/etc/ ディレクトリ内にあります。
事前共有鍵ベースのトンネル
最初のケースでは、共有シークレット ベースの VPN がゲートウェイ デバイス間で作成されます。よく知られているキー共有アルゴリズム Diffie-Hellman は、strongswan によって相互認証に使用されます。 IPsec プロトコルの仕組みの詳細については、次のリンクを参照してください。
VPN の構成:
(A面)
strongswan VPN ポリシーの主な構成は、ipsec.conf ファイルにあります。この構成ファイルには、次のような情報が含まれています。
- IKE のバージョン
- トンネルの種類
- 送信元と宛先のゲートウェイ
- VPN のプライベート ネットワーク
A側のipsec.confを以下に示します。
config setup
charondebug="all"
uniqueids=yes
strictcrlpolicy=no
conn %default
conn tunnel #
left=192.168.1.101
leftsubnet=192.168.223.0/24
right=192.168.1.102
rightsubnet=192.168.222.0/24
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
keyingtries=0
ikelifetime=1h
lifetime=8h
dpddelay=30
dpdtimeout=120
dpdaction=restart
authby=secret
auto=start
keyexchange=ikev2
type=tunnel
IPsec シークレット(共有キー、秘密キーのパスワード、hsm のロックを解除するためのピン)は、ipsec.secrets ファイルに保存されます。以下に示すように、両方の VPN パーティ間のシャード シークレットは \test12345\ です。
192.168.1.101 192.168.1.102 : PSK 'test12345'
(B面)
リモート側の ipsec.conf および ipsec.secrets ファイルの構成は、以下に示すようにローカル サイトの逆になります。
ipsec.conf ファイルの内容を以下に示します。
config setup
charondebug="all"
uniqueids=yes
strictcrlpolicy=no
conn %default
conn tunnel #
left=192.168.1.102
leftsubnet=192.168.222.0/24
right=192.168.1.101
rightsubnet=192.168.223.0/24
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
keyingtries=0
ikelifetime=1h
lifetime=8h
dpddelay=30
dpdtimeout=120
dpdaction=restart
authby=secret
auto=start
keyexchange=ikev2
type=tunnel
ipsec.secrets ファイルには、リモート側の共有シークレットが含まれています。
192.168.1.102 192.168.1.101 : PSK 'test12345'
両側で構成ファイルをセットアップした後、次のコマンドを使用して strongswan デーモン (charon) を開始します。
次のコマンドは、デバイスで作成された VPN のステータスを表示します。
ipsec ステータスオール
両側 (ローカルおよびリモート) のトンネルのステータスを以下に示します。
この Linux コマンドは、IPsec トンネルのポリシーと状態を表示します。
ip xfrm state
ip xfrm policy
上記のコマンド出力に示されているように、機密情報 esp/hmac (キー) も ip xfrm コマンドによって表示されます。
X.509 証明書ベースのトンネル
X.509 証明書 (公開鍵認証) ベースのトンネルでは、証明機関 (CA)、クライアント A および B の証明書を生成する必要があります。
次のスクリーンショットは、strongswan の PKI ユーティリティを使用して自己署名 CA 証明書を生成する方法を示しています。
/usr/local/etc/ipsec.d パスに入り、次のコマンドを実行します。
cd /usr/local/etc/ipsec.d
ipsec pki --gen --type rsa --size 4096 --outform pem > private/strongswanKey.pem
ipsec pki --self --ca --lifetime 3650 --in private/strongswanKey.pem --type rsa --dn "C=CH, O=strongSwan, CN=Root CA" --outform pem > cacerts/strongswanCert.pem
クライアント A の証明書の生成を以下に示します。
ipsec pki --gen --type rsa --size 2048 --outform pem > private/client1Key.pem
chmod 600 private/client1Key.pem
ipsec pki --pub --in private/client1Key.pem --type rsa | ipsec pki --issue --lifetime 730 --cacert cacerts/strongswanCert.pem --cakey private/strongswanKey.pem --dn "C=CH, O=strongSwan, CN=device1" --san device1 --flag serverAuth --flag ikeIntermediate --outform pem > certs/client1Cert.pem
同様に、クライアント B 用に生成された公開鍵と秘密鍵のペアと証明書。
ipsec pki --gen --type rsa --size 2048 --outform pem > private/client2Key.pem
chmod 600 private/client2Key.pem
ipsec pki --pub --in private/client2Key.pem --type rsa | ipsec pki --issue --lifetime 730 --cacert cacerts/strongswanCert.pem --cakey private/strongswanKey.pem --dn "C=CH, O=strongSwan, CN=device2" --san device2 --flag serverAuth --flag ikeIntermediate --outform pem > certs/client2Cert.pem
CA とクライアント証明書が正常に生成されたら、次のステップは ipsec.conf と ipsec.secrets の構成を変更することです。 ipsec.conf と secrets ファイルの変更の詳細については、strongswan のドキュメントを参照してください。
A 側の ipsec.conf & ipsec.secrets の内容を以下に示します。
config setup
charondebug="all"
uniqueids=yes
strictcrlpolicy=no
conn %default
conn tunnel #
left=192.168.1.101
leftsubnet=192.168.223.0/24
right=192.168.1.102
rightsubnet=192.168.222.0/24
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
keyingtries=0
ikelifetime=1h
lifetime=8h
dpddelay=30
dpdtimeout=120
dpdaction=restart
#authby=secret
auto=start
keyexchange=ikev2
type=tunnel
leftcert=client1Cert.pem
leftid="C=CH, O=strongSwan, CN=device1"
rightid="C=CH, O=strongSwan, CN=device2"
#192.168.1.101 192.168.1.102 : PSK 'test12345'
: RSA client1Key.pem
B面の構成も以下の通り。
config setup
charondebug="all"
uniqueids=yes
strictcrlpolicy=no
conn %default
conn tunnel #
left=192.168.1.102
leftsubnet=192.168.222.0/24
right=192.168.1.101
rightsubnet=192.168.223.0/24
ike=aes256-sha2_256-modp1024!
esp=aes256-sha2_256!
keyingtries=0
ikelifetime=1h
lifetime=8h
dpddelay=30
dpdtimeout=120
dpdaction=restart
#authby=secret
auto=start
keyexchange=ikev2
type=tunnel
leftcert=client2Cert.pem
leftid="C=CH, O=strongSwan, CN=device2"
rightid="C=CH, O=strongSwan, CN=device1"
#192.168.1.102 192.168.1.101 : PSK 'test12345'
: RSA client2Key.pem
ipsec restart コマンドを実行して上記の変更を適用し、証明書を使用して作成されたトンネルのステータスを確認します。
ipsec statusall # at side A
ipsec statusall # at side B
最後に、strongswan ツールを使用して、証明書ベースの VPN が正常に作成されました。