それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

OpenVPNのシンプルな接続に共通鍵(鍵ファイル)による認証を加える

OpenVPNを起動するときに、共通鍵ファイルを使用する

前回で、基本的なつなぎ方とコマンドがわかったので、認証方式を変更します。

鍵ファイルを作成して共有することでパスワード認証と同様に共有鍵でクライアントを認証します。

クライアント・サーバーでお互いに同じファイルを共有し、同じファイルを持っていることで本人確認とします。

固有鍵を作成する。

事前に鍵を共有することで認証します。鍵の作成は openvpn コマンドに含まれています。

openvpn --genkey --secret static.key

実例

固有鍵を作ったときの例です。

root@:~# openvpn --genkey --secret static.key
root@:~# cat static.key
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
8a0487a4ab6a2cb694510238347ea9d7
71f28051d4b00ad49f6d85fc7ffabb4d
bcaa5b5be249b3211dca11ff6ab03dd6
650c03577041a3b27eab9dce57c1b235
0aaa2275f5bff563236b796cc5402c73
7bf696a0f40685637bffb185f706371e
3fa2c8c88a3e178378e6b49ce8da0293
ebab45862b805c2528f217715f5069aa
dfbd1c95ba44ce5e97e352fd6617fce5
a40d0fcafd87004cd831f7c3669ffb7a
e3db41da10358febc6b1162c7ee42f6b
7862442659c229562ef39c96ed83c3d4
6173091a2e405d7fb1d40a890f99b85a
f3b1912eb5e63a39f9c12cfd40b19280
7641dc52bfafe92d42f38e96356ba9d9
0cbefe27eb8e4909f49d057d26f990d2
-----END OpenVPN Static key V1-----

鍵ファイルを任意の場所に設置

今回は、次の場所に、を固定鍵を次の場所に設置しました。

cp secret.key /etc/openvpn/secret.key

サーバーを起動

鍵ファイルを使って認証をするサーバーを起動します。

サーバーの起動方法は前回と同じです。前回と異なるのは、鍵ファイルを指定します。

openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 --secret /etc/openvpn/secret.key

実際の例です。

root@:/etc/openvpn# openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 --secret /etc/openvpn/secret.key
Fri Feb 14 14:34:47 2020 disabling NCP mode (--ncp-disable) because not in P2MP client or server mode
Fri Feb 14 14:34:47 2020 OpenVPN 2.4.7 x86_64-openwrt-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD]
Fri Feb 14 14:34:47 2020 library versions: OpenSSL 1.1.1d  10 Sep 2019, LZO 2.10
Fri Feb 14 14:34:47 2020 WARNING: INSECURE cipher with block size less than 128 bit (64 bit).  This allows attacks like SWEET32.  Mitigate by using a --cipher with a larger block size (e.g. AES-256-CBC).
Fri Feb 14 14:34:47 2020 WARNING: INSECURE cipher with block size less than 128 bit (64 bit).  This allows attacks like SWEET32.  Mitigate by using a --cipher with a larger block size (e.g. AES-256-CBC).
Fri Feb 14 14:34:47 2020 TUN/TAP device tun1 opened
Fri Feb 14 14:35:21 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Fri Feb 14 14:35:21 2020 Initialization Sequence Completed

クライアント側

クライアント側でも共有鍵を使って接続します。

鍵の転送

共有鍵はSCPなどで転送しておきます。

takuya@openvpn$ scp router:/etc/openvpn/secret.key  ~/Desktop/openvpn
secret.key

クライアント側で、共有鍵を使ってサーバーに接続します。

sudo openvpn --remote 192.168.1.1 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 --secret secret.key

こちらも、起動方法は、シンプルです。鍵ファイルを指定するオプションが前回に比べて増えます。

実際の接続例です。

takuya@openvpn$ sudo openvpn --remote 192.168.2.1 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 --secret secret.key
Fri Feb 14 14:35:09 2020 OpenVPN 2.4.8 x86_64-apple-darwin17.7.0 [SSL (OpenSSL)] [LZO] [LZ4] [PKCS11] [MH/RECVDA] [AEAD] built on Nov  1 2019
Fri Feb 14 14:35:21 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Fri Feb 14 14:35:21 2020 Initialization Sequence Completed

もし鍵を指定せずに接続した場合

共有鍵をなしで接続しようとしたら接続開始ができなくて止まります。

takuya@openvpn$ sudo openvpn --remote 192.168.1.1 --dev tun1 --ifconfig 10.9.8.2 10.9.8.1
Fri Feb 14 14:37:52 2020 library versions: OpenSSL 1.1.1d  10 Sep 2019, LZO 2.10
Fri Feb 14 14:37:52 2020 ******* WARNING *******: All encryption and authentication features disabled -- All data will be tunnelled as clear text and will not be protected against man-in-the-middle changes. PLEASE DO RECONSIDER THIS CONFIGURATION!
Fri Feb 14 14:37:52 2020 Opened utun device utun1
Fri Feb 14 14:37:52 2020 UDP link local (bound): [AF_INET][undef]:1194
Fri Feb 14 14:37:52 2020 UDP link remote: [AF_INET]192.168.1.1:1194
## 接続試行をずっとしてる

サーバー側のログには、認証失敗のメッセージが出てきます。

root@:/etc/openvpn# openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 --secret /etc/openvpn/secret.key
Fri Feb 14 14:35:21 2020 Initialization Sequence Completed
Fri Feb 14 14:38:02 2020 Authenticate/Decrypt packet error: missing authentication info
Fri Feb 14 14:38:12 2020 Authenticate/Decrypt packet error: missing authentication info
Fri Feb 14 14:38:22 2020 Authenticate/Decrypt packet error: missing authentication info
Fri Feb 14 14:38:33 2020 Authenticate/Decrypt packet error: missing authentication info
Fri Feb 14 14:38:43 2020 Authenticate/Decrypt packet error: missing authentication info

共有鍵を使う

ここで試したことは、共有鍵を使って認証してVPNのトンネルを接続が可能になる。 鍵を持っていない認証されてないユーザーを拒否する事ができています。

認証方式には、他にも数限りなく選択肢があります。OpenVPNで一般的なのはCAをつかった証明書ですが、証明書の作り方、それはOpenSSLとCAそのものの話なので、OpenVPNとはかなり別の話題です。

単純な認証であれば、共通鍵で十分だと思います。

その他にも

  • 証明書を使う
  • 共通鍵を使う
  • auth-user-pass を使う
    • Linuxのユーザー名パスワードで認証する( PAM )
    • 独自スクリプトで認証する。

などが可能です。PAM通ればもうなんでもありですよね。PostgreSQLのテーブルに問い合わせるとかもできそう。時間コストに見合わないので流石にやらないけど。

次回

次回は、今回の共通鍵の 接続設定を ovpn ファイルしてみたいと思います。