OpenVPN クライアント設定

OpenVPN環境構築

先日の記事に引き続きOpenVPN環境構築手順。クライアント編です。

はじめに

今回は前回記事 に続き OpenVPN クライアントのインストール/設定方法について書きます。
サーバ環境や参考サイト等は前回記事同様です。

写真 : 写真素材ぱくたそ
画像のフォント : 隼文字(Falcon Font)©霧風 隼

環境

クライアントの環境は以下になります。

OS Windows 8.1
openvpn 2.3.9

必要なもの

OpenVPNのクライアントを導入する場合、以下のものが必要になります。

  • CA証明書
  • 共有静的鍵
    tls-auth を利用する場合
  • クライアント証明書
  • クライアント秘密鍵
  • OpenVPNクライアントソフトウェア

このうちCA証明書、及び、共有静的鍵は OpenVPN サーバ構築時に作成済みです。

クライアントと証明書、及び、クライアント秘密鍵に関しては、利用者毎に作成を行い配布します。
以下ではこれらファイルの作成、及び、クライアントソフトのインストール/設定を行います。

OpenVPNクライアント導入手順

クライアント証明書/秘密鍵作成

クライアント証明書/秘密鍵の作成はOpenVPNサーバ上にて行います。
サーバ環境に関しては 前回記事 でインストールした環境を前提に話をすすめます。

※easy-rsa は バージョン 2 系です。

  1. easy-rsa ディレクトリに移動します。
    # cd /etc/openvpn/easy-rsa
    
  2. 環境変数をシステムに反映します。
    # source vars
    
  3. クライアント証明書・秘密鍵を作成します。

    ※以下手順では、パスフレーズを有効にするために build-key-pass を利用しています ( VPNクライアントから接続する際に、パスフレーズの入力を求められます )。
    パスフレーズの入力が不要の場合には build-key-pass の代わりに build-key スクリプトを利用して下さい。

    ※以下は クライアント名=client1 の証明書・秘密鍵を作成しています。クライアント名は実際の利用ユーザー名等に併せて適宜変更してください。

    # ./build-key-pass client1
    

    以下パスフレーズの入力を求められるので、パスフレーズを設定して下さい ( 二回 )。

    Enter PEM pass phrase:     # 任意のパスフレーズ応答
    Verifying - Enter PEM pass phrase: # 任意のパスフレーズ応答(確認)
    

    以下に関して y を応答。それ以外はリターンで応答します。

    Sign the certificate? [y/n]:y   # y応答
    1 out of 1 certificate requests certified, commit? [y/n]y # y応答
    

上記 手順を実行した場合、サーバの easy-rsa ディレクトリ下 keys ディレクトリに client1.crt, client1.csr, client1.key が生成されます。

必要ファイル群の転送

上で作成した、クライアント証明書/秘密鍵、及び、CA証明書、TLSの共有静的鍵 をクライアントに転送します。

前回記事、及び、今回の手順通り作成を行った場合、それぞれのファイル名は以下のようになります。

ファイルファイル名
CA証明書ca.crt
TLS共有静的鍵ta.key
クライアント証明書client1.crt
クライアント秘密鍵client1.key

※この際、これらファイルをクライアントに持ち込む手段としては、暗号化されていない通信等のセキュリティが確保されていない経路は利用しないようにしましょう。
通常のメールやFTP等暗号化されていない経路での受け渡しは辞めた方がよいでしょう。
適当な物理媒体(USBメモリ等)や十分にセキュアな経路(SCP等)で受け渡しを行いましょう。

※受け渡し後の管理(USBメモリからのファイル完全消去等)も忘れずに

OpenVPNクライアントインストール

OpenVPN のダウンロードページ からWindows用のインストーラーパッケージをダウンロードしてインストールします。
OpenVPNクライアント インストール
インストールウィザードに従ってインストールを完了させてください ( インストールするコンポーネントはデフォルトのままでOKです )。
途中TAPデバイスのインストールを行う際に警告ダイアログが表示されますが、続行してください。

OpenVPN クライアント設定

インストールが完了したら、OpenVPN クライアントの設定を行います。
OpenVPN クライアントには設定ファイルのサンプルが含まれているので、これを利用します。

クライアント設定ファイル (client.ovpn) を作成します。
OpenVPNのインストールディレクトリ ( C:\Program Files\OpenVPN ) 下sample-configディレクトリにある client.ovpn を編集して利用します。
以下内容を設定 / 編集してください ( 抜粋 )。

※いくつかの設定値は sample-config にある設定値のままです

client
dev tun    # tun デバイスを指定 (サーバ設定と同じ)
proto udp  # プロトコル (サーバ設定と同じ)
remote vpn-server-name 1194   # 接続先のアドレスとポート番号
resolv-retry infinite  # ホスト名解決失敗時のリトライ設定
nobind  # 特定のローカルポートをバインドしない(動的割当)
persist-key  # 再起動時の状態保持設定(key)
persist-tun  # 再起動時の状態保持(tun/tap)
# プロキシ経由で接続する場合、以下を設定
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
ca ca.crt  # 以下生成/転送したファイルを指定
cert client1.crt
key client1.key
ns-cert-type server # サーバ証明書のタイプ検証(Man in the middle 攻撃対策)
tls-auth ta.key 1  # サーバは0 クライアントは1で設定
comp-lzo  # 圧縮設定(サーバと同じ)
verb 3   # ログのレベル

よりセキュアな設定

前回記事 に書いた "よりセキュアな設定" を行っている場合、クライアントでも設定が必要なものがあります。

cipher, auth

cipher, auth に関してはサーバ側で設定している場合、同じ値をクライアントでも設定します。

cipher AES-256-CBC  # 暗号化指定。デフォルトはBF-CBC
auth SHA256 # デフォルトはSHA1

cipher, auth 以外にも、いくつかのオプションを設定する事でセキュリティを高められる可能性があります。

verify-x509-name

このオプションを指定した場合、接続時にX.509 のサブジェクトを確認し、サブジェクト名が一致しない場合接続を行いません。
想定外のサーバに接続してしまうというリスクを軽減する事ができます。

verify-x509-name 'C=JP, ST=Tokyo, L=Chiyoda-ku, O=hoge.com, CN=server, name=EasyRSA, emailAddress=xxxxx@hoge.com'

前回記事の方法で easy-rsa2 にてサーバ証明書を作成した場合、サブジェクト名は vars で指定した値に従って設定されています。
実際の subject を確認する場合、以下で確認可能です。

# openssl x509 -in server.crt -noout -subject

remote-cert-eku

このオプションを指定すると、接続先の証明書の "X509v3 Extended Key Usage" の値をチェックします。
通常、サーバ側証明書には "TLS Web Server Authentication", クライアント側証明書には "TLS Web Client Authentication" という値が設定されています ( easy-rsa を利用した場合もそうなる )。

クライアント側で以下設定を行う事で、MITM (Man-in-the-middle) 対策となります。

remote-cert-eku "TLS Web Server Authentication"

remote-cert-ku

このオプションを指定すると、接続先の証明書の "X509v3 Extended Key Usage" の値をチェックします。
値は HEX 値で指定します。クライアントでは以下の設定を行います。

remote-cert-ku a0 88

remote-cert-tls

"key usage" 及び "extended key usage" をチェックします。
クライアントでは以下を設定します。

remote-cert-tls server

上記設定は、以下と等価です。

なので、通常は remote-cert-ku, remote-cert-eku の代わりに remote-cert-tls を設定しておけばよい。

remote-cert-ku a0 88
remote-cert-eku "TLS Web Server Authentication"

上記オプションはMITM対策として有効ですが、tls-verify、 及び、sample-config 中にも記載のある ns-cert-type server オプション等でも行う事ができます。

参考 : Openvpn23ManPage – OpenVPN Community

二要素認証

OpenVPN ではスマートカード等を利用した二要素認証を行う事もできます。
ここでは触れませんが、( PKCS#11 互換の ) デバイスを利用した二要素認証に興味がある方は クライアント側でスマートカードを利用した2ファクタ認証を行うためのOpenVPNの設定方法 を参照ください。

※サーバ側も設定が必要です。

証明書、鍵、設定ファイルのコピー

先にサーバから導入した4つのファイル ( ca.crt、 ta.key、client1.crt、client1.key )、及び、クライアント設定ファイル ( client.ovpn ) を OpenVPN のconfig ディレクトリ ( C:\Program Files\OpenVPN\config ) にコピーします。

これらファイルは他者からアクセスされないよう、適切なアクセス権の設定を行ってください。
( 複数人で共有しているPCを利用している場合は特に )

OpenVPNクライアント実行

クライアント設定が完了したらOpenVPNクライアントを実行します。

  1. スタートメニューから "OpenVPN GUI" を実行します。
    ( スタートメニューに登録していない場合、OpenVPNインストールディレクトリ下 bin ディレクトリにある openvpn-gui.exe を実行 )
    実行すると、openvpn-guiのアイコンがWindowsタスクバー上に表示されます。
    OpenVPN GUI

    ※一部Windows、及び、OpenVPN GUI のバージョンによっては、管理者権限でopenvpn-gui.exeを実行する必要があります。

  2. OpenVPN サーバに接続する場合、OpenVPN GUIアイコンを右クリックし、表示されるコンテキストメニューから[接続]を実行します。 OpenVPN接続ウィンドウが表示され、パスフレーズの入力が求められるので、クライアント証明書作成時に入力したパスフレーズを入力して [OK] をクリックします。
    OpenVPN GUI
    パスフレーズが正しければ接続処理が行われます。

    ※build-key-pass スクリプトを利用してクライアント証明書/秘密鍵を作成した場合

  3. 接続が問題なく行われると、上記OpenVPN接続ウィンドウに以下のログが出力されます ( 接続時にウィンドウは自動的に閉じられるので、確認する場合はOpenVPN GUIアイコンをダブルクリックします )。
    VPN接続中はタスクバーのアイコンの色が緑に変更になります。
    OpenVPN GUI
    VPN接続が確認されたらLAN内のコンピュータへの接続が問題なく行われるかを確認してみてください。

まとめ

前回 に引き続き、OpenVPNのクライアント側設定に関して記載しました。
BCP対策に限らず、OpenVPNを利用する事でセキュアなリモートワーク環境を構築する事が可能です。

実際の運用を行う場合、単純に環境構築する以外に考えなければならない事が出てきたりしますが、BCP対策、リモートワーク環境構築を行いたいという場合、構築の検討をしてみてもよいのではないでしょうか。

スマートフォン等からの接続も可

この記事では Windows から接続する場合に関して書きましたが、スマートフォン等からも接続が可能です。

参考 : iPhoneやiPad (iOS) でOpenVPNを使ってみよう!

現在の環境にセキュリティ面で不安がある場合に

聞いたところによると社内の資料へのリモートアクセスを行うにあたって、Sambaサーバを立ててポート開けちゃってる会社なんかもあるとか、ないとか。

こういった環境はセキュリティ面でのリスクが高いので、OpenVPN でのトンネリングを考えてみてはいかがでしょうか。


記事化するにあたって暗号方式等を改めて見直し、私が利用している環境に関しても多少はセキュリティレベルが上がったと思われます。