包含データベース ユーザー - データベースの可搬性を確保する

包含データベース ユーザーを使用して SQL Server と SQL Database のデータベース レベルでの接続が認証されます。 包含データベースとは、他のデータベースや、データベースをホストするSQL Server/SQL Database (およびマスター データベース) のインスタンスから分離されたデータベースです。 SQL Server では、Windows 認証と SQL Server 認証の両方で包含データベース ユーザーがサポートされます。 SQL Databaseを使用して、包含データベース ユーザーとデータベース レベルのファイアウォール規則を結合します。 このトピックでは、従来のログイン/ユーザー モデルおよび Windows またはサーバー レベルのファイアウォール規則と比較して、包含データベース モデルの相違点とこれを使用する利点について説明します。 特定のシナリオ、管理の容易性、アプリケーションのビジネス ロジックでは、従来のログイン / ユーザー モデルとサーバー レベルのファイアウォール規則を引き続き使用する必要があります。

Note

Microsoft の SQL Database サービスが向上し、SLA の保証が高度になると、包含データベース ユーザー モデルとデータベース用ファイアウォール規則に切り替え、特定のデータベースに対する SLA の可用性と最大ログイン レートをさらに高める必要があります。 Microsoft は、今すぐこのような変化に対応することをお勧めします。

従来のログイン / ユーザー モデル

従来の接続モデルでは、Windows ユーザーまたは Windows グループのメンバーが データベース エンジン に接続する際、Windows によって認証されているユーザーまたはグループの資格情報を指定します。 または、接続は名前とパスワードの両方を提供し、SQL Server認証を使用して接続します (SQL Databaseに接続する場合は唯一のオプションです)。 どちらの場合も、接続ユーザーの資格情報に対応するログインが master データベースに格納されている必要があります。 通常、 データベース エンジン で Windows 認証の資格情報が確認されるか、 SQL Server 認証の資格情報で本人性が確認されると、ユーザー データベースへの接続が試行されます。 ユーザー データベースに接続するには、そのデータベース内のユーザーに対してログインをマップ (関連付けることが) できなければなりません。 また、特定のデータベースへの接続を接続文字列で指定する方法もあります。この方法は、 SQL Server では任意ですが、 SQL Databaseでは必須です。

重要なのは、(master データベース内の) ログインと (ユーザー データベース内の) ユーザーの両方が存在し、かつ相互に関連付けられていなければならない、ということです。 これは、ユーザー データベースへの接続が、master データベース内のログインに依存していることを意味します。そのことが、データベースのホストを別の SQL Server や Azure SQL データベース サーバーに切り替えることを困難にしています。 また、なんらかの理由で、master データベースへの接続が利用できないと (フェールオーバーが進行中であるなど)、全体的な接続時間が増えたり、接続がタイムアウトしたりする可能性もあります。そのため、接続のスケーラビリティが低下します。

包含データベース ユーザー モデル

包含データベース ユーザー モデルでは、ログインが master データベースには存在しません。 認証プロセスはユーザー データベースで実行されます。master データベースには、ユーザー データベース内のデータベース ユーザーに関連付けられたログインは存在しません。 包含データベース ユーザー モデルでは、Windows 認証 (SQL Server) とSQL Server認証 (SQL ServerとSQL Databaseの両方) の両方がサポートされます。 包含データベース ユーザーとして接続するには必ず、ユーザー データベースのパラメーターが接続文字列に含まれている必要があります。 データベース エンジン はそれを基に、認証プロセスがどちらのデータベースで管理されるかを判別します。 包含データベース ユーザーのアクティビティは、そのユーザーを認証するデータベースに限定されます。そのため包含データベース ユーザーとして接続しているときは、そのユーザーが必要とする個々のデータベースに、ユーザー アカウントを別々に作成する必要があります。 データベースを切り替えるには、 SQL Database ユーザー側で新しい接続を作成する必要があります。 SQL Server 内の包含データベース ユーザーは、別のデータベースに同一ユーザーが存在する場合、データベースを切り替えることができます。

SQL Databaseの場合、従来のモデルから包含データベース ユーザー モデルに切り替えるときに、接続文字列を変更する必要はありません。 SQL Server 接続の場合は、データベースの名前を接続文字列に追加する必要があります (既に存在する場合は不要)。

重要

従来型のモデルを使用した場合、サーバー レベルのロールとサーバー レベルの権限ですべてのデータベースに対するアクセスを制限できます。 包含データベース モデルを使用した場合、データベース所有者と ALTER ANY USER 権限を持ったデータベース ユーザーとがデータベースに対するアクセス権を付与できます。 これにより高い権限を与えられたサーバー ログインのアクセス制御範囲は狭められ、高い権限を与えられたデータベース ユーザーのアクセス制御範囲は拡大します。

ファイアウォール

SQL Server

Windows ファイアウォール ルールはすべての接続に適用され、ログイン (従来のモデルの接続) と包含データベース ユーザーに同じ影響を及ぼします。 Windows ファイアウォールの詳細については、「 データベース エンジン アクセスを有効にするための Windows ファイアウォールを構成する」を参照してください。

SQL Database ファイアウォール

SQL Database では、サーバー レベルの接続 (ログイン) 用とデータベース レベルの接続 (包含データベース ユーザー) 用にファイアウォール規則を切り離すことができます。 ユーザー データベースに接続すると、最初にデータベースのファイアウォール規則がチェックされます。 データベースへのアクセスを許可する規則が存在しない場合は、サーバー レベルのファイアウォール規則がチェックされます。これには、論理サーバーのマスター データベースへのアクセスが必要です。 データベース レベルのファイアウォール規則と包含データベース ユーザーを組み合わせることで、接続中にサーバーのマスター データベースにアクセスする必要がなくなり、接続のスケーラビリティが向上します。

SQL Database のファイアウォール規則の詳細については、次のトピックを参照してください。

構文上の違い

従来のモデル 包含データベース ユーザー モデル
master データベースに接続する場合:

CREATE LOGIN login_name WITH PASSWORD = 'strong_password';

次にユーザー データベースに接続する場合:

CREATE USER 'user_name' FOR LOGIN 'login_name';
ユーザー データベースにする場合:

CREATE USER user_name WITH PASSWORD = 'strong_password';
従来のモデル 包含データベース ユーザー モデル
master データベースのコンテキストでパスワードを変更するには:

ALTER LOGIN login_name WITH PASSWORD = 'strong_password';
ユーザー データベースのコンテキストでパスワードを変更するには:

ALTER USER user_name WITH PASSWORD = 'strong_password';

解説

  • SQL Serverでは、 SQL Serverのインスタンスに対して包含データベース ユーザーを有効にする必要があります。 詳細については、包含データベース認証サーバー構成オプションを参照してください。

  • 包含データベース ユーザーとログインの名前が重複しない場合は、アプリケーションで共存させることができます。

  • name1 という名前のログインが master データベースに存在し、なおかつ name1という名前の包含データベース ユーザーを作成した場合、接続文字列でデータベース名を指定すると、そのデータベースに接続するときのログイン コンテキストよりも、データベース ユーザーのコンテキストが優先されます。 つまり、包含データベース ユーザーは、同じ名前のログインに優先します。

  • SQL Database では、包含データベース ユーザーの名前を、サーバーの管理者アカウントと同じ名前にすることはできません。

  • SQL Database サーバーの管理者アカウントは、包含データベース ユーザーにできません。 サーバー管理者は、包含データベース ユーザーを作成し、管理するための十分な権限を持っています。 サーバー管理者は、ユーザー データベースの包含データベース ユーザーに権限を付与できます。

  • 包含データベース ユーザーはデータベース レベル プリンシパルであるため、使用するすべてのデータベースで包含データベース ユーザーを作成する必要があります。 ID はデータベースに限定され、同じサーバー内の別のデータベースで同じ名前とパスワードを持つユーザーとは完全に独立しています。

  • 通常のログインで使用するパスワードと同じ強度のパスワードを使用します。

参照

包含データベース
包含データベースでのセキュリティのベスト プラクティス
CREATE USER (Transact-SQL)