.NET TIPS

[ASP.NET]ログイン失敗時にアカウントをロックアウトするには?[2.0のみ、C#、VB]

山田 祥寛
2007/02/02

 悪意の第三者が他人のパスワードを解析し、見破ることを「パスワード・クラック」と呼ぶ。インターネット上での重要な業務活用が増大している昨今、パスワードの漏えいが重大な問題に直結するケースは少なくない。個人情報保護などありきたりな言葉を持ち出すまでもなく、情報取得の最大のキーとなるパスワード管理の重要性は、いまさらいうまでもないだろう。

 パスワード・クラックにはいくつかの手法が考えられるが、誰もがまず思いつくのが、「総当たり攻撃(ブルートフォース・アタック)」だろう。要は、パスワードとして思いつく限りの文字列の組み合わせを使って片っ端からログインを試行することで、いつかは正しいパスワードに行き当たるという手法だ。もちろん、総当たり攻撃を人間の手で行う分には限界があるが、昨今では、パスワード・クラックのソフトウェアも存在し、これらソフトウェアを利用することで、短い時間で数百万通りの試行を行うことも可能だ。

 また、「辞書攻撃」と呼ばれる手法も存在し、試行の対象を意味あるキーワードの組み合わせに絞り込むことでより効率的なクラッキングを行うこともできる。詳細は割愛するが、パスワード・クラックは、クラッカー(悪意あるハッカー)だけではなく、コンピュータのごく初心者であっても容易に実行可能であることを、ここではあらためて理解していただきたい。

●パスワード・クラック対策には「ロックアウト」設定

 このようなパスワード・クラックを防ぐためには、もちろん、パスワード運用上の取り決めも重要であるが、システム的な対策としては「ロックアウト」という手法が有効だ。ロックアウトとは、一定時間内に同一のユーザー・アカウントで規定回数以上のログイン失敗が発生した場合に、総当たり攻撃が行われていると判断して、ユーザー・アカウントを無効にする機能のことをいう。

 ASP.NETのメンバシップ・フレームワーク(詳細は「TIPS:[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには?」を参照)ではこのロックアウト機能が標準で提供されており、構成ファイル(Web.config)の定義のみでロックアウト機能の動作を制御することができる。

 Web.configは個々のアプリケーション上に配置するファイルであるが、そのデフォルトの構成はマシン構成ファイル(Machine.config)で記述されている(通常は構成を変更する必要がある部分のみをアプリケーションごとのWeb.configで変更する)。

 以下に、Machine.configで定義されたメンバシップ・フレームワークのデフォルトの構成を示しておく(適宜、見やすいように改行を含めている)。

<membership>
  <providers>
    <add name="AspNetSqlMembershipProvider"
      type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
      connectionStringName="LocalSqlServer"
      enablePasswordRetrieval="false"
      enablePasswordReset="true"
      requiresQuestionAndAnswer="true"
      applicationName="/"
      requiresUniqueEmail="false"
      passwordFormat="Hashed"
      maxInvalidPasswordAttempts="5"
      minRequiredPasswordLength="7"
      minRequiredNonalphanumericCharacters="1"
      passwordAttemptWindow="10"
      passwordStrengthRegularExpression="" />
  </providers>
</membership>
メンバシップ・プロバイダの構成を記述した既定のコード(Machine.config)

 <membership>−<providers>−<add>要素は、メンバシップ・フレームワークから使われるメンバシップ・プロバイダ(メンバシップの管理を行うためのクラス群)の定義を行うための構成要素だ。

 ご覧いただければ分かるように、<add>要素では多くの属性を指定可能であるが、このうち、ロックアウト機能にかかわるのはmaxInvalidPasswordAttempts/passwordAttemptWindow属性の2つだけだ。maxInvalidPasswordAttempts属性はログイン/パスワード問い合わせの試行可能な回数を、passwordAttemptWindow属性は失敗した試行回数を追跡する時間を、それぞれ表す。

 つまり、デフォルトの構成では10分間の中で5回以上のログイン試行に失敗した場合に、ユーザー・アカウントはロックアウトされるということだ。ロックアウトされたユーザー・アカウントは、その後、正しいユーザー名/パスワードを入力しても、ログインはできない状態となる。

 以上を踏まえて、個々のアプリケーションで(例えば)5分以内に10回以上のログイン試行が行われた場合に、アカウントがロックアウトされるよう、構成を変更してみよう。Web.configは以下のようなコードになる。

<membership defaultProvider="MyMembership">
  <providers>
    <add name="MyMembership"
      type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
      maxInvalidPasswordAttempts="10"
      passwordAttemptWindow="5"
      ……省略 …… />
  </providers>
</membership>
個別のアプリケーションでのロックアウト機能の構成例(Web.config)

 type属性は使用するメンバシップ・プロバイダの完全修飾名を表すもので、標準的なSQL Serverベースのメンバシップ管理を利用する場合には、固定で“System.Web.Security.SqlMembershipProvider”(ASP.NET標準で用意されたSQL Server向けメンバシップ・プロバイダ)を指定しておけばよい。

 name属性はプロバイダ設定を一意に識別するための論理名を表すものだ。また、先頭にある<membership>要素のdefaultProvider属性はデフォルトで使用されるプロバイダを指定するもので省略可能であるが、その場合、個別のログイン・コントロール(Login/PasswordRecovery/CreateUserWizardなど)において、使用するメンバシップ・プロバイダ名(MembershipProvider属性)を指定しなければならない。基本的にはdefaultProvider属性は明示的に宣言しておくのが好ましいだろう。

 以上で、アプリケーション・デフォルトの“MyMembership”プロバイダが定義されたことになる。

 <add>要素で利用可能な主な属性を以下の表にまとめた。パスワード・クラックを防ぐための方法は、ロックアウト機能だけではない。例えば、パスワードの最小文字数や特殊文字を混在させるような運用ルールを設けることで、総当たり攻撃や辞書攻撃の危険性を抑えることが可能になる(「Windows TIPS:安全性の高いパスワードを作るコツ」も参考にしてほしい)。ASP.NETのメンバシップ・プロバイダは、これらパスワード・ポリシーをシステム的に強制するためのパラメータをいくつか提供している。これらパラメータにも適切な値を適用しておくことを強くお勧めしたい。

属性 概要 デフォルト値
name メンバシップ・プロバイダの識別名 (必須)
type メンバシップ・プロバイダの完全修飾名 (必須)
connectionStringName メンバシップ・プロバイダが使用する接続名 (必須)
enablePasswordRetrieval メンバシップがパスワードの取得をサポートするか false
enablePasswordReset パスワードの初期化をサポートするか true
requiresQuestionAndAnswer パスワード問い合わせに「秘密の質問の回答」を必要とするか true
applicationName メンバシップ情報を識別するためのアプリケーション名 (アプリケーションの仮想パス)
requiresUniqueEmail アカウント情報に含まれる電子メール・アドレスは一意である必要があるか false
passwordFormat パスワードの格納形式(Hashed|Encrypted|Clear) Hashed
maxInvalidPasswordAttempts ロックアウトまでに可能なログイン試行の最大回数 5
minRequiredPasswordLength パスワードの最小文字数 7
minRequiredNonalphanumericCharacters パスワードに最低限含まれる必要がある特殊文字の数 1
passwordAttemptWindow ログイン試行をカウントする時間範囲(分) 10
passwordStrengthRegularExpression パスワードの妥当性検証に必要とする正規表現パターン (なし)
<membership>−<providers>−<add>要素で利用可能な主な属性

●アカウントのロックアウトを解除する方法

 アカウントのロックアウト情報は、「App_Data」フォルダ直下の「ASPNETDB.MDF」というSQL Serverデータベースに記録されている。ASPNETDB.MDFは、ユーザー/ロール情報をはじめとしたアプリケーション・データを管理するためのデータベースである。

 ここでは、aspnet_Membershipテーブルの中身を実際に確認してほしい。

aspnet_Membershipテーブルの内容
ロックアウトされたユーザーのIsLockedOutプロパティには「True」に設定される。

 該当するユーザーのIsLockedOutフィールドが「True」に設定されていれば、ユーザー・アカウントがロックアウトされているということだ。ロックアウトを解除する方法として最も手軽なのは、データベース上から直接に、このIsLockedOutフィールドを「False」に設定することだ。これによってロックアウトは解除され、再びユーザー・アカウントを利用できるようになる。

 もっとも、環境によっては、必ずしも直接にデータベースを操作できる状況にあるとは限らない。そのような場合にも、以下のようなコードを記述することで、アプリケーションから特定アカウントのロックアウトを解除することができる。

MembershipUser usr = Membership.GetUser("wings");
usr.UnlockUser();
Dim usr As MembershipUser = Membership.GetUser("wings")
usr.UnlockUser()
ユーザー「wings」のロックアウト状態を解除するコード(上:C#版/下:VB版)

 Membershipクラス(System.Web.Security名前空間)のGetUserメソッドによって、指定されたユーザーのアカウント情報をMembershipUserオブジェクトとして取得できる。あとは、取得したMembershipUserオブジェクトのUnlockUserメソッドを呼び出すことでロックアウトを解除することができる。

 このように、Membership/MembershipUserオブジェクトに代表されるメンバシップ関連のAPI(以降、「メンバシップAPI」)を利用することで、アプリケーション開発者はバックエンドのデータソース(この場合はSQL Server)を一切意識することなくユーザー情報を編集できるのも、メンバシップ・フレームワークの大きな特長の1つだ。メンバシップAPIを利用したユーザー情報の編集については、後日、「TIPS:[ASP.NET]メンバシップAPIでユーザー情報の編集を行うには?」で紹介の予定だ。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Webフォーム 処理対象:認証
使用ライブラリ:Membershipクラス(System.Web.Security名前空間)
関連TIPS:[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには?
関連TIPS:[ASP.NET]メンバシップAPIでユーザー情報の編集を行うには?(後日公開予定)

この記事と関連性の高い別の.NET TIPS
[ASP.NET]メンバシップAPIでユーザー情報の編集を行うには?
[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには?
[ASP.NET]PasswordRecoveryコントロールのパスワード通知メールをカスタマイズするには?
[ASP.NET AJAX]PasswordStrengthコントロールでパスワードの強度をインジケータ表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間