web-dev-qa-db-ja.com

db_ownerロールメンバーシップでログインするRESTORE権限を拒否することはできますか?

db_ownerロールメンバーシップを持つログインへのRESTORE権限を拒否することはできますか?

dbcreatorは、そのDBのバックアップを使用して既存のDBにRESTOREする必要がありますか?それとも、バックアップから新しいDBを作成するときにのみ必要ですか?

db_ownerのメンバーシップを持つユーザーが誤って間違ったサーバー/インスタンスに復元するのを防止しようとしています。

4
Maa421s

Microsoft RESTOREステートメントのドキュメント は、データベースの権限について次のように述べています。

復元するデータベースが存在しない場合、ユーザーはRESTOREを実行するためにCREATE DATABASE権限を持っている必要があります。データベースが存在する場合、RESTORE権限のデフォルトは、sysadminおよびdbcreator固定サーバーロールのメンバーとデータベースの所有者(dbo)です。

RESTORE権限は、メンバーシップ情報が常にサーバーですぐに利用できる役割に付与されます。固定データベースロールメンバーシップは、データベースがアクセス可能で損傷していない場合にのみチェックできるため、RESTOREが実行される場合は常にそうであるとは限らないため、db_owner固定データベースロールのメンバーにはRESTORE権限がありません

Db_ownerレベルの権限を必要とするpersonを提供することをお勧めします。実際のデータベース所有者とは別のログインです。 db_ownerデータベースロールのメンバーシップにより、そのユーザーは復元を実行できません。

RESTORE DATABASE権限を拒否することで、ログインがCREATE ANY DATABASEを実行できないようにすることができます。

テストとして、SQL Server 2008 R2インスタンスでこれを行いました。

テストログインを作成します。

USE master;
GO
IF NOT EXISTS (SELECT 1 FROM sys.server_principals sp WHERE sp.name = 'Test_db_owner')
BEGIN
    CREATE LOGIN Test_db_owner WITH PASSWORD = 'awsdaqwer0987)(FA&897afda2345';
END
GO

テストデータベースを作成します。

IF EXISTS (SELECT 1 FROM sys.databases d WHERE d.name = 'Test_db_owner')
BEGIN
    ALTER DATABASE Test_db_owner SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE Test_db_owner;
END
CREATE DATABASE Test_db_owner;
GO

上記のログイン用のテストデータベースにユーザーを作成し、そのユーザーをdb_ownerデータベースロールに追加します。

USE Test_db_owner;
CREATE USER [Test_db_owner] FOR LOGIN [Test_db_owner];
EXEC sys.sp_addrolemember @rolename = 'db_owner', @membername = 'Test_db_owner';
GO

データベースのバックアップを作成します。

USE master;
BACKUP DATABASE Test_db_owner TO DISK = 'D:\SQLServer\MV\Backup\Test_db_owner.bak' WITH INIT;

ログインとして復元ステートメントをテストします。

EXECUTE AS LOGIN = 'Test_db_owner';
RESTORE DATABASE Test_db_owner FROM DISK = 'D:\SQLServer\MV\Backup\Test_db_owner.bak' 
    WITH REPLACE, RECOVERY;
REVERT;

出力:

メッセージ3110、レベル14、状態1、行25 
ユーザーにはデータベース「Test_db_owner」を復元する権限がありません。
メッセージ3013、レベル16、状態1、行25 
復元DATABASEが異常終了しています。

掃除:

DROP LOGIN Test_db_owner;
DROP DATABASE Test_db_owner;

参考までに、データベース所有者は次のように変更されます。

ALTER AUTHORIZATION ON DATABASE::[xyz] TO [login_name];

(またはsys.sp_changedbowner、つまり 非推奨

Db_ownerロールのメンバーシップは次のように付与されます。

ALTER ROLE [db_owner] ADD MEMBER [login_name];

どちらのステートメントも「データベース所有者」に影響を与えるように見えますが、そうではありません。データベースを所有するログインを変更できるのは、ALTER AUTHORIZATIONステートメントだけです。 Remus Rusanuによる この優れた答え を参照してください。

ログインで非本番環境のデータベースを復元できるようにする場合は、それらをdbcreatorサーバーロールのメンバーにします。

EXEC sys.sp_addsrvrolemember @loginame = 'Test_db_owner'
    , @rolename = 'dbcreator';
1
Max Vernon