it-swarm.com.de

mysql: GRANTs für alle Benutzer anzeigen

MySQL's SHOW GRANTS zeigt die Berechtigungen des aktuellen Benutzers.

Gibt es eine Möglichkeit, sich als root anzumelden und die Berechtigungen aller Benutzer anzuzeigen?

97
Adam Matan

Nichts eingebaut. Sie haben jedoch zwei Möglichkeiten:

  • Verwenden common_schema 's sql_show_grants view. Sie können beispielsweise Folgendes abfragen:

    SELECT sql_grants FROM common_schema.sql_show_grants;
    

    Oder Sie können nach bestimmten Benutzern fragen, zum Beispiel:

    SELECT sql_grants FROM common_schema.sql_show_grants WHERE user='app';
    

    Installieren common_schema, folge den Anweisungen hier .

    Haftungsausschluss: Ich bin Autor dieses Tools.

  • Verwenden Sie Percona Toolkits pt-show-grants zum Beispiel:

    pt-show-grants --Host localhost --user root --ask-pass
    

In beiden Fällen können Sie nach dem Befehl GRANT oder dem Befehl REVOKE (gegenüber) fragen.

Im ersten Fall müssen Sie ein Schema installieren, im zweiten Fall müssen Sie Perl-Skripte + Abhängigkeiten installieren.

47
Shlomi Noach
select * from information_schema.user_privileges;

BEARBEITEN:

Wie von Shlomi Noach erwähnt:

Es werden keine datenbankspezifischen, tabellenspezifischen, spaltenspezifischen, routinemäßenspezifischen Berechtigungen aufgeführt. Daher wird der Zuschuss GRANT SELECT ON mydb. * TO myuser @ localhost nicht in information_schema.user_privileges angezeigt. Die oben vorgestellte Lösung common_schema aggregiert die Daten aus user_privileges und anderen Tabellen, um ein vollständiges Bild zu erhalten.

91
rumburak

Dieses Linux-Shell-Fragment durchläuft alle MySQL-Benutzer und führt für jeden ein SHOW GRANTS aus:

mysql --silent --skip-column-names --execute "select concat('\'',User,'\'@\'',Host,'\'') as User from mysql.user" | sort | \
while read u
 do echo "-- $u"; mysql --silent --skip-column-names --execute "show grants for $u" | sed 's/$/;/'
done

Funktioniert am besten, wenn Sie ohne Kennwort eine Verbindung zu MySQL herstellen können.

Die Ausgabe ist so formatiert, dass sie in einer MySQL-Shell ausgeführt werden kann. Achtung: Die Ausgabe enthält auch die MySQL-Root-Benutzerberechtigungen und das Kennwort! Entfernen Sie diese Zeilen, wenn Sie nicht möchten, dass der MySQL-Root-Benutzer geändert wird.

13
mleu

Ein Liner (Änderung -uroot bis -u$USER_NAME zur Verwendung mit anderen Benutzern) in einer Unix-Bash (wegen der Backticks):

mysql -uroot -p -sNe"`mysql -uroot -p -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',Host,'\';') FROM mysql.user;"`"

oder ohne Backticks und mit Inline-Passwort (Leerzeichen vor dem Befehl schließen es aus dem Bash-Verlauf in Ubuntu aus):

 mysql -uroot -p"$PASSWORD" -sNe"$(mysql -uroot -p"$PASSWORD" -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',Host,'\';') FROM mysql.user;")"

In Windows:

mysql -uroot -p -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',Host,'\';') FROM mysql.user;" > grants.sql
mysql -uroot -p < grants.sql
del grants.sql
10
inemanja

select * from mysql.user;

Kann Ihnen Benutzerliste und Berechtigungen geben, die jedem von ihnen zugewiesen sind, erfordert Zugriff auf mysql.user Tabelle obwohl und root Benutzer hat es.

9
Mahesh Patil

Wenn Sie die folgenden SELECT-Anweisungen ausführen können ohne Error:

/* User-Specific Grants     */   SELECT * FROM mysql.user;
/* Database-Specific Grants */   SELECT * FROM mysql.db;
/* Table-Specific Grants    */   SELECT * FROM mysql.tables_priv;
/* Column-Specific Grants   */   SELECT * FROM mysql.columns_priv;

dann können Sie den folgenden Code (unten) verwenden, der in der SQL-Syntax geschrieben ist.

Ich habe diese Abfrage entworfen, um zu versuchen, GRANT-Anweisungen für alle vorhandenen Berechtigungen neu zu erstellen (für die häufige Wartung während der Datenbankmigration). Es gibt einige Probleme, die behoben werden müssen, z. B. das Verknüpfen von Benutzerpasswörtern. Da wir jedoch häufig Passwörter aktualisieren, war dies nicht Gegenstand dieses Projekts.

/* Get All Grants/Permissions for MySQL Instance */

/* [Database.Table.Column]-Specific Grants */
SELECT
    CONCAT("`",gcl.Db,"`") AS 'Database(s) Affected',
    CONCAT("`",gcl.Table_name,"`") AS 'Table(s) Affected',
    gcl.User AS 'User-Account(s) Affected',
    IF(gcl.Host='%','ALL',gcl.Host) AS 'Remote-IP(s) Affected',
    CONCAT("GRANT ",UPPER(gcl.Column_priv)," (",GROUP_CONCAT(gcl.Column_name),") ",
                 "ON `",gcl.Db,"`.`",gcl.Table_name,"` ",
                 "TO '",gcl.User,"'@'",gcl.Host,"';") AS 'GRANT Statement (Reconstructed)'
FROM mysql.columns_priv gcl
GROUP BY CONCAT(gcl.Db,gcl.Table_name,gcl.User,gcl.Host)
/* SELECT * FROM mysql.columns_priv */

UNION

/* [Database.Table]-Specific Grants */
SELECT
    CONCAT("`",gtb.Db,"`") AS 'Database(s) Affected',
    CONCAT("`",gtb.Table_name,"`") AS 'Table(s) Affected',
    gtb.User AS 'User-Account(s) Affected',
    IF(gtb.Host='%','ALL',gtb.Host) AS 'Remote-IP(s) Affected',
    CONCAT(
        "GRANT ",UPPER(gtb.Table_priv)," ",
        "ON `",gtb.Db,"`.`",gtb.Table_name,"` ",
        "TO '",gtb.User,"'@'",gtb.Host,"';"
    ) AS 'GRANT Statement (Reconstructed)'
FROM mysql.tables_priv gtb
WHERE gtb.Table_priv!=''
/* SELECT * FROM mysql.tables_priv */

UNION

/* Database-Specific Grants */
SELECT
    CONCAT("`",gdb.Db,"`") AS 'Database(s) Affected',
    "ALL" AS 'Table(s) Affected',
    gdb.User AS 'User-Account(s) Affected',
    IF(gdb.Host='%','ALL',gdb.Host) AS 'Remote-IP(s) Affected',
    CONCAT(
        'GRANT ',
        CONCAT_WS(',',
            IF(gdb.Select_priv='Y','SELECT',NULL),
            IF(gdb.Insert_priv='Y','INSERT',NULL),
            IF(gdb.Update_priv='Y','UPDATE',NULL),
            IF(gdb.Delete_priv='Y','DELETE',NULL),
            IF(gdb.Create_priv='Y','CREATE',NULL),
            IF(gdb.Drop_priv='Y','DROP',NULL),
            IF(gdb.Grant_priv='Y','GRANT',NULL),
            IF(gdb.References_priv='Y','REFERENCES',NULL),
            IF(gdb.Index_priv='Y','INDEX',NULL),
            IF(gdb.Alter_priv='Y','ALTER',NULL),
            IF(gdb.Create_tmp_table_priv='Y','CREATE TEMPORARY TABLES',NULL),
            IF(gdb.Lock_tables_priv='Y','LOCK TABLES',NULL),
            IF(gdb.Create_view_priv='Y','CREATE VIEW',NULL),
            IF(gdb.Show_view_priv='Y','SHOW VIEW',NULL),
            IF(gdb.Create_routine_priv='Y','CREATE ROUTINE',NULL),
            IF(gdb.Alter_routine_priv='Y','ALTER ROUTINE',NULL),
            IF(gdb.Execute_priv='Y','EXECUTE',NULL),
            IF(gdb.Event_priv='Y','EVENT',NULL),
            IF(gdb.Trigger_priv='Y','TRIGGER',NULL)
        ),
        " ON `",gdb.Db,"`.* TO '",gdb.User,"'@'",gdb.Host,"';"
    ) AS 'GRANT Statement (Reconstructed)'
FROM mysql.db gdb
WHERE gdb.Db != ''
/* SELECT * FROM mysql.db */

UNION

/* User-Specific Grants */
SELECT
    "ALL" AS 'Database(s) Affected',
    "ALL" AS 'Table(s) Affected',
    gus.User AS 'User-Account(s) Affected',
    IF(gus.Host='%','ALL',gus.Host) AS 'Remote-IP(s) Affected',
    CONCAT(
        "GRANT ",
        IF((gus.Select_priv='N')&(gus.Insert_priv='N')&(gus.Update_priv='N')&(gus.Delete_priv='N')&(gus.Create_priv='N')&(gus.Drop_priv='N')&(gus.Reload_priv='N')&(gus.Shutdown_priv='N')&(gus.Process_priv='N')&(gus.File_priv='N')&(gus.References_priv='N')&(gus.Index_priv='N')&(gus.Alter_priv='N')&(gus.Show_db_priv='N')&(gus.Super_priv='N')&(gus.Create_tmp_table_priv='N')&(gus.Lock_tables_priv='N')&(gus.Execute_priv='N')&(gus.Repl_slave_priv='N')&(gus.Repl_client_priv='N')&(gus.Create_view_priv='N')&(gus.Show_view_priv='N')&(gus.Create_routine_priv='N')&(gus.Alter_routine_priv='N')&(gus.Create_user_priv='N')&(gus.Event_priv='N')&(gus.Trigger_priv='N')&(gus.Create_tablespace_priv='N')&(gus.Grant_priv='N'),
            "USAGE",
            IF((gus.Select_priv='Y')&(gus.Insert_priv='Y')&(gus.Update_priv='Y')&(gus.Delete_priv='Y')&(gus.Create_priv='Y')&(gus.Drop_priv='Y')&(gus.Reload_priv='Y')&(gus.Shutdown_priv='Y')&(gus.Process_priv='Y')&(gus.File_priv='Y')&(gus.References_priv='Y')&(gus.Index_priv='Y')&(gus.Alter_priv='Y')&(gus.Show_db_priv='Y')&(gus.Super_priv='Y')&(gus.Create_tmp_table_priv='Y')&(gus.Lock_tables_priv='Y')&(gus.Execute_priv='Y')&(gus.Repl_slave_priv='Y')&(gus.Repl_client_priv='Y')&(gus.Create_view_priv='Y')&(gus.Show_view_priv='Y')&(gus.Create_routine_priv='Y')&(gus.Alter_routine_priv='Y')&(gus.Create_user_priv='Y')&(gus.Event_priv='Y')&(gus.Trigger_priv='Y')&(gus.Create_tablespace_priv='Y')&(gus.Grant_priv='Y'),
                "ALL PRIVILEGES",
                CONCAT_WS(',',
                    IF(gus.Select_priv='Y','SELECT',NULL),
                    IF(gus.Insert_priv='Y','INSERT',NULL),
                    IF(gus.Update_priv='Y','UPDATE',NULL),
                    IF(gus.Delete_priv='Y','DELETE',NULL),
                    IF(gus.Create_priv='Y','CREATE',NULL),
                    IF(gus.Drop_priv='Y','DROP',NULL),
                    IF(gus.Reload_priv='Y','RELOAD',NULL),
                    IF(gus.Shutdown_priv='Y','SHUTDOWN',NULL),
                    IF(gus.Process_priv='Y','PROCESS',NULL),
                    IF(gus.File_priv='Y','FILE',NULL),
                    IF(gus.References_priv='Y','REFERENCES',NULL),
                    IF(gus.Index_priv='Y','INDEX',NULL),
                    IF(gus.Alter_priv='Y','ALTER',NULL),
                    IF(gus.Show_db_priv='Y','SHOW DATABASES',NULL),
                    IF(gus.Super_priv='Y','SUPER',NULL),
                    IF(gus.Create_tmp_table_priv='Y','CREATE TEMPORARY TABLES',NULL),
                    IF(gus.Lock_tables_priv='Y','LOCK TABLES',NULL),
                    IF(gus.Execute_priv='Y','EXECUTE',NULL),
                    IF(gus.Repl_slave_priv='Y','REPLICATION SLAVE',NULL),
                    IF(gus.Repl_client_priv='Y','REPLICATION CLIENT',NULL),
                    IF(gus.Create_view_priv='Y','CREATE VIEW',NULL),
                    IF(gus.Show_view_priv='Y','SHOW VIEW',NULL),
                    IF(gus.Create_routine_priv='Y','CREATE ROUTINE',NULL),
                    IF(gus.Alter_routine_priv='Y','ALTER ROUTINE',NULL),
                    IF(gus.Create_user_priv='Y','CREATE USER',NULL),
                    IF(gus.Event_priv='Y','EVENT',NULL),
                    IF(gus.Trigger_priv='Y','TRIGGER',NULL),
                    IF(gus.Create_tablespace_priv='Y','CREATE TABLESPACE',NULL)
                )
            )
        ),
        " ON *.* TO '",gus.User,"'@'",gus.Host,"' REQUIRE ",
        CASE gus.ssl_type
            WHEN 'ANY' THEN
                "SSL "
            WHEN 'X509' THEN
                "X509 "
            WHEN 'SPECIFIED' THEN
                CONCAT_WS("AND ",
                    IF((LENGTH(gus.ssl_cipher)>0),CONCAT("CIPHER '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL),
                    IF((LENGTH(gus.x509_issuer)>0),CONCAT("ISSUER '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL),
                    IF((LENGTH(gus.x509_subject)>0),CONCAT("SUBJECT '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL)
                )
            ELSE "NONE "
        END,
        "WITH ",
        IF(gus.Grant_priv='Y',"GRANT OPTION ",""),
        "MAX_QUERIES_PER_HOUR ",gus.max_questions," ",
        "MAX_CONNECTIONS_PER_HOUR ",gus.max_connections," ",
        "MAX_UPDATES_PER_HOUR ",gus.max_updates," ",
        "MAX_USER_CONNECTIONS ",gus.max_user_connections,
        ";"
    ) AS 'GRANT Statement (Reconstructed)'
FROM mysql.user gus
WHERE gus.Password != ''
/* SELECT * FROM mysql.user gus */

/* TODO: */
/* SELECT * FROM mysql.Host ghs */
/* SELECT * FROM mysql.procs_priv gpr */

Gerne beantworten/überprüfen Sie Fragen oder Bedenken

4
Cavallo

Dies gibt Ihnen eine bessere Sicht ...

mysql> select Host, Db, User, Insert_priv, Update_priv, Delete_priv, Create_tmp_table_priv, Alter_priv from mysql.db limit 1;
+------+------+------+-------------+-------------+-------------+-----------------------+------------+
| Host | Db   | User | Insert_priv | Update_priv | Delete_priv | Create_tmp_table_priv | Alter_priv |
+------+------+------+-------------+-------------+-------------+-----------------------+------------+
| %    | test |      | Y           | Y           | Y           | Y                     | Y          |
+------+------+------+-------------+-------------+-------------+-----------------------+------------+
1 row in set (0.00 sec)
2
Mansur Ali

Der Befehl SHOW GRANTS [FOR user] kann jeden gewünschten Benutzer anzeigen. Siehe hier für weitere Details.

1
Eugen Konkov

Wie in diese Antwort erwähnt, können Sie die folgenden Befehle ausführen, um die datenbankspezifischen, tabellenspezifischen, spaltenspezifischen und routinemäßenspezifischen Berechtigungen aller Benutzer aufzulisten. Beachten Sie, dass Sie dies über die Shell ausführen müssen, nicht über die MySQL-Eingabeaufforderung.

mysql -u root --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',Host,''';') FROM mysql.user WHERE user<>''" | mysql -u root --skip-column-names -A

Der Vorteil dieses Ansatzes besteht darin, dass Sie keine zusätzliche Software installieren müssen.

1
billyw

Wenn Sie Datenbanken häufig verwalten, möchten Sie wahrscheinlich strenge Berechtigungen behalten. Sie können eine gespeicherte Prozedur verwenden, um schnell eine Prüfung durchzuführen. Dieses Beispiel funktioniert in Mariadb. Möglicherweise ist ein Tweak erforderlich, um mit der Standard-MySQL-Version zu arbeiten.

Verwenden Sie die Antwort von Mansur ALi mit einem kleinen Tweak, um die Spalten neu zu ordnen und eine Reihenfolge hinzuzufügen, um die Ausgabe besser zu organisieren.

Verwenden eines Root-Logins:

USE mysql;
DELIMITER //

CREATE PROCEDURE ShowPrivs(start, end)
BEGIN
    SELECT Db, User, Host, Insert_priv, Update_priv, Delete_priv, Create_tmp_table_priv, Alter_priv FROM mysql.db order by Db, Host, User ASC;
END;
//

DELIMITER ;

Sie können die Prozedur ändern, um stattdessen die Tabelle mysql.user zu überprüfen.

Verwendung mit einem Root-Login:

USE mysql;
CALL ShowPrivs();

Ich habe die MySQL-Workbench unter Ubuntu verwendet, um den Teil der Erstellungsprozedur dieser Antwort auszuführen.

Abgesehen davon und ein wenig vom Thema hier entfernt, könnten Sie auch ein Verfahren haben, um unbekannte Hosts oder Benutzer anzuzeigen. Ein Beispiel für unbekannte Hosts:

USE mysql;

DELIMITER //
CREATE PROCEDURE `ShowUnknownHosts`(IN Hosts_String VARCHAR(200))
BEGIN
    SELECT user,Host FROM user
    WHERE FIND_IN_SET(Host, Hosts_String) = 0;
END//

DELIMITER ;

Verwendungshinweis: Geben Sie eine durch Kommas getrennte Zeichenfolge von Hosts an, sodass nur ein Satz von '' verwendet wird:

CALL ShowUnknownHosts('knownhost1,knownhost2');

Sie können die Spaltenvariable auch festlegen, indem Sie einen anderen Parameter in die Prozedur aufnehmen und ihn mit ShowUnknownHosts (user, 'user1, user2') aufrufen. zum Beispiel.

0
Chris