手当たり次第に書くんだ

飽きっぽいのは本能

CentOS 6 OpenVPN VPN サーバー構築

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で確認すること。

参考リンク

CentOS 6 OpenVPN VPN サーバー構築

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る