OpenVPNはオープンソースのSSL-VPNソフトウェア。証明書認証でクライアントを特定することができ、パスワード認証よりも強固なセキュリティを提供できる。
インストール
1. ソースコードの入手
OpenVPNのソースをダウンロード。
[root@centos ~]# cd /usr/local/src [root@centos src]# wget http://swupdate.openvpn.org/community/releases/openvpn-2.3.1.tar.gz
2. 必要な関連パッケージをインストール
OpenVPNのインストールには下記のパッケージを必要とする。
[root@centos src]# yum install openssl openssl-devel lzo lzo-devel pam pam-devel
3. RPMビルド
ソースからRPMを作成。尚、ビルドに必要な開発ツールは必要に応じてインストールすること。
[root@centos src]# rpmbuild -tb openvpn-2.3.1.tar.gz
実行するとrootディレクトリにrpmbuildが作成される。
4. インストール
rpmコマンドでインストール。
[root@centos ~]# cd /root/rpmbuild/RPMS/x86_64/ [root@centos x86_64]# rpm -ivh openvpn-2.3.1-1.x86_64.rpm
設定
1. easy-rsaを入手
OpenVPN2.3から同梱されなくなった。公式サイトからダウンロード。
[root@centos ~]# cd /usr/local/src [root@centos src]# wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
master.zipと指定してダウンロードしているが、何故かmasterとして保存されている。unzipで展開する。
[root@centos src]# unzip master
OpenVPN設定ディレクトリへコピー。
[root@centos src]# cp -r /usr/local/src/easy-rsa-master/easy-rsa/2.0/ /etc/openvpn/easy-rsa
2. CA証明書と秘密鍵を作成
実行権限を付加。
[root@centos ~]# cd /etc/openvpn/easy-rsa/ [root@centos easy-rsa]# chmod +x *
環境変数設定ファイルを編集。
[root@centos easy-rsa]# cp vars vars.org [root@centos easy-rsa]# vim vars
下記を環境に応じて設定。
export KEY_COUNTRY="JP" # 国名 export KEY_PROVINCE="Tokyo" # 都道府県名 export KEY_CITY="Chiyoda" # 市区町村名 export KEY_ORG="mydomain.com" # 組織名 export KEY_EMAIL="admin@mydomain.com" # メールアドレス export KEY_OU="centos.mydomain.com" # 部署名
環境変数をシステムに反映。
[root@centos easy-rsa]# source vars
証明書関連ディレクトリ初期化。
[root@centos easy-rsa]# ./clean-all
CA証明書と秘密鍵を作成。
[root@centos easy-rsa]# ./build-ca
Common Name以外は全てEnterで応答。
Generating a 2048 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) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Chiyoda]:
Organization Name (eg, company) [mydomain.com]:
Organizational Unit Name (eg, section) [centos.mydomain.com]:
Common Name (eg, your name or your server's hostname) [mydomain.com CA]:centos # ホスト名を入力
Name [EasyRSA]:
Email Address [admin@mydomain.com]:
ca.crt(CA証明書)とca.key(秘密鍵)が生成される。CA証明書をOpenVPN設定ディレクトリへコピー。
[root@centos easy-rsa]# cp keys/ca.crt /etc/openvpn/
3. サーバー証明書と秘密鍵作成を作成
サーバー証明書と秘密鍵作成を作成。
[root@centos easy-rsa]# ./build-key-server server
2箇所以外は全てEnterで応答。
Generating a 2048 bit RSA private key .............................+++ ..........................................................................................................+++ writing new private key to 'server.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) [JP]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Chiyoda]: Organization Name (eg, company) [mydomain.com]: Organizational Unit Name (eg, section) [centos.mydomain.com]: Common Name (eg, your name or your server's hostname) [server]: Name [EasyRSA]: Email Address [admin@mydomain.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' localityName :PRINTABLE:'Chiyoda' organizationName :PRINTABLE:'mydomain.com' organizationalUnitName:PRINTABLE:'centos.mydomain.com' commonName :PRINTABLE:'server' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'admin@mydomain.com' Certificate is to be certified until Apr 12 16:45:11 2023 GMT (3650 days) Sign the certificate? [y/n]:y # yで応答 1 out of 1 certificate requests certified, commit? [y/n]y # yで応答 Write out database with 1 new entries Data Base Updated
server.crt(サーバー証明書)とserver.key(秘密鍵作成)が生成される。両方をOpenVPN設定ディレクトリへコピー。
[root@centos easy-rsa]# cp keys/server.crt keys/server.key /etc/openvpn/
4. DHパラメータ生成
DHパラメータ生成。
[root@centos easy-rsa]# ./build-dh
DHパラメータをOpenVPN設定ディレクトリへコピー。
[root@centos easy-rsa]# cp keys/dh2048.pem /etc/openvpn/
5. 証明書廃止リスト作成
ダミーのクライアント証明書作成。
[root@centos easy-rsa]# ./build-key dummy
2箇所以外は全てEnterで応答。
Generating a 2048 bit RSA private key ..............................................................................................................+++ ...................+++ writing new private key to 'dummy.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) [JP]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Chiyoda]: Organization Name (eg, company) [mydomain.com]: Organizational Unit Name (eg, section) [centos.mydomain.com]: Common Name (eg, your name or your server's hostname) [dummy]: Name [EasyRSA]: Email Address [admin@mydomain.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' localityName :PRINTABLE:'Chiyoda' organizationName :PRINTABLE:'mydomain.com' organizationalUnitName:PRINTABLE:'centos.mydomain.com' commonName :PRINTABLE:'dummy' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'admin@mydomain.com' Certificate is to be certified until Apr 12 17:10:46 2023 GMT (3650 days) Sign the certificate? [y/n]:y # yで応答 1 out of 1 certificate requests certified, commit? [y/n]y # yで応答 Write out database with 1 new entries Data Base Updated
ダミーのクライアント証明書廃止
[root@centos easy-rsa]# ./revoke-full dummy
証明書廃止リストをOpenVPN設定ディレクトリへコピー。
[root@centos easy-rsa]# cp keys/crl.pem /etc/openvpn/
6. OpenVPNサーバー設定
TLS認証鍵生成
[root@centos ~]# openvpn --genkey --secret /etc/openvpn/ta.key
サーバー設定ファイルコピー
[root@centos ~]# cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
サーバー設定ファイル編集
[root@centos ~]# cp /etc/openvpn/server.conf /etc/openvpn/server.conf.org [root@centos ~]# vim /etc/openvpn/server.conf
変更と追記箇所のみ
dh dh2048.pem # dh1024.pemから変更 server 192.168.200.0 255.255.255.0 # 環境に応じて変更 push "route 192.168.1.0 255.255.255.0" # クライアントルーティング設定 push "dhcp-option DNS 192.168.1.1" # クライアントDNS設定 tls-auth ta.key 0 # コメントを解除してTLS認証有効化 user nobody # コメントを解除してOpenVPNの実行権限を下げる group nobody # コメントを解除してOpenVPNの実行権限を下げる log-append /var/log/openvpn.log # ログを追記モードで有効化 management localhost 7505 # 追記:管理インターフェイスを有効化 crl-verify crl.pem # 追記:証明書廃止リストを有効化
7. ログローテーション設定
新規作成。
[root@centos ~]# vim /etc/logrotate.d/openvpn
/var/log/openvpn.log { missingok notifempty sharedscripts postrotate /etc/rc.d/init.d/openvpn restart 2>&1 > /dev/null || true endscript }
8. IP転送(ルーティング)設定
デフォルトではIP転送が有効になっていない。
[root@centos ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 # 0から1に変更しIP転送有効化
再起動すれば有効になるが、即時有効にしたい場合。
[root@centos ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
OpenVPNサーバー起動確認
OpenVPNの状態確認
[root@centos ~]# service openvpn status
起動していない
openvpn: service not started
起動と再起動、自動起動確認。
[root@centos ~]# service openvpn start [root@centos ~]# service openvpn restart [root@centos ~]# chkconfig openvpn on | chkconfig openvpn --list
OpenVPNクライアント設定
1. クライアント証明書と秘密鍵作成を作成
OpenVPNサーバーで実施。Windowsは下記手順で問題ないが、iPhone用の証明書を作成する場合、build-key-passではなくbuild-keyを使う。iPhoneのOpenVPNクライアントはパスフレーズに対応していない。
[root@centos ~]# cd /etc/openvpn/easy-rsa/ [root@centos ~]# source vars [root@centos ~]# ./build-key-pass client
4箇所以外は全てEnterで応答。
Generating a 2048 bit RSA private key ......+++ .............................+++ writing new private key to 'client.key' Enter PEM pass phrase:xxxxxxxx # 任意のパスフレーズ Verifying - Enter PEM pass phrase:xxxxxxxx # 任意のパスフレーズを確認応答 ----- 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) [JP]: State or Province Name (full name) [Tokyo]: Locality Name (eg, city) [Chiyoda]: Organization Name (eg, company) [mydomain.com]: Organizational Unit Name (eg, section) [centos.mydomain.com]: Common Name (eg, your name or your server's hostname) [client]: Name [EasyRSA]: Email Address [admin@mydomain.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Tokyo' localityName :PRINTABLE:'Chiyoda' organizationName :PRINTABLE:'mydomain.com' organizationalUnitName:PRINTABLE:'centos.mydomain.com' commonName :PRINTABLE:'client' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'admin@mydomain.com' Certificate is to be certified until Apr 12 18:08:47 2023 GMT (3650 days) Sign the certificate? [y/n]:y # yで応答 1 out of 1 certificate requests certified, commit? [y/n]y # yで応答 Write out database with 1 new entries Data Base Updated
2. クライアントへ証明書関連ファイルを移動
SCPでコピーするのが望ましいが、セキュリティを考慮してrootでのSSHログインを拒否している場合が想定される。一般ユーザのホームディレクトリへ証明書関連ファイルを移動してSCPでコピーを実施。rootでのSSHログインを許可していればSCPでそのままコピーすればよい。
[root@centos ~]# cp /etc/openvpn/ca.crt /home/admin/ # CA証明書 [root@centos ~]# cp /etc/openvpn/ta.key /home/admin/ # TLS認証鍵 [root@centos ~]# cp /etc/openvpn/easy-rsa/keys/client.crt /home/admin/ # クライアント証明書 [root@centos ~]# cp /etc/openvpn/easy-rsa/keys/client.key /home/admin/ # クライアント秘密鍵
証明書関連ファイルの所有者を一般ユーザに変更。この状態でSCPでコピー。
[root@centos ~]# cd /home/admin [root@centos admin]# chown admin.admin ca.crt ta.key client.crt client.key
コピーしたら削除
[root@centos admin]# rm -f ca.crt ta.key client.crt client.key
コピーした証明書関連ファイルはC:Program FilesOpenVPNconfigへ移動する。
3. OpenVPNクライアント設定
サンプル設定ファイルをコピー
C:Program FilesOpenVPNsample-configからC:Program FilesOpenVPNconfigへclient.ovpnをコピーする。
クライアント設定ファイル編集
remote 192.168.1.1 1194 # OpenVPNサーバーを指定(FQDN可) cert client.crt # クライアント証明書 key client.key # クライアント秘密鍵 tls-auth ta.key 1 # コメント解除
OpenVPNクライアント起動
Windows7では初回起動時にのみ下記の手順が必要。
スタートメニュー -> すべてのプログラム -> OpenVPN -> OpenVPN GUI # 右クリック -> プロパティ -> 互換性 -> 管理者としてこのプログラムを実行する # チェックを入れてOKをクリック
下記手順でOpenVPNクライアント起動してアイコンが緑になれば接続完了。
スタートメニュー -> すべてのプログラム -> OpenVPN -> OpenVPN GUI # クリックするとタスクバーにアイコンが現れる タスクバー -> OpenVPN GUI # 右クリック -> 接続
構築後の運用管理
1. クライアント証明書廃止
証明書の漏洩が発覚した場合は一刻も早く該当のクライアント証明書を廃止する。また不要な証明書は廃止するのが望ましい。
[root@centos ~]# cd /etc/openvpn/easy-rsa [root@centos easy-rsa]# source vars [root@centos easy-rsa]# ./revoke-full client # clientのクライアント証明書廃止 [root@centos easy-rsa]# cp keys/crl.pem /etc/openvpn/ # 証明書廃止リストを上書き
2. 管理インターフェイス
[root@centos ~]# telnet localhost 7505
status(クライアント接続状況確認)、kill(クライアント強制切断)などがある。詳細はhelpで確認すること。
参考リンク
- http://freescitech.net/2/ovpn2_howto_ja.html
- http://centossrv.com/openvpn.shtml
- http://blog.cles.jp/item/5524