OpenVPN-Adminを使ってWebインタフェースでユーザを管理してみる

2017.06.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

まいど、大阪の市田です。
OpenVPNでVPNユーザの管理をしたい場合、デフォルトではコマンドラインから追加や削除などを行うことになりますが、ブラウザで利用できると運用が楽になります。

調べてみると「OpenVPN-Admin」というウェブインタフェースのツールがありましたので、早速試してみました。

構成

HTTPSで管理画面にアクセスしたかったので、ELBとACMを利用した構成にしました。ELB配下にはOpenVPNサーバ1台のみです。
VPNはOpenVPNサーバに直接接続します。

dialog

準備

今回は、Amazon Linux(2017.03.1)を使ってみます。
「OpenVPN-Admin」に必要なミドルウェアなどは上記のGithubのページに記載がありますので、こちらの「CentOS 7」向けの情報を元に必要なパッケージをインストールします。

$ sudo yum install openvpn httpd24 php56 php56-mysqlnd php56-pdo mysql-server unzip git wget sed

PHPは5.5以上が必要なので、今回はPHP56のパッケージを選びました。Apacheはhttpd24を選択しています。

node.js関連のパッケージは標準リポジトリに無いため、EPELレポジトリからインストールしましょう。

$ sudo yum install --enablerepo=epel nodejs npm

最後にbowerをインストールします。

$ sudo npm install -g bower

ミドルウェアの起動

ここでApacheとMySQLを起動しておきます。

$ sudo service httpd start
$ sudo chkconfig httpd on

$ sudo service mysqld start
$ sudo chkconfig mysqld on

インストール

ここからは、READMEにある手順でOpenVPN-Adminをインストールしていきます。
(適当な作業用ディレクトリに移動して作業しています。)

$ mkdir mytemp
$ cd mytemp/
$ git clone https://github.com/Chocobozzz/OpenVPN-Admin openvpn-admin
$ cd openvpn-admin

インストーラ(install.sh)があるので、引数にApacheのDocumentRootと実行ユーザ名、グループを指定して実行します。

$ sudo ./install.sh /var/www/html apache apache

いくつかのセクション毎に設定内容をインタラクティブに入力する表示になるので、それぞれ入力して進めて下さい。

最初はサーバ設定です。

################## Server informations ##################
Server Hostname/IP: 
Port [443]:
MySQL root password:
MySQL user name for OpenVPN-Admin (will be created): 
MySQL user password for OpenVPN-Admin:

設定内容は、下記を参考にして下さい。

設定項目 内容
Server Hostname/IP サーバホスト名またはサーバのグローバルIP
(今回はElastic IPを指定しました。ここで指定したIPに対してVPN接続します。)
Port [443] OpenVPNが利用するポート
(適宜設定して下さい。OpenVPN Adminの場合はデフォルトでTCP443です。) *1
MySQL root password ローカルにインストールしたMySQLのrootパスワード
MySQL user name for OpenVPN-Admin (will be created) OpenVPN-Admin用のMySQLユーザ名
MySQL user password for OpenVPN-Admin OpenVPN-Admin用のMySQLユーザのパスワード

次は証明書に関する設定です。
特有の設定は無いので、適宜入力して下さい。

################## Certificates informations ##################
Key size (1024, 2048 or 4096) [2048]:
Root certificate expiration (in days) [3650]:
Certificate expiration (in days) [3650]:
Country Name (2 letter code) [US]: 
State or Province Name (full name) [California]: 
Locality Name (eg, city) [San Francisco]: 
Organization Name (eg, company) [Copyleft Certificate Co]: 
Organizational Unit Name (eg, section) [My Organizational Unit]: 
Email Address [me@example.net]: 
Common Name (eg, your name or your server's hostname) [ChangeMe]:

インストールが完了したらOpenVPNを起動しておきます。

$ sudo service openvpn start
$ sudo chkconfig openvpn on

管理画面の設定

ここからはブラウザで設定していきます。
下記のURLにアクセスしてインストールの続きを行います。インストールしたフォルダ構成に読み替えてアクセスして下さい。

http://[your-installation]/index.php?installation

私の環境では下記の様になりました。

https://[hostname]/openvpn-admin/index.php?installation

下のインストール画面にある「Admin username」は先程設定したMySQLのユーザとは別のものです。ブラウザでアクセスするための管理者情報として新規に設定して下さい。

01-OpenVPN-Admin-install

無事にインストールができたら次のページに遷移します。先程設定した管理ユーザとしてログインしましょう。

02-admin-login

ログインすると下記のような管理画面が表示されます。まだユーザ登録が無いので「Web Admins」の登録しかありません。
ユーザ登録するには「OpenVPN Users」の横のプラス(+)ボタンをクリックします。

03-admin-dash

追加したいユーザ名とパスワードを登録します。

04-adduser

登録出来ました。MailやPhone、Start Date等は「Empty」の箇所をクリックすると登録できます。適宜設定して下さい。

05-user01

WindowsからVPN接続してみる

コンフィグダウンロード

ここまで出来たら、先程作成した「cm-user01」ユーザでVPN接続してみたいと思います。利用するクライアント側のOSは「Windows8.1」です。

管理画面の右上にある「Configurations」をクリックしてコンフィグをダウンロードします。

16-userconfig

ユーザ、パスワードを指定して、プルダウンからVPNクライアントのOS種別を選択して下さい。今回はWindowsを選択します。
全て指定できたら「Get configuration files」をクリックしてダウンロードしましょう。

06-getconfig

ダウンロードしたZIPファイルを解凍すると下記のようなファイルが展開されます。

07-windows

OpenVPNのクライアントアプリは「OpenVPN GUI for Windows」を利用します。インストールしていない場合は、事前に入れておきましょう。

デスクトップに作成されたショートカットから「管理者として実行」します。

08-runadmin

タスクトレイのアイコンから「設定」をクリックして、先程ダウンロードしたコンフィグを指定します。

09-vpnwindowsconfig

ログファイルの指定は適宜指定して下さい。デフォルトのままでも構いません。

10-winconfigadv

AWS側のSecurity Group

インストールスクリプトの中で指定したOpenVPN用のポートに対して、VPNクライアントがアクセスできるようにSecurityGroupで許可設定を入れておきます。
今回の場合だと、TCPの1443ポートを許可しています。

17-sginbound

「OpenVPN-Admin」をインストールするとIPマスカレードの設定が入るので、VPCのルートテーブルに「戻りの経路」を登録する必要はありません。OpenVPNサーバのプライベートIPで各サーバにアクセスすることになります。

$ sudo iptables -L -n -t nat

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0
MASQUERADE  all  --  10.8.0.0/24          0.0.0.0/0

接続してみる

以上で準備が整いました。接続してみます。

11-connect

管理画面で作成したユーザ名とパスワードを入力します。

12-connectprompt

無事接続できました。

13-winvpnconnect

VPCにあるウェブサーバにプライベートIPでアクセスしてみます。ページが見えれば成功です。

14-vpnpage

VPN接続を切ると管理画面にログが表示されます。ユーザ名や接続元IP、時間などが分かるのは嬉しいですね。

15-vpnlog

アンインストール

インストーラと同じディレクトリに専用のスクリプトがあります。引数に「インストールしたディレクトリ」を指定して実行すると、そこに展開されたファイル群とMySQLのデータが削除されます。

$ sudo ./desinstall.sh /var/www/html

最後に

ユーザの追加と削除くらいしか出来ませんが、これだけで十分な場合もあるかと思います。
サポートが必要な場合や多要素認証の利用など、他にも要件があれば「OpenVPN Access Server」「Sophos UTM」といった選択肢もあります。ベストなソリューションを選んで快適なVPNライフをお楽しみ下さい。

以上です。

脚注

  1. yumでインストールした際のデフォルトはUDPの1194ポートです。