Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
devenoza
Starting Member
14 Posts |
Posted - 2013-03-07 : 15:19:55
|
my company management has decided to have a backup to the nas share folder so if any users/DBAs are trying to take a backup to another location (i.e to thier local drive) they would not be able to do that, how can I achieve this task please? I was thinking of using policy based management but not sure how can I apply to many servers. I would appriciate your thoughts on this. Thanks... Dev |
|
tkizer
Almighty SQL Goddess
38200 Posts |
|
robvolk
Most Valuable Yak
15732 Posts |
Posted - 2013-03-07 : 16:49:54
|
I agree with Tara. Restrict backup permissions, and if possible, restrict backups to local drives only, then have a separate process copy/move them to the NAS.I have a crazy idea (who, me?) that might be an option, but it's a lot of work and I don't have the skill at this point. Basically:1. Create an event notification for AUDIT_BACKUP_RESTORE_EVENTs2. Have an activation procedure on the queue for that notification3. The procedure parses the event data (TextData and SPID nodes) to see if they are backing up to an unauthorized location4. Kill the spid that's doing it#3 is going to cause you a lot of grief since it's text parsing, and it's easily circumvented using the WITH MIRROR option. Plus the fact that anyone with access to the NAS can copy backups unless you lock that down, which is the key part of Tara's suggestion. |
|
|
devenoza
Starting Member
14 Posts |
Posted - 2013-03-08 : 00:14:06
|
Thanks Tara and Rob for your reply... if this is not possible or possible with crazy idea :-) then I would leave upto my seniors and will see if they come up with other solution... once again thank you... |
|
|
mbourgon
Starting Member
6 Posts |
Posted - 2013-03-28 : 14:27:54
|
Okay, so it's doable... with a catch. (well, several) The catch will differ depending on what you want to do. Catch 1: You would think you could use a Trigger on the table. Not easily - "KILL command cannot be used inside user transactions."The code you'd use, for your activated Stored Procedure, should use transactions. Which means you'd have to set your code to deal with the messages, THEN write to the table, which would fire the trigger. However, without being transactional, it could lose messages. Catch 2: Modifying the activated stored procedure to kill the transaction. The catch is that the stored procedure doesn't have rights to kill it ("User does not have permission to use the KILL statement.")Fixing that... I'm not sure offhand, honestly. It may require granting a particular user the rights to do so, it may require certificates... heck, it might require TRUSTWORTHY. Ugh.Catch 3: this is probably the one to go with, if 2 doesn't work. Note that I haven't tested the job - but I've already spent my lunch hour playing with this, so that's it for now, sorry.The backup must take more than a minute to run. And this could kill other code...IF SO...Build the EN. Queue, Service, EN.Set up an activated SP that will write to a table (I used Parse_EN_Messages, from my blog, thebakingdba dot blogspot dot com, the rest of the code is below). Make sure the code in Parse_EN_Messages points at the new Queue (it does so in multiple places), and modify the enaudit_events table & parse_en_messages to add the TextData field. Now, set up a job that runs as often as possible (once a minute; you can't easily do it continuously since you want to make sure you don't keep killing it after it's already died)If there are, grab the SPID and KILL it. Since it's a job separate from the Queue, I don't see any problems with it.Here's the code to build things... you'll have to do the Parse_EN_Message yourself - too long for here.CREATE DATABASE BackupWatcherGOALTER DATABASE BackupWatcher SET ENABLE_BROKER;goUSE BackupWatchergoCREATE QUEUE BackupNotifyQueue GOcreate SERVICE BackupNotifyServiceON QUEUE BackupNotifyQueue ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])GOCREATE EVENT NOTIFICATION BackupNotifyEvent ON SERVER WITH FAN_IN FOR AUDIT_BACKUP_RESTORE_EVENT TO SERVICE 'BackupNotifyService', 'current database';GOBACKUP DATABASE BackupWatcher TO DISK='BackupWatcher3.bak'go--set up PARSE_EN_MESSAGES and necessary tables, changing the Queue Name in the SP to BackupNotifyQueue ALTER QUEUE BackupNotifyQueue WITH STATUS = ON, RETENTION = OFF ,ACTIVATION(STATUS = ON, PROCEDURE_NAME = [dbo].[Parse_EN_Messages], MAX_QUEUE_READERS = 2, EXECUTE AS owner)---and here's the code for your jobDECLARE @now SMALLDATETIME, @sql NVARCHAR(100), @min INT, @max INTSET @now = GETDATE()DECLARE @spids_to_kill TABLE (id int IDENTITY, spid NVARCHAR(10))INSERT INTO @spids_to_killSELECT spid FROM enaudit_events WHERE eventtype = 'AUDIT_BACKUP_RESTORE_EVENT' AND TextData NOT LIKE '%\\youracceptedpathhere%' --or whatever location you want AND insert_datetime > DATEADD(mi,-1,@now)IF (SELECT COUNT(*) FROM [@spids_to_kill]) > 0BEGIN SELECT @min =MIN(id), @max = MAX(id) FROM @spids_to_kill WHILE @min <= @max BEGIN SELECT @sql = 'KILL ' + spid FROM @spids_to_kill WHERE ID = @min IF (SELECT COUNT(*) FROM sys.sysprocesses WHERE spid = @min AND command LIKE '%backup database%') >0 --we do that so it doesn't accidentally kill a SPID once the backup is done BEGIN EXEC sp_executesql @sql END SET @min = @min+1 END END |
|
|
devenoza
Starting Member
14 Posts |
Posted - 2013-05-30 : 15:24:50
|
Thanks mbourgon! I will try this way and let you know how it goes :-) |
|
|
d3goldnews
Starting Member
3 Posts |
Posted - 2013-05-31 : 22:02:57
|
I think so. I think your article will give those people a good reminding. And they will express thanks to you later.__________________I'd rather be a happy fool than a sad sage.unspammed |
|
|
|
|
|
|
|