Back to page

+ Links

 Print 

Backup source of Gentoo Linuxな生活​/OpenVPNで悩む (No. 5) :: Nest Of Hawk

Backup source of xpwiki:Gentoo Linuxな生活/OpenVPNで悩む(No. 5)

« Prev  Next »
*OpenVPNとは [#z114c7fe]
[[OpenVPN:http://www.openvpn.jp/]]は、インターネットやLAN上に仮想的なプライベートネットワーク(VPN)を構築するためのソフトウェアです。
VPNを構築することにより、インターネット上であってもデータを安全にやり取りしたり、社外から社内のサーバーにアクセスできるようにすることもできます。オープンソースで、SSL/TLSをベースにした認証機構及び通信路暗号化を用いることで、セキュアに通信路を構築することが可能です。ん~、便利。
ちなみに、OpenVPNでは、SSL/TLSトンネルをサーバ/クライアント間で接続して通信します。トンネルについての解説は、[[トンネル接続って何だべ?の記事>自宅鯖計画/トンネル接続って何だべ?]]を見てくださいね♪

*OpenVPNをインストールしてみよう [#rbce4c45]
**サーバ側 [#yc5d946a]
サーバ側には24時間稼働している、Linuxサーバ君にインストールします。
 # emerge -vuD openvpn
おしまい。
**クライアント側 [#v7b79b03]
クライアントにLinuxを使用する場合は、サーバと一緒。今回は、Windowsを使用するので、[[OpenVPN GUI for Windows 日本語版:http://www.openvpn.jp/bridging/5.html]]を使用します。インストール手順は[[こちら:http://www.openvpn.jp/guiuse.html]]でね。
*暗号鍵を作成 [#y9606253]
OpenVPNインストール時、大体/usr/share/openvpn等のどこかに、easy-rsaというフォルダがあります。この中に、暗号鍵作成ツールが入っております。そのフォルダ内で、ツールを実行!
**CA局を作成 [#naf18717]
 # source ./vars
 # clean-all
 # build-ca
 Generating a 1024 bit RSA private key
 ............++++++
 ...........++++++
 writing new private key to 'ca.key'
 -----
 You are about to be asked to enter information that will be incorporated
 into your certificate request.
 What you are about to enter is what is called a Distinguished Name or a DN.
 There are quite a few fields but you can leave some blank
 For some fields there will be a default value,
 If you enter '.', the field will be left blank.
 -----
 Country Name (2 letter code) [KG]:
 State or Province Name (full name) [NA]:
 Locality Name (eg, city) [BISHKEK]:
 Organization Name (eg, company) [OpenVPN-TEST]:
 Organizational Unit Name (eg, section) []:
 Common Name (eg, your name or your server's hostname) []:OpenVPN-CA
 Email Address [me@myhost.mydomain]:
なんでも、好きなもの、識別できるものを入れておくとよいでしょう~
**サーバ暗号鍵の作成 [#t6a2d753]
続いて、サーバ暗号鍵を作成します。
 # build-key-server server
CA局と同じように聞かれていきますが、識別可能な奴を入れていってくださいね。んで、「Sign the certificate?(証明書に署名しますか?) [y/n]」と「1 out of 1 certificate requests certified, commit?(1つの証明書要求がありますが、コミットしますか?) [y/n]」という2つの質問が出ますが、両方にYesと答えてやって。
**クライアント暗号鍵の作成 [#vd6c624e]
クライアント鍵の作成は、
 # build-key クライアント名
暗号鍵をパスワード保護したい場合は、
 # build-key-pass クライアント名
同じようにいろいろ聞かれますが、同じように識別可能な奴を入れていってやって…で、これは接続したいクライアント数分、クライアント名を変更してコマンドを実施します。
**Diffie hellmanパラメータ作成 [#g9b2984e]
 # build-dh
少々お待ちくださいね…
**TLSのHMAC認証用共有鍵作成 [#h77443fa]
別に作成しなくてもよいのですが、後で述べる暗号強度を強める設定を行う場合は、共有鍵を作成します。
 openvpn --genkey --secret ta.key

**鍵をコピー [#q123c922]
そうすると、keysサブディレクトリ配下に、以下があるはず。
 ca.crt
 ca.key
 dh1024.pem
 クライアント名.crt
 クライアント名.csr
 クライアント名.key
 server.crt
 server.csr
 server.key
 ta.key
で、これらのうち、ca.crt(CA証明書),クライアント名.crt,クライアント名.csr(クライアント証明書),クライアント名.key(クライアント秘密鍵),ta.key(HMAC認証用共有鍵)をコピーして、Windows側に持ってってあげます。くれぐれも、漏えいしたりしないように気をつけつつ…
*OpenVPNを設定してみよう(共通設定) [#tffcb460]
OpenVPNは、TUN/TAPの2種類の設定モードがありますが、まずは共通で設定できるものからね。
**サーバ側 [#aa7ab458]
/usr/share/doc/openvpn-XXX/examples/sample-config-files/ディレクトリに、設定ファイルのサンプルがあります。こちらを利用しましょう。
サーバ側ですので、この下にあるserver.conf.bz2を、/etc/openvpn配下に、openvpn.confという名称で、解凍&コピーします。この中で、特に必要な項目を…
:port|openvpnで通信するポートを指定します(クライアント側と合わせる)
:proto|tcpか、udpかを指定します。(クライアント側と合わせる)
:ca|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、ca.crtを指定します。フルパスで書くのが安心。
:cert|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、server.crtを指定します。フルパスで書くのが安心。
:key|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、server.keyを設定します。フルパスで書くのが安心。
:dh|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、dh1024.pemを設定します。

:push|接続してきたクライアントに自動設定するパラメータを指定する。例えばルーティングテーブル。接続してできたデバイスに対して、通信先NWのルーティング(上の例なら172.21.0.0/16向けのルーティング)を設定するとか、クライアントに参照させたいDNSサーバのアドレスとか。

**クライアント側 [#l2cb0b98]
Windowsだと、c:\Program Files(64ビット版の場合は、c:\Program Files (x86))\OpenVPN\sample-configに、サンプル設定ファイルがあります。この中のclient.ovpnをコピーして、c:\Program Files(64ビット版の場合は、c:\Program Files (x86))\OpenVPN\configに置きます。そしてこのファイルを編集しますが…注意!Windows7や、Windows Vistaは、管理者モードでないと変更セーブされませんので…気をつけてね。私は、個人のフォルダにコピーして、変更してからconfigフォルダに管理者モードでコピーしました。
:proto|tcpか、udpかを指定します。(サーバ側と合わせる)
:remote|接続先のサーバ名と、ポート(サーバ側のport項で指定した値)を指定する。
:ca|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、ca.crtを指定します。フルパスで書くのが安心。Windowsは、ファイルパスに\を使用しますが、OpenVPNは、\の指定は\\ですので、注意。
:cert|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、クライアント名.crtを指定します。フルパスで書くのが安心。Windowsは、ファイルパスに\を使用しますが、OpenVPNは、\の指定は\\ですので、注意。
:key|[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、クライアント名.keyを設定します。フルパスで書くのが安心。
Windowsは、ファイルパスに\を使用しますが、OpenVPNは、\の指定は\\ですので、注意。
**ブロードバンドルータ側の設定 [#ef9f4faa]
普通は、ブロードバンドルータで、ポートを閉じていると思います。ブロードバンドルータ側で、openvpnを受け付けているプロトコル、ポートを、openvpnサーバ側に向けてあげる変換テーブルを設定してあげましょう。
**Linuxサーバの設定 [#j3c08a4b]
***Sysctl [#bc5bca59]
Sysctlの、ip_forwardをONにします。
 # echo "1" > /proc/sys/net/ipv4/ip_forward

*OpenVPNを設定してみよう(TUNモード) [#gcb1e883]
#ref(TUN.jpg,around,right)
TUNモードは、ルーティングモードです。VPNのネットワークは、通信する先のネットワークとは別のサブネットマスクになります。OpenVPNの設定は楽なんだけど、ルーティングの設定が難しいんだよね…
#clear
**サーバ側 [#ubdd8bbb]
先ほどのopenvpn.confの項目で、以下の項目を設定するですよ。
:dev|tunを指定します。
:server|サーバモードで設定する、openvpn空間でのネットワークアドレスを指定します。通信先ネットワーク内で使用しているIPとは、かぶらないIPアドレスにする。例えば、通信先のNW空間が、仮に172.21.0.0/16ならば、openvpn空間のNWは、172.22.0.0/16とかね。
**クライアント側 [#ebfbd9a9]
先ほどのclient.ovpnの、以下の項目を編集します。
:dev|tunを指定します。

**その他の設定 [#zecd28f8]
***iptables等 [#n39f0623]
iptablesを指定している場合は、openvpn用のNWアドレスを通過する設定をしないといけません
***各種サーバ [#r9e58f78]
openvpn用のNWアドレスからのリクエストを受け付けるようにしましょう
***ブロードバンドルータ等 [#deab2c18]
基本は、デフォルトゲートウェイにブロードバンドルータを指定している事でしょう。このデフォルトゲートウェイに、OpenVPNクライアントのアドレスはOpenVPNサーバにルーティングしてあげるルーティングテーブルを追加します。

*OpenVPNを設定してみよう(TAPモード) [#l984cd92]
#ref(TAP.jpg,around,right)
TAPモードは、アクセス先ネットワークとクライアントが同じアドレスとなります。TAPインタフェースの設定がめんどくさいんだけど、ルーティングなんかは設定しなくていいから楽なんだよね。ただ、アクセスコントロールをしたいときは難しいですわ。

#clear
**サーバ側 [#aa08ed07]
:dev|tap指定ね。
:server-bridge|TAPの場合はこちら。ブリッジIFのアドレス、ネットマスク、クライアントに付与するアドレスの範囲を指定。
**クライアント側 [#f5343d4c]
:dev|tap指定ね。
**OpenVPNのサーバ [#c272a946]
ブリッジ設定を追加してやります。
***bridge-utilsのインストール [#t84c78b8]
 emerge bridge-utils
***ブリッジインタフェースを作成する [#o6c2ed73]
/etc/conf.d/netをこんな感じで設定。
 config_br0=("br0に振るIPアドレス")
 routes_br0=(
        "default via ゲートウェイアドレス"
 )
 #eth0にはアドレス付与しない
 config_eth0=( "null" )
 #tun0はTAPモードで動かす
 tuntap_tun0="tap"
 #tun0にはアドレス付与しない
 config_tun0=("null")
 #eth0とtun0をブリッジする
 bridge_br0="eth0 tun0"
 #net.eth0とnet.tun0を実行してからbr0を動かす
 depend_br0() {
   need net.eth0 net.tun0
 }
さらに、/etc/init.dに移って
 ln -sfn net.lo net.br0
 ln -sfn net.lo net.tun0
さらにさらに、初期設定で自動起動するように、
 rc-update add net.br0 default

*接続確認 [#c07b1bf1]
サーバ側で、openvpnを起動してみます。
 # /etc/init.d/openvpn start
クライアント側で、openvpnクライアントを起動してみましょう。ちなみに、私はブロードバンドルータの外側から接続を試してみてます。うちのプロバイダは、DHCPでクライアントへのアドレス払い出しが5つまでOKなので♪でないと試験の意味がないからね。openvpnGUIのコンテキストメニューから、『接続』を選択。さて、うまくコネクトできるでしょうか…クライアント側でログが出ますから、確認できるでしょう…ちなみに、私は、protoをTCPにしないとだめでした。ブロードバンドルーターとかいろいろあるのかしら…

*もう一工夫 [#z3477833]

**暗号化強度を上げてみる [#r6a3b622]
***OpenVPNの設定 [#lf755405]
OpenVPNの設定で、以下を追加すると、暗号強度が増しますよ。
:tls-auth|TLSによる暗号化をプラスする場合、使用する。暗号強度が上がる。[[ここの暗号鍵作成>Gentoo Linuxな生活/OpenVPNで悩む#y9606253]]で作成する、ta.keyを書いて、第2パラメータに0を指定。サーバで指定したら、クライアント側にも必要
:cipher|暗号化アルゴリズムを指定します。サーバ、クライアントにて設定を合わせます
:user,group|Windowsではない場合、openvpnが動作するユーザ、グループ権限が指定できる。root以外にすれば、セキュリティは向上するよね。
***鍵長を変えてみる [#scca189d]
/usr/share/openvpn/easy-rsaの下に、varsというファイルがあります。こいつの
 export KEY_SIZE=2048
にすると、2048bitの鍵長になり、SSLキー自体の暗号強度が上がりますよ。デフォルトは1024bit長ね

**SSL等とポートを共有する [#x83a0432]
例えば、apacheサーバ等の暗号化ポート(https:443番)を、OpenVPN用ポートと共有するってことを考えてみます。
***apache側 [#y1caed41]
SSL等のListenポートをずらしてやります。apacheの設定ファイルを開いて
 #Listen 443
 Listen 444

 #<VirtualHost _default_:443>
 <VirtualHost _default_:444>
等ね。で、再起動

***OpenVPN側 [#dc29ad6e]
port-shareってオプションを使用します。これを行うと、httpのプロトコルを、shareしたアドレス、ポートに転送してくれます。サーバ側のopenvpn.confを開いて

 port 443
 port-share 127.0.0.1 444

として再起動。
こうすると、127.0.0.1のポート444に転送してくれるんですよ。httpを。

**BitLocker to Go [#j8f352de]
Windows側のVPNクライアントを見ていると、USBのアクセスキーを差し込まないとVPN接続できないようなもの、ありますよね。あれにチャレンジしてみます。

うちのdv3500君は、SDカードスロットを持っています。うちに1GbyteのSDカードがありました。こいつを暗号化して、これにさっきのクライアント暗号化キーをぶっこんでおけば…そいつがないとVPN接続できないし、安心ですね。~
Windows7 Ultimateには、BitLockerというドライブ暗号化ツールが入っています。コントロールパネルから、BitLockerドライブ暗号化を選択します。SDカードを差し込むと、BitLocker to Goというメニューが出てきます。こいつでTPMデバイスを使用しない、パスワード認証を選択すると、SDカード差し込み時にパスワードを問い合わせてくる暗号化ドライブになります。これを選択。暗号化。

そして、出来上がった暗号化ドライブに、暗号キーを放り込んで、クライアント側OpenVPNのコンフィグファイルに、キーのパス(SDカードドライブを含むフルパス)を記述しておきます。こーすると、アクセスの手順がこうなります。

+SDカードスロットに暗号キーを差し込む
+SD暗号キーのパスワード認証(BitLocker側)
+OpenVPN GUIで『接続』を選択
+クライアント暗号キーのパスフレーズ入力(パスフレーズ付きのクライアントキー認証)
+サーバと接続確立

+あとはおうちで使用するのと同じように、サーバにSSHやら、共有ドライブアクセスやら、IMAP使用したりできる

うっふっふ♪こいつぁ便利な上に、SDカードとセットでないとアクセスできない。SDキーをなくしても、暗号化されている上に何のキーかわからないから、安心ってわけね。

« Prev  Next »