ToPocketTweetこのページはOpenVPN公式サイトのコンテンツ(“Howto”)の翻訳ですが、完全な翻訳であることを保証するものではありません。正確な情報については公式サイトの情報も併せてご確認ください。VPNの仮想インターフェイスに対してファイアーウォールを設定することによってユーザーやグループ単位でのアクセス制御もできます。OpenVPNはWebアプリケーションプロキシではありませんので、Webブラウザを使って操作するものではありません。2.0のクライアント/サーバーの設定方法をステップバイステップで解説します。設定ファイルのサンプルを参照したい場合はこちらからどうぞ。想定されている読者このドキュメントは、ネットワークに関する基礎知識、たとえばIPアドレス、DNS、ネットマスク、サブネット、IPルーティング、ルータ、ネットワークインターフェイス、LAN、ゲートウェイ、ファイアーウォールなどについての基本的な知識を持っている方を対象にしています。HOWTO」から参照できます。Point-to-Pointでの接続や静的鍵での設定などについて有用な情報が含まれていますので、必要に応じて参照してください。他にもたくさんの資料があります。こちらをご覧ください。PKI(証明書と秘密鍵を使った公開鍵認証)を使ってVPNクライアント/サーバーを構成する方法を説明します。「設定は最小限にしてとにかくVPNをすぐ使いたい!」という場合は、静的鍵での設定が簡単です。Mini-HOWTOを参照してください。鍵が漏洩した場合、以前のセッションについてもデータが明らかになってしまうVPNのペアごとに秘密鍵をプレーンテキストファイルとして保持しなければならない秘密鍵を交換するのに、安全な方法(フロッピーディスクなどの物理媒体、暗号化されたネットワーク経由など)を使わなければならないインストールまずはOpenVPNをダウンロードします。ダウンロードできたかどうかを確認するため、ダウンロードしたファイルの署名を確認しておくとさらに安全です。OpenVPNの実行ファイルはサーバーとクライアントの両方にインストールする必要がありますが、サーバーとクライアントに同じ実行ファイルをインストールします。Linuxの場合(RPMパッケージを使うとき)RPMパッケージをサポートしたLinuxディストリビューション(SuSE、Fedora、Redhatなど)を使うときには、RPMを使ってインストールするのが最も簡単です。お使いのディストリビューションに対応したバイナリRPMファイルを入手してインストールするという方法が一般的ですが、次のように自分でRPMファイルをビルドすることもできます。openvpn-[version].tar.gzRPMファイルを入手/ビルドできれば、通常のRPMファイルの場合と同じ方法でインストールできます。openvpn-[details].rpmインストール済みのOpenVPNをアップグレードする場合は次のようにします。openvpn-[details].rpmOpenVPNのバイナリRPMパッケージをインストールする場合、次の依存関係があります。openssllzopamまた、自分でRPMパッケージをビルドする場合にはさらに次の依存関係があります。9でのRPMビルドや、依存関係の制御などに関してはopenvpn.specファイルを参照してください。Linuxの場合(RPMを使わないとき)DebianやGentooなど、RPMベースではないLinuxディストリビューションの場合は、そのディストリビューションで利用できるパッケージングシステム(apt-getやemergeなど)を使ってインストールすることができます。./configureコマンドを使ってインストールすることもできます。最初に.tar.gzファイルを展開します。openvpn-[version].tar.gz展開したディレクトリに移動してmakeします。installWindowsの場合ダウンロードページにある自己解凍exeファイルを実行してインストールします。2000以降でのみ動作することと、OpenVPNをインストール/実行するには管理者権限が必要(Windowsの制約のため)であることに注意してください。インストール後であれば、サービスとして動作することにより管理者権限のないユーザーでもOpenVPNを利用することができます。issues」を参照してください。GUIのインストール時にOpenVPNをインストールすることもできます。Sundmanのインストールパッケージを使うと、GUIツールとOpenVPN本体を同時にインストールできます。OpenVPNをWindowsインストーラでインストールすると、.ovpnファイルがOpenVPNに関連付けられます。インストールが完了した後、OpenVPNを次のいずれかの方法で実行します。file(この設定ファイルでOpenVPNを開始する)」を選択する。OpenVPNを終了するにはF4キーを押します。コマンドプロンプトからOpenVPNのコマンドを実行する。実行後、OpenVPNを終了するにはF4キーを押します。myconfig.ovpnOpenVPNをサービスとして実行する。Files\OpenVPN\configに配置してOpenVPNサービスを起動します。Windows用にはGUIもあり、GUIから起動することもできます。Windowsへのインストールについては、こちらにある情報も参照してください。10.3も参照してください。その他のOS特定のOS向けの注記がINSTALLに記載されていますので参照してください。通常は下記の方法でインストールできます。install「ルーティング」と「ブリッジ」のどちらを使うか?「ルーティング」と「ブリッジ」の違いについてはFAQで、ブリッジの詳細はこちらのページでさらに詳しく説明されていますので、参照してください。一般的には「ルーティング」が適している場合が多く、設定も容易です。クライアントごとのアクセス制御もこちらのほうが高機能です。「ブリッジ」でないと利用できない機能もあります。下記のような機能が必要な場合は「ブリッジ」を使用する必要があります。非IPプロトコル(IPXなど)をVPN上で使用する必要がある場合ブロードキャストパケットをVPN上で使用する必要がある場合(ネットワークゲームなど)SambaやWINSを使用せずに、VPN経由でWindowsファイル共有のブラウズをしたい場合サブネットの設定VPNを設定する場合、通常は異なるロケーションにあるサブネットを相互にリンクさせます。RFC1918において下記のIPアドレスブロックをプライベートネットワーク用アドレスとして定義しています。prefix)VPN設定でもこれらのプライベートIPアドレスブロック内のアドレスを使用しますが、IPアドレスやサブネットが重複しないよう注意する必要があります。次のような状況は避けなければなりません。同一VPN内の他の拠点にあるネットワークと同じサブネットになってしまうリモートアクセスを使用する場合で、アクセス元のサブネットがVPNのサブネットと重複してしまうたとえば、よく使用されるプライベートLANのサブネットとして192.168.0.0/24があります。外部のインターネットカフェからVPNにアクセスしようとしたとき、そのインターネットカフェのLANがこの同じサブネットを使うよう設定されているとすると、ルーティングの衝突が発生します。192.168.0.1というゲートウェイのアドレスが、そのインターネットカフェのLAN内のアドレスなのか、VPN上のアドレスなのかが判断できないためです。ひとつの例を考えてみます。複数の拠点間をVPNで接続しようとしますが、それぞれの拠点のLANでサブネットとして192.168.0.0/24を使用していたとします。この場合も問題が発生します。各拠点で異なるサブネットを使用しないと、どのサイトにパケットを送ればいいかが判断できないためです。この問題を避けるための最善の解決策は10.0.0.0/24や192.168.0.0/24をプライベートLANのネットワークアドレスとして使用しないことです。VPNのアクセス元(インターネットカフェや空港、ホテルなども含む)で使用されている可能性の低いサブネットを選択します。)を抜き出して使えば、アドレスが重なりにくくなるかもしれません。2.0の設定の第一段階は、PKI(公開鍵基盤)の構築です。PKIには以下のものが含まれます。サーバーとクライアントそれぞれに個別に必要な証明書(公開鍵とも言われます)と秘密鍵サーバーやクライアントで使用される証明書に署名するために必要な認証局(CA)の証明書と鍵OpenVPNは双方向の認証をサポートしています。したがって、信頼された接続を確立するためにはクライアントはサーバーの証明書を認証し、サーバーはクライアントの証明書を認証する必要があります。この認証では、まずマスター認証機関(CA)によって署名されているかを確認し、その後証明書のヘッダ情報(共通名や認証タイプなど)をチェックします。VPNの観点からすると、このセキュリティモデルにはさまざまな利点があります。サーバーは自分自身の証明書と鍵を持っていればよい。サーバーは接続してくる可能性のあるすべてのクライアントの証明書を持っている必要がありません。サーバーはマスター認証機関(CA)が署名した証明書だけを受け入れる。List)に加えればよい。CRLを使えば、PKI全体を再構築しなくても特定の証明書を拒否できます。サーバーは証明書内に埋め込まれた特定のフィールド(共通名など)に基づいて、クライアントごとのアクセス権限を強制できる。マスター認証機関(CA)の証明書と鍵の生成このセクションでは、まずマスター認証機関の証明書と鍵を生成した後、サーバーの証明書と鍵を生成し、続けて3台のクライアントそれぞれの証明書と鍵を生成する方法を説明します。LinuxやBSD、UnixベースのOSを使用している場合には、シェルを開き、OpenVPNが配置されているディレクトリのeasy-rsaサブディレクトリに入ります。RPMファイルからインストールした場合は、このディレクトリは通常/usr/share/doc/packages/openvpnか/usr/share/doc/openvpn-2.0にあります。RPMファイルからインストールした場合、設定ファイルを編集する前に、設定ファイルを/etc/openvpnなどのディレクトリにコピーしておくと安全です。しておけば、今後OpenVPNをアップグレードしたときにも設定ファイルが上書きされることを防ぐことができます。.tar.gzファイルからインストールした場合は、easy-rsaサブディレクトリはソースツリーを展開したトップディレクトリの下にあります。Files\OpenVPN\easy-rsaディレクトリに入ります。次のバッチファイルを実行して設定ファイルをコピーします(このコマンドを実行すると、vars.batとopenssl.cnfが上書きされます)。init-configvarsファイル(Windowsの場合はvars.batファイル)で記述されているKEY_COUNTRY、KEY_PROVINCE、KEY_CITY、KEY_ORG、KEY_EMAILの各パラメータを設定します。これらのパラメータはブランクにしないようにしてください。続いて、PKIを初期化します。Linux/BSD/Unixの場合は次のようにします。./vars./clean-all./build-caWindowsの場合は次のようにします。varsclean-allbuild-ca最後にbuild-caコマンドを実行すると、opensslコマンドが呼び出されて認証機関(CA)の証明書と鍵が生成されます。protected]�varsまたはvars.batファイルで設定した値が使用されます。Name(共通名)だけはデフォルト値が設定されないため、ここで必ず入力しなければなりません。上記の例では「OpenVPN-CA」としています。次に、サーバー用の証明書と秘密鍵を生成します。Linux/BSD/Unixの場合は次のようにします。serverWindowsの場合は次のようにします。Nameは設定する必要があります。ここでは「server」と設定します。[y/n]」という2つの質問が出ますが、両方にYesと答えてください。基本的にサーバーの手順と同様の方法です。Linux/BSD/Unixの場合は次のようにします。client3Windowsの場合は次のようにします。client3クライアントの鍵をパスワードで保護したい場合には、代わりにbuild-key-passコマンドを使用してください。Nameを設定する必要があります。これは他のクライアント用証明書で使用した共通名と重複することはできません。このサンプルでは「client1」「client2」「client3」という共通名を使用します。Hellmanパラメータを生成します。Linux/BSD/Unixの場合は次のようにします。./build-dhWindowsの場合は次のようにします。build-dhコマンドを実行すると次のように表示されます。time.................+..............................................................+.............+.................+...............................................鍵ファイル新しく作成された証明書と鍵はkeysサブディレクトリにあります。今までの手順に従うと、以下のようなファイルがあるはずです。Hellmanパラメータいいえserver.crtサーバーのみサーバーの証明書いいえserver.keyサーバーのみサーバーの鍵はいclient1.crtクライアント1のみクライアント1の証明書いいえclient1.keyクライアント1のみクライアント1の鍵はいclient2.crtクライアント2のみクライアント2の証明書いいえclient2.keyクライアント2のみクライアント2の鍵はいclient3.crtクライアント3のみクライアント3の証明書いいえclient3.keyクライアント3のみクライアント3の鍵はい鍵を生成したら、それぞれのPCに必要なファイルをコピーします。これらのファイルは重要なファイルですので、ファイルを各PCにコピーする際には安全な方法でファイルをやり取りするように注意してください。サーバー用/クライアント用の設定ファイルの作成サンプル設定ファイル設定ファイルを作成するには、サンプル設定ファイルをベースに利用するのが便利です。サンプル設定ファイルは下記の場所にあります。Files]Linux、BSDなどのUnix系のOSでは、サンプル設定ファイルはserver.confやclient.confというファイル名になっています。Windows版ではserver.ovpnやclient.ovpnというファイル名になっています。サーバー設定ファイルの編集サンプルのサーバー設定ファイルをベースにして、サーバー設定ファイルの編集を行います。1194(OpenVPNの標準ポート番号)でクライアントからの接続を受け付け、VPNクライアントには10.8.0.0/24サブネットのアドレスを配布します。サンプルの設定ファイルを使用する前には、ca、cert、key、およびdhの各パラメータをPKIのセクションで作成した実際のファイルの場所に設定してください。これだけの設定でサーバー設定ファイルを使うこともできますが、通常はさらに以下のような設定を行います。tapを使用する必要があります。2つの別個のOpenVPNインスタンスを実行する必要があります)。10.8.0.0/24以外の仮想IPアドレスを使用する場合には、serverディレクティブを変更する必要があります。その場合、仮想IPアドレス範囲としてネットワーク上で使用されていないプライベートアドレスブロックを使うようにしてください。VPN上でクライアント同士が接続できるようにするには、client-to-clientのコメントを外します。デフォルトでは各クライアントはサーバーに対してのみ接続できます。nobodyのコメントを外すことによってセキュリティを向上させることもできます。1台のPC上で複数のOpenVPNインスタンスを実行する場合は、それぞれのインスタンスで個別の設定ファイルを使用します。このためには下記のような設定が必要になります。1194を利用することができます)。Windowsを使用している場合は、各OpenVPN設定ごとに別個のTAP-Win32アダプタが必要です。adapter]から追加できます。複数のOpenVPNインスタンスを実行する場合には、それぞれのインスタンスでファイルの出力時に同じファイルを上書きしてしまうことがないように注意してください。logやlog-append、status、ifconfig-pool-persistなどの設定が関係します。クライアント設定ファイルの編集クライアント用のサンプル設定ファイル(Linux/BSD/Unixではclient.conf、Windowsではclient.ovpn)は、サーバー用のサンプル設定ファイルでの設定に対応するようになっています。サーバー用設定ファイルと同様、ca、cert、key、およびdhの各パラメータをPKIのセクションで作成した実際のファイルの場所に設定してください。各クライアントは個別のcert/keyペアを使用する必要があります。サーバーとクライアントの両方に必要なファイルはcaファイルのみです。次にremoteディレクティブにOpenVPNサーバーのホスト名かアドレスとポート番号を設定します。最後に、クライアント用設定ファイルの設定とサーバー用設定ファイルの設定の整合がきちんと取れているかを確認します。確認すべきなのはdev(tunかtap)、proto(udpかtcp)が揃っているかですが、もし使用されるのであればcomp-lzoやfragmentもサーバーとクライアントの両方で設定が行われているかを確認してください。VPNの起動と接続テストサーバーの起動まず、OpenVPNサーバーがインターネットからアクセスできるようになっていることを確認します。ファイアーウォールの設定も確認し、OpenVPNのポート(設定したポート)にアクセスできるように設定されているかをチェックしてください。次に、TUN/TAPインターフェイスに対するファイアーウォールの保護を解除します。トラブルシューティングを容易にするために、OpenVPNをデーモンやサービスとしてではなく、まずはコマンドラインから(Windowsの場合は.ovpnファイルを右クリックして)実行します。[サーバー設定ファイル]通常、サーバーは起動時に次のようなメッセージを表示します。Completedクライアントの起動サーバーと同様、OpenVPNをデーモンやサービスとしてではなく、まずはコマンドラインから(Windowsの場合は.ovpnファイルを右クリックして)実行します。[クライアント設定ファイル]Windows版では通常、前述のサーバーの起動時の出力と似たようなメッセージが表示されます。Completedとなります。クライアントからVPN経由でPINGを実行してみましょう。tunを使用している場合)は次のようにします。tapを使用している場合)は、サーバーのサブネット上にあるIPアドレスに対してPINGを実行します。PINGが成功すれば、VPNでの接続は成功です。トラブルシューティングPINGが失敗した場合、またOpenVPNクライアントが接続を開始できない場合には、以下の点を確認してください。connectivity)と表示される。このエラーはクライアントがサーバーへのネットワーク接続が確立できないときに発生します。以下の点をご確認ください。クライアント設定ファイルでOpenVPNサーバーの正しいホスト名、IPアドレスとポート名を設定していることを確認する。OpenVPNサーバーがNICを1つだけ搭載していて保護されたLAN上にある場合、ゲートウェイやファイアーウォールの設定でアクセスできなくなっていないことを確認する。errorsと表示される。SP2上でサードパーティのパーソナルファイアーウォールを使用しているとき、に発生する可能性があります。SP2上で正しく動作するものであることを確認する。Completedメッセージは表示されるものの、PINGが成功しない。これはTUN/TAPインターフェイス上のVPNネットワークトラフィックがファイアーウォールによってフィルタされているときによく起きる問題です。クライアントのTUN/TAPインターフェイスでファイアーウォールを無効にする。SP2の場合、[Windowsセキュリティセンター]-[Windowsファイアーウォール]-[詳細]でTAP-Win32アダプタのファイアーウォールを解除する。サーバー側のTUN/TAPインターフェイスでもトラフィックがフィルタされていないことを確認する(サーバー側でのファイアーウォールの利用については、「クライアント特有のルールとアクセスポリシーの設定」も参照してください)。udp設定を使用しているが、接続開始時に接続が止まってしまい、サーバーに下記のようなログが残される。xxxxxxxxクライアント側にログが残されていない。接続がクライアントからサーバーへの一方のみしか確立できないため、サーバーからクライアントへのデータが(おそらくはクライアント側で)ブロックされている。(1)クライアント上でパーソナルファイアーウォールが動作しているか、(2)クライアント用のNATルータゲートウェイが動作している可能性がある。サーバーからクライアントへのUDPパケットが許可されるようファイアーウォールの設定を変更する。トラブルシューティングに関するさらに多くの情報がFAQにありますので、参照してください。システムのスタートアップでOpenVPNが自動起動するように設定するブート時にデーモンやサービスを自動起動する方法はOSによって異なります。WindowsインストーラやRPMのようなパッケージからインストールすると、標準で自動起動の設定が行われます。LinuxLinuxでRPMパッケージからOpenVPNをインストールした場合、インストーラによってinitscriptがセットアップされます。実行すると/etc/openvpnディレクトリ内にある.confファイルが検索され、見つかった設定ファイルごとに別個のOpenVPNデーモンが起動します。WindowsWindowsインストーラを使ってインストールするときにサービスラッパーも同時にセットアップされますが、デフォルトではOFFになっています。サービスを有効化するには、[コントロールパネル]にある[管理ツール]から[サービス]を開き、OpenVPNサービスを選択して右クリックして[プロパティ]を選択します。[スタートアップの種類]を「自動」に設定すると、サービスは次回の再起動時から自動起動します。Files\OpenVPN\configフォルダにある.ovpn設定ファイルを検索し、見つかった設定ファイルごとに別個のOpenVPNプロセスが起動します。実行中のOpenVPNプロセスの制御Linux/BSD/Unixで動作している場合OpenVPNは下記のシグナルを受け付けます。終了writepidディレクティブを使用するとOpenVPNデーモンが使用するPIDをファイルに書き出すことができるため、シグナルを送るプロセスを判別できます(initscriptでOpenVPNを起動した場合は、コマンドラインに–writepidディレクティブを付加して起動します)。GUIを参照してください。file]を選択することによって起動できます。この方法で起動すると、以下のキーボードコマンドが使用可能になります。終了Windowsサービスとして動作している場合OpenVPNをWindowsのサービスとして起動した場合には、以下の方法でのみ制御できます。サービスコントロールマネージャ([コントロールパネル]-[管理ツール]-[サービス])で開始/停止する後述の管理インターフェイスを使用するサーバー起動中の設定変更ほとんどの設定変更については、変更後にサーバーの再起動が必要です。2つのディレクティブによって参照されているファイルだけは例外で、それらのファイルは書き換えられた後すぐに反映され、設定の反映のためにサーバープロセスを再起動する必要がありません。このディレクティブはクライアント設定ディレクトリを設定するものです。pageを参照してください。このディレクトリ内のファイルは変更がすぐに反映され、サーバーの再起動は必要ありません。この設定の変更が適用されるのは設定変更後に接続してくる新しい接続に対してのみで、既存の接続には適用されないことに注意してください。既存の接続(または、切断したもののまだタイムアウトしていない接続)にも新しい設定を適用したい場合は、後述する管理インターフェイスを使用してその接続のインスタンスをKillしてください。これによって再接続が行われ、新しいclient-config-dirファイルが適用されることになります。List)を指定するためのものです。ここで指定されたCRLファイルを書き換えた場合は、その後接続してくる新しい接続や、既存の接続のSSL/TLSチャンネルの再ネゴシエーション(デフォルトでは1時間おき)の際にすぐに適用されます。CRLに追加した証明書を使っているクライアントからの接続をすぐに切断したい場合には、後述する管理インターフェイスを使用してください。ステータスファイルデフォルトのserver.confでは次のように設定されています。openvpn-status.logこのファイルには、現在接続しているクライアント接続のリストが1分ごとに書き出されます。管理インターフェイスの使用OpenVPN管理インターフェイスを使うと、実行中のOpenVPNプロセスを制御できます。この管理インターフェイスは管理用のポートにTELNETで接続することによって直接使用することもできますし、この機能を利用するGUIを使って間接的に使用することもできます。この管理インターフェイスを有効にするには、サーバーかクライアントの設定ファイルで次のように設定します。7505で接続を受け付けます(もちろん他の空いているポートを設定することもできます)。この設定を行ってOpenVPNが実行されている状態であれば、この管理インターフェイスにTELNETクライアントを使って接続することができます。Documentationを参照してください。tun)でサーバー側に複数PCを接続するクライアントとサーバー間でVPNが動作するようになると、クライアントを追加し、サーバーだけではなくサーバーネットワーク上にある複数のPCにアクセスできるようにVPNを拡張したいと思うことでしょう。IPアドレス範囲として10.8.0.0/24を使用しているものとします。VPNクライアントに対して、10.66.0.0/24のサブネットにVPN経由でアクセスさせるようにする必要があります。これは、サーバーの設定ファイル内のディレクティブを下記のように設定することによって簡単にできます。255.255.255.0"次に、サーバー側LANのゲートウェイにおいて、VPNクライアントサブネット(10.8.0.0/24)からOpenVPNサーバーへルーティングされるように設定する必要があります(これはOpenVPNサーバーとLANゲートウェイが別の場合にのみ必要な設定です)。OpenVPNサーバーでIPフォワードとTUN/TAPフォワードが有効になっていることを確認してください。tap)でサーバー側に複数PCを接続するブリッジの場合は、追加の設定を行う必要はありません。これはブリッジを利用しているメリットの1つです。tun)でクライアント側に複数PCを接続する典型的なリモートアクセスの場合、クライアントPCは1台のPCとしてVPNに接続します。クライアントPCをローカルLAN(ホームオフィスなど)のゲートウェイとして利用し、そのクライアントLAN上にある各PCをVPNに接続したい場合があります。今回の例ではクライアントLANは192.168.4.0/24サブネットを使用しており、このVPNクライアントは共通名としてclient2を設定した証明書を使うものとします。目標は、クライアントLAN上のすべてのマシンがVPN経由でサーバーLAN上の任意のPCにアクセスできるようにすることです。セットアップの前に必要なことがいくつかあります。クライアントLAN(今回の例では192.168.4.0/24)と同じサブネットがVPN上で使用されていないことを確認してください。VPNに接続するそれぞれのサブネットは固有である必要があります。このクライアントの証明書では必ずユニークな共通名(今回の例ではclient2)を設定してください。サーバー設定ファイルでduplicate-cnフラグを使用することはできません。このクライアントPCでIPフォワードとTUN/TAPフォワードを有効にしてください。次に、サーバー側の設定を変更します。サーバー設定ファイルでクライアント設定ディレクトリへの参照が行われていない場合は、次の行を追加してください。ccdこのディレクティブで設定されているccdは、OpenVPNサーバーデーモンが起動する際に事前に作成されるディレクトリの名前です。Files\OpenVPN\configが使用されます。新しいクライアントがOpenVPNサーバーに接続してくると、デーモンがこのディレクトリをチェックし、接続してきたクライアントと一致する共通名が設定された設定ファイルがないかどうかを確認します。ファイルが見つかった場合には、この設定が読み込まれ、追加の設定ディレクティブが適用されます。次に、ccdディレクトリにclient2というファイルを作成します。このファイルには次の1行を含めます。255.255.255.0この設定は、OpenVPNサーバーに対し、192.168.4.0/24サブネットへの通信をclient2にルートさせるためのものです。続いて、メインのサーバー設定ファイル(ccd/client2ファイルではありません)に下記の1行を加えます。255.255.255.0routeとirouteの両方の設定を行うのは冗長に感じるかもしれません。routeはカーネルからOpenVPNサーバー(TUNインターフェイス経由)でのルート設定に使用される設定で、irouteはOpenVPNサーバーからリモートクライアントでのルート設定に使用されます。そのため、この2つはどちらも必要なものです。client2のサブネット(192.168.4.0/24)とOpenVPNサーバーの他のクライアントとの間でのネットワークトラフィックを許可したい場合には、サーバー設定ファイルに下記の設定を加えます。255.255.255.0"この設定により、OpenVPNサーバーはクライアント2のサブネットを他のクライアントに通知することになります。最後に(よく忘れる点ですが)、サーバーのLANゲートウェイにおいて、192.168.4.0/24への通信をOpenVPNサーバーにルーティングする設定を追加します(OpenVPN本体がサーバーLANのゲートウェイも兼ねている場合はこのステップは不要です)。PINGはその対象PCには届きますが、192.168.4.0/24へのルートが設定されていないため、リプライを返すためのルートがわからないことになります。同様に、OpenVPNが稼動しているクライアントマシンがクライアントLANのゲートウェイでない場合、クライアントLANのゲートウェイにおいて、OpenVPNクライアントマシンにVPNで接続できるようにすべてのサブネットへのルートが設定されている必要があります。tap)でクライアント側に複数PCを接続するこちらは少し複雑です(実際にはそれほど難しくありませんが)。下記のような手順が必要です。クライアント上のTAPインターフェイスと、LANに接続したNICをブリッジします。クライアント上のTAPインターフェイスのIPアドレスとネットマスクは手動で設定します。クライアント側LAN内のPCのIPアドレスとネットマスクは、ブリッジされたサブネットの範囲内にある必要があります。ここで説明されているように、DHCPサーバーを使用する方法もあります。クライアントに対するDHCPオプションの設定OpenVPNサーバーはクライアントに対し、DNSやWINSサーバーのアドレスなどのDHCPオプションをプッシュすることができます(詳細についてはFAQを参照してください)。foreign_option_n環境変数リストをパースするupスクリプトを使用する必要があります。archiveを参照してください。接続してくるクライアントに対して内部DNSサーバーを10.66.0.4と10.66.0.5、WINSサーバーを10.66.0.8として設定したい場合には、OpenVPNサーバー設定で次のように設定します。10.66.0.8"Windowsでこの動作を確認するには、OpenVPNサーバーに接続している状態でコマンドプロンプトから下記のコマンドを実行します。/allTAP-Win32アダプタの欄に、サーバーからプッシュされたDHCPオプションが表示されているはずです。企業で使用するVPNをセットアップするとして、以下の3つのグループごとにアクセスポリシーを設定する場合を想定します。クライアントの仮想IPアドレスを利用してアクセスを制御するファイアーウォールを設定する、ということになります。今回の例では、正社員の人数は可変であるものの、システム管理者は1名のみ、契約社員は2名のみ、という構成を想定してみましょう。IPアドレスの割り当て方針としては、正社員に対してはIPアドレス範囲からアドレスを割り当て、システム管理者と契約社員には固定IPアドレスを割り当てるものとします。前提条件として、アクセス制御を可能にするため、OpenVPNサーバー上でソフトウェアファイアーウォールが動作している必要があります。今回は一例としてLinuxのiptableでの例を説明しましょう。グループごとの仮想IPアドレスのマッピングを決めます。10.8.0.0/2410.66.4.4のsamba/メールサーバー[いろいろ]システム管理者10.8.1.0/2410.66.4.0/24サブネット全体sysadmin1契約社員10.8.2.0/2410.66.4.12の契約社員用サーバーcontractor1,contractor2次に、このマッピングをOpenVPNサーバー設定に書き換えます。その際、前述の手順に従い、すべてのクライアントが利用可能な10.66.4.0/24サブネットが構成してあることを確認してください(10.66.4.0/24サブネットにアクセスできるようにルーティングの設定を行った後、上記のポリシーに従ってアクセス制御を行うようファイアウォールを設定します)。ファイアーウォールルールでインターフェイスを識別できるようにするために、tunインターフェイスのユニット番号を決めます。tun0サーバー構成ファイルで、正社員用IPアドレス範囲を定義します。255.255.255.0システム管理者用および契約社員用のIPアドレス範囲に対するルーティングを追加します。255.255.255.0システム管理者と契約社員には固定IPアドレスを割り振る必要があるため、クライアント設定ファイルディレクトリを使用します。ccdこれで、ccdサブディレクトリに正社員以外のVPNクライアント用に固定IPアドレスを設定するための設定ファイルを格納することになります。10.8.2.6ifconfig-pushで設定されている2つのアドレスは、仮想的なクライアントとサーバーのエンドポイントを示しています。WindowsクライアントおよびTAP-Win32ドライバとの互換性のため、これらのアドレスは連続する/30サブネットから選択する必要があります。具体的には、ここで指定するIPアドレスの最後のオクテットの組み合わせは、下記のセットのいずれかでなければなりません。[253,254]これでOpenVPNの構成は完了です。あとはアクセスポリシーに基づいてファイアーウォールルールを設定します。一例としてLinuxのiptablesの場合は、次のように設定します。2.0には、接続しているクライアントからOpenVPNサーバーがユーザー名やパスワードを安全に取得し、これらの情報をクライアントを認証するための基盤として利用するための機能が備わっています。この認証方式を利用するには、クライアント設定ファイルにauth-user-passディレクティブを追加します。この設定を追加するとOpenVPNクライアントはユーザーにユーザー名とパスワードを問い合わせ、それらの情報をセキュアなTLSチャンネルを経由してサーバーに渡します。次に、スクリプトや共有オブジェクト、DLLなどの認証プラグインを使用するようにサーバーを設定します。OpenVPNサーバーはVPNクライアントが接続しようとしてくるたびにプラグインを呼び出し、クライアントで入力されたユーザー名とパスワードをプラグインに渡します。OpenVPNサーバーへの接続を許可するかどうかを戻り値(1:接続拒否、0:接続許可)によって制御します。スクリプトプラグインの使用スクリプトプラグインを使用するには、サーバー設定ファイルにauth-user-pass-verifyディレクティブを追加します。次のように設定します。via-fileこの設定では、接続してきたクライアントのユーザー名とパスワードをauth-pam.plスクリプトで認証することになります。pageを参照してください。auth-pam.plはOpenVPNのソースファイル一式の中にあるsample-scriptsディレクトリに含まれています。このスクリプトではPAM認証モジュール(シャドウパスワード、RADIUS、LDAPによる認証が実装されています)を使用してLinuxサーバー上のユーザーを認証します。auth-pam.plは主にデモンストレーション用に作成されています。PAM認証を実際に使用したい場合には、次に説明するopenvpn-auth-pam共有オブジェクトプラグインを使用してください。共有オブジェクトやDLLのプラグインはCモジュールとしてコンパイルされ、OpenVPNサーバーの起動時に読み込まれます。RPMベースのLinux用のOpenVPNパッケージを使用している場合には、openvpn-auth-pamプラグインがビルドされています。このプラグインを使用するには、サーバー設定ファイルに下記の記述を追加します。PAMモジュールを使って検証します。PAM認証を実際に使用する場合には、openvpn-auth-pamプラグインを使用するほうが望ましいと言えます。このプラグインはauth-pam.plに比べていくつかの利点があります。共有オブジェクトであるopenvpn-auth-pamプラグインは分割された権限実行モデルを利用しており、より安全です。nobody、chrootといったディレクティブを使ってOpenVPNサーバーを実行する際の権限を制限しつつ、rootしか読み込めないシャドウパスワードファイルを使っての認証が実現できます。ユーザー名やパスワードをファイルや環境変数ではなく、仮想メモリ経由でプラグインに渡すことができます。これはサーバー上のセキュリティを向上させます。Cでコンパイルされたプラグインはスクリプトより早く動作します。OpenVPNで使用できるプラグインを開発する方法については、OpenVPNのソース内にあるpluginディレクトリのREADMEファイルを参照してください。Linux上でopenvpn-auth-pamプラグインをビルドするには、OpenVPNのソース内にあるplugin/auth-pamディレクトリに入り、makeを実行します。デフォルトでは、auth-user-pass-verify、またはユーザー名とパスワードによる認証を行うプラグインを使用すると、二重の認証が行われることになります。したがって、クライアントが認証をパスするには、クライアント証明書による認証と、ユーザー名とパスワードによる認証の両方が必要です。セキュリティ上はお勧めできませんが、クライアント証明書による認証を行わないようにし、ユーザー名とパスワードによってのみ認証を行うように設定することもできます。その場合にはサーバー設定で下記の記述を追加します。client-cert-not-requiredこの設定を行う場合には下記の設定も行います。username-as-common-nameこれにより、サーバーはユーザー名をインデックス用に使用します。クライアント証明書での認証の場合は共通名が使用されます。client-cert-not-requiredはサーバー証明書を不要にするものではありません。keyディレクティブを削除できますが、caディレクティブは削除できません。これはクライアントがサーバー証明書を検証する際に必要だからです。authentication)について2ファクタ認証とは、「持っている物」と「知っていること」という2つの要素を組み合わせた認証方式のことです。「持っている物」としてよく使用されるのは複製不可能なデバイス、たとえば秘密鍵を格納した暗号化トークンです。このような暗号化トークンでは、秘密鍵はデバイスの中で生成され、外に出ることはありません。暗号化トークンを所有しているユーザーがリモートネットワーク上にある保護されたサービスにアクセスしようとしたとき、そのユーザーが物理的に認証済みトークンを持っていれば認証プロセスは高い信頼性でユーザーを証明することができます。「知っていること」としてよく使用されるのが暗号化デバイスのパスワードです。正しいパスワードが入力されなければ、秘密鍵にアクセスできません。暗号化デバイスの別の機能として、何度も間違ったパスワードが入力されたときに秘密鍵を使用できなくする、ということがあります。この機能により、もしユーザーがデバイスを紛失したとしても、他の人がそのデバイスを使用できなくすることができます。暗号化デバイスは一般的にスマートカードやトークンと呼ばれ、PKI(公開鍵基盤)と組み合わせて使用されます。VPNサーバーはX.509証明書をチェックし、ユーザーが正しい秘密鍵を持っているかどうか検証することができます。デバイスの複製が不可能であり、さらに正しいパスワードも必要とすることで、サーバーはユーザー認証を高度なレベルで実現できることになります。2ファクタ認証はパスワードベースの認証よりはるかに強力です。仮に最悪のケースを想定したとしても、暗号化トークンが使用できるのは一度に一人だけです。パスワードは他のユーザーによって推測されたり暴露されたりすることがあり得るため、パスワードのみの認証方式では、最悪の場合、非常に多くの人々が不正なアクセスを行う可能性があります。秘密鍵をファイルとして保管する場合、通常、この鍵はパスワードによって暗号化されます。この方法の問題は、クライアント上でスパイウェアなどを利用したり、パスワードのアタックをかけることにより、暗号化された鍵が復号化されてしまう可能性があることです。暗号化デバイスを使用するときとは異なり、復号化に何回も失敗したときに鍵を自動的に消去する機能もありません。PKCS#11とは?この標準は、暗号化情報を保持したり暗号化機能を実行したりするデバイスのAPI(Cryptoki)を定義しています。interface」を短縮したもので、crypto-keyと発音しますが、シンプルなオブジェクトベースのアプローチに従い、特定の技術やデバイスに依存せず、リソースを共有化(複数のアプリケーションが複数のデバイスにアクセス可能)するという目標のもと、暗号化トークンのようなデバイスにアプリケーションがアクセスするための共通の論理ビューを提供します。(訳注:リンク切れ)要約すると、PKCS#11はアプリケーションがスマートカードや他の暗号化トークンにアクセスするために使用される標準仕様です。デバイス開発元の多くはPKCS#11プロバイダインターフェイスを実装したライブラリを提供しており、このライブラリを使用してアプリケーションはデバイスにアクセスすることができます。PKCS#11はクロスプラットフォームであり、特定のベンダーに依存していません。PKCS#11プロバイダライブラリを見つける最初にしなければならないことは、デバイスドライバと共にインストールされているはずのプロバイダライブラリを探し出すことです。各ベンダーはそれぞれ独自のライブラリを提供しています。pkcs11.dllです。以下の登録手順に従ってください。PKCS#11トークンを初期化する。PKCS#11トークン上でRSA鍵ペアを生成する。生成された鍵ペアに基づいて証明書要求を作成する。証明書要求の作成にはOpenSCとOpenSSLを使用できます。証明書要求を認証機関に送り、作成された証明書を受け取る。証明書をトークンに読み込む。この際、証明書のIDやラベル属性は秘密鍵のIDやラベル属性とマッチする必要がある。これらの設定が終わったトークンは、同じIDとラベル属性を持った秘密鍵と証明書を格納しているトークンとなります。2.0が用意されています。READMEファイルに書かれている手順に従い、その後pkitoolを使って登録してください。トークンの初期化は以下のコマンドで行います。&lt;label&gt;証明書の登録は以下のコマンドで行います。2.1以降のバージョンである必要があります。最新のβ版をhttp://openvpn.net/download.htmlから入手できます。正しいスロットを識別する各PKCS#11プロバイダは複数のデバイスをサポートしており、スロットごとに1つのデバイスがあります。スロットの一覧を表示するには下記のコマンドを実行します。00このコマンドの出力から、特定のスロットを指定することができます。00”のように使用します。トークン名でスロットを選択することもできます。“Token1”オプションを使用します。正しいオブジェクトを識別する各PKCS#11トークンには複数のオブジェクトが含まれています。各オブジェクトにはidとlabelという特殊な2つの属性があります。トークンに何が含まれているのかを確認するには、次のコマンドを実行します。TRUEこのオブジェクトへの参照は次のようになります。"AUTH000-20050705B436961C5E5F6D2B"この設定では、”Token1′′が入っているスロットを選択し、ラベル”AUTH000-20050705B436961C5E5F6D2B”に基づいた証明書と秘密鍵を選択します。8888management-query-passwordsこの設定ではOpenVPNに2つのプロバイダを読み込み、”Token1′′が入っているスロットを検索し、ラベル”AUTH000-20050705B436961C5E5F6D2B”に基づいた証明書と秘密鍵を選択して、パスワードを問い合わせるために管理インターフェイスを使用します。トークンにアクセスできなかったときには、デーモンは保留状態に戻ります。(NPTL)にアップグレードすることをお勧めします。PKCS#11プロバイダはUnixであれば/usr/lib/pkcs11/opensc-pkcs11.so、Windowsであればopensc-pkcs11.dllです。PKCS#11プロバイダは秘密鍵の属性を正しくレポートしないという問題があります。signオプションを指定してください。API(CryptoAPI)の違いPKCS#11はフリーで、ベンダーに依存せず、クロスプラットフォームな標準です。CryptoAPIはマイクロソフト特定のAPIです。多くのスマートカードベンダーは両方のインターフェイスをサポートしています。Windows環境ではユーザーはどちらのインターフェイスを使用するか選択しなければなりません。CryptoAPI(cryptoapicertオプション)を使用したOpenVPNの現在の実装は、サービスとして実行させなければ問題なく動作します。管理された環境下でサービスとしてOpenVPNを実行させたい場合は、下記のような理由により多くのスマートカードが正しく動作しない可能性があります。大半のスマートカードプロバイダは証明書をローカルPC上にロードしません。そのため、この実装はユーザーの証明書にアクセスできません。OpenVPNをエンドユーザーに対話させずにサービスとして動作させた場合、サービスはユーザーに対してスマートカードのパスワードを問い合わせることができません。そのため、スマートカードのパスワード検証プロセスに失敗します。PKCS#11インターフェイスを使用すると、PKCS#11はMicrosoftストアにアクセスする必要がなく、エンドユーザーに問い合わせを行う必要もないので、任意の実装においてOpenVPNをスマートカードと組み合わせて使用できます。クライアントのすべてのトラフィック(Webトラフィックを含む)をVPN経由にルーティングする概要OpenVPNが有効になっているとき、デフォルトではOpenVPNサーバーのネットワークとのやり取りのみVPN上での通信が行われます。通常のWebブラウジングなどは直接接続され、VPNを経由することはありません。特定のケースにおいては、Webブラウジングなどを含むすべての通信をVPN経由で行いたいということがあります。この設定はクライアント上のパフォーマンスの低下は避けられませんが、VPN管理者にとってはクライアントが通常のインターネットとVPNに同時に接続する場合でもセキュリティポリシーの適用が行いやすくなります。設定サーバー設定ファイルに下記の設定を追加します。def1"VPNが無線LANに接続されており、すべてのOpenVPNクライアントとOpenVPNサーバーも同じ無線LANのサブネット上にある場合は、localフラグを追加します。def1"redirect-gatewayをクライアントにプッシュすると、クライアントPCからのすべてのIPネットワークトラフィックがOpenVPNサーバーを経由するようになります。これにより、サーバーではトラフィックをどのように扱うか、たとえばインターネットにNATで接続させたり、サーバーのネットワーク上にあるHTTPプロキシに渡したりするなどの設定を行う必要があります。Linuxの場合は、次のようなコマンドでVPNクライアントのトラフィックをインターネットにNATで接続させることができます。MASQUERADEこのコマンド例では、VPNサブネットが10.8.0.0/24(OpenVPNサーバー設定のserverディレクティブによる)で、ローカルEthernetインターフェイスがeth0であることを想定しています。redirect-gatewayディレクティブを使用すると、OpenVPNクライアントはDNS問い合わせもVPN経由で行うようになるため、VPNサーバーがDNS問い合わせも処理できるようにする必要があります。これは、VPNが接続しているときに使用できるDNSサーバーのアドレス情報をクライアントにプッシュすることによって行えます。10.8.0.1"これにより、Windowsクライアントの場合はDNSサーバーとして10.8.0.1を使用するようになります(Windows以外のクライアントの場合はサーバー側のスクリプトが必要です)。DNSサーバーのアドレスにはクライアントから接続できるアドレスを使用してください。注意事項すべてのネットワークトラフィックをVPN経由にすることは、問題になることもあり得ます。以下のような点に注意する必要があります。インターネットに接続しているOpenVPNクライアントPCはたいてい、DHCPサーバーと定期的に通信を行ってIPアドレスのリースを更新します。redirect-gatewayオプションはクライアントがローカルDHCPサーバーに接続できないようにしてしまう(DHCPメッセージがVPN上を通ってしまうため)ので、IPアドレスのリースを失うことになります。WindowsクライアントにDNSアドレスをプッシュするときに問題が発生する可能性があります。クライアントでのWebブラウジングは相当遅くなります。redirect-gatewayディレクティブの仕組みについては、こちらを参照してください。動的IPアドレスでのOpenVPNサーバーの運用OpenVPNクライアントは動的IPアドレスでも特別な設定なしでサーバーに接続できます。サーバー自身が動的アドレスであっても問題ありません。OpenVPNはいくつかの追加設定を行えば、動的IPアドレスでのサーバーでも問題なく動作します。最初に必要なステップは、サーバーのIPアドレスが変わるたびにIPアドレスを更新できる、ダイナミックDNSのアドレスを取得することです。dyndns.orgなど、いくつかのダイナミックDNSサービスが提供されています。次に、サーバーのIPアドレスが変わるたびにDNSを更新するようセットアップすることです。これによって、クライアントはサーバーのIPアドレスが変わっても接続先を特定できます。これには2つの方法があります。クライアント設定ファイルでremoteディレクティブを使ってダイナミックDNS名を設定すると、デフォルトでOpenVPNクライアントはサーバーのIPアドレスの変更を検知します。再起動時にremoteディレクティブで指定されたアドレスが再度解決され、新しいIPアドレスに接続できるようになります。動的IPアドレスについてはFAQも参照してください。HTTPプロキシ経由でのOpenVPNサーバーへの接続OpenVPNはHTTPプロキシ経由での接続をサポートしており、次の認証モードが使用可能です。プロキシ認証なし基本プロキシ認証NTLMプロキシ認証HTTPプロキシを利用するには、トンネルキャリアプロトコルとしてTCPを使用していなければなりません。サーバーとクライアントの設定ファイルで次のように記述されている必要があります。udpの記述は削除してください。pageを参照してください)。クライアントLAN上にHTTPプロキシサーバーが存在しており、そのプロキシのアドレスが192.168.4.1で、ポート1080でリッスンしているとします。このプロキシを利用するには、クライアント設定で下記の記述を追加します。1080HTTPプロキシで基本認証が必要な場合は次のようにします。basicHTTPプロキシでNTLM認証が必要な場合は次のようにします。ntlmこの2つの認証方法の例では、OpenVPNはユーザー名とパスワードを標準入力から読み込みます。ファイルから読み込ませたい場合にはstdinをファイル名に置き換え、そのファイルの1行目にユーザー名を、2行目にパスワードを記述してください。tunトンネルを経由してOpenVPNクライアントがSamba共有に接続する方法を説明します。tap)はOpenVPNクライアントがサーバー側ネットワークにあるPCを参照できるため、下記の手順は必要ありません。今回の例では、以下のような状況を想定します。サーバー側LANはサブネット10.66.0.0/24を使用します。VPNのIPアドレス範囲は10.8.0.0/24を使用します(OpenVPNサーバー設定ファイルのserverディレクティブで設定します)。SambaサーバーのIPアドレスは10.66.0.4を使用します。Sambaサーバーは既にローカルLANからアクセスできるよう設定されています。SambaとOpenVPNサーバーが別のPCで動作している場合は、「クライアント側、またはサーバー側サブネットへのクライアントPCの追加によるVPNの拡張」で説明された手順を確認してください。次に、Samba設定ファイル(smb.conf)を編集します。allowディレクティブにおいて、10.8.0.0/24サブネットから接続してくるOpenVPNクライアントが接続できるよう許可してください。次のように設定します。127.0.0.1SambaとOpenVPNサーバーが同一PC上で動作している場合は、smb.confファイルのinterfacesディレクティブを編集し、10.8.0.0/24のサブネットのTUNインターフェイスもリッスンするようにします。10.8.0.0/24SambaとOpenVPNサーバーが同一PC上で動作している場合は、OpenVPNクライアントからSamba共有にフォルダ名を使って接続します。\\10.8.0.1\\sharenameSambaとOpenVPNサーバーが別々のPCで動作している場合は、次のように接続します。\\10.66.0.4\sharenameたとえば、コマンドプロンプトで次のように入力します。/USER:myusernameロードバランス/フェールオーバー構成クライアントOpenVPNクライアントは複数のサーバーを参照するように設定することができます。これにより、ロードバランシングやフェールオーバーが実現できます。server3.mydomainこのように設定すると、OpenVPNはServer1、Server2、Server3の順番に接続しようとしますが、既存の接続が切断された場合、OpenVPNクライアントは直前まで接続していたサーバーに再接続しようとします。接続できなかった場合、リストの次のサーバーに接続しようとします。リスト上にあるサーバーに対してランダムに接続するよう設定することもできます。これによって結果的に各サーバーの負荷が分散しやすくなります。remote-randomさらに、OpenVPNクライアントがDNS参照に失敗したときに次のサーバーに接続させるようにするには、以下のようにします。60この「60」という値は、リストの次のサーバーに移る前にOpenVPNクライアントがremoteで定義されている各サーバーのDNS参照を60秒間試行するよう設定するものです。このサーバーリストは、1台のサーバー上で稼動している複数のOpenVPNサーバーデーモンを参照するように設定することもできます。これらのデーモンはそれぞれ別個のポートを使用しています。8001サーバーがマルチプロセッサのPCを使用している場合、複数のOpenVPNデーモンを実行する際のパフォーマンスの向上が期待できます。OpenVPNはremoteディレクティブにおいて、複数のAレコードが設定されたDNS名を参照するように設定することもできます。この場合、OpenVPNクライアントはDNS参照時に”A”レコードのいずれか1つをランダムに選択して接続することになります。サーバーロードバランシング/フェールオーバーを実現する最も簡単な方法は、クラスタ内の各サーバーで同一の設定ファイル(仮想IPアドレス範囲だけはそれぞれ別個に設定します)を使用することです。255.255.255.0OpenVPNのセキュリティを強化するネットワークセキュリティの鉄則の1つは、「ひとつのセキュリティコンポーネントに決して大きな信頼を置かない」ということです。1つに大きく依存してしまうと、セキュリティに壊滅的な損害を与える可能性があるためです。OpenVPNではこのような問題に対応するため、セキュリティレイヤーを追加するためのいくつかの方法を提供しています。tls-authtls-authディレクティブを指定すると、整合性の検証を行うためのすべてのSSL/TLSハンドシェイクパケットにHMAC署名が追加されます。正しいHMAC署名を有していないUDPパケットは、その後の処理は行われずに破棄されます。HMAC署名はSSL/TLSによって提供されるセキュリティに加えてさらに高度なセキュリティを提供し、次のような攻撃や問題に対処できます。認証されていないマシンからのSSL/TLSハンドシェイクの開始(いずれにしても最終的には認証に失敗することになりますが、tls-authを使えばさらに前のポイントで切り捨てることができます)tls-authを使用する場合は、標準のRSA証明書と鍵に加えて、共有静的鍵を生成しておく必要があります。ta.keyこのコマンドを実行するとOpenVPNの静的鍵が生成され、ファイルta.keyに書き込まれます。この鍵ファイルをサーバーとすべてのクライアントにコピーしておく必要があります(安全な方法でコピーするように注意してください)。このファイルはRSAの.keyと.crtファイルのあるディレクトリに入れておきます。サーバー設定ファイルに以下の行を追加します。0クライアント設定ファイルに以下の行を追加します。udpOpenVPNでは、VPNキャリアプロトコルとしてTCPかUDPのいずれかのプロトコルを使用することができますが、UDPプロトコルのほうがDoSアタックやポートスキャニングに対して強力です。udp非特権モード(Linuxのみ)Linux上では、OpenVPNを非特権モード内で動作させることができます。設定はやや複雑になりますが、最良のセキュリティが提供されます。指定し、OpenVPNでiprouteインターフェイスを使用するように設定する必要があります。システム上でsudoパッケージが利用可能になっている必要もあります。この構成では、Linuxの機能を使用してtunデバイスのパーミッションを変更し、非特権ユーザーがアクセスできるようにします。インターフェイス設定とルーティングテーブルを変更するため、sudoを使ってiprouteを実行します。以下のように設定します。以下のスクリプトを/usr/local/sbin/unpriv-ipとして保存します。$*visudoを使用して、ユーザー’user1’が/sbin/ipを実行できるように以下の行を追記します。/sbin/ip以下のコマンドでユーザーのグループに割り当てることも可能です。/sbin/ipOpenVPNの設定ファイルに以下の記述を追記します。/usr/local/sbin/unpriv-ipXに適切な値を設定し、tunかtapのいずれかを指定してください。インターフェイスを追加し、指定したユーザー/グループが管理できるようにするため、以下のコマンドでtunX(Xに適切な値を設定してください)インターフェイスを作成します。usersOpenVPNを非特権ユーザーのコンテキストで実行します。/usr/local/sbin/unpriv-ipスクリプトのパラメータ設定により、さらにセキュリティを高めることができます。(Windows以外の場合)OpenVPNはインストール後、ルート権限をドロップさせてもきちんと動作するように設計されており、Linux/BSD/Solarisではこの機能を利用することをお勧めします。OpenVPNサーバーデーモンをルート権限なしで動作させると、外部からの攻撃に対して強化されます。jailにロックさせることができます。これにより、OpenVPNデーモンはパラメータで指定された特定のディレクトリ以外のディレクトリにアクセスできなくなります。次のように設定したとします。jailこの設定により、OpenVPNデーモンは初期化時にjailディレクトリに移動し、このディレクトリをルートディレクトリとして扱います。これにより、OpenVPNデーモンはjailディレクトリとそのサブディレクトリ以外のファイルにアクセスできなくなります。これにより、たとえ攻撃を受けたとしてもサーバーのファイルシステムを保護することができます。chrootを利用する場合には、OpenVPNが初期化後に使用するすべてのファイルをjailディレクトリに配置しておく必要があります。下記のようなファイルです。client-config-dirディレクトリRSA鍵のサイズを大きくするRSA鍵サイズはeasy-rsa/varsファイルのKEY_SIZE変数で制御されており、すべての鍵を生成する前に設定しておく必要があります。デフォルトでは1024に設定されていますが、この値は2048まで増加させることができます。値を大きくしてもVPNトンネルのパフォーマンスそのものに悪影響はありませんが、各クライアントが1時間おきに実行するSSL/TLSの再ネゴシエーションにかかる時間が若干増えます。Hellmanパラメータの生成に時間がかかるようになります。対称鍵を大きくするデフォルトではOpenVPNは128ビットの鍵を使用したBlowfishを使用します。OpenVPNはOpenSSLライブラリがサポートする任意の暗号化方式を自動的にサポートしており、鍵サイズを大きくすることも可能です。使用するには、サーバーとクライアントの設定ファイルで下記の記述を追加します。使用するメリットの1つは、ルートCA鍵(ca.key)をOpenVPNサーバー上に置いておく必要がないことです。高いセキュリティが必要な環境では、鍵の署名のための専用PCを用意しておき、そのPCを物理的に安全な場所に設置し、ネットワークから切り離しておきます。鍵ファイルの移動にはフロッピーディスクなどが使用できるでしょう。これにより攻撃者がルート鍵を盗むことは(物理的にそのPCにアクセスできなければ)非常に困難になります。「証明書の失効」とは、以前署名した証明書を無効にし、認証できなくすることです。下記のような場合に、証明書を失効させることがあります。例この例では、このHOWTOの中で生成したclient2証明書を失効させます。シェルかコマンドプロンプトを開き、キーの生成時に使用したeasy-rsaディレクトリに入ります。その後、Linux/BSD/Unixの場合は次のようにします。client2Windowsの場合は次のようにします。client2すると、次のようなメッセージが表示されます。23′′が気になるかもしれませんが、このメッセージは問題ありません。これは、失効させた証明書の検証に失敗したということを示しているからです。revoke-fullスクリプトはkeysサブディレクトリ内にcrl.pemというCRL(証明書失効リスト)ファイルを生成します。このファイルをOpenVPNサーバーがアクセスできる場所にコピーし、サーバー設定ファイルで下記の記述を加えることによりCRLによる検証を有効化します。crl.pemこれにより、すべての接続クライアントはCRLによって検証され、CRLにマッチした接続はドロップされることになります。CRLに関する注意事項OpenVPNでcrl-verifyオプションを使用すると、新規クライアントの接続時、また既存のSSL/TLS接続の再ネゴシエーション時(デフォルトでは1時間おき)にCRLファイルを再度読み込みます。このため、OpenVPNサーバーデーモンの実行中であってもCRLファイルの書き換えが可能で、書き換えた結果は新しいクライアントの接続から即時に反映されます。失効させた証明書が既に接続済みのクライアントのものの場合は、サーバーにシグナル(SIGUSR1かSIGHUP)を送って再起動させる(すべてのクライアント接続が切断されます)か、管理インターフェイスを使ってTELNETで接続し、失効したクライアントのインスタンスを切断します。crl-verifyディレクティブはサーバーとクライアントのどちらででも使用できますが、通常の場合、サーバー証明書が失効されたのではない限りCRLファイルをクライアントに配布する必要はありません。CRLファイルは秘密にはなりません。OpenVPNデーモンがルート権限をドロップされても読み取ることができるようにしておく必要があります。chrootディレクティブを使用している場合は、CRLファイルをchrootディレクトリにコピーしておいてください。OpenVPNが読み込む他のファイルとは異なり、CRLファイルはchroot呼び出しが実行された後に読み込まれます。証明書を失効させる理由の1つが、ユーザーが秘密鍵のパスワードを忘れてしまった場合です。元の証明書を失効させると、元の証明書と同じ共通名で新しい証明書と鍵のペアを生成することができます。クライアントが接続先のサーバー証明書を検証しない場合に発生する可能性のある「Man-in-the-Middle」攻撃について認証済みのクライアントがサーバーを偽装して他のクライアントに接続しようとする「Man-in-the-Middle」攻撃の可能性を回避するために、各クライアントにサーバー証明書を強制的に検証させることができます。これを実現するには下記の5つの方法があります(優先順)。usage)を指定してサーバー証明書を生成します。RFC3280では、TLS接続において下記の属性が提供されるべきとしています。keyAgreementサーバー証明書はbuild-key-serverスクリプトを使って生成できます(詳細についてはeasy-rsaを参照してください)。このスクリプトを使用して証明書を作成すると、適切な属性がセットされたサーバー専用証明書として作成されます。クライアントの設定ファイルに下記の設定を加えます。build-key-serverスクリプトを使ってサーバー証明書を生成します(詳細についてはeasy-rsaを参照してください)。このスクリプトを使用して証明書を作成すると、nsCertType=serverとして設定されたサーバー専用証明書として作成されます。クライアントの設定ファイルに下記の設定を加えます。serverこれにより、OpenVPN設定ファイルで設定されたcaファイルで署名されていたとしても、nsCertType=serverとして生成されていない証明書を持つサーバーへの接続が拒否されます。クライアントでtls-remoteディレクティブを使用することにより、サーバー証明書の共通名に基づいてサーバー接続を許可/拒否を制御できます。tls-verifyスクリプトかプラグインを使用して、サーバー証明書に埋め込まれたX509サブジェクトを独自の方法で検査した結果によって、サーバー接続を許可/拒否を制御できます。サーバー証明書とクライアント証明書を別々のCAを使って署名します。クライアント設定のcaディレクティブにはサーバー証明書を署名したCAファイル、サーバー設定のcaディレクティブにはクライアント証明書を署名したCAファイルを設定します。