OpenVPN&セキュリティ情報
2011-12-06
OpenVPN sqlite認証プラグイン
English version is here.
OpenVPNでsqliteをデータベースとして使用し、ID/パスワードを使って認証するためのプラグインです。pythonで書かれていますので、必要に応じて変更してお使いください。
このプラグインは無保証で提供されています。ご利用の環境によっては正しく動作しない可能性があります。また、このプラグインの使用によって生じた損害(直接、間接を問わず)の責任を作者は一切負いません。
使用方法
ユーザーデータベースの準備
認証に使用するユーザーIDとパスワードを保持するsqliteデータベースファイルを用意します。サンプルデータベースではデータベースのテーブル名は「Users」、IDを「UserId」フィールド、パスワードを「Password」フィールド、有効/無効フラグを「Active」フィールドに設定していますが、auth-sqlite.py
内のSQLを書き換えれば任意のスキーマに対応できます。UserId | Password ※ | Active |
---|---|---|
gonbe | naisho#0023 | 1 |
jdoe | Da-reMO_shiRANA1 | 1 |
haruka | QueenS#1*2 | 1 |
hide | monkey%55! | 0 |
- Windows上でsqliteデータベースを扱うにはPupSQLiteがお手軽でお勧めです。
- 上のテーブルではパスワードを平文で記載していますが、データベース内に格納するパスワードはRIPEMD160でハッシュ化します。ブラウザでのハッシュ化にはこのサイトが便利です(出力結果の「hex」を使います)。
プラグインファイルの配置
auth-sqlite.py
をOpenVPNサーバーに設置します。通常は/etc/openvpn
の中などがわかりやすいと思います。このとき、auth-sqlite.py
に実行権限を付与しておくことを忘れないようにしてください。OpenVPNサーバー設定ファイルの編集
OpenVPNサーバー設定ファイルに以下の記述を追加します。script-security 2 client-cert-not-required username-as-common-name setenv auth_sqlite_db /etc/openvpn/vpnusers.db auth-user-pass-verify /etc/openvpn/auth-sqlite.py via-file
script-security 2 |
---|
プラグインとして外部プログラムを呼び出す際にはこの値を2か3に設定する必要があります。この設定のデフォルト値は1で、この場合はifconfig やroute コマンドなどのOS組み込みコマンドしか実行できません。 |
client-cert-not-required |
クライアント証明書による認証を不要にします。ID/パスワードのみで認証するようにしたいときにはこのディレクティブが必要です。 |
username-as-common-name |
認証で使用するユーザー名(ID)を証明書の共通名(common name)として使用します。これは特にCCD(クライアント構成ディレクトリ:Client Configuration Directory)を使用する際などに必要になります。 |
setenv auth_sqlite_db /etc/openvpn/vpnusers.db |
ユーザーデータベースとして使用するsqliteデータベースファイルをauth_sqlite_db という環境変数に設定します。スクリプト内でこの環境変数に設定された値を読み込み、データベースに接続します。 |
auth-user-pass-verify /etc/openvpn/auth-sqlite.py via-file |
認証プラグインとして使用するファイルの位置をフルパスで指定します(スクリプトの場合はpluginディレクティブではないのでご注意を)。2番目の引数は、認証情報をOpenVPNからスクリプトに受け渡す方法を指定します。「via-file(ファイル経由)」か「via-env(環境変数経由)」のいずれかになります。 |
OpenVPNクライアントから接続!
OpenVPNクライアントから接続を試してみましょう。auth-user-pass
ディレクティブを指定し、ID/パスワード認証を使用するように設定します。設定が簡単な vpnux Connector Lite がお勧めです。
サーバーのログ
OpenVPNサーバーのログには認証結果が以下のように記録されています。まずは認証に成功した場合。最後から2番目の行の数字は、データベースを検索した結果、IDとパスワードでの検索でヒットした行数です(つまり「1」なら認証OKということですね)。[auth-sqlite] sqlite_file : /etc/openvpn/vpnusers.db [auth-sqlite] filename : /tmp/openvpn_up_a4f9bc76dbe81514ae0628285c328616.tmp [auth-sqlite] username : hide [auth-sqlite] password : monkey%55! [auth-sqlite] hashedPassword : f5d003945021de1e376559db7fc13b227ae1792d 1 [auth-sqlite] Authentication succeed.そして認証に失敗した場合です。
[auth-sqlite] sqlite_file : /etc/openvpn/vpnusers.db [auth-sqlite] filename : /tmp/openvpn_up_ebd6f2c1fa0662a4cf2b160f50b835a7.tmp [auth-sqlite] username : hide [auth-sqlite] password : damedame*password [auth-sqlite] hashedPassword : a6f144628d9619d725397e8cce709288d5ad81e1 0 [auth-sqlite] Authentication failed.認証に成功した場合は終了コード 0で、認証に失敗した場合は終了コード 1で終了させると、その終了コードを受け取ったOpenVPNサーバーが認証結果をクライアントに送信します。
ソースコード:auth-sqlite.py
#!/usr/bin/python import os import sys import hashlib try: import sqlite3 except: from pysqlite2 import dbapi2 as sqlite3 ## Read settings from config sqlite_file = os.environ["auth_sqlite_db"] print "[auth-sqlite] sqlite_file : " + sqlite_file ## Read username and password from via-file filename = sys.argv[1] print "[auth-sqlite] filename : " + filename fp = open(filename) data = fp.readlines() fp.close() username = data[0].rstrip() password = data[1].rstrip() print "[auth-sqlite] username : " + username print "[auth-sqlite] password : " + password h = hashlib.new("ripemd160") h.update(password) hashedPassword = h.hexdigest() print "[auth-sqlite] hashedPassword : " + hashedPassword ## Connect and fetch from database vals = (username, hashedPassword) conn = sqlite3.connect(sqlite_file) cur = conn.cursor() cur.execute('SELECT count(*) FROM Users WHERE UserId = ? AND Password = ? AND Active = 1', vals) row = cur.fetchone(); targetRows = row[0] conn.close() print targetRows ## Return result if(targetRows == 1): print "[auth-sqlite] Authentication succeed." sys.exit(0) else: print "[auth-sqlite] Authentication failed." sys.exit(1) sys.exit(1)
Profile
- 山崎 太郎 (Taro Yamazaki)
- プラムシステムズ株式会社所属。 主にVPN(OpenVPN)やセキュリティ関連技術、Webアプリケーションを手がけています。
Page Views
Popular Posts
-
「VPNっていろいろあるけど、OpenVPNのメリットって何?」 という疑問は多くの方が持たれますよね。この点は公式サイトなどにもいろいろ書かれているのですが、実際に使ってきたユーザー側としてメリットと思う部分をまとめてみました。
-
現在ダウンロードできるOpenVPNでは、今まで認証局の構築で使用していたeasy-rsaが含まれなくなっています。 OpenVPN.netのダウンロードページ にも Note that easy-rsa is no longer bundled with OpenVPN...
-
Jan Just Keijser氏の記事「 Optimizing performance on gigabit networks 」については こちら でも概要を取り上げましたが、記事全体にいろいろなヒントが含まれていますので、全文の日本語訳を掲載しています。意訳している部分も...
-
OpenVPNでは、接続してきたクライアントのVPNアドレスは動的に割り振られます(その際に割り振られる際のアドレス範囲はOpenVPNサーバー側設定ファイルに基づきます)。特定のVPNクライアントに特定のVPNアドレスを割り振りたい場合、OpenVPNでは以下の2つの方法で設定...
-
では、いよいよiPhone構成ユーティリティでVoDの設定をしてみましょう。あ、 前の記事 での準備はきちんとやっておいてくださいね!
-
前回 は2つのワンタイムパスワードの生成方法について取り上げました。今回はいよいよ実際の生成アルゴリズムを取り上げましょう。TOTPをベースに説明します(ただ、前回も解説したように、基本的なロジックはTOTPとHOTPで同じです)。 参考としてpythonのコードも併記してみま...
-
現時点においてはマニュアルやHowToにも記載されていない(ChangeLogにちょっとだけ出てきます)あまり知られていない機能なのですが、「設定ファイルで鍵ファイルや証明書ファイルのパスを記載する」という通常の方法とは別に、「鍵ファイルや証明書ファイル内のデータをそのまま設定フ...
-
OpenVPNはLinuxをはじめとした幅広いプラットフォームで動作実績があるのが特徴の一つです。 今回は、最近の電子工作ブームでも話題のシングルボードPC 3機種をOpenVPNサーバーとしてセットアップし、OpenVPNのVPNパフォーマンスを測定してみましょう。 ...
-
前回 はワンタイムパスワードの基本的な仕組みについて説明しました。サーバー側とクライアント側で、それぞれ共通のルールに基づいてパスワードを生成させる必要があることを取り上げましたが、今回は OATH が規定しているその生成ルールについて具体的に説明します。 ワンタ...
-
OpenVPNを使用している方ならよくご存知だと思いますが、通常OpenVPNでは証明書認証を使用します。証明書認証はID/パスワード認証に比較すると安全性が高いとされます(もちろん、秘密鍵の管理方法に大きく依存します)が、証明書認証の概念を理解しにくいユーザーが秘密鍵や証明...
© yamata::memo 2013 . Powered by Bootstrap , WebLyb