レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

C6 S6

OpenVPN で不要になったクライアント証明書を無効にし、該クライアントからの接続を拒否する

2013年1月16日 2014年1月15日
virtual lan opnevpn

今回は、OpenVPN を使って仮想LAN接続してみる の補足です。

SSL 認証 の仕組みと OpenVPN の認証の仕組み の認証方法からクライアント証明書、クライアント秘密鍵が正しいものであれば、設定にもよりますが、かなりの確率で、OpenVPNは、いつでもどこでも接続できてしまいます。 つまり、古いユーザなどにクライアント証明書、クライアント秘密鍵を発行していた場合、そのユーザは、いつまでもOpenVPNに接続できてしまいます。

それでは、困りますね。

そこで今回は、その不要になったクライアント証明書を失効(無効)にして接続を拒否する方法、また、すでに接続済の場合は、切断する方法について簡単に解説してみます。

OpenVPN で不要になったクライアント証明書を無効にし、該クライアントからの接続を拒否する

早速、OpenVPN のインストールから仮想ネットワークの接続、通信までの手順を簡単に解説してみます。

クライアント証明書を失効(無効)にして接続を拒否する方法

クライアント証明書を失効(無効)にして接続を拒否する方法には、まずは、クライアント証明書を 失効リスト crl.pem (CRL(Certificate Revocation List)ファイル) を作成します。 CRLファイル は、失効したいクライアント証明書を作成したサーバーで作成します。(失効までの管理を一括で行う上でも、運用上、クライアント証明書は、1つのサーバーで作成されるべきだと思います。)

さらにそのCRLファイルをOpenVPNに設定すればOKです。

ここでは、OpenVPNのサーバー および 認証局をはじめサーバー証明書からクライアント証明書まで全てを同じサーバーで管理していますから、そのサーバーで以下のような手順で行います。

  1. 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
    失効するクラインと証明書を追加したい場合は、単純に上記の手順を繰り返すだけです。
    [easy-rsa]$ ./revoke-full client_pc999
    ...
    これで、CRLファイル( crl.pem ) には、client_pc999 のクライアント証明書も追加されます。
    更新したら、/etcv/openvpn へコピーするのを忘れないようにしましょう。

  2. 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 と出力されるでしょう。

...
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 7505return
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
helpreturn
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
statusreturn
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_pc1return
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
exitreturn
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は失効リストから無くなっているはすです。


クライアント証明書の管理は、ちゃんとやっておかないと、非常にリスキーです。
特に使わなくなったクライアント証明書は、直ちに失効し、接続できないようにしておく必要があります。
上記に手順がすべてではありませんが、すくなくともこの程度の知識があると、すぐに失効できると思います。
もし、手元に使わなくなったクライアント証明書があるなら、直ちに失効しましょう。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

OpenVPN を使って仮想LAN接続してみる

Samba を使ってファイル共有してみる では、Sambaを使ってファイル、ディレクトリの共有を行ってみました。 ただ、Sambaをそのままイ ...

SSL 認証 の仕組みと OpenVPN の認証の仕組み

OpenVPN を使って仮想LAN接続してみる で、OpenVPNを使った仮想プライベートネットワークを構築してみました。 その際に、簡単にO ...

WindowsでOpenVPNへのクライアント接続を自動化する

ここまで、以下のようにOpenVPNおよびSambaに関して記事を書いてきました。 Samba を使ってファイル共有してみる ...

プライベート認証局の証明書、サーバー証明書、クライアント証明書の作成方法について

このサイトでもSSL関連の記事も増えてきました。SSLを使うためには、SSL用の各証明書が必要になります。 その作成手順が、各ツールでバラバラ ...

OpenVPN 上で Samba を使うための設定

以下の記事で Samba の設定、OpenVPN の設定を行ってみました。 Samba を使ってファイル共有してみる OpenVPN ...



コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2460 [s]