包含データベースでのセキュリティのベスト プラクティスSecurity Best Practices with Contained Databases

適用対象: ○SQL Server XAzure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

包含データベースには固有の脅威があるので、 SQL Server データベース エンジンSQL Server Database Engine の管理者はそれを理解し、危険性を軽減する必要があります。Contained databases have some unique threats that should be understood and mitigated by SQL Server データベース エンジンSQL Server Database Engine administrators. 脅威の多くは USER WITH PASSWORD 認証プロセスと関連しており、このプロセスでは認証の境界を データベース エンジンDatabase Engine のレベルからデータベースのレベルへと移します。Most of the threats are related to the USER WITH PASSWORD authentication process, which moves the authentication boundary from the データベース エンジンDatabase Engine level to the database level.

ALTER ANY USER 権限を持つ、包含データベースのユーザー ( db_ownerdb_securityadmin 固定データベース ロールのメンバーなど) は、知識、許可、または SQL ServerSQL Server 管理者がなくても、データベースへのアクセスを付与できます。Users in a contained database that have the ALTER ANY USER permission, such as members of the db_owner and db_securityadmin fixed database roles, can grant access to the database without the knowledge or permission or the SQL ServerSQL Server administrator. ユーザーに包含データベースへのアクセスを許可すると、 SQL ServerSQL Server インスタンス全体に対する潜在的な攻撃の危険性が高まります。Granting users access to a contained database increases the potential attack surface area against the whole SQL ServerSQL Server instance. 管理者はこのアクセス制御の委任について理解し、包含データベースのユーザーへの ALTER ANY USER 権限の許可については十分に注意する必要があります。Administrators should understand this delegation of access control, and be very careful about granting users in the contained database the ALTER ANY USER permission. すべてのデータベース所有者は ALTER ANY USER 権限を持ちます。All database owners have the ALTER ANY USER permission. SQL ServerSQL Server 管理者は、包含データベースのユーザーを定期的に監査する必要があります。administrators should periodically audit the users in a contained database.

guest アカウントによる他のデータベースへのアクセスAccessing Other Databases Using the guest Account

ALTER ANY USER 権限を持つデータベース所有者とデータベース ユーザーは、包含データベースのユーザーを作成できます。Database owners and database users with the ALTER ANY USER permission can create contained database users. SQL ServerSQL Serverのインスタンスの包含データベースに接続した後で、包含データベースのユーザーは データベース エンジンDatabase Engine上の、 guest アカウントを有効にしている他のデータベースにアクセスできます。After connecting to a contained database on an instance of SQL ServerSQL Server, a contained database user can access other databases on the データベース エンジンDatabase Engine, if the other databases have enabled the guest account.

別のデータベースへの重複するユーザーの作成Creating a Duplicate User in Another Database

アプリケーションによっては、1 人のユーザーが複数のデータベースにアクセスできるようにすることが必要な場合があります。Some applications might require that a user to have access to more than one database. この操作を行うには、各データベースに同一の包含データベース ユーザーを作成します。This can be done by creating identical contained database users in each database. パスワードを持つ 2 番目のユーザーを作成するときは、SID オプションを使用します。Use the SID option when creating the second user with password. 次の例では、2 つのデータベースに 2 人の同一ユーザーを作成します。The following example creates two identical users in two databases.

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 オプションを設定する必要があります。To execute a cross-database query, you must set the TRUSTWORTHY option on the calling database. たとえば、上で定義したユーザー (Carlo) が DB1 に存在する場合、 SELECT * FROM db2.dbo.Table1; を実行するには、データベース DB1 に対して TRUSTWORTHY 設定が ON である必要があります。For example if the user (Carlo) defined above is in DB1, to execute SELECT * FROM db2.dbo.Table1; then the TRUSTWORTHY setting must be on for database DB1. TRUSTWORTHY 設定を ON に設定するには、次のコードを実行します。Execute the following code to set the TRUSTWORTHY setting on.

ALTER DATABASE DB1 SET TRUSTWORTHY ON;  

ログインが重複するユーザーの作成Creating a User that Duplicates a Login

パスワードを持つ包含データベース ユーザーが、 SQL ServerSQL Server ログインと同じ名前を使用して作成された場合、 SQL ServerSQL Server ログインが包含データベースを初期カタログとして指定して接続しようとすると、 SQL ServerSQL Server ログインは接続できません。If a contained database user with password is created, using the same name as a SQL ServerSQL Server login, and if the SQL ServerSQL Server login connects specifying the contained database as the initial catalog, then the SQL ServerSQL Server login will be unable to connect. その接続は、 SQL ServerSQL Server ログインに基づくユーザーとしてではなく、包含データベース上のパスワード プリンシパル付きの包含データベース ユーザーとして評価されます。The connection will be evaluated as the contained database user with password principal on the contained database instead of as a user based on the SQL ServerSQL Server login. このことは、 SQL ServerSQL Server ログインに対する意図的または偶発的なサービス拒否を引き起こす可能性があります。This could cause an intentional or accidental denial of service for the SQL ServerSQL Server login.

  • ベスト プラクティスとして、 sysadmin 固定サーバー ロールのメンバーは常に、初期カタログ オプションを使用せずに接続することを検討してください。As a best practice, members of the sysadmin fixed server role should consider always connecting without using the initial catalog option. このようにすると、ログインが master データベースに接続されるので、データベースの所有者によるログイン試行の悪用を回避できます。This connects the login to the master database and avoids any attempts by a database owner to misuse the login attempt. その後、管理者は USE <database> ステートメントを使用して、包含データベースに切り替えることができます。Then the administrator can change to the contained database by using the USE<database> statement. また、ログインの既定のデータベースを包含データベースに設定することもできます。この場合、まず masterへのログインが行われ、その後、ログインが包含データベースに転送されます。You can also set the default database of the login to the contained database, which completes the login to master, and then transfers the login to the contained database.

  • ベスト プラクティスとして、パスワードを持つ包含データベース ユーザーを作成する場合は、 SQL ServerSQL Server ログインと同じ名前にしないようにしてください。As a best practice, do not create contained database users with passwords who have the same name as SQL ServerSQL Server logins.

  • 重複するログインが存在する場合は、初期カタログを指定せずに master データベースに接続し、その後 USE コマンドを実行して包含データベースに切り替えてください。If the duplicate login exists, connect to the master database without specifying an initial catalog, and then execute the USE command to change to the contained database.

  • 包含データベースが存在する場合、包含データベースではないデータベースのユーザーは、初期カタログを使用せずに データベース エンジンDatabase Engine に接続するか、初期カタログとして非包含データベースの名前を指定する必要があります。When contained databases are present, users of databases that are not contained databases should connect to the データベース エンジンDatabase Engine without using an initial catalog or by specifying the database name of a non-contained database as the initial catalog. こうすることで、 データベース エンジンDatabase Engine の管理者による直接的な制御が及ばない部分のある包含データベースへの接続を回避できます。This avoids connecting to the contained database which is under less direct control by the データベース エンジンDatabase Engine administrators.

データベースの包含状態の変更によるアクセスの増加Increasing Access by Changing the Containment Status of a Database

ALTER ANY DATABASE 権限を持つログイン ( dbcreator 固定サーバー ロールのメンバーなど) と、 CONTROL DATABASE 権限を持つ、非包含データベースのユーザー ( db_owner 固定データベース ロールのメンバーなど) は、データベースの包含設定を変更できます。Logins that have the ALTER ANY DATABASE permission, such as members of the dbcreator fixed server role, and users in a non-contained database that have the CONTROL DATABASE permission, such as members of the db_owner fixed database role, can change the containment setting of a database. データベースの包含設定が NONE から PARTIAL または FULLに変更された場合、パスワードを持つ包含データベース ユーザーを作成することで、ユーザー アクセスを許可できるようになります。If the containment setting of a database is changed from NONE to either PARTIAL or FULL, then user access can be granted by creating contained database users with passwords. これは、SQL ServerSQL Server 管理者が認識せず、同意していないアクセスが可能になることを意味しています。This could provide access without the knowledge or consent of the SQL ServerSQL Server administrators. どのデータベースも包含されないようにするには、データベース エンジンDatabase Enginecontained database authentication オプションを 0 に設定します。To prevent any databases from being contained, set the データベース エンジンDatabase Enginecontained database authentication option to 0. パスワードを持つ包含データベース ユーザーによる選択された包含データベースへの接続を防ぐには、ログイン トリガーを使用して、パスワードを持つ包含データベース ユーザーによるログイン試行を取り消します。To prevent connections by contained database users with passwords on selected contained databases, use login triggers to cancel login attempts by contained database users with passwords.

包含データベースのインポートAttaching a Contained Database

包含データベースをアタッチすることにより、管理者が意図していないユーザーに データベース エンジンDatabase Engineのインスタンスへのアクセスを許可する可能性があります。By attaching a contained database, an administrator could give unwanted users access to the instance of the データベース エンジンDatabase Engine. この危険性を懸念する管理者は、データベースを RESTRICTED_USER モードでオンラインにすることができます。このモードでは、パスワードを持つ包含データベース ユーザーの認証を防ぐことができます。An administrator concerned about this risk can bring the database online in RESTRICTED_USER mode, which prevents authentication for contained database users with passwords. ログインによって承認されたプリンシパルだけが、 データベース エンジンDatabase Engineにアクセスできます。Only principals authorized through logins will be able to access the データベース エンジンDatabase Engine.

ユーザーの作成時にはパスワード要件が有効で、パスワードが確認されますが、データベースがアタッチされるときにはパスワードの再確認が行われません。Users are created using the password requirements in effect at the time that they are created and passwords are not rechecked when a database is attached. 包含データベースをアタッチすることによって、厳しいパスワード ポリシーのシステムで脆弱なパスワードが許可されるため、管理者はアタッチする データベース エンジンDatabase Engineでの現在のパスワード ポリシーに準拠していないパスワードを許可する可能性があります。By attaching a contained database which allowed weak passwords to a system with a stricter password policy, an administrator could permit passwords that do not meet the current password policy on the attaching データベース エンジンDatabase Engine. 管理者は、アタッチされているデータベースのすべてのパスワードのリセットを要求することによって、脆弱なパスワードの保持を回避できます。Administrators can avoid retaining the weak passwords by requiring that all passwords be reset for the attached database.

パスワード ポリシーPassword Policies

データベースのパスワードを強力なパスワードにするように要求することはできますが、強固なパスワード ポリシーで保護することはできません。Passwords in a database can be required to be strong passwords, but cannot be protected by robust password policies. Windows で使用可能なより広範なパスワード ポリシーを活用するために、できる限り Windows 認証を使用してください。Use Windows Authentication whenever possible to take advantage of the more extensive password policies available from Windows.

Kerberos 認証Kerberos Authentication

パスワードを持つ包含データベース ユーザーは、Kerberos 認証を使用することはできません。Contained database users with passwords cannot use Kerberos Authentication. 可能であれば、Windows 認証を使用して、Kerberos などの Windows の機能を利用してください。When possible, use Windows Authentication to take advantage of Windows features such as Kerberos.

オフライン辞書攻撃Offline Dictionary Attack

パスワードを持つ包含データベース ユーザーのパスワード ハッシュは、包含データベースに格納されます。The password hashes for contained database users with passwords are stored in the contained database. データベース ファイルにアクセスできるユーザーはだれでも、パスワードを持つ包含データベース ユーザーに対する辞書攻撃を、監査されないシステム上で実行できます。Anyone with access to the database files could perform a dictionary attack against the contained database users with passwords on an unaudited system. この脅威を軽減するには、データベース ファイルへのアクセスを制限するか、Windows 認証を使用する場合にのみ包含データベースへの接続を許可します。To mitigate this threat, restrict access to the database files, or only permit connections to contained databases by using Windows Authentication.

包含データベースのエスケープEscaping a Contained Database

データベースが部分的に包含されている場合、 SQL ServerSQL Server 管理者は包含データベースのユーザーとモジュールの機能を定期的に監査する必要があります。If a database is partially contained, SQL ServerSQL Server administrators should periodically audit the capabilities of the users and modules in contained databases.

AUTO_CLOSE によるサービス拒否Denial of Service Through AUTO_CLOSE

包含データベースを自動終了するように構成しないでください。Do not configure contained databases to auto close. 自動終了すると、ユーザーの認証のためにデータベースを開くことで追加のリソースが消費されたり、サービス拒否攻撃が容易になったりします。If closed, opening the database to authenticate a user consumes additional resources and could contribute to a denial of service attack.

参照See Also

包含データベース Contained Databases
部分的包含データベースへの移行Migrate to a Partially Contained Database