SQL Server でのアプリケーション ロールの作成 (ADO.NET)

更新 : November 2007

アプリケーション ロールは、データベース ロールやユーザーに対してではなく、アプリケーションに権限を割り当てる手段です。ユーザーはデータベースに接続し、アプリケーション ロールをアクティブ化して、そのアプリケーションに付与された権限を使用することになります。アプリケーション ロールに付与された権限は、接続している間のみ有効です。

Bb669062.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

アプリケーション ロールは、クライアント アプリケーションが接続文字列でアプリケーション ロール名とパスワードを渡すことによってアクティブ化されます。2 層アプリケーションでは、パスワードをクライアント コンピュータに保存する必要があるため、セキュリティ上の脆弱性を伴います。3 層アプリケーションでは、アプリケーションのユーザーがアクセスできないような形でパスワードを保存できます。

アプリケーション ロールの特徴

アプリケーション ロールには次の特徴があります。

  • データベース ロールとは異なり、アプリケーション ロールはメンバを持ちません。

  • アプリケーション ロールは、アプリケーションが sp_setapprole システム ストアド プロシージャにアプリケーション ロール名とパスワードを渡すことによってアクティブ化されます。

  • パスワードはクライアント コンピュータに保存しておき、実行時に渡す必要があります。アプリケーション ロールを SQL Server 内からアクティブ化することはできません。

  • パスワードは暗号化されません。SQL Server 2005 以降では、パラメータのパスワードが一方向のハッシュとして保存されます。

  • アクティブ化後、アプリケーション ロールを使用して取得した権限は、接続している間のみ有効です。

  • SQL Server 2000 では、実行コンテキストを元の呼び出し元に切り替えることはできません。したがって、アプリケーション ロールを使用するには接続プールを無効にする必要があります。詳細については、「SQL Server の接続プール (ADO.NET)」を参照してください。

  • アプリケーション ロールは、public ロールに付与された権限を継承します。

  • アプリケーション ロールが sysadmin 固定サーバー ロールのメンバによってアクティブ化された場合、セキュリティ コンテキストは、接続している間、アプリケーション ロールのセキュリティ コンテキストに切り替わります。

  • アプリケーション ロールを持ったデータベースに guest アカウントを作成した場合、そのアプリケーション ロールまたはそれを呼び出すログインに対するデータベース ユーザー アカウントを作成する必要はありません。別のデータベースに guest アカウントが存在する場合は、アプリケーション ロールでそのデータベースに直接アクセスできます。

  • SYSTEM_USER など、ログイン名を返す組み込み関数を実行した場合、アプリケーション ロールを呼び出したログイン名が返されます。データベース ユーザー名を返す組み込み関数を実行した場合、アプリケーション ロールの名前が返されます。

最小特権の原則

パスワードが漏洩した場合に備えて、アプリケーション ロールには必要な権限だけを付与してください。アプリケーション ロールを使ったデータベースでは、public ロールに対する権限は取り消す必要があります。アプリケーション ロールの呼び出し元が特定のデータベースにアクセスできないようにするには、そのデータベースの guest アカウントを無効にします。

アプリケーション ロールの機能強化

SQL Server 2005 リリース以降では、アプリケーション ロールをアクティブ化した後で実行コンテキストを元の呼び出し元に戻すことができるため、接続プールを無効にする必要はありません。呼び出し元のコンテキスト情報を格納する Cookie を作成するための新しいオプションが sp_setapprole プロシージャに追加されています。sp_unsetapprole プロシージャにその Cookie を渡して呼び出すことによって、元のセッションに切り替えることができます。

アプリケーション ロールに代わる方法

アプリケーション ロールはパスワードのセキュリティに依存する関係上、セキュリティ上の脆弱性を伴います。パスワードをアプリケーション コードに組み込んだり、ディスクに保存したりすると、パスワードが漏洩する可能性があります。

SQL Server 2005 以降のバージョンでは、次の代替策を検討してください。

  • EXECUTE AS ステートメントに NO REVERT 句と WITH COOKIE 句を指定してコンテキスト切り替えを行う。ログインにマップされていないユーザー アカウントをデータベースに作成し、このアカウントに権限を割り当てるようにします。EXECUTE AS はパスワード ベースではなく、権限ベースであるため、非ログイン ユーザーで使用した方が高いセキュリティを確保できます。詳細については、「SQL Server での借用を使用した権限のカスタマイズ (ADO.NET)」を参照してください。

  • 証明書を使ってストアド プロシージャに署名し、そのプロシージャを実行するのに必要な権限だけを付与する。詳細については、「SQL Server でのストアド プロシージャの署名 (ADO.NET)」を参照してください。

外部リソース

詳細については、次のリソースを参照してください。

リソース

説明

アプリケーション ロール (SQL Server 2008 オンライン ブック)

SQL Server 2008 でアプリケーション ロールを作成および使用する方法について説明します。

アプリケーション ロール (SQL Server 2005 オンライン ブック)

SQL Server 2005 でアプリケーション ロールを作成および使用する方法について説明します。

アプリケーション セキュリティとアプリケーション ロールの設定 (SQL Server 2000 オンライン ブック)

SQL Server 2000 でアプリケーション ロールを作成および使用する方法について説明します。

参照

概念

SQL Server におけるアプリケーション セキュリティのシナリオ (ADO.NET)

その他の技術情報

ADO.NET アプリケーションのセキュリティ保護

SQL Server セキュリティの概要 (ADO.NET)