【VPNサーバ】OpenVPN導入その1

外から自宅サーバをいじってみたくなったので、OpenVPNを導入します。
Raspberry Piで動いてるサービスをNUCに移行したら
Raspberry PiはOpenVPNサーバ専用かもしれません。

  • OpenVPN導入
    まずはパッケージを最新化します。
    しばらくやってなかったので、結構長かったです。

    aptitude update
    aptitude upgrade
    

    OpenVPNをインストールします。
    相変わらずインストールはコマンドで一瞬。

    aptitude install openvpn openssl
    

    opensslは以前にApache2にSSLを導入した際に
    最初から入ってたような気がしたのですが、入れちゃいました。

  • OpenVPN設定(準備)
    Apache2のSSLではサーバー側で公開鍵、秘密鍵を利用していましたが、
    OepnVPNを利用するにはサーバー側、クライアント側の両方で公開鍵、秘密鍵を利用します。

    Apache2の時と同様に鍵の正当性を証明するために、OpenVPN用のオレオレ認証局を作成します。
    OpenVPNをインストールするとOpenSSLを簡単に利用できるツール「easy-rsa」が
    同時にインストールされるのでそれを利用します。
    OpenVPNのディレクトリにツール「easy-rsa」をコピーしておきます。

    現在では「easy-rsa」は3.0まで公開されていて、
    それを利用すると以降に記述した2.0の手順よりさらに短く簡単に設定できるようです。
    今回は2.0の手順になります。

    cd /etc/openvpn
    cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 ./easy-rsa
    

    認証局作成、サーバー用の証明書と鍵作成、クライアント用の証明書と鍵作成で
    参照する変数用のファイル作成もしておきます。
    作成しておくと入力の手間が省けます。

    vi /etc/openvpn/easy-rsa/vars
    
    下記内容を変更
    export EASY_RSA="`pwd`"
    ↓
    export EASY_RSA="/etc/openvpn/easy-rsa"
    
    export KEY_COUNTRY="US"
    ↓
    export KEY_COUNTRY="JP"
    
    export KEY_PROVINCE="CA"
    ↓
    export KEY_PROVINCE="TOKYO"
    
    export KEY_CITY="SanFrancisco"
    ↓
    export KEY_CITY="Akihabara"
    
    export KEY_ORG="Fort-Funston"
    ↓
    export KEY_ORG="OreOreCA"
    
    export KEY_EMAIL="me@myhost.mydomain"
    ↓
    export KEY_EMAIL=""
    
    export KEY_CN=changemeからexport PKCS11_PIN=1234はコメントアウト
    
  • OpenVPN設定(認証局作成)
    認証局を作成する際に「openssl.cnf」を参照するため、
    サンプルファイルの「openssl-1.0.0.cnf」を「openssl.cnf」としてコピーしておきます。

    cd /etc/openvpn/easy-rsa
    cp -pi openssl-1.0.0.cnf openssl.cnf
    

    さらに先ほど事前作成しておいたvarファイルを環境変数として有効化しておきます。

    source ./vars
    
    NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
    

    初期化してから実行しろということなので、初期化後にオレオレ認証局を作成します。

    ./clean-all
    ./build-ca オレオレ認証局名(適当)
    
    Generating a 1024 bit RSA private key
    ...............++++++
    ....++++++
    writing new private key to 'ca.key'
    -----
    略
    

    括弧内にvarsファイルで予め設定しておいた設定内容が表示されるので、
    問題なければそのままEnter押下して作業を進めます。

  • OpenVPN設定(DHパラメータ作成)
    DHパラメータはサーバーとクライアントで鍵を交換するために利用するそうです。

    ./build-dh
    
  • OpenVPN設定(サーバー用の証明書と鍵作成)

    ./build-key-server サーバー名
    

    途中でチャレンジパスワード、会社名付属、署名にサインされるか聞かれますが、
    チャレンジパスワード、会社名付属はブランクでEnter、署名はyで入力します。
    最後のコミットもyで入力します。

  • OpenVPN設定(クライアント用の証明書と鍵作成)

    ./build-key クライアント名
    

    実行するファイル名がサーバーと似ていますが微妙に違うので注意。

  • OpenVPN設定(共有鍵作成)
    セキュリティ強化の一環として、共有鍵をさらに作成可能です。
    この鍵はツール「easy-rsa」ではなく、openvpnコマンドを利用して作成します。

    openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key
    

    私の環境では、iphoneから利用する場合、ta.keyがあると
    OpenVPNに接続できなかったので、利用しませんでした。

作業完了すると「/etc/openvpn/easy-rsa/keys」に下記ファイルが作成されています。
他にも作業ファイルが作成されていますが、記載していません。

ファイル名概要権限備考
ca.crtオレオレ認証局の証明書644サーバー、クライアントで利用
ca.keyオレオレ認証局の秘密鍵--
サーバー名.crtサーバーの証明書644サーバーで利用
サーバー名.csrサーバーの公開鍵--
サーバー.keyサーバーの秘密鍵600サーバーで利用
クライアント名.crtクライアントの証明書-クライアントで利用
クライアント名.csrクライアントの公開鍵--
クライアント.keyクライアントの秘密鍵-クライアントで利用
dh1024.pem鍵交換用644サーバーで利用
ta.key共有鍵--

サーバーで利用する4ファイルはディレクトリ移動しておきます。
実行権限も表の通りではない場合は修正しておきます。

cd /etc/openvpn
cp -pi /etc/openvpn/easy-rsa/keys/ca.crt .
cp -pi /etc/openvpn/easy-rsa/keys/サーバー名.crt .
cp -pi /etc/openvpn/easy-rsa/keys/サーバー.key .
cp -pi /etc/openvpn/easy-rsa/keys/dh1024.pem .

クライアントで利用する3ファイルはUSBメモリ等でクライアントに移動しておきます。
keysディレクトリ内のファイルは削除しても問題ないようですが、
クライアントを追加したい場合、ca.crtやca.keyを参照したりするので、一旦削除しないでおきます。