Datenbanken 16 Zugriffsrechte und Benutzer Karl Meier [email protected] 21.12.2010 Inhalt Sicherheitskonzept Benutzer eröffnen verwalten Rechte erteilen löschen 21.12.2010 16 Zugriffsrechte und Benutzer 2 1 Grundsätzlich gilt… Normalerweise ist es nicht erwünscht, dass jeder alle Datenbankoperationen durchführen kann. Es muss einen (oder mehrere) Administratoren geben, die mit sehr weit reichenden Rechten ausgestattet sind. Mit Differenzierung der Zugriffsrechte wird den verschiedenen Vorschriften Rechnung getragen. 21.12.2010 16 Zugriffsrechte und Benutzer 3 Sicherheitskonzept Sicherheitskonzept mit Rechteverwaltung für Objekte der Datenbank ist notwendig Benutzer- / Benutzergruppenverwaltung Zugriffsrechte ACL: Access Control List 21.12.2010 16 Zugriffsrechte und Benutzer 4 2 Benutzerverwaltung Zweistufige Zugriffskontrolle: Die Datenbankbenutzer besitzen Systemund Objektprivilegien Systemprivilegien werden mit Username, Hostname und Passwort geprüft (MySQL) Für die Objektprivilegien empfiehlt es sich, eine CRUD Matrix zu erstellen 21.12.2010 16 Zugriffsrechte und Benutzer 5 CRUD Matrix 21.12.2010 C reate INSERT R ead SELECT U pdate UPDATE D elete DELETE 16 Zugriffsrechte und Benutzer 6 3 Das DB Sicherheitsmodell grant Schema XY OP XY.tab1 XY.tab2 erzeugt XY grant S P Create session Create table S P „clients“ Schema ZX Create SP erzeugt DBA OP OP ZX grant 21.12.2010 16 Zugriffsrechte und Benutzer 7 Datenbankadministrator DBA Verfügt über die meisten Rechte Kann anderen Usern Rechte zuweisen Unterschiedlicher Name je nach RDBMS MySQL: root / <blank> MS SQL-Server: sa / <blank> ORACLE: sys / change_on_install sysadm / sysadm 21.12.2010 16 Zugriffsrechte und Benutzer 8 4 Rechteverwaltung in MySQL Administrationsprogramm mit GUI Tabelle user in Datenbank mysql (host, benutzer, passwort, rechte) Direkt mit INSERT und UPDATE ändern SQL Befehle GRANT und REVOKE Perl-Script mysql_setpermission.pl Zugriff auf Datenbank mysql sehr restriktiv 21.12.2010 16 Zugriffsrechte und Benutzer 9 Datenbankbenutzer mysql> USE mysql; Database changed mysql> DESC user; +-----------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+---------------+------+-----+---------+-------+ | Host | char(60) | | PRI | | | | User | char(16) | | PRI | | | | Password | char(41) | | | | | | Select_priv | enum('N','Y') | | | N | | | Insert_priv | enum('N','Y') | | | N | | | Update_priv | enum('N','Y') | | | N | | | Delete_priv | enum('N','Y') | | | N | | | Create_priv | enum('N','Y') | | | N | | | Drop_priv | enum('N','Y') | | | N | | | Reload_priv | enum('N','Y') | | | N | | | Shutdown_priv | enum('N','Y') | | | N | | | Process_priv | enum('N','Y') | | | N | | | File_priv | enum('N','Y') | | | N | | | Grant_priv | enum('N','Y') | | | N | | | References_priv | enum('N','Y') | | | N | | | Index_priv | enum('N','Y') | | | N | | | Alter_priv | enum('N','Y') | | | N | | ... +-----------------+---------------+------+-----+---------+-------+ 37 rows in set (0.04 sec) 21.12.2010 16 Zugriffsrechte und Benutzer 10 5 MySQL-Installation unter Unix/Linux root# mysqladmin –u root –h localhost password xxx root# mysqladmin –u root –h 127.0.0.1 password xxx root# mysqladmin –u root –h „hostname“ password xxx root# mysql –p Enter password: xxx Welcome to the MySQL monitor. … mysql> USE mysql; Database changed mysql> DELETE FROM user WHERE user=´ ´; Query OK, 2 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql> exit 21.12.2010 16 Zugriffsrechte und Benutzer 11 MySQL-Installation unter Windows root Passwort für lokalen Zugang C:\...\bin> mysqladmin –u root –h localhost password xxx Kein root Zugang von fremden Rechnern mysql> DELETE From USER where USER=´root´ AND host=´%´; Weniger Rechte für lokale Benutzer mysql> REVOKE ALL ON *.* FROM ´´@localhost; mysql> REVOKE GRANT OPTION ON *.* FROM ´´@localhost; Kein lokaler Zugang ohne Passwort mysql> DELETE FROM user WHERE user=´´ AND host=´localhost´; Kein Zugang ohne Passwort von externen Rechnern mysql> DELETE FROM user WHERE host=´%´ AND user=´´; mysql> FLUSH PRIVILEGES; 21.12.2010 16 Zugriffsrechte und Benutzer 12 6 Benutzer anlegen mysql> USE mysql; Database changed mysql> INSERT INTO user -> SET host="%", user="meier", password=PASSWORD("secret"); Query OK, 1 row affected (0.27 sec) mysql> INSERT INTO user (host, user, password) -> VALUES ("localhost", "huber", PASSWORD("geheim")); Query OK, 1 row affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) 21.12.2010 16 Zugriffsrechte und Benutzer 13 Syntax INSERT INTO user (host, user, password) VALUES („hostname“, „benutzername“, PASSWORD(„passwort“)); 21.12.2010 „hostname“ Erklärung % Alle Computer localhost Lokaler Computer db.hsz-t.ch Computer mit Domainname %.hsz-t.ch Alle Rechner der Domain hostname Computer mit Netzwerkname 16 Zugriffsrechte und Benutzer 14 7 Benutzer verwalten SELECT * FROM user; Benutzer anzeigen UPDATE user SET spalte=wert, …; Benutzer ändern DELETE FROM user WHERE user=„benutzername“; Benutzer löschen 21.12.2010 16 Zugriffsrechte und Benutzer 15 Zugriffsrechte Definiert mit GRANT DBA hat alle Rechte Ersteller von Objekten hat Rechte darauf Weitere Rechte nach Bedarf definiert Rechtevergabe durch DBA (Standard) Entziehen mit REVOKE 21.12.2010 16 Zugriffsrechte und Benutzer 16 8 Beispiel mysql> GRANT ALL ON t_ma_proj TO meier; Query OK, 0 rows affected (0.35 sec) mysql> GRANT SELECT, UPDATE ON t_proj TO meier; Query OK, 0 rows affected (0.07 sec) mysql> GRANT SELECT ON t_ma TO meier; Query OK, 0 rows affected (0.02 sec) 21.12.2010 16 Zugriffsrechte und Benutzer 17 Syntax GRANT GRANT privilegien ON [db.]tabelle TO user@host; 21.12.2010 Privilegien ALL CRUD Erklärung C, R, U, D Alle Rechte INSERT Create Einfügerecht (INSERT…) SELECT Read Leserecht (SELECT…) UPDATE Update Änderungsrecht (UPDATE…) DELETE Delete Löschrecht (DELETE…) 16 Zugriffsrechte und Benutzer 18 9 Syntax REVOKE REVOKE privilegien ON [db.]tabelle FROM user@host; ON db.* Alle Tabellen ON *.* Globale Privilegien ´´@host Alle Benutzer auf host user@´%´ user auf allen Rechnern 21.12.2010 16 Zugriffsrechte und Benutzer 19 MySQL Privilegien Privilegien Erklärung Für Tabellen Select Darf Daten lesen Insert Darf neue Datensätze einfügen Update Darf vorhandene Datensätze ändern Delete Darf vorhandene Datensätze löschen Index Darf Indizes für Tabellen anlegen/löschen Alter Darf Tabellen umbenennen bzw. Struktur verändern 21.12.2010 16 Zugriffsrechte und Benutzer 20 10 Weitere MySQL Privilegien Privilegien Erklärung Für Datenbanken, Tabellen und Indizes Create Darf neue Datenbanken bzw. Tabellen anlegen Drop Darf vorhandene Datenbanken bzw. Tabellen löschen Grant Darf anderen Benutzern die eigenen Rechte geben References Zur Zeit nicht in Verwendung Für den Dateizugriff File Darf Dateien des lokalen Dateisystems lesen und ändern Zur MySQL Administration Process Darf MySQL Prozesse auflisten / beenden (processlist, kill) Reload Darf diverse Kommandos ausführen (reload, refresh, flush) Shutdown Darf MySQL herunterfahren 21.12.2010 16 Zugriffsrechte und Benutzer 21 Global vs. Objekt In MySQL werden Privilegien global oder objektbezogen vergeben. Verwaltung von objektbezogenen Privilegien ist aufwändiger, aber sicherer. Voraussetzung von objektbezogenen Privilegien ist aber, dass die entsprechenden globalen Privilegien nicht gesetzt sind. Die hierarchische Grundidee gilt auch innerhalb der Objektprivilegien (DB – Tabelle – Spalte). 21.12.2010 16 Zugriffsrechte und Benutzer 22 11 Vorsicht Das GRANT-Privileg ist ein oft übersehenes Sicherheitsrisiko! Für Testzwecke werden oft alle Privilegien eines Benutzers für die Testdatenbank auf Y gesetzt. Jeder, der uneingeschränkt Zugriff hat, kann nun diese unlimitierten Zugriffsrechte auch auf andere Datenbanken übertragen! 21.12.2010 16 Zugriffsrechte und Benutzer 23 Testdatenbanken Unabhängig davon, unter welchem OS MySQL installiert ist, darf jeder Benutzer, der sich unter MySQL anmeldet, Testdatenbanken erstellen! Voraussetzung ist, dass der Name einer solchen Datenbank mit dem String test_ beginnt. Jeder Benutzer kann sämtliche Daten darin lesen, ändern und löschen. Die Daten sind also vollkommen ungeschützt! 21.12.2010 16 Zugriffsrechte und Benutzer 24 12 Die mysql Datenbank mysql> USE mysql; Database changed mysql> SHOW TABLES; +-----------------+ | Tables_in_mysql | +-----------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +-----------------+ 6 rows in set (0.00 sec) 21.12.2010 16 Zugriffsrechte und Benutzer 25 Tabellen in mysql user db Username, Hostname, Passwort Globale Privilegien Wer darf auf welche DB zugreifen host Ergänzt db-Tabelle um zulässigen hostnamen (falls nicht in db definiert) tables_priv Wer darf auf welche Tabellen zugreifen columns_priv Wer darf auf welche Spalten zugreifen proc 21.12.2010 Verwaltung von Stored Procedures 16 Zugriffsrechte und Benutzer 26 13 Zugriffsrechte betrachten Geht der Überblick verloren, welche Privilegien ein Benutzer hat, hilft SHOW GRANTS weiter: mysql> SHOW GRANTS FOR meier; +-----------------------------------------------------------------------------+ | Grants for meier@% | +-----------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'meier'@'%' IDENTIFIED BY PASSWORD '58982d15048734ee' | | GRANT SELECT ON mav.t_ma_dt TO 'meier'@'%' | | GRANT ALL PRIVILEGES ON mav.t_ma_proj TO 'meier'@'%' | | GRANT SELECT, UPDATE ON mav.t_proj TO 'meier'@'%' | +-----------------------------------------------------------------------------+ 4 rows in set (0.00 sec) 21.12.2010 16 Zugriffsrechte und Benutzer 27 Übersicht Kapitel 16 Begriff Erklärung INSERT INTO user (host, user, password) VALUES („hostname“, „username“, PASSWORD(„passwort“)); Neuer Benutzer anlegen GRANT rechte ON DBobjekt TO user; Einzelne Rechte zuweisen GRANT ALL ON DBobjekt TO user; Alle Rechte gewähren GRANT recht (datenfeldliste) ON …; Rechte für einzelne Datenfelder GRANT rechte ON DBobjekt TO user WITH GRANT OPTION; Vergabe von Benutzerrechten ermöglichen REVOKE rechte ON DBobjekt FROM user; Rechte entziehen REVOKE ALL ON DBobjekt FROM user; Alle Rechte entziehen SHOW GRANTS FOR user; Privilegien anzeigen 21.12.2010 16 Zugriffsrechte und Benutzer 28 14 Vergessenes root-Passwort MySQL stoppen (MySQL Server mysqld) Mit Option --skip-grant-tables neu starten Passwort für root löschen, bzw. neu setzen MySQL stoppen MySQL ohne Option neu starten Jeder, der unter Unix root-Rechte, bzw. unter Windows adminstrator-Rechte besitzt, kann auf diese Weise auf jede MySQL Datenbank Vollzugriff erlangen!!! 21.12.2010 16 Zugriffsrechte und Benutzer 29 21.12.2010 16 Zugriffsrechte und Benutzer 30 15