移行の最中です。完全バックアップが作成され、宛先にコピーされています。金曜日に、差分バックアップを行う予定ですが、誰かが誤って別の完全バックアップを作成しました(copy_onlyは使用しませんでした)。
今後はこれを防ぎたいと思います。 (次のように)拒否することは考えられますが、特定のログインはわかりません。では、誰も完全バックアップを実行できないようにするにはどうすればよいですか?
DENY BACKUP DATABASE TO [LoginName]
データベースのバックアップを防止する最も「通常の」方法-データベースをバックアップする権限を持っている人に尋ね、移行が完了するまで(copy_onlyではない)完全バックアップを行わないでください...
「[LoginName]へのバックアップデータベースの拒否」を実行できます
sysadmin
のログインメンバーである限り、[〜#〜] no [〜#〜]DENYはsysadminメンバーを停止できます。そう、 DENY BACKUP
以下を適用しない限り、hepしません:
sysadmin
サーバーロールから削除されたログインdb_owner
データベースごと。ただし、セキュリティのベストプラクティスとして、ユーザーがDBへのフルアクセスを必要とする場合は、それらをdb_owner
として作成するのではなく、それぞれのデータベースでsysadmin
にします。その後、あなただけが適用できますDENY BACKUP DATABASE
今後発生しないようにするため。
それとは別に、db_owner
(ifotherexist in same DB)REVOKE DENY、 Creating a alert (using message:18264)は回避策。
しかし、私たちは特定のログインを知りません
次のクエリを使用すると、誰がそれを実行できるか(予期しないバックアップ)、最後に実行したバックアップの詳細を知ることができます。
予期しないバックアップを実行できるユーザー:
select
sp.name as LoginName,
r.name as RoleName,
sp.sid,
sp.type_desc,
'ALTER SERVER ROLE SYSADMIN DROP MEMBER ' + QUOTENAME(sp.name) as FixCommand
from sys.server_principals as sp
left outer join sys.server_role_members rm on sp.principal_id = rm.member_principal_id
left outer join sys.server_principals r on rm.role_principal_id = r.principal_id
Where r.name = 'sysadmin' and (not sp.name like 'NT SERVICE%')
実行されたバックアップの詳細:
SELECT [b].[database_name] ,
[b].[backup_start_date] ,
[b].[backup_finish_date] ,
[b].[type] ,
[b].[first_lsn] ,
[b].[last_lsn] ,
[b].[checkpoint_lsn] ,
[b].[database_backup_lsn],
--,f.media_set_id
f.physical_device_name,
((b.compressed_backup_size / 1024) / 1024) as CompressedSize_MB,
CASE WHEN Type = 'L'
Then 'RESTORE LOG '+ QUOTENAME([database_name]) +' FROM DISK=N''' + f.physical_device_name + ''' WITH NORECOVERY, REPLACE, STATS; '
WHEN Type = 'D'
Then 'RESTORE DATABASE '+ QUOTENAME([database_name]) +' FROM DISK=N''' + f.physical_device_name + ''' WITH NORECOVERY, REPLACE, STATS; '
END as Script,
b.is_single_user,
b.user_name
FROM [msdb].[dbo].[backupset] AS [b]
LEFT JOIN msdb.dbo.backupmediafamily f ON b.media_set_id = f.media_set_id
where b.database_name = 'YourDatabase' --- add your database name here
order by b.backup_finish_date desc
テストケース(コメントに基づく)
CREATE LOGIN TEST_USER WITH PASSWORD = 'test', CHECK_POLICY=OFF;
USE TestDB;
CREATE USER TEST_USER FOR LOGIN TEST_USER;
ALTER ROLE DB_OWNER ADD MEMBER TEST_USER;
CREATE ROLE DENY_BACKUP;
DENY BACKUP DATABASE TO DENY_BACKUP;
ALTER ROLE DENY_BACKUP ADD MEMBER TEST_USER; -- Implicit DENY
DENY BACKUP DATABASE TO TEST_USER; -- Explicit DENY
GO
-- Implicit/Explicit BACKUP permissions Verification
select dp.name, p.*
from sys.database_permissions as p
join sys.database_principals as dp on p.grantee_principal_id = dp.principal_id
where p.type = 'BADB'
go
----------------------------------------------------------------------------------------
-- Above commands must be run by SYSADMIN, below must be from TEST_USER
----------------------------------------------------------------------------------------
Use TestDB;
Backup Database TestDB to disk = 'null'; -- as expected it fails due to DENY permissions
go
sp_helpuser 'test_user'; -- Yes, "TEST_USER" is DB_OWNER
REVOKE BACKUP DATABASE TO DENY_BACKUP; -- Implicit DENY can be revoked by same user while the user is DB_OWNER
ALTER ROLE DENY_BACKUP DROP MEMBER TEST_USER; -- Implicit DENY can be revoked by same user while the user is DB_OWNER
REVOKE BACKUP DATABASE TO Test_User -- Explicit DENY cannot be revoked by same user though user is DB_OWNER. It says, "you cannot revoke permissions yourself"
go
バックアップに対してDENY権限を発行する方法はないと思います。
ただし、ログインとユーザーがバックアップを作成できるいくつかの役割があります。
SA=グループからのログインを無効にすることができます。このログイングループの誰でも、サーバー上の任意のデータベースでバックアップを実行できます。
そして、db_backupoperatorまたはdb_ownerグループに含まれるユーザーを無効にします。このロールを持つメンバーは、そのデータベースをバックアップできます。これはデータベースごとに行う必要があります。これらはデータベース全体の役割であり、サーバー全体の役割ではありません。
これらのユーザーとログインを削除する前に、スクリプトで削除することを検討してください。無効にする方が復元したり削除したりする方がはるかに簡単ですが、復元スクリプトはあなたを雇用し続け、ストレスを減らすのに役立つ安全策です...
バックアップを取るために必要な最低限の権限はdb_backupoperatorであり、次にバックアップを取ることができるdb_ownerが来ます。これらはデータベースレベルのロールです。 'Sysadmin'は、バックアップを取ることができるサーバーの役割です。
次に、ログインの権限を確認します。すべてを最初にスクリプト化します。移行が完了するまで、上記の権限を削除してください。完了したら、アクセス許可を元に戻します。