Sql-und-Xml - Home

SQL-Praxis

Ein Nutzer ohne sysadmin-Recht soll eine Aktivität ausführen, die das sysadmin-Recht benötigt

Erstellen Sie ein Backup Ihrer Datenbank mit einem Klick. Für welchen Zweck kann eine solche Technik genutzt werden?

  • Sie betreiben bsp. einen Web-Server mit Datenbank-Anbindung, wobei Sie den MS-SqlServer oder die Microsoft Data Engine verwenden. Aus Gründen der Sicherheit Ihres Systems wird der Datenbank-Zugriff von der ASP- oder ASPX-Seite nur über einen Nutzer abgewickelt, der ein sehr schwaches Zugriffs-Recht hat. Dieser Nutzer darf bsp. nur auf eine einzige Datenbank zugreifen, er hat keine direkten SELECT, INSERT-, UPDATE- oder DELETE-Rechte. Er gehört weder zu einer Server- noch zu einer Datenbank-Rolle. Er darf lediglich gewisse gespeicherte Prozeduren ausführen, denen er viele Parameter übergibt. Sie vermeiden damit Gefahren, die von einer möglichen Sql-Injection kommen könnten.
  • Nun benötigen Sie über diesen Datenbank-Zugriff die Möglichkeit, eine Aktion auszuführen, für die ein stärkeres Recht notwendig ist. Denken Sie an das Sichern der Datenbank außerhalb des üblichen Zeitplans, das Erstellen oder Ändern einer Datenbank, das Erstellen / Ändern / Löschen einer Tabelle oder ihrer Spalten. Oder Sie müssen auf eine kanonische Art und Weise zu einer neuen Tabelle die gespeicherte Prozedur erstellen, die Ihr eigenes Sicherheitskonzept implementiert.
  • Dieselbe Anforderung kann sich ebenso in einem lokalen Netzwerk stellen. Ein Nutzer soll das Recht bekommen, die Durchführung einer Datenbank-Sicherung veranlassen zu können, ohne daß er ein erweitertes Recht erhält oder gar selbst einen Sql-Befehl ausführen müßte. Dies ist nicht nur im Sinne eines Zugriffsschutzes, sondern auch im Sinne einer möglichst geringen Fehleranfälligkeit wünschenswert, es kann auch relevant für Ihre Urlaubsvertretung sein.

Notwendige Schritte

  • Mit der folgenden Technik können Sie für dieses Szenario eine Lösung implementieren.
  • Einmalig sind die folgenden Schritte zu erledigen

    1. Erstellen Sie die gespeicherte Prozedur, welche Ihrer Anforderung entspricht. Zur Ausführung der dort definierten Aktionen ist das SysAdmin-Recht notwendig.
    2. Erstellen Sie einen Job, dessen einzigster Job-Step diese gespeicherte Prozedur aufruft (sp_add_job in der msdb-Datenbank).
    3. Erstellen Sie eine benutzerdefinierte Message mit einer eigenen Nummer (sp_addmessage in der master).
    4. Verknüpfen Sie die Nummer der selbstdefinierten Message mit dem Namen des Jobs, indem Sie eine Warnung erstellen (sp_add_alert in msdb)
    5. Schließlich erstellen Sie eine gespeicherte Prozedur, die nur einmalig RaisError aufruft. Für diese Prozedur erhält der Nutzer, der diese Aktion ausführen soll, die Execute-Berechtigung.

Beispiel

Kopieren Sie sich das folgende Script in eine Datei namens Scriptdatei.sql

  1. -- Wechseln Sie in die Datenbank, in der die gespeicherte Prozedur
    -- erstellt werden soll
    use db_production
    go
    
    -- Erstellen Sie diese - für die Ausführung des Backup-Befehls
    -- ist das sysadmin-, db_owner- oder db_backupoperator-Recht notwendig
    
    Create Procedure up_backup_Database
    As
    Backup Database db_production
    	To Disk = 'E:\MSSQL\Backup\db_production.bak'
    go
  2. -- Wechsel in die msdb
    use msdb
    go
    
    -- Erzeugen des Jobs
    
    Execute sp_add_job @job_name = 'job_backup_db_production',
    	@notify_level_eventlog = 3
    
    Execute sp_add_jobstep @job_name = 'job_backup_db_production',
    	@step_name = 'jobstep_backup_db_production',
    	@step_id = 1,
    	@subsystem = 'TSQL',
    	@command = 'Execute db_production.dbo.up_backup_Database',
    	@database_name = 'master',
    	@cmdexec_success_code = 0,
    	@on_success_action = 1,
    	@output_file_name =
    		'E:\MSSQL\own_logs\job_backup_db_production.txt',
    	-- Dies schreibt Ausgaben in die angegebene Datei
    
    	@flags = 2
    	-- Anhängen anstatt überschreiben
    
    Execute sp_add_jobserver @job_name = 'job_backup_db_production'
    go
  3. -- Erstellen der eigenen Message
    
    Execute master.dbo.sp_addmessage @msgnum = 100101,
    	-- Dies ist Ihr eigener Nummernkreis
    	@severity = 1,
    	@msgtext = 'Backup Database db_production',
    	@lang = 'us_english',
    	@with_log = 'true',
    	-- with_log ist entscheidend: Jeder Aufruf wird
    	-- ins EventLog eingetragen
    	@replace = 'replace'
    
    -- Erstellen der lokalisierten Version
    
    Execute master.dbo.sp_addmessage @msgnum = 100101,
    	@severity = 1,
    	@msgtext = 'Datenbank db_production sichern',
    	@lang = 'german',
    	@with_log = 'true',
    	@replace = 'replace'
  4. -- Erstellen der Warnung
    
    Execute sp_add_alert @name = 'alert_backup_db_production',
    	@message_id = 100101,
    	@include_event_description_in = 7,
    	-- Dies kann nützlich sein, falls Sie RaisError weitere
    	-- Informationen mitgeben möchten
    
    	@database_name = 'db_production',
    	-- In dieser Datenbank muß RaisError ausgelöst werden,
    	-- um diesen Alert zu aktivieren
    
    	@job_name = 'job_backup_db_production'
    
    go
  5. -- Erstellen der eigentlichen Prozedur
    -- und Erteilen der Execute-Berechtigung
    
    use db_production
    go
    
    Create Procedure up_start_backup
    As
    RaisError(100101, 1, 1)
    go
    
    Grant Execute On up_start_backup To [INTERNETSERVER\AspNet]
    -- Setzen Sie hier den zu dieser Aktion legitimierten Nutzer ein
    go

Den Beispiel-Code verwenden

  • Erstellen Sie die Datenbank db_production einmalig per Hand:
    OSQL -E -Q "Create Database db_production"
  • Führen Sie das Script über eine vertraute Anmeldung aus mit
    OSQL -E -i Scriptdatei.sql
  • Starten Sie das Backup als der 'schwache Benutzer':
    OSQL -E -Q "Execute db_production.dbo.up_start_backup"
  • Nun werden Sie im Verzeichnis E:\MSSQL\Backup die Datei db_production.bak finden. Eine genaue Protokollierung der normalerweise an die Konsole übergebenen Ausdrücke finden Sie in der Datei 'E:\MSSQL\own_logs\job_backup_db_production.txt'.
  • Sie können sich auch eine Verknüpfung erstellen, welche die obige OSQL-Zeile als Befehl enthält. Dann sichern Sie sich ihre Datenbank per Klick auf die Verknüpfung.

© 2003-2016 Jürgen Auer, Berlin.