セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 第 13 章 セキュリティのトラブル シューティング

patterns and practices home

J.D. Meier, Alex Mackman, Michael Dunner, and Srinath Vasireddy
Microsoft Corporation

November 2002
日本語版最終更新日 2003 年 3 月 17 日

適用対象:
    Microsoft® ASP.NET

全体の概要については、「セキュリティ保護された ASP.NET アプリケーションの構築」の開始ページを参照してください。

要約 : ここでは、セキュリティ関連の問題を診断するときに役立つトラブルシューティングのヒント、テクニック、およびツールについて説明します。

目次

トラブルシューティングの手順
認証の問題のトラブルシューティング
認定の問題のトラブルシューティング
ASP.NET
ID の判別
.NET リモート処理
SSL
IPSec
監査とログ
トラブルシューティング ツール

この章では、トラブルシューティングの手順と、セキュリティ関連の問題を診断するときに役立つトラブルシューティングのテクニックおよびツールについて説明します。

トラブルシューティングの手順

セキュリティとセキュリティ コンテキストに関する問題を解決するときに役立つ方法を次に示します。

  1. まず、問題を具体的に説明します。予期されていた動作と実際に行われた動作を理解しており、問題を再現するための詳しい手順を把握していることを確認します。

  2. 可能な限り正確に問題を隔離します。要求の処理における問題発生時点を確認します。クライアントとサーバーのどちらに関係する問題ですか。構成またはコードに関係するエラーですか。問題を隔離するため、アプリケーションの各層を分離します。たとえば、単純なコンソール ベースのテスト クライアント アプリケーションを作成し、複雑なクライアント アプリケーションの代わりに使用します。

  3. エラー メッセージとスタック トレースを利用できる場合には、これらの情報を分析します。最初に Windows のイベント ログとセキュリティ ログを確認してください。

  4. Microsoft サポート技術情報で問題に関する文書が Knowledge Base に収録されているかどうかを確認します。

  5. セキュリティ関連の問題の多くは、コード実行に使われた ID に関連しています。コード実行に使われる ID は、ユーザーが想定している ID でない場合があります。後の「ASP.NET」の「ID の判別」に収録されているサンプル コードを使い、ID 情報を取得、診断します。ID が正しくない可能性がある場合には、web.config と machine.config の構成設定を確認し、アプリケーションの仮想ディレクトリの IIS 認証設定を確認します。ASP.NET Web アプリケーション内で ID に影響する可能性のある要因には、次のようなものがあります。

    • ASP.NET ワーカー プロセス (aspnet_wp.exe) のプロセス ID の判別に使われた machine.config の <processModel> 要素。
    • IIS の認証設定。
    • web.config の認証設定。
    • web.config の偽装設定。
  6. 正しい設定が使用および表示されているようにみえる場合でも、上位のアプリケーション、つまり、上位仮想ディレクトリの web.config または machine.config から該当のアプリケーションへの設定の継承を防ぐ目的で、アプリケーションの仮想ディレクトリでこのアプリケーションに合わせて web.config ファイルを明示的に構成することを検討します。

  7. 後の「トラブルシューティング ツール」に記載されているトラブルシューティング ツールを使い、詳細な診断結果を確認します。

  8. 別のコンピュータで問題を再現します。この操作により、環境に関連する問題を分離できます。また、アプリケーション コードと構成のどちらが原因で問題が発生しているのかを確認できます。

  9. アプリケーションからリモート リソースへアクセスするときに問題が生じる場合には、偽装および委任に関連する問題が発生している可能性があります。リモート リソースへアクセスするときに使われるセキュリティ コンテキストを特定します。Windows 認証を使用している場合には、コンテキストを提供するプロセス アカウントなどのアカウントでリモート コンピュータによる認証が可能なことを確認します。

  10. ニュースグループを検索し、問題が既に報告されているかどうかを確認します。未報告の場合は、開発コミュニティの中にこの問題に関して援助してくれる開発者がいるどうかを確認するため、問題に関する情報をニュースグループに投稿します。

    ASP.NET に関するオンライン ニュースグループは、http://communities.microsoft.com/newsgroups/default.asp?icp=mscom&slcid=JA&newsgroup=microsoft.public.dotnet.framework.aspnet へアクセスしてください。

  11. Microsoft サポート センターに連絡します。詳細については、Microsoft サポート技術情報を参照してください。

実装ソリューションの検索

特異な問題を抱えており、最善の解決方法を理解する必要がある場合には、次の方法を試してください。

  • このガイドの第 5 章、第 6 章、および第 7 章を参照し、該当するシナリオまたは類似のシナリオを見つけます。
  • MSDN ライブラリのドキュメントとサンプルを参照します。
  • 数多くある ASP.NET 情報 Web サイトを参照します。次にその一例を示します。
    • www.asp.net
    • www.gotdotnet.com
    • www.asptoday.com

Microsoft サポート技術情報で、手法に関する適切な文書を検索します。

ニュースグループに質問を投稿します。

Microsoft サポート センターに連絡します。

認証の問題のトラブルシューティング

認識の問題のトラブルシューティングでは、最初に IIS の認証失敗メッセージと ASP.NET の認証失敗メッセージを区別します。

  • IIS エラー メッセージを受信した場合には、ASP.NET エラー コードは表示されません。アプリケーションの仮想ディレクトリの IIS 認証設定を確認します。

    ソリューションから ASP.NET を分離するための単純な HTML テスト ページを作成します。

  • ASP.NET のエラー メッセージを受信した場合には、アプリケーションの web.config ファイルで ASP.NET 認証設定を確認します。

IIS 認証の問題

認証プロセスは IIS を使って開始されます。このため、IIS が正しく構成されていることを確認してください。

  • ユーザーが認証されることを確認します。認証されるプリンシパルを把握するため、基本認証を有効にし、手動でログインします。"ドメイン\ユーザー名" の形式のユーザー名を使ってログインします。
  • ログオン セッションがキャッシュされていないことを確認するため、IIS を再起動します。IIS を再起動するには、IISReset.exe を実行します。
  • ブラウザに資格情報がキャッシュされていないことを確認するため、連続するテストとテストの間でブラウザを閉じます。
  • 統合 Windows 認証を使用する場合は、次の手順でブラウザ設定を確認します。
    • [ツール] メニューの [インターネット オプション] をクリックし、[詳細設定] タブをクリックします。[統合 Windows 認証を使用する (再起動が必要)] チェック ボックスをオンにします。ブラウザを再起動します。
    • [ツール] メニューの [インターネット オプション] をクリックし、[セキュリティ] タブをクリックします。適切な Web コンテンツ ゾーンを選択して、[レベルのカスタマイズ] をクリックします。[ユーザー認証] で、ログオン設定がアプリケーションに対して正しく設定されていることを確認します。テストのたびに資格情報を入力し、情報が一切キャッシュされないようにするために、[ユーザー名とパスワードを入力してログオンする] をオンにしてください。
    • ブラウザから資格情報の入力を求められる場合、サーバーが認識していないドメインへログオンしている可能性があります。たとえば、ローカル コンピュータに管理者としてログオンする場合などです。
    • ローカル コンピュータのアプリケーションをブラウザで表示するときには、Web ブラウザへ対話式にログオンするので、対話ログオン トークンが使用されます。

セキュリティ コンテキスト情報を表示する単純な Web ページを使ってテストします。この章の後半にサンプル ページが収録されています。

テストが失敗した場合には、要求されたファイルの監査を有効にし、セキュリティ イベント ログを調べます。監査を有効にするときには、ローカル セキュリティ ポリシー ツール、ドメイン セキュリティ ポリシー ツールのいずれかのグループ ポリシーを必ず使用してください。ログで無効なユーザー名または無効なオブジェクト アクセスの形跡を確認します。

  • Web アプリケーションでリモート リソースへアクセスする場合に問題が生じるときには、リモート リソースの監査を有効にします。

  • 無効なユーザー名またはパスワードの問題が発生する場合、Web サーバーで ASP.NET を実行するときに使われたアカウントが、リモート コンピュータで正しく認証できないことを示します。既定の ASPNET ローカル アカウントを使ってリモート リソースにアクセスしようとしている場合には、リモート コンピュータに重複したアカウントおよびパスワードが作成されていることを確認してください。

  • NT AUTHORITY\ANONYMOUS のログインが失敗したことを示すメッセージが表示される場合、Web サーバーの ID にネットワーク資格情報がないまま、リモート コンピュータにアクセスしようとしたことを示します。

    Web アプリケーションがリモート リソースへアクセスするときに使うアカウントを確認し、このアカウントにネットワーク資格情報があることを確認します。Web アプリケーションが偽装する場合には、Web サーバーでKerberos 委任 (適切に構成されているアカウントを使用) または基本認証が必要です。

Windows 認証の使用

アプリケーションの web.config がWindows 認証を使用するために <authentication> 要素を構成している場合には、匿名アクセスが使用されているかどうか、認証ユーザーが匿名インターネット ユーザー アカウント [IUSR_MACHINE] であるかどうかを確認するため、Web アプリケーションに次のコードを挿入します。

WindowsIdentity winId = HttpContext.Current.User.Identity as WindowsIdentity;
if (null != winId)
{
Response.Write(winId.IsAnonymous.ToString());
}

フォーム認証の使用

<forms> 要素に指定されている Cookie 名が global.asax イベント ハンドラで正しく取得されることを確認します (Application_AuthenticateRequest)。また、Cookie が作成されることも確認します。クライアントから継続的にログイン ページ (<forms> 要素の loginUrl 属性で指定されているページ) へ転送される場合には、なんらかの理由で Cookie が作成されていない、または認証された ID がコンテキスト (HttpContext.User) に挿入されていない可能性があります。

Kerberos のトラブルシューティング

Kerberos 関連の認証または委任の問題を解決するときに役立つツールを次に示します。

  • Kerbtray.exe このユーティリティでは、現在のコンピュータのキャッシュに保存されている Kerberos チケットを確認できます。Kerbtray.exe は Windows 2000 Resource Kit に含まれています。https://www.microsoft.com/downloads/search.aspx?displaylang=ja からダウンロードできます。"Kerbtray.exe" を検索してください。

  • Klist.exe Kerbtray に類似した機能を持つコマンド ライン ツールです。Klist.exe ではKerberos チケットの表示と削除が可能です。Klist.exe は Windows 2000 Resource Kit に含まれています。https://www.microsoft.com/downloads/search.aspx?displaylang=ja からダウンロードできます。"Klist.exe" を検索してください。

  • Setspn.exe Active Directory サービス アカウントのサービス プリンシパル名 (SPN) ディレクトリ プロパティを管理するためのコマンド ライン ツールです。SPN は、サービス実行時のターゲット プリンシパル名を検出するために使われます。

    Setspn.exe は Windows 2000 Resource Kit に含まれています。https://www.microsoft.com/downloads/search.aspx?displaylang=ja からダウンロードできます。"setspn.exe" を検索してください。

認定の問題のトラブルシューティング

Windows ACL の確認

アプリケーションがファイルまたはレジストリ キー (あるいは ACL で保護されている安全な Windows オブジェクト) へアクセスするときに問題が生じている場合には、ACL の内容を参照し、Web アプリケーション ID に読み取りアクセス権限が付与されていることを確認してください。

ID の確認

ASP.NET Web アプリケーションがリソースへアクセスするときに使用する ID を把握しておく必要があります。この ID は、一般には次のいずれかになります。

  • ASP.NET プロセス ID (web.config の <processModel> 要素で構成)。

    既定では、ユーザー名 "machine"、パスワード "AutoGenerate" が指定されたローカル ASPNET アカウントです。

  • web.config で偽装が有効に設定されている場合の認証された呼び出し元の ID。次のようになります。

    <identity impersonate="true" />
    

    IIS で匿名アクセスを無効にしていない場合には、これは IUSR_MACHINE になります。

  • 次のように指定された偽装 ID。ただし、この方法はお勧めできません。

    <identity impersonate="true" userName="Bob" password="password" />
    

詳細情報

ASP.NET を実行するときに使う ID と、ローカル リソースおよびネットワーク リソースへアクセスするときに使う ID の詳細については、「第 8 章 ASP.NET セキュリティ」を参照してください。

<authorization> 要素の確認

<allow> 要素と <deny> 要素が正しく構成されていることを確認します。

  • <deny users="?" /> が設定されており、フォーム認証または IIS 匿名認証 (あるいはこの両方) を使用している場合には、HttpContext.User に IPrincipal オブジェクトを明示的に挿入します。このオブジェクトを挿入しないと、アクセス拒否 (401) 応答が戻されます。
  • <allow> 要素と <deny> 要素に指定されているロールに認証ユーザーが含まれていることを確認します。

ASP.NET

トレースの有効化

ASP.NET の迅速でシンプルなトレース機能では、ページ内の実行イベントと一般的な変数の値が表示されます。トレース機能は、非常に有効な診断支援機能として利用できます。ページ レベルの Trace ディレクティブを使用してトレースを有効にするコードを次に示します。

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs"
 AutoEventWireup="false" Inherits="Test.WebForm1" Trace="true" %>

詳細情報

ASP.NET の新しいトレース機能の詳細については、Microsoft サポート技術情報の Knowledge Base の文書 306731「[INFO] ASP.NET の新しいトレース機能」を参照してください。

構成設定

ほとんどのアプリケーション設定は web.config に記述されています。web.config に記述できる主要なセキュリティ関連設定を次に示します。

<authentication>
<authorization>
<trust>
<identity>

ASP.NET ワーカー プロセス (aspnet_wp.exe) を実行するときに使われる ID を制御する次の設定を、machine.config に記述する必要があります。

<processModel>

アプリケーションの構成設定は常にアプリケーションの web.config ファイルから取得されます。machine.config の同等の設定は web.config ファイルの値により上書きされます。特定の設定をアプリケーションに適用するには、アプリケーションの web.config ファイルでその設定値を設定します。

特定のアプリケーションのメイン web.config ファイルは、アプリケーションの仮想ディレクトリ ルートに保存されています。メイン web.config ファイルは、多くの場合アプリケーション唯一の web.config でもあります。web.config ファイルはサブディレクトリにも格納されている場合があります。サブディレクトリに保存されている web.config ファイルの設定値は、親ディレクトリに保存されている web.config ファイルの設定値を上書きします。

ID の判別

セキュリティやアクセス拒否の問題の多くは、リソースへアクセスするときに使われる ID に関連しています。Web ページ、COM オブジェクト、および Web サービスの ID を判別する際に役立つサンプル コードを次に示します。

.NET ID 変数の詳細については、このガイドの「パート IV : 参照」の「ASP.NET の ID マトリックス」を参照してください。

Web ページでの ID の判別

セキュリティ コンテキスト関連情報を収集し、Web ページの実行に使用されている ID を特定するスクリプトを次に示します。

このコードを使用するには、コードをファイルに貼り付け、拡張子.aspx をファイル名に付加してファイルを保存します。作成したファイルを IIS 仮想ディレクトリにコピーし、ブラウザからこのファイルを表示します。

<%@ Page language="c#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Threading" %>
<%@ Import Namespace="System.Security.Principal" %>
<HTML>
<HEAD>
<title>WhoAmI</title>
</HEAD>
<body>
<form id="WhoAmI" method="post" runat="server">
<TABLE id=contextTable border=1>
<TR>
<TD align=middle colSpan=3 rowSpan="">
HttpContext.Current.User.Identity</TD>
</TR>
<TR>
<TD><b>Name</b></TD>
<TD><asp:Label ID="contextName" Runat=server /></TD>
</TR>
<TR>
<TD><b>IsAuthenticated</b></TD>
<TD><asp:Label ID="contextIsAuth" Runat=server /></TD>
</TR>
<TR>
<TD><b>AuthenticationType</b></TD>
<TD><asp:Label ID="contextAuthType" Runat=server /></TD>
</TR>
</TABLE>
<br><br>
       
<TABLE id=windowsIdentityTable border=1>
<TR>
<TD align=middle colSpan=3 rowSpan="">WindowsIdentity.GetCurrent()</TD>
</TR>
<TR>
<TD><b>Name</b></TD>
<TD><asp:Label ID="windowsName" Runat=server /></TD>
</TR>
<TR>
<TD><b>IsAuthenticated</b></TD>
<TD><asp:Label ID="windowsIsAuth" Runat=server /></TD>
</TR>
<TR>
<TD><b>AuthenticationType</b></TD>
<TD><asp:Label ID="windowsAuthType" Runat=server /></TD>
</TR>
</TABLE>
<br><br>
       
<TABLE id=threadIdentityTable border=1>
<TR>
<TD align=middle colSpan=3 
rowSpan="">Thread.CurrentPrincipal.Identity</TD>
</TR>
<TR>
<TD><b>Name</b></TD>
<TD><asp:Label ID="threadName" Runat=server /></TD>
</TR>
<TR>
<TD><b>IsAuthenticated</b></TD>
<TD><asp:Label ID="threadIsAuthenticated" Runat=server /></TD>
</TR>
<TR>
<TD><b>AuthenticationType</b></TD>
<TD><asp:Label ID="threadAuthenticationType" Runat=server /></TD>
</TR>
</TABLE>
</form>
</body>
</HTML>
<script runat=server>
void Page_Load(Object sender, EventArgs e)
  {
IIdentity id = HttpContext.Current.User.Identity;
if(null != id)
    {
contextName.Text = id.Name;
contextIsAuth.Text = id.IsAuthenticated.ToString();
contextAuthType.Text = id.AuthenticationType;
    }
id = Thread.CurrentPrincipal.Identity;
if(null != id)
    {
threadName.Text = id.Name;
threadIsAuthenticated.Text = id.IsAuthenticated.ToString();
threadAuthenticationType.Text = id.AuthenticationType;
    }
id = WindowsIdentity.GetCurrent();
windowsName.Text = id.Name;
windowsIsAuth.Text = id.IsAuthenticated.ToString();
windowsAuthType.Text = id.AuthenticationType;
  }
</script>

Web サービスでの ID の判別

次に示すコードは、ID 情報を取得します。このコードは Web サービス内で使用できます。

[WebMethod]
public string GetDotNetThreadIdentity()
{
return Thread.CurrentPrincipal.Identity.Name;
}
[WebMethod]
public string GetWindowsThreadIdentity()
{
return WindowsIdentity.GetCurrent().Name;
}
[WebMethod]
public string GetUserIdentity()
{
return User.Identity.Name;
}
[WebMethod]
public string GetHttpContextUserIdentity()
{
return HttpContext.Current.User.Identity.Name;
}

詳細情報

  • エラー メッセージが頻繁に表示される問題に関するセキュリティ関連文書のリストを表示するには、Microsoft サポート技術情報の Knowledge Base へアクセスし、次のキーワードを検索してください。
    prb kbsecurity kbaspnet

Visual Basic 6 COM オブジェクトでの ID の判別

Visual Basic 6 COM オブジェクトの ID を戻すメソッドを次に示します。COM 相互運用機能を介して、ASP.NET アプリケーションから直接 Visual Basic 6.0 COM オブジェクトを呼び出すことができます。次に示すメソッドは、リソースへアクセスしようとしたときにコンポーネントがアクセス拒否エラーを受け取る問題を解決する必要がある場合に役立ちます。

Private Declare Function GetUserName Lib "advapi32.dll" _
Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long


Public Function WhoAmI()
Dim sBuff    As String
Dim lConst   As Long
Dim lRet     As Long
Dim sName    As String
    
lConst = 199
sBuff = Space$(200)
lRet = GetUserName(sBuff, lConst)
WhoAmI = Trim$(Left$(sBuff, lConst))
End Function 

.NET リモート処理

ASP.NET でリモート オブジェクトがホストされており、このオブジェクトが Windows 認証向けに構成されている場合には、チャネルの資格情報プロパティを使用して、認証に使用される資格情報を指定する必要があります。資格情報を明示的に設定しないと、資格情報を使用せずにリモート オブジェクトが呼び出されます。Windows 認証が必要な場合には、"HTTP ステータス 401 (アクセス拒否応答)" が戻されます。

現在のスレッド偽装トークンに関連付けられている資格情報 (クライアント スレッドが偽装されている場合) またはプロセス トークンに関連付けられている資格情報 (偽装が使用されていない場合) を使用するには、既定の資格情報を使用します。この操作を構成するには、クライアント側構成ファイルで次の設定を使用します。

<channel ref="http" useDefaultCredentials="true" />

リモート コンポーネントを呼び出す ASP.NET Web アプリケーションが、偽装するように構成されている場合には、この Web アプリケーションでは Kerberos 認証または基本認証を使用する必要があります。その他の認証タイプは、委任と組み合わせて使用できません。

偽装できるように Web アプリケーションが構成されていない場合には、ASP.NET ワーカー プロセスのプロセス ID が使用されます。これは machine.config の <processModel> 要素で指定されています。既定値はローカル ASPNET アカウントです。

メモ リモート コンピュータにより認証可能なアカウントでプロセスが実行されていることを確認します。

詳細情報

リモート コンポーネントを呼び出すときのクライアント側資格情報の設定方法の詳細については、「第 11 章 .NET リモート処理のセキュリティ」を参照してください。

SSL

SSL関連の問題を解決するには、次の手順に従います。

  • クライアントとサーバー コンピュータの IP アドレスのポート 443 に、telnet 接続できるかどうかを確認します。ポート 443 に telnet 接続できない場合には、sspifilt.dll がロードされていない、sspifilt.dll のバージョンが誤っている、または他の ISAPI 拡張と競合している可能性があります。

  • 証明書を調べます。ポート 443 へ telnet 接続できる場合には、ブラウザの [証明書の表示] ダイアログ ボックスで証明書属性を確認します。証明書の有効日、有効期限日、ニックネームが正しいかどうか、機関情報アクセス (AIA) または証明書失効リスト (CSL) の配布ポイントを確認します。

    AIA/CRL ポイントへのディレクトリを正しく表示できることを確認します。

  • Web ブラウザではなく、カスタム クライアント アプリケーションを使用してクライアント証明書を必要とする SSL 対応 Web サイトへアクセスしている場合には、クライアント アプリケーションがアクセスする正しいストアにクライアント証明書が保存されていることを確認します。

    ブラウザを使用する場合には、対話ユーザーのユーザー ストアに証明書が保存されている必要があります。サービスまたはカスタム アプリケーションが、サービス アカウントのプロファイルに関連付けられているストアまたはコンピュータ ストアからクライアント証明書をロードすることがあります。[管理ツール] プログラム グループからサービス MMC スナップイン (証明書サービスがインストールされている場合に使用できるスナップイン) を使用して、証明書ストアの内容を確認します。

詳細情報

次に示す Microsoft サポート技術情報の Knowledge Base で SSL 関連の文書を参照してください。

  • 257591「[IIS]SSL (Secure Sockets Layer) ハンドシェイクの概要」
  • 257586「[IIS]SSL ハンドシェイクを使用したクライアント認証プロセスに関する説明」
  • 257587「[IIS] SSL ハンドシェイクでのサーバー認証プロセスに関する説明」
  • 301429「HOWTO: Install Client Certificate on IIS Server for ServerXMLHTTP Request Object」(英語情報)
  • 295070「[IIS] 同じ SSL (https) 接続の速度が証明書によって異なる」

IPSec

IPSec の問題の解決手順については、以下の Microsoft サポート技術情報の Knowledge Base の文書を参照してください。

監査とログ

Windows セキュリティ ログ

問題診断における早い段階で、Windows のイベント ログとセキュリティ ログを参照してください。

詳細情報

イベントの監査と監視を有効にする方法の詳細については、Microsoft サポート技術情報の Knowledge Base の文書 300958「[HOW TO] 許可されていないユーザー アクセスを監視する方法」を参照してください。

SQL Server の監査

既定では、ログオン監査は無効に設定されています。ログオン監査を有効にするには、SQL Server Enterprise Manager を使用するか、レジストリを変更します。

既定では、SQL Server ログ ファイルは次のディレクトリに保存されます。SQL Server ログ ファイルはテキスト ファイルであり、メモ帳などのテキスト エディタで表示できます。

C:\Program Files\Microsoft SQL Server\MSSQL\LOG

■ Enterprise Manager を使ってログオン監査を有効にするには

  1. Enterprise Manager を起動します。
  2. 左側のツリー コントロールで監査する SQL Server を選択し、右クリックします。次に [プロパティ] をクリックします。
  3. [セキュリティ] タブをクリックします。
  4. 該当する監査レベルとして、[失敗]、[成功]、[すべて] のいずれかをクリックします。

■ レジストリ設定でログオン監査を有効にするには

次に示す AuditLevel キーをレジストリ内に作成し、このキーの値として以下の REG_DWORD の値の 1 つを設定します。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\AuditLevel

この AuditLevel キーには、次のいずれかの数値を設定します。この数値によって、捕捉対象の詳細レベルが決定します。

3 成功したログインと失敗したログインの両方を捕捉します。

2 失敗したログインだけを捕捉します。

1 成功したログインだけを捕捉します。

0 ログインを捕捉しません。

失敗したログインの監査を有効にしておくことをお勧めします。これにより、SQL Server に対してブルート フォース攻撃を行っているユーザーがいるかどうかを判別できます。失敗したログインを記録することによるパフォーマンスの低下は、攻撃を受けていない限りわずかなものであり、攻撃を受けたときには失敗したログインの記録を調べることが必要になります。

また、監査レベルを設定するもう 1 つの方法として、SQL Server 分散管理オブジェクト (DMO) に対してスクリプトを実行する方法があります。この操作を、次のサンプル コードに示します。

Sub SetAuditLevel(Server As String, NewAuditLevel As SQLDMO_AUDIT_TYPE)
Dim objServer As New SQLServer2
objServer.LoginSecure = True  'Use integrated security
objServer.Connect Server      'Connect to the target SQL Server    
'Set the audit level
objServer.IntegratedSecurity.AuditLevel = NewAuditLevel
Set objServer = Nothing
End Sub

「SQL Server Books Online」によると、列挙型 SQLDMO_AUDIT_TYPE のメンバは次のとおりです。

SQLDMOAudit_All     3 Log all authentication attempts - success or failure 
SQLDMOAudit_Failure 2 Log failed authentication 
SQLDMOAudit_None    0 Do not log authentication attempts 
SQLDMOAudit_Success 1 Log successful authentication

ログ エントリの例

SQL Server のログオン成功エントリとログオン失敗エントリの例を次に示します。

統合 Windows 認証を使用したログオンの成功を示すエントリ

2002-07-06 22:54:32.42 logon     Login succeeded for user 'SOMEDOMAIN\Bob'.Connection: Trusted.

SQL 標準認証を使用したログオンの成功を示すエントリ

2002-07-06 23:13:57.04 logon     Login succeeded for user 'SOMEDOMAIN\Bob'.Connection: Non-Trusted.

ログオンの失敗を示すエントリ

2002-07-06 23:21:15.35 logon     Login failed for user 'SOMEDOMAIN\BadGuy'.

IIS ログ

IIS ログには複数のフォーマットを設定できます。W3C 拡張ログを使用すると、詳細情報を参照できます。たとえば、[所要時間] を有効にすると、ページの処理にかかった時間がログに記録されます。これにより、本稼動 Web サイトで処理に時間のかかるページを特定できます。[URI クエリ] チェック ボックスをオンにすると、クエリ文字列 パラメータがログに記録されます。この情報は、Web ページに対する GET 操作の問題を解決するときに役立ちます。IIS ログの [拡張プロパティ] ダイアログ ボックスを次の図に示します。

図 13.1 IIS 拡張ログ プロパティ

トラブルシューティング ツール

ここでは、セキュリティ関連の問題やそれ以外の問題を診断する上で役に立つ非常に有用なツールについて説明します。

ファイル モニタ (FileMon.exe)

ファイルとフォルダへのアクセスを監視するためのツールです。ファイルのアクセス許可に関する問題を解決するときに役立ちます。このツールは、https://www.sysinternals.com/ Non-MS link (英語情報) から入手できます。

詳細情報

詳細については、Microsoft サポート技術情報の Knowledge Base の文書 286198「DLL ファイルで "アクセス許可は拒否されました" エラーを監視する」を参照してください。

アセンブリ バインディング ログ ビューア (Fuslogvw.exe)

アセンブリ バインディング ログ ビューアは .NET Framework SDK に収録されています。アセンブリ バインディング ログ ビューアはアセンブリ バインディングの問題を追跡するためのユーティリティです。詳細については、.NET Framework のドキュメントを参照してください。

ASP.NET のアセンブリ バインディング ログを作成するには、レジストリにログのパスを指定し、アセンブリ バインディング ログ ビューアで失敗をログに記録するオプションを有効にする必要があります。

ログ ファイルのログ パスを指定するには、regedit.exe を使ってディレクトリの位置 (e:\MyLogs など) を次のレジストリ キーに追加します。

[HKLM\Software\Microsoft\Fusion\LogPath]

ISQL.exe

ISQL は、コマンド プロンプトから SQL をテストするためのツールです。このツールは、複数のユーザーを使って、異なるログインを効率的にテストする場合に役立ちます。ISQL を実行するには、SQL Server がインストールされているコンピュータのコマンド プロンプトで isql.exe と入力します。

SQL 認証を使用した接続

ユーザー名を受け渡すには -U スイッチを使用します。また、任意で -P スイッチを使用してパスワードを指定することもできます。パスワードを指定しないと、ISQL からパスワードの入力が求められます。Windows コマンド プロンプトから次のコマンドを実行すると、パスワード プロンプトが表示されます。-P スイッチではなく、このテクニックを使用するうえでの利点は、パスワードが画面に表示されない点です。

C:\ >isql -S YourServer -d pubs -U YourUser
Password:

Windows 認証を使用した接続

現在の対話ログオンユーザーのセキュリティ コンテキストを利用した信頼関係接続を使用するには、-E スイッチを使用します。

C:\ >isql -S YourServer -d pubs -E

単純なクエリの実行

ログイン後に、次のような単純なクエリを実行します。

1> use pubs
2> SELECT au_lname, au_fname FROM authors
3> go

ISQL を終了するには、コマンド プロンプトに「quit」と入力します。

Windows タスク マネージャ

Windows XP および Windows Server 2003 の Windows タスク マネージャでは、プロセス実行に使用されている ID を表示できます。

■ プロセス実行 ID を表示するには

  1. タスク マネージャを起動します。
  2. [プロセス] タブをクリックします。
  3. [表示] メニューの [列の選択] をクリックします。
  4. [ユーザー名] チェック ボックスをオンにし、[OK] をクリックします。
    ユーザー名 (プロセス ID) が表示されます。

ネットワーク モニタ (NetMon.exe)

NetMon は、ネットワーク トラフィックを捕捉および監視するためのツールです。

詳細情報

Knowledge Base の次の記事を参照してください。

クライアントとサーバーが同一のコンピュータにインストールされている場合には、Netmon を実行できません。このため、ネットワーク トレースを捕捉するための別のツールが用意されています。

  • tcptrace.exe このツールは、http://www.pocketsoap.com/ Non-MS link から入手できます。アプリケーション実行中にトラフィックを記録、表示するようにセットアップできるため、Web サービスで特に役立ちます。基本認証に切り替え、tcptrace を使用して Web サービスへ送信される資格情報を確認できます。
  • packetmon.exe このツールは、http://www.analogx.com/ Non-MS link から入手できます。ネットワーク モニタ の簡易版ですが、ネットワーク モニタよりも容易に構成できます。

レジストリ モニタ (regmon.exe)

レジストリ モニタは、レジストリへのアクセスを監視するためのツールです。このツールでは、すべてのプロセスまたは指定したプロセスからの読み取りアクセスと更新操作を表示できます。レジストリのアクセス許可の問題を解決する場合に非常に役立つツールです。このツールは、https://www.sysinternals.com/ Non-MS link (英語情報) から入手できます。

WFetch.exe

WFetch.exe は、IIS と Web クライアントの間の接続の問題を解決するときに役立つツールです。IIS と Web クライアントの接続の問題を解決するときには、Web ブラウザには表示されないデータ (要求パケットと応答パケットに含まれている HTTP ヘッダなど) を参照することが必要になる場合があります。

詳細情報

このツールとダウンロード方法の詳細については、Microsoft サポート技術情報の Knowledge Base の文書284285 284285「[HOWTO] Wfetch による HTTP 接続のトラブルシューティング方法」を参照してください。

Visual Studio .NET ツール

Microsoft .NET Framework SDK セキュリティ ツール は https://www.microsoft.com/japan/msdn/library/ja/cptools/html/cpconnetframeworktools.asp にあります。

詳細情報

以下の Microsoft サポート技術情報の Knowledge Base の文書を参照してください。

WebServiceStudio

WebServiceStudio は、Web サービスの機能をテストするための汎用クライアントとして使用できます。このツールは SOAP 応答と要求パケットを捕捉して表示します。

このツールは https://www.gotdotnet.com/team/tools/web_svc/default.aspx (英語情報)からダウンロードできます。

Windows 2000 リソース キット

Windows 2000 リソース キットは https://www.microsoft.com/japan/windows2000/techinfo/reskit/default.asp から入手できます。

ツールの一覧については、https://www.microsoft.com/windows2000/techinfo/reskit/tools/default.asp (英語情報) を参照してください。

patterns and practices home