OpenVPN で不要になったクライアント証明書を無効にし、該クライアントからの接続を拒否する
早速、OpenVPN のインストールから仮想ネットワークの接続、通信までの手順を簡単に解説してみます。
クライアント証明書を失効(無効)にして接続を拒否する方法
クライアント証明書を失効(無効)にして接続を拒否する方法には、まずは、クライアント証明書を 失効リスト crl.pem (CRL(Certificate Revocation List)ファイル) を作成します。
CRLファイル は、失効したいクライアント証明書を作成したサーバーで作成します。(失効までの管理を一括で行う上でも、運用上、クライアント証明書は、1つのサーバーで作成されるべきだと思います。)
さらにそのCRLファイルをOpenVPNに設定すればOKです。
ここでは、OpenVPNのサーバー および 認証局をはじめサーバー証明書からクライアント証明書まで全てを同じサーバーで管理していますから、そのサーバーで以下のような手順で行います。
- CRLファイル (失効したデジタル証明書のリスト) を作成します。
$ cd /etc/openvpn/easy-rsa/
[easy-rsa]$ . vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
[easy-rsa]$ ./revoke-full client_pc1
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Revoking Certificate 02.
Data Base Updated
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
client_pc1.crt: C = JP, ST = Tokyo, L = Setagaya, O = example.com, OU = changeme, CN = client_pc1, name = changeme, emailAddress = postmaster@example.com
error 23 at 0 depth lookup:certificate revoked
[easy-rsa]$ ls keys/
...
crl.pem
...
[easy-rsa]$ cp keys/crl.pem /etcv/openvpn/.
|
必ず、クライアント証明書のファイルが存在しないとCRLファイルの作成はできません。必ずクライアント証明書を作成したサーバーで実行してください。
もし、クライアント証明書がない場合は、以下のようなエラーが発生します。
[easy-rsa]$ ./revoke-full client_pc1
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Error opening client_pc1.crt client_pc1.crt
3078551276:error:02001002:system library:fopen:No such file or directory:bss_file.c:355:fopen('client_pc1.crt','r')
3078551276:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:357:
unable to load certificate
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Error opening certificate file client_pc1.crt
3078219500:error:02001002:system library:fopen:No such file or directory:bss_file.c:355:fopen('client_pc1.crt','r')
3078219500:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:357:
unable to load certificate
|
失効するクラインと証明書を追加したい場合は、単純に上記の手順を繰り返すだけです。
[easy-rsa]$ ./revoke-full client_pc999
...
|
これで、CRLファイル( crl.pem ) には、client_pc999 のクライアント証明書も追加されます。
更新したら、/etcv/openvpn へコピーするのを忘れないようにしましょう。
- OpenVPNサーバーにCRLファイル を設定します。
OpenVPNサーバーの設定ファイルは、/etc/openvpn/server.conf ですので、ここでは、その最終行に以下のように追記します。
...
management localhost 7505
crl-verify crl.pem
|
CRLファイルの設定は、最後の crl-verify … の箇所です。
management … については、失効したクライアント証明書からの接続を切断する方法 で解説します。
編集を終えたら、最後にOpenVPNをリスタートすればOKです。
$ /etc/init.d/openvpn restart
openvpn を停止中: [ OK ]
openvpn を起動中: [ OK ]
|
リスタートすることで、現在接続中のクライアントは、全部、再接続します。その際に、CRLファイルに設定されているクライナントについては、認証に失敗するようになります。
失効するクラインと証明書を追加したい場合は、先の手順でCRLファイル( crl.pem )にCRLファイルを更新すればOKです。
OpenVPNのリスタートは必要ありません。最長でも1時間以内にクライアントとの再接続が自動的に行われ、その再接続時に更新されたCRLファイルは読み込まれます。
失効したクライアント証明書を使ってOpenVPNサーバーへアクセスしてみてください。
先の接続拒否の設定がうまく機能していれば、OpenVPNサーバーのログ情報に CRL CHECK FAILED と出力されるでしょう。
...
Mon Nov 19 20:17:09 2012 us=533784 192.168.1.33:1194 CRL CHECK OK: /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=changeme/name=changeme/emailAddress=postmaster@example.com
Mon Nov 19 20:17:09 2012 us=533859 192.168.1.33:1194 VERIFY OK: depth=1, /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=changeme/name=changeme/emailAddress=postmaster@example.com
Mon Nov 19 20:17:09 2012 us=534136 192.168.1.33:1194 CRL CHECK FAILED: /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=client_pc1/name=changeme/emailAddress=postmaster@example.com is REVOKED
Mon Nov 19 20:17:09 2012 us=534350 192.168.1.33:1194 TLS_ERROR: BIO read tls_read_plaintext error: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
Mon Nov 19 20:17:09 2012 us=534379 192.168.1.33:1194 TLS Error: TLS object -> incoming plaintext read error
Mon Nov 19 20:17:09 2012 us=534395 192.168.1.33:1194 TLS Error: TLS handshake failed
Mon Nov 19 20:17:09 2012 us=534492 192.168.1.33:1194 SIGUSR1[soft,tls-error] received, client-instance restarting
...
|
失効したクライアント証明書からの接続を切断する方法
クライアント証明書を失効(無効)にして接続を拒否する方法 では、
OpenVPNのリスタートを実行するので、そこで再接続されます。その再接続で再認証が実行されますから、そこで接続拒否され、めでたしめでたしなのですが、
先に説明したように crl.pem さえ更新していれば、失効したクライアント証明書は、常に更新されていきますから、毎回、リスタートする必要はないのです。
例えば、たくさんのユーザが接続中なのに、1つの失効したクライアントのためだけにリスタートするのは、接続中のユーザには迷惑な話ですし、操作によっては、保障されない場合もあり、
簡単にリスタートできない場合もあります。
そういう時は、OpenVPNの管理インタフェースを利用すると良いです。
先のクライアント証明書の失効手順の中で、/etc/openvpn/server.conf の設定で以下の1行が追加されていました。これによって、telentを使ってデーモンプロセスの管理を行うことができます。
...
# OpenVPNの管理インタフェースを有効にする
management localhost 7505
...
|
以下のようにOpenVPNの管理インタフェースを使ってプロセスを削除することができます。
$ telnet localhost 7505
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
>INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
help
Management Interface for OpenVPN 2.2.2 i686-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] built on Apr 5 2012
Commands:
auth-retry t : Auth failure retry mode (none,interact,nointeract).
bytecount n : Show bytes in/out, update every n secs (0=off).
echo [on|off] [N|all] : Like log, but only show messages in echo buffer.
exit|quit : Close management session.
forget-passwords : Forget passwords entered so far.
help : Print this message.
hold [on|off|release] : Set/show hold flag to on/off state, or
release current hold and start tunnel.
kill cn : Kill the client instance(s) having common name cn.
kill IP:port : Kill the client instance connecting from IP:port.
load-stats : Show global server load stats.
log [on|off] [N|all] : Turn on/off realtime log display
+ show last N lines or 'all' for entire history.
mute [n] : Set log mute level to n, or show level if n is absent.
needok type action : Enter confirmation for NEED-OK request of 'type',
where action = 'ok' or 'cancel'.
needstr type action : Enter confirmation for NEED-STR request of 'type',
where action is reply string.
net : (Windows only) Show network info and routing table.
password type p : Enter password p for a queried OpenVPN password.
pid : Show process ID of the current OpenVPN process.
pkcs11-id-count : Get number of available PKCS#11 identities.
pkcs11-id-get index : Get PKCS#11 identity at index.
client-auth CID KID : Authenticate client-id/key-id CID/KID (MULTILINE)
client-auth-nt CID KID : Authenticate client-id/key-id CID/KID
client-deny CID KID R [CR] : Deny auth client-id/key-id CID/KID with log reason
text R and optional client reason text CR
client-kill CID : Kill client instance CID
env-filter [level] : Set env-var filter level
client-pf CID : Define packet filter for client CID (MULTILINE)
signal s : Send signal s to daemon,
s = SIGHUP|SIGTERM|SIGUSR1|SIGUSR2.
state [on|off] [N|all] : Like log, but show state history.
status [n] : Show current daemon status info using format #n.
test n : Produce n lines of output for testing/debugging.
username type u : Enter username u for a queried OpenVPN username.
verb [n] : Set log verbosity level to n, or show if n is absent.
version : Show current version number.
http-proxy-fallback <server> <port> [flags] : Enter dynamic HTTP proxy fallback info.
http-proxy-fallback-disable : Disable HTTP proxy fallback.
END
status
OpenVPN CLIENT LIST
Updated,Mon Nov 19 22:13:04 2012
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client_pc1,192.168.1.33:1194,20027,8935,Mon Nov 19 22:10:18 2012
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.50,client_pc1,192.168.1.33:1194,Mon Nov 19 22:10:18 2012
GLOBAL STATS
Max bcast/mcast queue length,0
END
kill client_pc1
SUCCESS: common name 'client_pc1' found, 1 client(s) killed
status
OpenVPN CLIENT LIST
Updated,Mon Nov 19 22:14:23 2012
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
GLOBAL STATS
Max bcast/mcast queue length,0
END
exit
Connection closed by foreign host.
$
|
telnet にて7505ポートにアクセスすることでOpenVPNの管理インタフェースへ接続できます。以降は、ここで使用したコマンドです。
help:文字通りヘルプです。
status:現在の接続状態を出力します。
kill client_pc1:クライアントclient_pc1を切断します。
exit:OpenVPNの管理インタフェースへ接続を終了します。
これで、openvpnのリスタートなしに切断したいプロセスのみを切断することができます。
クライアント側は、切断通知が来るわけではないので、接続されたままのような状態になっていると思います。
ただ、この状態で、OpenVPNクライアントからOpenVPNサーバーへpingを発行すると、「要求がタイムアウトしました。」となります。
C:\> ping 10.8.0.1
10.8.0.1 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
10.8.0.1 の ping 統計:
パケット数: 送信 = 1、受信 = 0、損失 = 1 (100% の損失)、
Ctrl+C
^C
|
これで完全に切断されているのが確認できました。
失効したクライアント証明書を解除したいとの対処(おまけ)
クライアント証明書を失効(無効)にして接続を拒否する方法 では、
CRLファイルを作成する際、失効するクライアントは追加されていきますが、間違って失効してしまったクライアントはもとに戻せません。
ただ、失効を解除できないか?というと手がないわけではありません。ここでは、その手順を簡単に解説してみます。
ただ、これは、イリーガルな方法だと思うので、やられる場合はあくまで自己責任でお願いします。
/etc/openvpn/easy-rsa/keys/index.txt を編集します。以下は、そのダンプイメージです。
V 221114104811Z 01 unknown /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=server/name=changeme/emailAddress=postmaster@example.com
R 221114105501Z 121119105813Z 02 unknown /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=client_pc1/name=changeme/emailAddress=postmaster@example.com
R 221117105640Z 121119105703Z 03 unknown /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=dummy/name=changeme/emailAddress=postmaster@example.com
R 221117112423Z 121119112454Z 04 unknown /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=client_dummy/name=changeme/emailAddress=postmaster@example.com
|
この中でclient_pc1の失効を解除してみます。
V 221114104811Z 01 unknown /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=server/name=changeme/emailAddress=postmaster@example.com
RV 221114105501Z 121119105813Z 02 unknown /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=client_pc1/name=changeme/emailAddress=postmaster@example.com
R 221117105640Z 121119105703Z 03 unknown /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=dummy/name=changeme/emailAddress=postmaster@example.com
R 221117112423Z 121119112454Z 04 unknown /C=JP/ST=Tokyo/L=Setagaya/O=example.com/OU=changeme/CN=client_dummy/name=changeme/emailAddress=postmaster@example.com
|
まずは、CN=client_pc1 を検索します。その行が、client_pc1の情報になります。
先頭のRはrevoke(失効)の意味です。これをVへ変更します。
次にTABによる3カラム目は、revokeされた日付情報?なので、これを削除します。
これで保存して、再度、CRLファイル( crl.pem ) を作成してみてください。client_pc1は失効リストから無くなっているはすです。
クライアント証明書の管理は、ちゃんとやっておかないと、非常にリスキーです。
特に使わなくなったクライアント証明書は、直ちに失効し、接続できないようにしておく必要があります。
上記に手順がすべてではありませんが、すくなくともこの程度の知識があると、すぐに失効できると思います。
もし、手元に使わなくなったクライアント証明書があるなら、直ちに失効しましょう。
コメントを投稿 :