OpenVPNドキュメント

クライアント側のスマートカードを利用して二要素認証をおこなうためのOpenVPN設定

二要素認証(dual-factor authentication)について

二要素認証は、「ユーザーが所有するもの」と「ユーザーが知っていること」という2つの要素を組み合わせた認証方式のことです。

「ユーザーが所有するもの」とは、複製できないデバイス、例えば秘密鍵を含む暗号化トークンが挙げられます。
この秘密鍵はデバイス内で生成され、外部に出ることはありません。
暗号化トークンを所有するユーザーがリモートネットワーク上の保護されたサービスにアクセスしようとした場合、そのユーザーが認証済トークンを物理的に所有していれば、ネットワークアクセスを許可/拒否する認証プロセスによりユーザーを高い信頼性でもって証明することができます。

「ユーザーが知っていること」とは、暗号デバイスのパスワードのことです。
正しいパスワードを入力しなければ、秘密鍵にアクセスすることはできません。
暗号デバイスのもうひとつの特徴は、間違ったパスワードが一定回数以上入力された場合、秘密鍵の使用を禁止することです。
この動作により、もしユーザーがデバイスを紛失しても、他の人がデバイスを使用することはできません。

暗号化デバイスは一般的に「スマートカード」または「トークン」と呼ばれ、PKI(公開鍵基盤)と組み合わせて使用​​されます。
VPNサーバーはX.509証明書をチェックし、ユーザーが正しい秘密鍵を所有しているかどうかを確認します。
デバイスは複製不可能であり、有効なパスワードを要求するため、サーバーは高い信頼性でもってユーザー認証をおこないます。

二要素認証は、仮に最悪のケースを想定しても暗号トークンを一度にひとりしか使用できないため、パスワードベースの認証よりはるかに強力です。
パスワードは他のユーザーに推測や公開される恐れがあるため、パスワードのみの認証方式では最悪の場合、不特定多数の人々が不正アクセスを試みる可能性があります。

秘密鍵をファイルに保存する場合、通常はパスワードによって暗号化されます。
しかしこの方法の問題点は暗号化された鍵が復号化されたり、クライアントマシン上で実行されるスパイウェア/マルウェアの攻撃にさらされることです。
暗号化デバイスを使用する場合とは異なり、復号化に複数回失敗した時に鍵を自動的に消去する機能はありません。


PKCS#11とは?

この標準規格は、暗号情報を保持し暗号化機能を実行するデバイス向けに、Cryptokiと呼ばれるAPIを定義しています。 Cryptokiは"cryptographic token interface"の略称で、"crypto-key"と発音します。 シンプルなオブジェクトベースのアプローチを採用し、テクノロジーの独立性(あらゆる種類のデバイス)とリソースの共有化(複数のアプリケーションが複数のデバイスにアクセス可能)という目標のもと、暗号トークンと呼ばれるデバイスにアプリケーションがアクセスする共通の論理ビューを提供します。

要約すると、PKCS#11はアプリケーションソフトウェアがスマートカードや他の暗号化トークンにアクセスするために使用できる標準規格です。
大半のデバイスベンダーはPKCS#11プロバイダーインターフェースを実装したライブラリを提供しており、アプリケーションはこのライブラリを使用してデバイスにアクセスする事が可能です。
PKCS#11は特定のベンダーに依存しないフリー規格のクロスプラットフォームです。


PKCS#11プロバイダーライブラリ

まず最初に、デバイスドライバと一緒にインストールされている筈のプロバイダライブラリを探します。
各ベンダーはそれぞれ独自のライブラリを提供しています。例えば、OpenSC PKCS#11プロバイダはUnixでは/usr/lib/pkcs11/opensc-pkcs11.so、Windowsではopensc-pkcs11.dllにあります。


暗号化トークンの設定方法

以下の登録手順に従います。

  • PKCS#11トークンを初期化
  • PKCS#11トークン上にRSA鍵ペアを生成
  • 生成された鍵ペアに基づいて証明書要求を作成
    OpenSCとOpenSSLを使用できます。
  • 証明書要求を証明機関に送信し、作成された証明書を受け取る
  • 証明書をトークンにloadする
    証明書のID属性とラベル属性が秘密鍵のものと一致する必要があります。

作成されたトークンは、共に同じID属性とラベル属性の秘密鍵オブジェクトと証明書オブジェクトを所有するトークンです。

シンプルな登録ユーティリティとして、OpenVPN 2.1シリーズの一部であるEasy-RSA 2.0があります。
READMEファイルに記載されている手順に従い、pkitoolを使用して登録してください。

以下のコマンドでトークンを初期化します。

$ ./pkitool --pkcs11-slots /usr/lib/pkcs11/
$ ./pkitool --pkcs11-init /usr/lib/pkcs11/

証明書を登録します。

$ ./pkitool --pkcs11 /usr/lib/pkcs11/ client1

暗号化トークンを利用するためにOpenVPN設定を変更する

PKCS#11機能を使用するには、OpenVPN 2.1以上のバージョンである必要があります。
最新版はhttp://openvpn.net/download.htmlから入手できます。

正しいオブジェクトを決定する

各PKCS#11プロバイダは複数のデバイスをサポートしています。
利用可能なオブジェクト一覧を表示するには以下のコマンドを使用します。

$ openvpn --show-pkcs11-ids /usr/lib/pkcs11/

The following objects are available for use.
Each object shown below may be used as parameter to
--pkcs11-id option please remember to use single quote mark.

Certificate
DN: /CN=User1
Serial: 490B82C4000000000075
Serialized id: aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600

各証明書/秘密鍵ペアには、固有の「シリアル化ID」文字列が付与されます。
要求された証明書のシリアル化ID文字列は一重引用符を使用してpkcs11-idオプションに指定する必要があります。

pkcs11-id 'aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600'
PKCS#11でOpenVPNを使用する
PKCS#11のOpenVPNオプションの一般的なセット
pkcs11-providers /usr/lib/pkcs11/
pkcs11-id 'aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600'

これにより、pkcs11-id文字列に一致するオブジェクトが選択されます。

PKCS#11の高度なOpenVPNオプション
pkcs11-providers /usr/lib/pkcs11/provider1.so /usr/lib/pkcs11/provider2.so
pkcs11-id 'aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600'
pkcs11-pin-cache 300
daemon
auth-retry nointeract
management-hold
management-signal
management 127.0.0.1 8888
management-query-passwords

これにより、OpenVPNに2つのプロバイダがloadされ、pkcs11-idオプションで指定した証明書が使用されます。
管理インターフェースによりパスワードが照会され、トークンにアクセスできない場合、デーモンはホールド状態に戻ります。
トークンは300秒間使用され、その後パスワードが再照会されます。
管理セッションが切断した場合、セッションも切断されます。

PKCS#11 実装に関する考慮事項

大半のPKCS#11プロバイダはスレッドを使用しています。
LinuxThreads(setuid,chroot)の実装により発生する問題を避けるため、PKCS#11を使用する場合はNative POSIX Thread Library (NPTL)対応のglibcにアップグレードすることを強くお勧めします。

OpenSC PKCS#11プロバイダ

OpenSC PKCS#11プロバイダはUnixでは/usr/lib/pkcs11/opensc-pkcs11.so、Windowsではopensc-pkcs11.dllにあります。


PKCS#11とMicrosoft Cryptographic API(CryptoAPI)の違い

PKCS#11はベンダーに依存しないクロスプラットフォームのフリーな標準なのに対し、CryptoAPIはMicrosoft特定のAPIです。
多くのスマートカードベンダーは両方のインターフェースをサポートしています。
Windows環境ではユーザーはどちらのインターフェースを使用するかを選択しなければなりません。

MS CryptoAPI(cryptoapicertオプション)を使用したOpenVPNの現在の実装は、OpenVPNをサービスとして実行しない限り正常に動作します。
管理環境でサービスとしてOpenVPNを実行する場合、以下の理由により、大半のスマートカードでは動作しません。

  • 大半のスマートカードプロバイダは証明書をローカルマシンにloadしません。
    そのため、実装ではユーザー証明書にアクセスできません。
  • OpenVPNクライアントがエンドユーザーと直接やり取りせずにサービスとして実行されている場合、サービスはユーザーに対してスマートカードのパスワードを入力するよう問い合わせることが出来ません。
    そのため、スマートカードでのパスワード検証プロセスに失敗します。

PKCS#11はMicrosoftストアにアクセスする必要がなく、またエンドユーザーとの直接のやり取りも必要としないため、PKCS#11インターフェイスを使用するとあらゆる実装においてOpenVPNをスマートカードと組み合わせて使用できます。