PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL root Passwort sicher verstauen?



kiker99
09.12.05, 17:10
Hallo,

ich zerbreche mir schon seit einigen den Kopf über folgendes Problem:
Ich habe zusammen mit ein paar Freunden einen Webserver (VServer) gemietet, drauf läuft u.a. PHP & MySQL. Die einzelnen User haben nicht das Recht, neue Datenbanken zu erstellen, da sie dafür auch die Berechtigungen ändern können müssten. Natürlich will ich nicht allen Benutzern quasi Root-Rechte einräumen.
Ich will nun ein Script schreiben, das neue Datenbanken anlegen und die Berechtigungen entsprechend setzen kann. Um dieses Skript zu nützen, müssten sich die Benutzer natürlich vorher mit ihrem normalen Usernamen und Passwort anmelden.
Das Problem ist nun, das ich nur sehr ungern das root Passwort einfach in den PHP-Quelltext schreiben würde. Auch ein auslagern in eine andere Datei (die nicht unterhalb des DocumentRoot liegt) würde IMHO auch nicht viel bringen, da ein Hacker, der sich FTP Zugang erschummelt hat dann ebenfalls die Rechte hätte, diese Datei auszulesen.
Geht es irgendwie noch sicherer? Oder ist diese Methode eurer Meinung nach OK? Habt ihr ne Ahnung wie das professionelle Seiten machen? Kann ja nicht sein, dass jeder, der FTP-Zugang hat wenn es entsprechende Skripte gibt, die Root Zugriff benötigen, einfach das Passwort ausspähen kann?

Gruß
Andre

drummermonkey
09.12.05, 17:18
Hi,

Wenn du FTP-Zugang auf ein default-chroot setzt und entsprechend die Datei ausserhalb davon platziert sollte sich das Problem erübrigen.

Zusätzlich solltest du dann auch noch die Rechte entsprechend setzen, damit auch dann wenn jemand zugriff darauf bekommen sollte er die Datei nicht auslesen kann

Gruß
Roman

Tomek
10.12.05, 09:49
Wenn jemand allerdings eine Rootshell auf dem Server hat, ist es für denjenigen kein Problem mehr, das MySQL-Rootpasswort zurückzusetzen.

Newbie2001
10.12.05, 18:58
Wenn jemand allerdings eine Rootshell auf dem Server hat, ist es für denjenigen kein Problem mehr, das MySQL-Rootpasswort zurückzusetzen.

Richtig, aber wenn ein nicht-befugter eine root-shell auf einem server hat wird das wohl noch das geringste problem sein :ugly:

Ich persönlich denke, dass es für durchschnittliche sicherheitsansprüche genügt das php-include mit dem passwort ausserhalb des FTP und HTTP DocumentRoots aufzubewahren.

marce
10.12.05, 20:46
... und wo liegt das Problem darin, dem jeweiligen Benutzer einfach das Recht zu geben, neue Tabellen und Datenbanken anlegen zu dürfen?

kiker99
11.12.05, 20:03
Richtig, aber wenn ein nicht-befugter eine root-shell auf einem server hat wird das wohl noch das geringste problem sein :ugly:

Ich persönlich denke, dass es für durchschnittliche sicherheitsansprüche genügt das php-include mit dem passwort ausserhalb des FTP und HTTP DocumentRoots aufzubewahren.

OK, dann werde ich das wohl auch so lösen, danke.


... und wo liegt das Problem darin, dem jeweiligen Benutzer einfach das Recht zu geben, neue Tabellen und Datenbanken anlegen zu dürfen?

Nur das allgemeine CREATE-Recht zu vergeben, reicht nicht. Die Leute müssten zusätzlich, wie ich das jetzt sehe, auch noch über das Recht verfügen, die Rechte für die DB zu ändern, da standardmäßig nur Root Zugriff auf die neue Datenbank hat.

kiker99
11.12.05, 20:05
Hi,

Wenn du FTP-Zugang auf ein default-chroot setzt und entsprechend die Datei ausserhalb davon platziert sollte sich das Problem erübrigen.

Zusätzlich solltest du dann auch noch die Rechte entsprechend setzen, damit auch dann wenn jemand zugriff darauf bekommen sollte er die Datei nicht auslesen kann

Gruß
Roman

Ja, direkt wird man es dann nicht auslesen können, man könnte nur versuchen den Dateinamen zu erraten und es durch ein PHP-Skript auslesen zu lassen.

marce
12.12.05, 06:12
Ja, direkt wird man es dann nicht auslesen können, man könnte nur versuchen den Dateinamen zu erraten und es durch ein PHP-Skript auslesen zu lassen.
das lässt sich ja entsprechend konfigurieren und verbieten...

kiker99
12.12.05, 23:22
das lässt sich ja entsprechend konfigurieren und verbieten...

Wie willst du das machen? Kann man nur einzelnen PHP-Skripts Zugriff geben? Ich muss ja selber auch auf die Datei zugreifen können-sonst nutzt der ganze Spaß ja nichts ;)

Pingu
13.12.05, 06:19
Ja, direkt wird man es dann nicht auslesen können, man könnte nur versuchen den Dateinamen zu erraten und es durch ein PHP-Skript auslesen zu lassen.
Also mal ehrlich, wer hat denn Scripte auf seinem Server, denn man jeden beliebigen Pfad übergeben kann und die dann auch noch den Inhalt der Dateien einfach ungefiltert anzeiegn?

Pingu

Pingu
13.12.05, 06:52
Nur das allgemeine CREATE-Recht zu vergeben, reicht nicht. Die Leute müssten zusätzlich, wie ich das jetzt sehe, auch noch über das Recht verfügen, die Rechte für die DB zu ändern, da standardmäßig nur Root Zugriff auf die neue Datenbank hat.
Wo ist das Problem?

Erstens kann man den Benutzer vorschreiben, daß die Datenbanken bestimmte Namen haben müssen (festgelegtes Prefix). Dann läßt es sich eigentlich leicht zu teilen, daß Benutzer nur Zugriff auf Datenbanken mit einem bestimmten Prefix haben. Dann könnte man in der Datenbank mysql in der Tabelle db die Default-Werte ändern. Und dann könnte man noch zusätzlich den Zugriff auf die Datenbank mysql für alle außer einem bestimmten User verbieten. Dann könnte man verschiedene User mit verschiedenen Rechten anlegen, denn wer sagt denn daß root alle Rechte haben muß? Ich habe schon Beispiele gesehen wo die Verantwortung auf verschiedene Schultern (accounts) verteilt wird und jeder Account nur bestimmte Rechte hat.

Außerdem: Wozu müssen Benutzer Datenbank kreieren? Jeder Benutzer bekommt seine eigene Datenbank, wo er sich austoben kann wie er will. Wo er Tabellen kreieren kann, wie er will. Aber Datenbank selbst darf nur ein bestimmter Nutzer kreieren.

Das Berechtigungssystem ist eigentlich sehr flexibel. Man muß nur ein bißchen Phantasie haben.

Pingu

kiker99
13.12.05, 18:54
Also mal ehrlich, wer hat denn Scripte auf seinem Server, denn man jeden beliebigen Pfad übergeben kann und die dann auch noch den Inhalt der Dateien einfach ungefiltert anzeiegn?

Pingu

OK, das ist ein Argument. Wie ist das standardmäßig geregelt? Nur Zugriff auf Dateien im selben Pfad?

kiker99
13.12.05, 19:03
Wo ist das Problem?

Erstens kann man den Benutzer vorschreiben, daß die Datenbanken bestimmte Namen haben müssen (festgelegtes Prefix). Dann läßt es sich eigentlich leicht zu teilen, daß Benutzer nur Zugriff auf Datenbanken mit einem bestimmten Prefix haben.

Das jetzt noch einzuführen, wäre etwas umständlich. Kann man MySQL so einstellen, dass die Benutzer Zugriff auf Datenbanken mit einem bestimmten prefix sowie auf einzelne Datenbanken, wo ich die Rechte extra gesetzt habe, haben?



Dann könnte man in der Datenbank mysql in der Tabelle db die Default-Werte ändern.

Habe mir die Tabelle mal angeschaut, bin daraus aber nicht wirklich schlau geworden. Habe auch keinen Default-Eintrag gesehen.



Und dann könnte man noch zusätzlich den Zugriff auf die Datenbank mysql für alle außer einem bestimmten User verbieten. Dann könnte man verschiedene User mit verschiedenen Rechten anlegen, denn wer sagt denn daß root alle Rechte haben muß? Ich habe schon Beispiele gesehen wo die Verantwortung auf verschiedene Schultern (accounts) verteilt wird und jeder Account nur bestimmte Rechte hat.


Zugriff auf die MySql-DB ist sowieso für alle bis auf einen Benutzer verboten.



Außerdem: Wozu müssen Benutzer Datenbank kreieren? Jeder Benutzer bekommt seine eigene Datenbank, wo er sich austoben kann wie er will. Wo er Tabellen kreieren kann, wie er will. Aber Datenbank selbst darf nur ein bestimmter Nutzer kreieren.

Das Berechtigungssystem ist eigentlich sehr flexibel. Man muß nur ein bißchen Phantasie haben.
Pingu

Also ich weiß ja nicht, wieviel längerfristig auf dem Server landen wird, ich persönlich hätte aber auch keine Lust, Tabellen von überhaupt nicht zusammengehörenden Projekten in der selben Datenbank zu lagern.

Danke für die Antwort :)

Pingu
14.12.05, 07:17
Erstens kann man den Benutzer vorschreiben, daß die Datenbanken bestimmte Namen haben müssen (festgelegtes Prefix). Dann läßt es sich eigentlich leicht zu teilen, daß Benutzer nur Zugriff auf Datenbanken mit einem bestimmten Prefix haben.
Das jetzt noch einzuführen, wäre etwas umständlich. Kann man MySQL so einstellen, dass die Benutzer Zugriff auf Datenbanken mit einem bestimmten prefix sowie auf einzelne Datenbanken, wo ich die Rechte extra gesetzt habe, haben?
Das kann man ja Zweistufig einführen. Alle neuen Datenbanken müssen dem Schema entsprechen. Alle bestehenden Datenbanken haben Bestandschutz.
Mann kann natürlich jedem Benutzer getrennt bestimmte Aktionen für bestimmte Datenbank erlauben oder verbieten. Man kann hier auch mit Wildcards arbeiten, denn schließlich sind die Berechtigungen auch nur in normalen Tabellen untergebracht, die den normalen Regeln unterliegen. Zwei Punkte gibt es dazu auch im Manual:
- http://dev.mysql.com/doc/refman/4.0/de/grant.html
- http://dev.mysql.com/doc/refman/4.0/de/adding-users.html


Dann könnte man in der Datenbank mysql in der Tabelle db die Default-Werte ändern.Habe mir die Tabelle mal angeschaut, bin daraus aber nicht wirklich schlau geworden. Habe auch keinen Default-Eintrag gesehen.
Dann laß Dir Mal die Standardeinstellungen für z. B. die Tabelle db mit SHOW COLUMNS FROM db; anzeigen. Da hier natürlich wieder die allg. Datenbankregeln gelten, lassen sich diese Defaulteinstellungen auch ändern und damit auch das Defaultverhalten (Thema: ALTER TABLE). Allerdings sollte man hiermit sehr vorsichtig sein und wissen was man tut.


Außerdem: Wozu müssen Benutzer Datenbank kreieren? Jeder Benutzer bekommt seine eigene Datenbank, wo er sich austoben kann wie er will. Wo er Tabellen kreieren kann, wie er will. Aber Datenbank selbst darf nur ein bestimmter Nutzer kreieren.Also ich weiß ja nicht, wieviel längerfristig auf dem Server landen wird, ich persönlich hätte aber auch keine Lust, Tabellen von überhaupt nicht zusammengehörenden Projekten in der selben Datenbank zu lagern.
Was ist wichtiger: persönliche Präferenzen oder Sicherheit?
Ansonsten gibt es das Thema bereits hier im Partnerforum: http://www.mrunix.de/forums/showthread.php?t=42169

Pingu

PS: Zum Thema PHP: Erstens sollte ein Skript nie einfach einen Pfad als Benutzereingabe nehmen und die Datei, die das Skript dort findet einfach so darstellen. Zweitens: fällt mir gerade nix ein ;).

kiker99
14.12.05, 21:20
Das kann man ja Zweistufig einführen. Alle neuen Datenbanken müssen dem Schema entsprechen. Alle bestehenden Datenbanken haben Bestandschutz.
Mann kann natürlich jedem Benutzer getrennt bestimmte Aktionen für bestimmte Datenbank erlauben oder verbieten. Man kann hier auch mit Wildcards arbeiten, denn schließlich sind die Berechtigungen auch nur in normalen Tabellen untergebracht, die den normalen Regeln unterliegen. Zwei Punkte gibt es dazu auch im Manual:
- http://dev.mysql.com/doc/refman/4.0/de/grant.html
- http://dev.mysql.com/doc/refman/4.0/de/adding-users.html


Ok, vielen Dank. Habe das nun so eingerichtet, dass die Leute allgemeines Create-Recht und eben Zugriff auf Datenbanken mit $Name_% haben.



Dann laß Dir Mal die Standardeinstellungen für z. B. die Tabelle db mit SHOW COLUMNS FROM db; anzeigen. Da hier natürlich wieder die allg. Datenbankregeln gelten, lassen sich diese Defaulteinstellungen auch ändern und damit auch das Defaultverhalten (Thema: ALTER TABLE). Allerdings sollte man hiermit sehr vorsichtig sein und wissen was man tut.

Was ist wichtiger: persönliche Präferenzen oder Sicherheit?
Ansonsten gibt es das Thema bereits hier im Partnerforum: http://www.mrunix.de/forums/showthread.php?t=42169


Warum sollte es so einen großen Unterschied von der Sicherheit her machen? Wenn die Leute den Server zumüllen wollten, könnten sie das auch ohne das Recht, Datenbanken zu erstellen. Außerdem vertraue ich meinen Freunden schon ziemlich weit. Ich weiß, man sollte den Benutzern immer misstrauen, allein schon, weil sich andere hereingehackt haben könnten, aber ich denke nicht, dass die Berechtigungen so wesentlich zu locker gehandhabt sind.



PS: Zum Thema PHP: Erstens sollte ein Skript nie einfach einen Pfad als Benutzereingabe nehmen und die Datei, die das Skript dort findet einfach so darstellen. Zweitens: fällt mir gerade nix ein ;).

Das ist mir schon klar ;)
Mir ging es jetzt eher darum, falls der PHP-Account von jemandem geknackt wurde und so fremder PHP-Code ins System gelangen kann.

Nochmal vielen Dank!
Gruß
Andre

kiker99
15.12.05, 17:07
Habe jetzt noch ein etwas seltsames Problem. Die Benutzer können, seitdem ich ihnen das Create-Recht gegeben habe, in PhpMyAdmin alle Datenbanken und Tabellen sehen (haben aber keinen Zugriff), Die Benutzer haben keinerlei globalen Rechte außer Create. Scheinbar können sie trotzdem SHOW_DATABASES ausführen obwohl sie nicht das Recht dazu haben?!

Hat vielleicht etwas mit dem folgenden Fehler zu tun:
http://bugs.mysql.com/bug.php?id=179

Theoretisch könnte der Fehler auch bei PhpMyAdmin liegen, schließlich verwaltet der den Control User der das Recht dazu hat, die Datenbanken und Tabellen abzufragen.

Andre