OpenVPNを触る
環境
VirtualBoxにUbuntu Desktopを2台用意。1つをOpenVPNサーバー及びCAサーバー、もう1つをクライアントとして利用。
以下、Ubuntuの環境。
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
インストール
$ sudo apt install openvpn
$ openvpn --version
OpenVPN 2.6.9 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
library versions: OpenSSL 3.0.13 30 Jan 2024, LZO 2.10
DCO version: N/A
Originally developed by James Yonan
Copyright (C) 2002-2023 OpenVPN Inc <sales@openvpn.net>
Compile time defines: enable_async_push=no enable_comp_stub=no enable_crypto_ofb_cfb=yes enable_dco=yes enable_dco_arg=yes enable_debug=yes enable_dependency_tracking=no enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=needless enable_fragment=yes enable_iproute2=no enable_libtool_lock=yes enable_lz4=yes enable_lzo=yes enable_maintainer_mode=no enable_management=yes enable_option_checking=no enable_pam_dlopen=no enable_pedantic=no enable_pkcs11=yes enable_plugin_auth_pam=yes enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no enable_shared=yes enable_shared_with_static_runtimes=no enable_silent_rules=no enable_small=no enable_static=yes enable_strict=no enable_strict_options=no enable_systemd=yes enable_unit_tests=no enable_werror=no enable_win32_dll=yes enable_wolfssl_options_h=yes enable_x509_alt_username=yes with_aix_soname=aix with_crypto_library=openssl with_gnu_ld=yes with_mem_check=no with_openssl_engine=auto with_sysroot=no
公開鍵基盤の作成
easy-rsaのインストール
easy-rsaはPKI(公開鍵基盤)を作成・管理できるツール。
開発元がOpenVPN(OpenVPN Technologies, Inc.)と同じで、OpenVPNのドキュメントにも本ツールの利用が案内されている。
$ sudo apt install easy-rsa
PKIの初期化
$ cd /usr/share/easy-rsa # 私の環境ではeasy-rsaはこのディレクトリに導入されました。
$ sudo ./easyrsa init-pki
[sudo] password for ubuntu:
Notice
------
'init-pki' complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /usr/share/easy-rsa/pki
Using Easy-RSA configuration:
* undefined
CAの公開証明書の作成
$ sudo ./easyrsa build-ca
No Easy-RSA 'vars' configuration file exists!
Using SSL:
* openssl OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)
Enter New CA Key Passphrase: #今回は試験的な動作のため「easyrsa」と記入。
Confirm New CA Key Passphrase:
...+....+.....+...+....+...+..+...+....+.....+..
……
++++++++
-----
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:openvpn-test.com # 今回は試験的な動作のため仮の名前を配置。本来書いている通りユーザー名、ホスト名、サーバー名などを割り当てるべき
Notice
------
CA creation complete. Your new CA certificate is at:
* /usr/share/easy-rsa/pki/ca.crt
/usr/share/easy-rsa/pki/ca.crt
の内容を確認する。
以下が確認できる。
- コモンネームには先ほど設定した
openvpn-test.com
が記述されている - 署名アルゴリズムはSHA-2(SHA-256によって内容をハッシュ化、RSA暗号方式によって暗号化し署名作成)
- 暗号化アルゴリズムはRSA
- 署名は作成日から10年間有効
- 署名有効期間のタイムスタンプはGMTで書かれる(日本時間は+9時間。)
$ sudo openssl x509 -text -noout -in pki/ca.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
...
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = openvpn-test.com
Validity
Not Before: Jun 15 16:19:07 2024 GMT
Not After : Jun 13 16:19:07 2034 GMT
Subject: CN = openvpn-test.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
暗号化用の秘密鍵は pki/private/ca.key
に格納されている。
$ sudo cat pki/private/ca.key
-----BEGIN ENCRYPTED PRIVATE KEY-----
……
-----END ENCRYPTED PRIVATE KEY-----
OpenVPN側のファイル準備
CAの公開証明書の作成
今回はeasy-rsaとOpenVPNは同一マシン上で機能させるため、単純にコピーする。別サーバーに存在する場合、scp
などによるファイル転送を行う必要がある。
$ sudo cp pki/ca.crt /etc/openvpn/server/
OpenVPNサーバー証明書要求ファイルと秘密鍵ファイルの作成
今回はeasy-rsaとOpenVPNは同一マシン上で機能させるため、特にプロンプトやディレクトリパスの移動は行わない。
サーバーを分離させる場合は本操作はOpenVPN側で行う必要がある。
$ sudo ./easyrsa gen-req openvpn-test.com nopass
No Easy-RSA 'vars' configuration file exists!
Using SSL:
* openssl OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)
...
-----
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.
-----
Common Name (eg: your user, host, or server name) [openvpn-test.com]: # 何も入力せずにエンターキー
Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /usr/share/easy-rsa/pki/reqs/openvpn-test.com.req
* key: /usr/share/easy-rsa/pki/private/openvpn-test.com.key
証明書要求を確認すると以下のことがわかる。
- コモンネームには先ほど設定した
openvpn-test.com
が記述されている - 暗号化アルゴリズムはRSA
- 署名アルゴリズムはSHA-2
$ openssl req -noout -text -in pki/reqs/openvpn-test.com.req
Certificate Request:
Data:
Version: 1 (0x0)
Subject: CN = openvpn-test.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Attributes:
(none)
Requested Extensions:
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
...
キーはOpenVPNサーバーに配置する
$ sudo cd /usr/share/easy-rsa/pki/private/openvpn-test.com.key /etc/openvpn/server
Diffie-Hellman (DH) パラメータファイルの作成
$ sudo openssl dhparam -out /etc/openvpn/server/dh.pem 2048
HMAC鍵ファイルの作成
$ sudo openvpn --genkey secret /etc/openvpn/server/ta.key
OpenVPNクライアント側のファイル準備
この操作はクライアント側で行う。クライアント側ではopen-rsaはインストールされていないため、そこから始める。
$ sudo apt install easy-rsa
$ cd /usr/share/easy-rsa
$ sudo ./easyrsa init-pki
$ sudo ./easyrsa gen-req openvpn-test-client.com nopass
CAによる署名
$ sudo cp /usr/share/easy-rsa/pki/openvpn-test.req /tmp
$ sudo ./easyrsa import-req /tmp/openvpn-test.com.req openvpn-test-server
No Easy-RSA 'vars' configuration file exists!
Using SSL:
* openssl OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)
Notice
------
Request successfully imported with short-name: openvpn-test-server
This request is now ready to be signed.
サーバー
$ sudo cp /usr/share/easy-rsa/pki/reqs/openvpn-test-client.com.req /tmp # サーバー
クライアント
$ sudo scp /usr/share/easy-rsa/pki/reqs/openvpn-test-client.com.req ubuntu@192.168.0.8:/tmp # 前提としてCAサーバーに対してSSH通信が可能である必要がある
証明書要求のインポート
$ sudo ./easyrsa import-req /tmp/openvpn-test-server.com.req openvpn-test-server # OpenVPNサーバーとCAサーバーが同居している場合は必要ない。
$ sudo ./easyrsa import-req /tmp/openvpn-test-client.com.req openvpn-test-client
No Easy-RSA 'vars' configuration file exists!
Using SSL:
* openssl OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)
Notice
------
Request successfully imported with short-name: openvpn-test-client
This request is now ready to be signed.
証明書要求ファイルをeasy-rsa/pki/reqs
に移動し、短縮名として指定した openvpn-test-client
や openvpn-test-server
を命名している。
署名
$ sudo ./easyrsa sign-req server openvpn-test-server
$ sudo ./easyrsa sign-req client openvpn-test-client
No Easy-RSA 'vars' configuration file exists!
Using SSL:
* openssl OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)
You are about to sign the following certificate:
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a client certificate
for '825' days:
subject=
commonName = openvpn-test-client.com
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes #yesと入力
Using configuration from /usr/share/easy-rsa/pki/openssl-easyrsa.cnf
Enter pass phrase for /usr/share/easy-rsa/pki/private/ca.key: # build-ca実行時に指定したパスワードを入力。今回は「easyrsa」。
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'openvpn-test-client.com'
Certificate is to be certified until Sep 25 11:44:34 2026 GMT (825 days)
Write out database with 1 new entries
Database updated
Notice
------
Certificate created at:
* /usr/share/easy-rsa/pki/issued/openvpn-test-client.crt
これによって署名済みの証明書の作成が完了する。
sudo openssl x509 -text -noout -in pki/issued/openvpn-test-client.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
...
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = openvpn-test.com # 発行者のコモンネーム
Validity
Not Before: Jun 22 11:44:34 2024 GMT
Not After : Sep 25 11:44:34 2026 GMT
Subject: CN = openvpn-test-client.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
...
証明書の返却
クライアントへの返却
$ sudo cp pki/issued/openvpn-test-client.crt /tmp
$ sudo scp /tmp/openvpn-test-client.crt {クライアント側のユーザー名}@{クライアントのホスト名またはIPアドレス}:/tmp
$ sudo scp ca.crt {クライアント側のユーザー名}@{クライアントのホスト名またはIPアドレス}:/tmp
$ sudo scp /etc/openvpn/server/ta.key {クライアント側のユーザー名}@{クライアントのホスト名またはIPアドレス}:/tmp
...
openvpn-test-client. 100% 4557 1.2MB/s 00:00
OpenVPNで証明書を読み取れるように配置
$ sudo cp /tmp/openvpn-test-client.crt /etc/openvpn/client/
$ sudo cp /tmp/ca.crt /etc/openvpn/client/
$ sudo cp /tmp/ta.key /etc/openvpn/client/
サーバーへの返却
# 今回はOpenVPNサーバーとCAサーバーが同居しているので単純なファイルコピーを行う。分離している場合はクライアントのようにscp等による転送を行う
$ sudo cp /usr/share/easy-rsa/pki/issued/openvpn-test-client.crt /etc/openvpn/server/
OpenVPNサーバーの準備
サンプルの.confファイルを参考に設定ファイルを作成/編集する。
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
$ sudo nano server.conf
内容は以下とする。
tls-server
port 1194
proto udp
dev tun
ca ca.crt
cert openvpn-test-server.crt
key openvpn-test-server.com.key
dh dh.pem
tls-auth ta.key 0
$ sudo openvpn server.conf
2024-06-24 21:45:14 OpenVPN 2.6.9 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
2024-06-24 21:45:14 library versions: OpenSSL 3.0.13 30 Jan 2024, LZO 2.10
2024-06-24 21:45:14 DCO version: N/A
2024-06-24 21:45:14 TUN/TAP device tun0 opened
2024-06-24 21:45:14 Could not determine IPv4/IPv6 protocol. Using AF_INET
2024-06-24 21:45:14 UDPv4 link local (bound): [AF_INET][undef]:1194
2024-06-24 21:45:14 UDPv4 link remote: [AF_UNSPEC]
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client/
$ sudo cd /etc/openvpn/client/
$ sudo nano client.cnf
編集内容は以下の通り。remote
の行にはサーバーのIPアドレスまたは名前を入力する。
client
dev tun
proto udp
remote {IPアドレスまたは名前} 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert openvpn-test-client.crt
key openvpn-test-client.com.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
以下のコマンドでサーバーに対してクライアントに接続する。
$ sudo openvpn client.cnf
Discussion