
今回は、OpenVPN を使って仮想LAN接続してみる の補足です。
SSL 認証 の仕組みと OpenVPN の認証の仕組み の認証方法からクライアント証明書、クライアント秘密鍵が正しいものであれば、設定にもよりますが、かなりの確率で、OpenVPNは、いつでもどこでも接続できてしまいます。
つまり、古いユーザなどにクライアント証明書、クライアント秘密鍵を発行していた場合、そのユーザは、いつまでもOpenVPNに接続できてしまいます。
それでは、困りますね。
そこで今回は、その不要になったクライアント証明書を失効(無効)にして接続を拒否する方法、また、すでに接続済の場合は、切断する方法について簡単に解説してみます。
- 目次
- 履歴
2013年1月16日 初版
OpenVPN で不要になったクライアント証明書を無効にし、該クライアントからの接続を拒否する
早速、OpenVPN のインストールから仮想ネットワークの接続、通信までの手順を簡単に解説してみます。
クライアント証明書を失効(無効)にして接続を拒否する方法
クライアント証明書を失効(無効)にして接続を拒否する方法には、まずは、クライアント証明書を 失効リスト crl.pem (CRL(Certificate Revocation List)ファイル) を作成します。
CRLファイル は、失効したいクライアント証明書を作成したサーバーで作成します。(失効までの管理を一括で行う上でも、運用上、クライアント証明書は、1つのサーバーで作成されるべきだと思います。)
さらにそのCRLファイルをOpenVPNに設定すればOKです。
ここでは、OpenVPNのサーバー および 認証局をはじめサーバー証明書からクライアント証明書まで全てを同じサーバーで管理していますから、そのサーバーで以下のような手順で行います。
- CRLファイル (失効したデジタル証明書のリスト) を作成します。
$ cd /etc/openvpn/easy-rsa/
# パラメータファイル vars を読み込みます [easy-rsa]$ . vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys # CRLファイルを作成します [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 # CRLファイル crl.pem が作成されたか確認します。 [easy-rsa]$ ls keys/
... crl.pem # これがCRLファイル (Certificate Revocation List) 失効したデジタル証明書のリスト ... # keys ディレクトリはroot以外読み込み不可なので、/etcv/openvpn へコピーします。 [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
失効するクラインと証明書を追加したい場合は、単純に上記の手順を繰り返すだけです。
これで、CRLファイル( crl.pem ) には、client_pc999 のクライアント証明書も追加されます。[easy-rsa]$ ./revoke-full client_pc999
...
更新したら、/etcv/openvpn へコピーするのを忘れないようにしましょう。
- OpenVPNサーバーにCRLファイル を設定します。
OpenVPNサーバーの設定ファイルは、/etc/openvpn/server.conf ですので、ここでは、その最終行に以下のように追記します。
... # OpenVPNの管理インタフェースを有効にする 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 と出力されるでしょう。
|
失効したクライアント証明書からの接続を切断する方法
クライアント証明書を失効(無効)にして接続を拒否する方法 では、
OpenVPNのリスタートを実行するので、そこで再接続されます。その再接続で再認証が実行されますから、そこで接続拒否され、めでたしめでたしなのですが、
先に説明したように crl.pem さえ更新していれば、失効したクライアント証明書は、常に更新されていきますから、毎回、リスタートする必要はないのです。
例えば、たくさんのユーザが接続中なのに、1つの失効したクライアントのためだけにリスタートするのは、接続中のユーザには迷惑な話ですし、操作によっては、保障されない場合もあり、
簡単にリスタートできない場合もあります。
そういう時は、OpenVPNの管理インタフェースを利用すると良いです。
先のクライアント証明書の失効手順の中で、/etc/openvpn/server.conf の設定で以下の1行が追加されていました。これによって、telentを使ってデーモンプロセスの管理を行うことができます。
|
以下のようにOpenVPNの管理インタフェースを使ってプロセスを削除することができます。
|
telnet にて7505ポートにアクセスすることでOpenVPNの管理インタフェースへ接続できます。以降は、ここで使用したコマンドです。
help:文字通りヘルプです。
status:現在の接続状態を出力します。
kill client_pc1:クライアントclient_pc1を切断します。
exit:OpenVPNの管理インタフェースへ接続を終了します。
これで、openvpnのリスタートなしに切断したいプロセスのみを切断することができます。
クライアント側は、切断通知が来るわけではないので、接続されたままのような状態になっていると思います。 ただ、この状態で、OpenVPNクライアントからOpenVPNサーバーへpingを発行すると、「要求がタイムアウトしました。」となります。
|
これで完全に切断されているのが確認できました。
失効したクライアント証明書を解除したいとの対処(おまけ)
クライアント証明書を失効(無効)にして接続を拒否する方法 では、
CRLファイルを作成する際、失効するクライアントは追加されていきますが、間違って失効してしまったクライアントはもとに戻せません。
ただ、失効を解除できないか?というと手がないわけではありません。ここでは、その手順を簡単に解説してみます。
ただ、これは、イリーガルな方法だと思うので、やられる場合はあくまで自己責任でお願いします。
/etc/openvpn/easy-rsa/keys/index.txt を編集します。以下は、そのダンプイメージです。
|
この中でclient_pc1の失効を解除してみます。
|
まずは、CN=client_pc1 を検索します。その行が、client_pc1の情報になります。
先頭のRはrevoke(失効)の意味です。これをVへ変更します。
次にTABによる3カラム目は、revokeされた日付情報?なので、これを削除します。
これで保存して、再度、CRLファイル( crl.pem ) を作成してみてください。client_pc1は失効リストから無くなっているはすです。
特に使わなくなったクライアント証明書は、直ちに失効し、接続できないようにしておく必要があります。
上記に手順がすべてではありませんが、すくなくともこの程度の知識があると、すぐに失効できると思います。
もし、手元に使わなくなったクライアント証明書があるなら、直ちに失効しましょう。
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
コメントを投稿 :