包含データベースには固有の脅威があるので、 SQL Server データベース エンジン の管理者はそれを理解し、危険性を軽減する必要があります。 脅威のほとんどは、認証境界をデータベース エンジン レベルからデータベース レベルに移動する USER WITH PASSWORD
認証プロセスに関連しています。
ユーザーに関連する脅威
包含データベース内でALTER ANY USER
権限を持つユーザー、例えばdb_ownerやdb_securityadminの固定データベースロールのメンバーは、SQL Server 管理者の知識や許可なしにデータベースへのアクセス権を付与できます。 包含データベースへのアクセス権をユーザーに付与すると、SQL Server インスタンス全体に対する潜在的な攻撃対象領域が増加します。 管理者は、このアクセス制御の委任を理解し、包含データベース内のユーザーに ALTER ANY USER
アクセス許可を付与することに十分注意する必要があります。 すべてのデータベース所有者は、 ALTER ANY USER
権限を持っています。 SQL Server 管理者は、包含データベース内のユーザーを定期的に監査する必要があります。
ゲスト アカウントを使用した他のデータベースへのアクセス
ALTER ANY USER
権限を持つデータベース所有者とデータベース ユーザーは、包含データベース ユーザーを作成できます。 SQL Server のインスタンス上の包含データベースに接続した後、他のデータベースで ゲスト アカウントが有効になっている場合、包含データベース ユーザーはデータベース エンジン上の他のデータベースにアクセスできます。
別のデータベースに重複するユーザーを作成する
アプリケーションによっては、ユーザーが複数のデータベースにアクセスする必要がある場合があります。 これを行うには、各データベースに同じ包含データベース ユーザーを作成します。 パスワードを使用して 2 番目のユーザーを作成するときは、SID オプションを使用します。 次の例では、2 つのデータベースに同一のユーザーを 2 人作成します。
USE DB1;
GO
CREATE USER Carlo WITH PASSWORD = '<strong password>';
-- Return the SID of the user
SELECT SID FROM sys.database_principals WHERE name = 'Carlo';
-- Change to the second database
USE DB2;
GO
CREATE USER Carlo WITH PASSWORD = '<same password>', SID = <SID from DB1>;
GO
データベース間クエリを実行するには、呼び出し元のデータベースに対して TRUSTWORTHY
オプションを設定する必要があります。 たとえば、上記で定義したユーザー (カルロ) が DB1 内にある場合、 SELECT * FROM db2.dbo.Table1;
実行するには、データベース DB1 の TRUSTWORTHY
設定をオンにする必要があります。 次のコードを実行して、 TRUSTWORHTY
設定をオンにします。
ALTER DATABASE DB1 SET TRUSTWORTHY ON;
ログインを複製するユーザーの作成
SQL Server ログインと同じ名前を使用してパスワードを持つ包含データベース ユーザーを作成し、SQL Server ログインが包含データベースを初期カタログとして指定して接続した場合、SQL Server ログインは接続できません。 接続は、SQL Server ログインに基づくユーザーとしてではなく、包含データベースのパスワード プリンシパルを持つ包含データベース ユーザーとして評価されます。 これにより、SQL Server ログインの意図的または偶発的なサービス拒否が発生する可能性があります。
ベスト プラクティスとして、 sysadmin 固定サーバー ロールのメンバーは、初期カタログ オプションを使用せずに常に接続することを検討する必要があります。 これにより、ログインがマスター データベースに接続され、データベース所有者によるログイン試行の誤用が回避されます。 その後、管理者は、
USE
<database> ステートメントを使用して、包含データベースに変更できます。 ログインの既定のデータベースを包含データベースに設定することもできます。これにより、 master へのログインが完了し、ログインが包含データベースに転送されます。ベスト プラクティスとして、SQL Server ログインと同じ名前のパスワードを持つ包含データベース ユーザーを作成しないでください。
重複するログインが存在する場合は、初期カタログを指定せずに マスター データベースに接続し、
USE
コマンドを実行して包含データベースに変更します。包含データベースが存在する場合、包含データベースではないデータベースのユーザーは、初期カタログを使用したり、非包含データベースのデータベース名を初期カタログとして指定したりせずに、データベース エンジンに接続する必要があります。 これにより、包含データベースへの接続が回避され、データベース エンジン管理者による直接的な制御が低下します。
データベースの包含状態を変更してアクセスを増やす
ALTER ANY DATABASE
権限を持つログイン (dbcreator 固定サーバー ロールのメンバーなど)、およびCONTROL DATABASE
権限を持つ非包含データベース内のユーザー (db_owner固定データベース ロールのメンバーなど) は、データベースの包含設定を変更できます。 データベースの包含設定を NONE
から PARTIAL
または FULL
に変更した場合は、パスワードを使用して包含データベース ユーザーを作成することで、ユーザー アクセスを許可できます。 これにより、SQL Server 管理者の知識や同意なしにアクセスできるようになります。 データベースが含まれるのを防ぐには、データベース エンジンcontained database authentication
オプションを 0 に設定します。 選択した包含データベースでパスワードを持つ包含データベース ユーザーによる接続を防ぐには、ログイン トリガーを使用して、パスワードを持つ包含データベース ユーザーによるログイン試行を取り消します。
データベースの添付(コンテインド)
包含データベースをアタッチすることで、管理者は不要なユーザーにデータベース エンジンのインスタンスへのアクセス権を付与できます。 このリスクを懸念している管理者は、データベースを RESTRICTED_USER
モードでオンラインにできます。これにより、パスワードを持つ包含データベース ユーザーの認証が禁止されます。 ログインによって承認されたプリンシパルのみがデータベース エンジンにアクセスできます。
ユーザーは、作成時に有効なパスワード要件を使用して作成され、データベースがアタッチされるときにパスワードは再確認されません。 パスワード ポリシーが厳しいシステムに脆弱なパスワードを許可する包含データベースをアタッチすることで、管理者は、アタッチするデータベース エンジンで現在のパスワード ポリシーを満たしていないパスワードを許可できます。 管理者は、接続されているデータベースのすべてのパスワードをリセットすることを要求することで、脆弱なパスワードの保持を回避できます。
パスワード ポリシー
データベース内のパスワードは強力なパスワードである必要がありますが、堅牢なパスワード ポリシーでは保護できません。 可能な限り Windows 認証を使用して、Windows から利用できるより広範なパスワード ポリシーを利用します。
Kerberos 認証
パスワードを持つ包含データベース ユーザーは、Kerberos 認証を使用できません。 可能であれば、Windows 認証を使用して、Kerberos などの Windows 機能を利用します。
オフライン 辞書攻撃
パスワードを持つ包含データベース ユーザーのパスワード ハッシュは、包含データベースに格納されます。 データベース ファイルにアクセスできるユーザーはだれでも、監査されていないシステム上のパスワードを持つ包含データベース ユーザーに対してディクショナリ攻撃を実行する可能性があります。 この脅威を軽減するには、データベース ファイルへのアクセスを制限するか、Windows 認証を使用して包含データベースへの接続のみを許可します。
コンテイン済みデータベースのエスケープ
データベースが部分的に含まれている場合、SQL Server 管理者は、包含データベース内のユーザーとモジュールの機能を定期的に監査する必要があります。
AUTO_CLOSEを介したサービス拒否
包含データベースを自動的に閉じるよう構成しないでください。 閉じた場合、ユーザーを認証するためにデータベースを開くと、追加のリソースが消費され、サービス拒否攻撃に寄与する可能性があります。