2016-05-31 8 views
0

Ich habe die MySQL-Version von this question for SQL-ServerWie kann man nur durch die gespeicherte Prozedur einfügen?

ich mysql Ver 14.14 Distrib 5.5.49, für debian-linux-gnu (x86_64) mit Readline- 6.3

läuft ich nur mit dieser Berechtigung einen Benutzer erstellt haben :

DELIMITER $$ 
CREATE PROCEDURE seed_database() 
this_procedure:BEGIN 

    INSERT INTO `dbtable` VALUES (1,'data'); 

END $$ 
DELIMITER ; 

Aber wenn ich l:

CREATE USER 'username'@'localhost' IDENTIFIED BY '[email protected]'; 
GRANT EXECUTE ON dbname.* TO 'username'@'localhost'; 

ich dieses Verfahren auf dbname erstellt haben ogin mit diesem Benutzer und versuchen zu CALL seed_database();, erhalte ich:

ERROR 1142 (42000) in Zeile 1: INSERT Befehl verweigert Benutzer 'username' @ 'localhost' für Tabelle 'dbtable'

Ich versuche, the principle of least privilege zu folgen, indem ich nur einem Benutzer erlaube, gespeicherte Prozeduren auszuführen. Ich möchte einem Benutzer nicht das Recht geben, direkt auf eine Tabelle mit dem offensichtlichen GRANT INSERT ON dbname.dbtable TO 'username'@'localhost'; INSERT zu setzen, falls die Berechtigungsnachweise kompromittiert sind und ich eine komplexe Logik in der gespeicherten Prozedur habe, die zu speichernde Eingaben erzeugt (dargestellt durch hartcodierte Daten in dem Beispiel (1,'data')), dass ich nicht möchte, dass der Benutzer direkt erzeugt und fügt. Aber ich möchte, dass sie die gespeicherte Prozedur verwenden, um das gleiche Ziel zu erreichen.

Antwort

1

Ich würde vorschlagen, Sie lesen auf definer's rights procedures. Sie sollten in der Lage sein, Ihre Prozedur zu definieren als privilegierter Benutzer laufen, dann GRANT EXECUTE zu unprivilegierten Benutzern:

GRANT INSERT ON TABLE dbtable 
    TO 'privileged_user'@'localhost'; 

CREATE 
    DEFINER = 'privileged_user'@'localhost' 
    PROCEDURE seed_database() 
    BEGIN 

     INSERT INTO `dbtable` VALUES (1,'data'); 

    END; 

GRANT EXECUTE ON PROCEDURE dbname.seed_database 
    TO 'unprivileged_user'@'localhost'; 

HAFTUNGSAUSSCHLUSS: Ich bin nicht eingerichtet dies zur Zeit zu testen, aber es sollte funktionieren.

Standardmäßig führt MySQL gespeicherte Prozeduren mit "definer's rights" aus, dh mit den Rechten der Person, die die gespeicherte Prozedur erstellt. Dies bedeutet, dass dieser Benutzer Berechtigungen für alle Datenobjekte haben muss, auf die die Prozedur zugreift. Wenn die DEFINER-Klausel in CREATE FUNCTION/PROCEDURE angegeben ist, führt MySQL stattdessen die Prozedur mit den Rechten des Benutzers aus, der in der DEFINER-Klausel genannt wird. Solange der Definierer Berechtigungen für die Datenobjekte hat, benötigt der Invoker nur Privileg für das Verfahren selbst.

Fragesteller oder die definer Recht kann auch explizit angegeben werden, wie in

CREATE PROCEDURE seed_database() 
    SQL SECURITY DEFINER 
    BEGIN 
    ... 

SECURITY DEFINER ohne DEFINER = Klausel angeben, wird die definer an der Person, die tatsächlich auf dem Standard die CREATE Anweisung ausführen. Dies ist das Gleiche, als würde keine der beiden Klauseln angegeben.

Die Angabe SECURITY INVOKER bewirkt, dass MySQL mit den Privilegien der Person unter Verwendung der gespeicherten Prozedur ausgeführt wird. Dies bedeutet, dass der Aufrufer für alle Datenobjekte, auf die die Prozedur zugreift, Berechtigungen für die Prozedur und haben muss.Dies kann zum Beispiel mit Verwaltungsroutinen geschehen, so dass ein Benutzer, der nicht in den Systemtabellen herumfummeln darf, auch keine Prozedur verwenden kann, die in den Systemtabellen herumfummelt, selbst wenn versehentlich Zugriff darauf gewährt wird Verfahren.

+0

danke! das war die erforderliche Lektüre, die ich brauchte. Nach einigen Tests stellte ich fest, dass es beim ersten Erstellen der Prozedur als root funktionierte. Aber ich hatte einige Dinge verwirrt, indem ich versuchte, eine Testumgebung zu erstellen, in der der Benutzer Prozeduren ändern, löschen und erstellen konnte. Ich hatte naiv angenommen, dass alle SPs mit erhöhten Rechten laufen. So könnten sie die Prozedur neu erstellen, aber das Zulassen von Einfügungsberechtigungen wäre eine Sicherheitslücke. danke –

+0

Ziemlich willkommen. Ich füge eine kleine Information über die Rechte von invoker vs. definer zu meiner Antwort für zukünftige Leser hinzu. –

+0

in Bezug auf *** Standardmäßig **, MySQL führt gespeicherte Prozeduren mit "Invoker-Rechte", * dies kann in den letzten Versionen geändert haben, aber für 5,5 * Das SQL-SECURITY-Merkmal kann DEFINER oder INVOKER sein ... ** default ** value ist DEFINER ... Der Standardwert DEFINER ist der Benutzer, der das CREATE PROCEDURE * ausführt, wie es bei meinem vorherigen Kommentar der Fall war DEFINER und DEFINER Klauseln) –

Verwandte Themen