Weiter Zurück [Inhalt] Online Suche im Handbuch

6.5 Ändern des Administratorpaßwortes unter MySQL

Wir erinnern uns nun an die Default-Werte in den Tabellen db, host, und user. Wir müssen also damit rechnen, daß wenn wir eine Tabelle anlegen, jedermann/frau über einen Zugriff über das Netzwerk daraus Daten löschen oder diese verändern kann. Also Vorsicht.....

Da die Datenbank test schon einmal exisitiert, sollten wir nun vielleicht direkt einen User mit einem Paßwort einfügen......Hierzu schauen wir uns das Beispiel aus dem Kapitel Beispiel zur Vergabe der Rechte an. An dieser Stelle sollte vielleicht noch kurzerwähnt werden, daß MySQL selbstverständlich auch den GRANT Befehl unterstützt, wie Sie es vielleicht von anderen Datenbanken gewöhnt sind. Der Befehl INSERT INTO user VALUES ...... ist absolut gleichwertig. Alle Datenbankhersteller haben hier geringe Abweichungen bei der Bedeutung der Parameter des GRANT Statements, so auch MySQL. Das sollte man vielleicht bedenken, wenn man von oder auf andere Datenbanken wechselt.

Hier nun ein Statement:

mysql> insert into user values ('%', 'testuser', password('testpasswort'),
'Y', 'Y', 'Y', 'Y', 'Y', 'Y' ,'Y', 'Y', 'Y','Y');
Query OK, 1 row affected (0.00 sec)

mysql> 
Ok, scheint funktioniert zu haben. Was haben wir den nun eigentlich verändert ? Wir haben einen testuser angelegt, der sich mit dem Paßwort testpasswort einloggen kann, und alle Rechte an der Datenbank test erhält. Wir überprüfen das einmal:

mysql> select * from user;
+-----------+----------+------------------+-------------+-------------+-->
| Host      | User     | Password         | Select_priv | Insert_priv |
+-----------+----------+------------------+-------------+-------------+-->
| localhost | root     |                  | Y           | Y           | Y
| localhost |          |                  | N           | N           | N
| tunix     | root     |                  | Y           | Y           | Y
| tunix     |          |                  | N           | N           | N
| %         | testuser | 34469d8918c0c98c | Y           | Y           | Y
+-----------+----------+------------------+-------------+-------------+-->
5 rows in set (0.00 sec)

mysql>
Wie man sehen kann, erfordert die Anmeldung als User root zwar ein Paßwort, das Feld ist aber leer. Das ist der Grund, warum wir uns bisher ohne Paßwort einloggen konnten. MySQL unterstützt beim Start des mysqld (Das Kommando /sbin/init.d/mysql start die Option --password. Siehe hierzu auch Kapitel Lösungen bei access denied Fehlern) Das Startskript von LINUX sorgt dafür, daß das Paßwort aus der Datei /etc/mysql.passwd, welches bei einer Standardinstallation von LINUX einfach leer ist, daß man ohne Paßwort den Datenbankserver MySQL administrieren kann. Wir loggen uns nun mit exit aus, und mit folgendem Statement wieder ein:

user01@tunix:~ > mysql -u testuser mysql
ERROR 1044: Access denied for user: '@localhost' to database 'mysql'
user01@tunix:~ > mysql -u testuser      
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 29 to server version: 3.21.33b

Type 'help' for help.

mysql> quit
Bye
Das Einloggen als einfacher User testuser auf der Datenbank mysql funktioniert natürlich nicht. Schließlich haben wir den User testuser ja angelegt, damit er nur auf die Datenbank test zugreifen darf. Hier also der zweite, erfolgreiche Versuch:

user01@tunix:~ > mysql -h localhost -u testuser 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 32 to server version: 3.21.33b

Type 'help' for help.

mysql> status;
--------------
mysql  Ver 9.29 Distrib 3.22.16a-gamma, for pc-linux-gnu (i586)

Connection id:          32
Current database:
Current user:           testuser
Server version          3.21.33b
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /tmp/mysql.sock
Uptime:                 4 hours 47 min 9 sec

Running threads: 1  Questions: 151  Opened_tables: 4  Flush tables: 1  Open
tables: 4
--------------

mysql> 
Wir haben es nun geschafft, uns als testuser anzumelden, allerdings haben wir einen Zugang, ohne daß wir das Paßwort angegeben haben:
user01@tunix:~ > mysql -h localhost -u testuser 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 33 to server version: 3.21.33b

Type 'help' for help.

mysql> use test
Database changed
mysql> show tables;
Empty set (0.02 sec)

mysql> use mysql;
ERROR 1044: Access denied for user: '@localhost' to database 'mysql'
mysql> 
Nun müssen wir nur noch ein Paßwort für den User root vergeben, damit nicht jeder, der gerade einen mysql Client besitzt, beliebig sich in den Datenbankserver einloggen und herumadministrieren darf. Wir haben uns bisher ohne Paßwort an dem Datenbankserver anmelden können. Hierzu editieren wir als User root die Datei /etc/mysql.passwd und tragen dort unser neues Paßwort ein: testadmin. Danach starten wir die Datenbank neu:
bash-2.02# /sbin/init.d/mysql restart
Restarting service MySQL./usr/bin/mysqladmin: connect to server at
'localhost' failed
error: 'Access denied for user: 'root@localhost' (Using password: YES)' failed
bash-2.02#
Der Fehler ist so korrekt. Die von S.u.S.E. vorbereiteten Skripte, die sich nun mit einem Paßwort einloggen müssen, dürfen nun nicht mehr funktionieren, da wir ja das Paßwort in der mysql Tabelle noch nicht verändert haben. Damit keine Mißverständnisse aufkommen. Das in der Datei /etc/mysql.passwd angegebene Paßwort hat nur Auswirkungen auf die Startup-Skripte, nicht aber auf das root Paßwort für den Datenbank-Server. Dieses werden wir nun ändern. Ähnlich dem INSERT INTO... Befehl ist auch der REPLACE INTO Befehl. Ein kleiner Tip: Mit STRG-R kann man vorher eingegebene Befehle suchen und editieren:
mysql> select * from user;
+-----------+----------+------------------+-------------+-------------+-->
| Host      | User     | Password         | Select_priv | Insert_priv |
+-----------+----------+------------------+-------------+-------------+-->
| localhost | root     |                  | Y           | Y           | Y
| localhost |          |                  | N           | N           | N
| tunix     | root     |                  | Y           | Y           | Y
| tunix     |          |                  | N           | N           | N
| %         | testuser | 34469d8918c0c98c | Y           | Y           | Y
+-----------+----------+------------------+-------------+-------------+-->
5 rows in set (0.00 sec)

mysql> replace into user values ('localhost', 'root', password('testadmin'),
'Y', 'Y', 'Y', 'Y', 'Y', 'N' ,'N', 'N', 'N','N');
Query OK, 2 rows affected (0.00 sec)

mysql> 
Sie sollten sich darüber bewußt sein, daß hier viel zu viele Rechte vergeben wurden. Es ist Usern der Tabelle test sogar möglich, der MySQL Server anzuhalten, weil eventuell das shutdown priv. vergeben wurde. In der Praxis sollten insbesondere die letzten fünf 'Y' auf 'N' stehen. Damit können Daten verändert und Tabellen angelegt werden, jedoch ist es nicht möglich den Server herunterzufahren, oder andere Tabellen in der Datenbank zu löschen.

Sie können beim MySQL Client stets alle Befehle mit Hilfe der Cursortasten zurückholen, um längere Statements, wie das Beispiel replace into... nochmals zur Korektur von Zugriffsrechten aufzurufen. Alle Befehle werden in Ihrem Homeverzeichnis in der Datei .mysql_history gespeichert.

Damit die Änderungen in der Datenbank wirksam werden, müssen wir aus dem MySQL Client aussteigen, die Datenbank neu laden, und uns wieder einloggen:

mysql> quit
Bye
user01@tunix:~ > mysqladmin -u root reload
user01@tunix:~ > mysql -u root mysql
ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)
user01@tunix:~ > 
Offensichtlich hat es funktioniert. Das Einloggen ohne Paßwort funktioniert nicht mehr ! Probieren wir es also mit Paßwort:
user01@tunix:~ > mysql -u root -ptestadmin mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 42 to server version: 3.21.33b

Type 'help' for help.

mysql> status;
--------------
mysql  Ver 9.29 Distrib 3.22.16a-gamma, for pc-linux-gnu (i586)

Connection id:          42
Current database:       mysql
Current user:           root
Server version          3.21.33b
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /tmp/mysql.sock
Uptime:                 5 hours 43 min 44 sec

Running threads: 1  Questions: 223  Opened_tables: 4  Flush tables: 1  Open
tables: 4
--------------

mysql> 
Es hat funktioniert ! Von nun an ist unser MySQL Datenbankserver gegen unbefugten Zugriff gesichert. Niemand kann nun auf das Rechtesystem, also die Datenbank mysql ohne das gültige Paßwort zugreifen ! Allerdings ist unsere Datenbank test noch für Zugriffe offen. Nun müßte das Skript /sbin/init.d/mysql restart auch ohne Probleme funktionieren, da das interne Paßwort nun ja mit dem Paßwort in der Datei /etc/mysql.passwd übereinstimmt. Unser Server ist nun korrekt aufgesetzt. Nun möchten wir jedoch diesen nicht von der Konsole aus administriren, sondern eventuell auch einmal von unserer Windows Arbeitsstation aus.... Aktivieren Sie nun das Powermanagement für CPU und Festplatte, entfernen Sie Monitor und Tastatur und stellen Sie Ihren LINUX MySQL Server in die Ecke, sie benötigen keinen Zugang mehr zum System. Alles weitere läuft nun über Fernadministration.


Weiter Zurück [Inhalt] Online Suche im Handbuch