SoftEtherVPN に証明書認証を追加する

NTT 東日本、IPA、つくば大学が提供しているシン・テレワークシステムの話をあげたが、自前でも無償オープンソースのSoftEtherVPNを使って、テレワークシステムを構築して使っている。その構築TIPSから、標準で使用できない認証機能を追加する方法です。

つくば大学で配布しているSoftEtherVPNには、標準パスワード認証以外に以下の③から⑥の認証機能がガードされている。

①匿名認証

もっとも簡単なユーザ認証方法で、匿名認証に設定されたユーザはパスワードを必要とせずに、ユーザ名のみで VPNサーバへ接続することができます。

②パスワード認証

ユーザ名に対して個別のパスワードを設定することができます。
接続できる期間を設定する場合には、「このアカウントの有効期限を設定する」にチェックを入れます。

③固有証明書認証

ユーザ名とパスワードではなく公開鍵証明書を使って認証する方法です。
サーバ側で設定された特定の公開鍵証明書と対応する秘密鍵のペアを持つクライアントのみが接続できます。
SoftEtherVPN管理マネージャーを使って、管理者が公開鍵証明書を生成して、自分で端末に設定を施すことができます。
また、既に証明書と秘密鍵のペアを持っている場合に、それを利用することもできます。

④署名済み証明書認証

企業内端末がすでに外部公開鍵証明書で管理されている場合には、その証明書を利用できます。
外部の認証機関の証明書を登録することで、すでに発行されている証明書を使用してクライアントを認証することができます。
端末の証明書再発行を省くことができます。

⑤Radius認証

Radiusプロトコル対応の認証サーバーによって管理されたユーザ情報で認証します。
企業の既存のパスワードデータベースを使用したユーザー認証が可能です。

⑥NTドメイン認証

ActiveDirectoryコントローラによって管理されたユーザ情報で認証します。
すでに企業ユーザ情報が、ActiveDirectoryによって管理されていればそれを利用できます。

すぐに機能を開放できるようには設定があるわけではなく、認証機能を有効化するためには、SofEtherサーバ自体のソースを取得し、コンパイル・ビルドして、モジュールを入れ替えなければならない。

2日かかったが、挑戦してみて、取り合えず、固有証明書の機能を試してみた。
SoftEtherVPNサーバ管理ツール(SEツール)から公開鍵証明書を作成し、登録することによって、証明書を提示できない端末からはアクセスできないことを確認した。
他の機能は試していないがガードははずれているようです。
(DesktopVPNのサイトに認証機能の説明と操作方法の記載があった)
https://www.desktopvpn.net/support/handling/server/#fun034

サーバ側での作業です。(自己責任でお願いします)

サーバ側で、認証機能のガードを許可します。

➊ まず、ソースを入手します。つくば大学HPからダウンロード可能です。

 https://ja.softether.org/5-download

 SELECT SoftWare:SoftEtherVPN(Freeware)
 Select Platform:tar.gz.package
 SelectCPU:Any
 で、私はこの時点での最新の「Source Code of SoftEther VPN (Ver 4.34, Build 9745, beta)」をダウンロードした。

➋ softetherの再ビルド(私はAWS上のAmazon Linuxで実施した)

[root@ip-10-0-0-220 miko]# pwd
/home/ec2-user
[root@ip-10-0-0-220 miko]# ls
softether-vpnserver-v4.32-9731-beta-2020.01.01-linux-x64-64bit.tar.gz
[root@ip-10-0-0-220 miko]# wget https://jp.softether-download.com/files/softether/v4.34-9745-beta-2020.04.05-tree/Source_Code/softether-src-v4.34-9745-beta.tar.gz

--2020-05-07 10:10:32--  https://jp.softether-download.com/files/softether/v4.34-9745-beta-2020.04.05-tree/Source_Code/softether-src-v4.34-9745-beta.tar.gz
Resolving jp.softether-download.com (jp.softether-download.com)... 130.158.75.49
Connecting to jp.softether-download.com (jp.softether-download.com)|130.158.75.49|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 59108198 (56M) [application/x-gzip]
Saving to: ‘softether-src-v4.34-9745-beta.tar.gz’

100%[=====================================================================================================================>] 59,108,198  1.96MB/s   in 29s

2020-05-07 10:11:02 (1.95 MB/s) - ‘softether-src-v4.34-9745-beta.tar.gz’ saved [59108198/59108198]

[root@ip-10-0-0-220 miko]# ls
softether-src-v4.34-9745-beta.tar.gz  softether-vpnserver-v4.32-9731-beta-2020.01.01-linux-x64-64bit.tar.gz
[root@ip-10-0-0-220 miko]# tar xvfz softether-src-v4.34-9745-beta.tar.gz

v4.34-9745/
v4.34-9745/AUTHORS.TXT
v4.34-9745/BUILD_UNIX.TXT
v4.34-9745/BUILD_WINDOWS.TXT
v4.34-9745/ChangeLog
  :
  :
  :
v4.34-9745/centos/SOURCES/scripts/vpnserver
v4.34-9745/centos/SOURCES/init.d/
v4.34-9745/centos/SOURCES/init.d/vpnserver
v4.34-9745/.github/
v4.34-9745/.github/PULL_REQUEST_TEMPLATE.md

➌ ソースを修正

[root@ip-10-0-0-220 miko]# cp -p /home/miko/v4.34-9745/src/Cedar/Server.c /home/miko/v4.34-9745/src/Cedar/Server.c.org
[root@ip-10-0-0-220 miko]# ls /home/miko/v4.34-9745/src/Cedar/Server.*
/home/miko/v4.34-9745/src/Cedar/Server.c  /home/miko/v4.34-9745/src/Cedar/Server.c.org  /home/miko/v4.34-9745/src/Cedar/Server.h
[root@ip-10-0-0-220 miko]# vi /home/miko/v4.34-9745/src/Cedar/Server.c

10902-10920 行をコメントアウト  +  10921 行をプラス

  10900 bool SiIsEnterpriseFunctionsRestrictedOnOpenSource(CEDAR *c)
  10901 {
  10902 /*
  10903         char region[128];
  10904         bool ret = false;
  10905         // Validate arguments
  10906         if (c == NULL)
  10907         {
  10908                 return false;
  10909         }
  10910
  10911
  10912         SiGetCurrentRegion(c, region, sizeof(region));
  10913
  10914         if (StrCmpi(region, "JP") == 0 || StrCmpi(region, "CN") == 0)
  10915         {
  10916                 ret = true;
  10917         }
  10918
  10919         return ret;
  10920 */
  10921         return false;
  10922 }

➍ ビルドに必要なパッケージをインストール

[root@ip-10-0-0-220 miko]# yum -y groupinstall "Development Tools"	
[root@ip-10-0-0-220 miko]# yum -y install readline-devel ncurses-devel openssl-devel

	

➎ ソースコードのルートフォルダでビルド

[root@ip-10-0-0-220 miko]# cd v4.34-9745
[root@ip-10-0-0-220 v4.34-9745]# ./configure
---------------------------------------------------------------------
SoftEther VPN for Unix

Copyright (c) Daiyuu Nobori.
Copyright (c) SoftEther VPN Project, University of Tsukuba, Japan.
Copyright (c) SoftEther Corporation.
Copyright (c) all contributors on SoftEther VPN project in GitHub.

License: The Apache License, Version 2.0

Read and understand README.TXT, LICENSE.TXT and WARNING.TXT before use.
---------------------------------------------------------------------

Welcome to the corner-cutting configure script !

The Makefile is generated. Run 'make' to build SoftEther VPN.

[root@ip-10-0-0-220 v4.34-9745]# make

cc -DNDEBUG -DVPN_SPEED -DUNIX -DUNIX_LINUX -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -O2 -fsigned-char -m64 -c src/Mayaqua/Cfg.c -o tmp/objs/Mayaqua/Cfg.o
cc -DNDEBUG -DVPN_SPEED -DUNIX -DUNIX_LINUX -DCPU_64 -D_REENTRANT -DREENTRANT -D_THREAD_SAFE -D_THREADSAFE -DTHREAD_SAFE -DTHREADSAFE -D_FILE_OFFSET_BITS=64 -I./src/ -I./src/Cedar/ -I./src/Mayaqua/ -O2 -fsigned-char -m64 -c src/Mayaqua/Encrypt.c -o tmp/objs/Mayaqua/Encrypt.o
  :
  :
In file included from ./src/Mayaqua/Mayaqua.h:334:0,   ←エラーが出まくる
                 from src/Mayaqua/Memory.c:115:
src/Mayaqua/Memory.c: In function ‘HashListKeyToPointer’:
./src/Mayaqua/MayaType.h:221:64: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
 #define POINTER_TO_KEY(p)  ((sizeof(void *) == sizeof(UINT)) ? (UINT)(p) : HashPtrToUINT(p))
  :
  :
[root@ip-10-0-0-220 v4.34-9745]# make install
  :
  :
--------------------------------------------------------------------
Installation completed successfully.

Execute 'vpnserver start' to run the SoftEther VPN Server background service.
Execute 'vpnbridge start' to run the SoftEther VPN Bridge background service.
Execute 'vpnclient start' to run the SoftEther VPN Client background service.
Execute 'vpncmd' to run SoftEther VPN Command-Line Utility to configure VPN Server, VPN Bridge or VPN Client.
--------------------------------------------------------------------
(上記メッセージが出たら、モジュールとしては機能する)

➏ 既存のSoftEtherVPNサーバのプロセスを差し替えて、サービス登録作業や自動起動設定を行う

[root@ip-10-0-0-220 local]# ls -la /usr/bin/vpn*

-rwxr-xr-x 1 root root 48 May 7 10:29 /usr/bin/vpnbridge
-rwxr-xr-x 1 root root 48 May 7 10:29 /usr/bin/vpnclient
-rwxr-xr-x 1 root root 42 May 7 10:29 /usr/bin/vpncmd
-rwxr-xr-x 1 root root 48 May 7 10:29 /usr/bin/vpnserver

[root@ip-10-0-0-220 ~]# cd /usr/local/
[root@ip-10-0-0-220 local]# cd vpnserver

[root@ip-10-0-0-220 vpnserver]# ls

Authors.txt code lib ReadMeFirst_Important_Notices_cn.txt ReadMeFirst_License.txt vpncmd
backup.vpn_server.config hamcore.se2 Makefile ReadMeFirst_Important_Notices_en.txt security_log vpnserver
chain_certs lang.config packet_log ReadMeFirst_Important_Notices_ja.txt server_log vpn_server.config

[root@ip-10-0-0-220 vpnserver]# ls -la vpnserver

-rwx------ 1 root root 5317264 Mar 20 11:37 vpnserver

[root@ip-10-0-0-220 vpnserver]# mv vpnserver vpnserver_2020507old  ← 一応バックアップ

[root@ip-10-0-0-220 vpnserver]# cp -p /usr/bin/vpnserver .
[root@ip-10-0-0-220 vpnserver]# ls -la vpnserver

-rwxr-xr-x 1 root root 48 May 7 10:29 vpnserver

[root@ip-10-0-0-220 vpnserver]# chmod 700 vpnserver
[root@ip-10-0-0-220 vpnserver]# ls -la vpnserver

-rwx------ 1 root root 48 May 7 10:29 vpnserver

➐ SoftEtherVPNサーバ、クライアントがすでに動いている環境で作業した場合には、コンフィグが生きているので、調整。
 初期状態であれば、クライアント、ブリッジなどの設定を行う。

以上で、標準パスワード認証以外の認証方法も使える状況となった。

標準パスワード認証以外の認証方法を使う場合には、次の手順で行います。

SE-VPN サーバー管理 (ツール)を使って、サーバ側のユーザ認証方法を変更します。

認証方法を「固有証明書認証」で設定すると、固有証明書を使ったセキュアな認証で接続するようにできます。
すでに、使用できる外部の公開鍵証明書がある場合には、「署名済み証明書認証」を利用できるが、証明書をまだ発行していない場合には、「固有証明書認証」を指定し、以下に説明するように、証明書を作成して使用することができる。

SoftEtherVPN管理ツール(Windows版)を起動して

固有証明書認証を設定します。

①固定証明書認証を行うユーザのプロパティを表示する

②固有証明書認証を指定する

③証明書作成ツールを起動する

証明書作成ツールで新しい証明書を作成するには、「新しい証明書の作成」ウィンドウにて 証明書の種類を「ルート証明書」に設定し、左イメージの各項目を入力します。

※シリアル番号を指定する場合は、”00″ 以外で始まる 4 桁以上の 16 進数で指定してください。空欄の場合は 0 が設定されます。固有証明書認証で使用する証明書では通常はシリアル番号は空欄でもかまいません。

一番ノーマル(?)なX509証明書を選んで

適当なパスフレーズを入力し「OK」をクリックします。

※ パスフレーズは暗号化する時の鍵素材、一時鍵、
  タネと呼ばれるものに使われると思います。

証明書ファイルと秘密鍵を保存します

「証明書を保存するファイル名を指定してください」というウィンドウが開いたら、証明書ファイルと秘密鍵ファイルを順番に適当な名前を付けて保存します。


SoftEther VPN クライアント接続ツールを使って、クライアント側のユーザ認証方法を変更します。

Windowsパソコンに、「SoftEtherVPNクライアント リモート管理」ツールをインストールします。

https://www.softether-download.com/ja.aspx?product=softether

Windowsパソコンに、SoftEtherVPNクライアントをインストール(つくば大学HPダウンロードページ)
セットアップウィザード

「SoftEtherVPNクライアント」を選んで、クライアントプログラムをインストールしても、管理ツールも同時にインストールされる。
「SoftEtherVPNクライアント接続マネージャ(管理ツールだけ)」を選んで、管理ツールだけインストールすることもできる。

「SoftEtherVPNクライアント接続マネージャ」をインストールします。

「SoftEtherVPNクライアント接続マネージャ」を立ち上げると、左図イメージのような画面が表示されますので、管理したいSoftEtherVPNクライアント端末(ラズパイなど)のIPアドレスを指定して、「OK」をクリック

ラズパイ上で動くSoftEtherVPN Client に、SoftEtherVPN クライアント接続マネージャー(Windowsパソコン)から接続

 

最初にツールをインストールすると、まず下の欄ある仮想LANカードの生成処理が行われます。
仮想LANカード名を決めるように言われますが、基本指示通りやれば問題なし。

  • WindowsパソコンをSoftEtherVPNクライアントとして接続するときは、パソコン上からクライアントアイコンをクリックすると左のイメージで画面が立ち上がります。
  • ラズパイのSoftEtherVPNクライアントの認証方法を変える場合には、WindowsパソコンからラズパイのIPアドレスを指定して接続して、左のイメージまで持ってこれます。

「SoftEtherVPNクライアント リモート管理」ツールで、SoftEtherVPNクライアントをリモート操作する)を参照

上欄のクライアントの設定で右クリックして
「プロパティ」をクリック。

SoftEtherVPNクライアントの接続方法を、固有証明書認証に変更します。

SoftEtherVPNクライアントの設定をこの画面から変更できます。

ユーザ認証が左イメージだと、「標準パスワード認証」で運用されているのがわかる。

これを「固有証明書認証」に変更します。

※ 前項で、サーバ側の処理を行い、鍵と証明書は
  作成済み

「標準パスワード認証」となっているのを、

「クライアント認証」に変更する

「クライアント証明書の指定」をクリック

保存してある固有証明書を指定

「開く」をクリック

保存してある秘密鍵を指定

「開く」をクリック

指定したパスフレーズを入力

「OK」をクリック

「OK」をクリック

接続先をダブルクリック

固有証明書認証で、SoftEtherVPNサーバに接続できた

※このとき、IPアドレス体系を変更していると、IPアドレスが新アドレスにまだ変更されていないので、ラズパイを立上げ直しする必要がある。

まとめ

SoftEtherでパスワード認証以外のデジタル証明書認証などを使いたいときのやり方でした。

当サイトでは、自前で作成した

を紹介していますが、このシステムではSoftEtherVPNを使っていますので、
この投稿内容「SoftEtherVPN に証明書認証を追加する」を利用できます。

また、AWSクラウド上にSoftEtherVPNServerを稼働して、拠点間のVPN通信を中継し、拠点のVPN通信を受け付けるサーバ環境の構築について、セットアップする手順を投稿しました。

Winパソコン、ラズパイをSoftEtherVPNの「ブリッジ」に設定る方法はこちらです。

ラズパイをSoftEtherVPNクライアントとする方法はこちらです。

その他のSoftEtherネタです。