OpenVPN&セキュリティ情報
2011-06-02
Gmailアカウントのフィッシング攻撃

Official Google Blogで取り上げられたこの問題、日本の各メディアでも取り上げられていますね。
ただ、その記事のタイトルが「Googleへの攻撃」といったニュアンスのものもあり、セキュリティに関する情報提供の難しさを感じさせられます。Official Google Blogでもあえて「Gmail自体のセキュリティの問題ではない」と書かれていますね。
今回の問題はGmailのシステムに攻撃が加えられたということではなく、一部のユーザーがフィッシングサイトに引っかかってしまい、フィッシングサイト上でGmailにアクセスするためのIDとパスワードを入力してしまったことが原因です。攻撃者はそのIDとパスワードを利用してGmailにアクセスし、メールの転送設定を追加することでメールの内容を盗んでいた、ということです。対象となったユーザーが米政府高官や中国の政治活動家などだったことから、特定の対象を狙ったものであることが推測できます。攻撃手法についてはこちらにまとめられています(今年の2月に報告されているものです)。
この問題に対して、Googleは2段階認証(ワンタイムパスワード)を使うことを推奨しています。この方法は今回のような問題の対策としてとても有効なものです。ただ、この設定は初心者にはちょっと敷居が書く(日本国内の場合はSMSを使った認証なども使用できないため、より条件が難しくなります)、広く普及させるのはなかなか難しいと思われます。
Gmailのようなフリーメールアカウントに限らず、各プロバイダから提供されるメールアドレスでもWebメールが提供されることが一般的になっています。どこからでもWebサイトにさえつながれば利用できるという利点もあり、特にライトユーザーがWebメールを多用する傾向が強いようです。セキュリティに関する知識をそれほど持ち合わせていないユーザーを対象にする場合は、セキュリティを向上させるために設定を変更させたり、手順を増やして対応させたりするのはあまり現実的ではありません。この問題、いろいろな企業システムでも同じように直面している問題です。
企業においては、システム側の対応を進めることはもちろんのこと、「怪しいメールは開かない」「怪しいリンクはクリックしない」「機密情報はメール以外の方法(または暗号化するなどの対策を取る)でやり取りする」といった基本的なユーザー教育を徹底するのが最初の一歩かな、と思います。攻撃するのも人間なら、身を守れるのも人間、ですもんね。
2011-06-01
OATHによるワンタイムパスワードの仕様 - 3
前回は2つのワンタイムパスワードの生成方法について取り上げました。今回はいよいよ実際の生成アルゴリズムを取り上げましょう。TOTPをベースに説明します(ただ、前回も解説したように、基本的なロジックはTOTPとHOTPで同じです)。
参考としてpythonのコードも併記してみます。
※ OATHの仕様ではタイムステップとして30秒が推奨されています。
※ なお、ハッシュの算出にはSHA-1だけでなく、SHA-256やSHA-512なども使用できます。
OATHの仕様には、Javaで記述されたリファレンスコードが掲載されています。また、生成されたワンタイムパスワードの値が正しいかどうかをテストするための値のリストも載せられていますので、独自に実装した際の確認のために使用することができます。
今回説明したように、ワンタイムパスワードの生成自体はそれほど難しいものではなく(計算は少々ややこしいですが…)、スクリプト言語でも比較的簡単に実装できます。PHPやpythonなどで開発されたWebアプリケーションに組み込むことも容易ですし、スマートフォンを使ったソフトウェア・トークンもいろいろと出てきていますので、Webアプリケーションのセキュリティを高めるためにも取り組んでみるいい機会かもしれませんね。
Read More
参考としてpythonのコードも併記してみます。
1. タイムステップを考慮したカウンタの算出
TOTPの場合、カウンタはunixtimeになります。しかし、これをそのまま使うとワンタイムパスワードが毎秒変わってしまうことになり、さすがにこれは実用的ではありません。それで、ワンタイムパスワードが切り替わる間隔としてタイムステップ (Time-Step) を設定し、unixtimeをタイムステップで割った値をカウンタとします。messagetime = unixtime / timestepこれにより、タイムステップが30なら、30秒間は同じワンタイムパスワードが生成されることになります。
※ OATHの仕様ではタイムステップとして30秒が推奨されています。
2. HMAC (SHA) の算出
まず、1.で生成した値を16バイトの16進数表記に変換します(バイト数が足りない分はゼロ埋めします)。その16バイトをASCII文字列に変換したものをデータとし、パスコードをキーとしてHMACダイジェストを算出します。message = '%016X' % messagetime h = hmac.new(key, message.decode("hex_codec"), sha) d = h.digest() hmac_result = [] for c in d: hmac_result.append(ord(c))これにより、20バイトのハッシュ文字列が生成されます。この文字列の文字コードを1文字ずつ配列に格納しておきます。
※ なお、ハッシュの算出にはSHA-1だけでなく、SHA-256やSHA-512なども使用できます。
3. オフセットの算出とビット演算
2. で生成されたハッシュの最後のバイト(20バイト目)を 0xf でマスクした値をオフセットとし、そのオフセットに基づいてビット演算を行います。offset = hmac_result[19] & 0xf sn = (hmac_result[offset] & 0x7f) << 24 | \ (hmac_result[offset+1] & 0xff) << 16 | \ (hmac_result[offset+2] & 0xff) << 8 | \ (hmac_result[offset+3] & 0xff)
4. ワンタイムパスワードの出力
3. で計算された値を 10のn乗(nはワンタイムパスワードの桁数となります)で割ります。その余りがワンタイムパスワードとなります。8桁の場合はこのようになります(桁数を合わせるためにゼロ埋めが必要です)。result = '%08d' % (sn % 10**8)
OATHの仕様には、Javaで記述されたリファレンスコードが掲載されています。また、生成されたワンタイムパスワードの値が正しいかどうかをテストするための値のリストも載せられていますので、独自に実装した際の確認のために使用することができます。
今回説明したように、ワンタイムパスワードの生成自体はそれほど難しいものではなく(計算は少々ややこしいですが…)、スクリプト言語でも比較的簡単に実装できます。PHPやpythonなどで開発されたWebアプリケーションに組み込むことも容易ですし、スマートフォンを使ったソフトウェア・トークンもいろいろと出てきていますので、Webアプリケーションのセキュリティを高めるためにも取り組んでみるいい機会かもしれませんね。
2011-05-30
OATHによるワンタイムパスワードの仕様 - 2
前回はワンタイムパスワードの基本的な仕組みについて説明しました。サーバー側とクライアント側で、それぞれ共通のルールに基づいてパスワードを生成させる必要があることを取り上げましたが、今回はOATHが規定しているその生成ルールについて具体的に説明します。
ワンタイムパスワードを生成するために必要なデータは2つ、(1) ユーザーが決めたパスコード(一般的なパスワードと同じもので、「シークレット」とも呼ばれます)と、(2) 回数や時刻などのカウンタです。これらをサーバーとクライアントの両方で共有しておき、この2つのデータから決められた方法で計算した結果をワンタイムパスワードとして生成します。
OATHで規定している2つの生成方法は、(1) は共通で、(2) の部分だけが異なります。では、それぞれの方法について説明しましょう。
カウンタとして使用されるのは「今回のパスワード生成が何回目のパスワード生成か」を示す値です。この値は生成するたびに1つずつカウントアップされますが、サーバー側 (HOTP validator) とクライアント側 (HOTP generator) でこの値を共有していなければなりません。クライアント側はパスワードを生成した回数(何回目の生成か)、サーバー側は認証処理を行った回数(何回目の認証か)を持つことになります。
しかし、このカウンタはサーバー側とクライアント側で同一値になる保証がありません。例えば、パスワードは生成したがそのパスワードを使って認証処理を行わなかった、という場合には値がずれることになります(生成回数 > 認証回数となるため)。そのため、サーバー側にカウンタを再同期 (resync) させる機能を備えておく必要があります。
カウンタとして使用されるのは「現在の時刻(UnixTime)」です。ワンタイムパスワードの基準が時刻であるため、サーバー側とクライアント側のそれぞれのデバイス(PC、スマートフォン、トークンなど)の時刻が正確でなければなりません。認証の仕組みを作る際にはある程度の時刻のずれは考慮しますが、当然ながら時刻が大幅にずれていると正しく認証できませんから、NTPやGPSなどを使って定期的に時刻が補正されているデバイスが望ましいでしょう。
では、次回は実際のワンタイムパスワードの算出方法を解説しましょう。
Read More
ワンタイムパスワード生成方法のキホン
OATHでは後述する2つの方法が規定されていますが、基本的な仕組みは同じです。
ワンタイムパスワードを生成するために必要なデータは2つ、(1) ユーザーが決めたパスコード(一般的なパスワードと同じもので、「シークレット」とも呼ばれます)と、(2) 回数や時刻などのカウンタです。これらをサーバーとクライアントの両方で共有しておき、この2つのデータから決められた方法で計算した結果をワンタイムパスワードとして生成します。
OATHで規定している2つの生成方法は、(1) は共通で、(2) の部分だけが異なります。では、それぞれの方法について説明しましょう。
[1] HOTP : 利用ごとに生成する(生成回数ベース)
利用者がトークンのボタンを押すなどしてパスワードを生成するたびに、新しいワンタイムパスワードを生成します。この方法は最も基本的な方法で、OATHの規格では HOTP (HMAC-Based OTP Algorithm) として規定されており、RFC 4226としても規定されています。カウンタとして使用されるのは「今回のパスワード生成が何回目のパスワード生成か」を示す値です。この値は生成するたびに1つずつカウントアップされますが、サーバー側 (HOTP validator) とクライアント側 (HOTP generator) でこの値を共有していなければなりません。クライアント側はパスワードを生成した回数(何回目の生成か)、サーバー側は認証処理を行った回数(何回目の認証か)を持つことになります。
しかし、このカウンタはサーバー側とクライアント側で同一値になる保証がありません。例えば、パスワードは生成したがそのパスワードを使って認証処理を行わなかった、という場合には値がずれることになります(生成回数 > 認証回数となるため)。そのため、サーバー側にカウンタを再同期 (resync) させる機能を備えておく必要があります。
[2] TOTP : 現在の時刻に応じて生成する(時刻ベース)
一定時間ごとにワンタイムパスワードを生成します。OATHでは TOTP (Time-based One-time Password Algorithm) として規定されており、規格はドラフトとして公開(2011年4月現在)されています。仕組み上は、前述したHOTPの応用といった位置付けになります。カウンタとして使用されるのは「現在の時刻(UnixTime)」です。ワンタイムパスワードの基準が時刻であるため、サーバー側とクライアント側のそれぞれのデバイス(PC、スマートフォン、トークンなど)の時刻が正確でなければなりません。認証の仕組みを作る際にはある程度の時刻のずれは考慮しますが、当然ながら時刻が大幅にずれていると正しく認証できませんから、NTPやGPSなどを使って定期的に時刻が補正されているデバイスが望ましいでしょう。
では、次回は実際のワンタイムパスワードの算出方法を解説しましょう。
2011-05-27
OATHによるワンタイムパスワードの仕様 - 1
OATH (The Initiative for Open Authentication) は、Verisignなどのベンダーが中心となって、認証に関する標準規格を策定している団体です。今回はOATHが策定しているワンタイムパスワードの仕様について取り上げます。
では、利用者は毎回変わるパスワードをどうやって知るのでしょうか? 利用者は自分の使うパスワードを知るために、ワンタイムパスワードを生成する「道具」を別に持っている必要があります。
この「道具」としてよく用いられているのが「トークン」と呼ばれるものです。このトークンには、ボタンを押すたびに新しいパスワードが生成、表示されたり、決まった時間ごと(30秒ごと、1分ごとなど)に新しいパスワードが生成、表示されたりします。最近では、トークンの代わりにスマートフォンのアプリを使う(「ソフトウェア・トークン」とも呼ばれます)ケースも出てきています。

RSA SecurID トークン
WebアプリケーションやVPN機器など、ログイン先の認証システム(サーバー側)が生成するパスワードと、トークン(クライアント側)が生成するパスワードを共通の方法で算出し、両者のパスワードを常に一致させるようにすることによって、ワンタイムパスワードとして利用することができることになります。
次回は、OATHが規定しているワンタイムパスワードの2つの生成方法について取り上げましょう。
Read More
そもそもワンタイムパスワードとは?
「ワンタイムパスワード」はその名の通り、その時だけ有効な1回限りのパスワードを使って認証を行う仕組みです。使用するたびにパスワードが変わることになるので、万が一パスワードが漏えいしても、そのパスワードを他人に悪用される危険性を大幅に削減できます。では、利用者は毎回変わるパスワードをどうやって知るのでしょうか? 利用者は自分の使うパスワードを知るために、ワンタイムパスワードを生成する「道具」を別に持っている必要があります。
この「道具」としてよく用いられているのが「トークン」と呼ばれるものです。このトークンには、ボタンを押すたびに新しいパスワードが生成、表示されたり、決まった時間ごと(30秒ごと、1分ごとなど)に新しいパスワードが生成、表示されたりします。最近では、トークンの代わりにスマートフォンのアプリを使う(「ソフトウェア・トークン」とも呼ばれます)ケースも出てきています。

RSA SecurID トークン
WebアプリケーションやVPN機器など、ログイン先の認証システム(サーバー側)が生成するパスワードと、トークン(クライアント側)が生成するパスワードを共通の方法で算出し、両者のパスワードを常に一致させるようにすることによって、ワンタイムパスワードとして利用することができることになります。
次回は、OATHが規定しているワンタイムパスワードの2つの生成方法について取り上げましょう。
登録:
投稿
(
Atom
)
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