dbadmin
Bei dbadmin handelt es sich um eine Eigenentwicklung von Hostsharing zur Verwaltung von PostgreSQL- und MySQL-Datenbanken und deren Benutzern durch den Paketadmin.
Eine kurze Erläuterung der Optionen wird auch durch den Aufruf von dbadmin -h auf einem der Hostsharing-Server angezeigt.
Bei den Funktionen zum Anlegen eines neuen Benutzers oder dem Ändern eines Kennwortes gibt es zwei Möglichkeiten der Passworteingabe. Im Normallfall erscheint ein Prompt und das gewünschte Passwort muss interaktiv über die Tastatur eingegeben werden. Um eine skriptgesteuerte Anwendung zu ermöglichen, wird beim Aufruf mit der Pipe-Option -p das Passwort über die Standardeingabe erwartet.
Die meisten Funktionen erlauben das zusätzliche Quiet-Flag -q, mit dem zusätzliche Ausgabeformatierungen deaktiviert werden. Damit kann die Ausgabe auch von Shell-Skripten leicht ausgewertet werden.
Auflisten der gültigen Instanzen
Der Begriff Instanz bezeichnet bei dbadmin einen Datenbankserverprozess, über den eine oder mehrere Datenbanken angesprochen werden können. Über den Instanznamen erfolgt eine eindeutige Zuordnung, da dbadmin sowohl MySQL als auch PostgreSQL unterstützt und bei uns z.B. auch mehrere MySQL-Server benutzt werden.
Die Option -s dient zur Auflistung der Datenbank-Instanzen, für die das eigene Paket freigeschaltet wurde. Neben dem Instanznamen, der für die übrigen Kommandos notwendig ist, bekommt man auch die Verbindungsdaten der Instanz angezeigt.
xyz00@hopi:~$ dbadmin -s
PAC "xyz00" is authorized to use the following instances:
- pgsql : PostgreSQL (localhost on port 5432)
- mysql : MySQL (localhost on socket)
Bei den meisten dbadmin-Kommandos muss der Instanzname mit der Option -i spezifiziert werden.
Existierende Datenbanken auflisten
Die Option -e ermöglicht eine Anzeige der in einer Instanz bereits existierenden Datenbanken für das eigene Paket.
xyz00@hopi:~$ dbadmin -e -i pgsql
Database
--------------------
xyz00_test
Anlegen einer Datenbank
Mit -c kann eine neue Datenbank in der angegebenen Instanz angelegt werden. Der Datenbankname wird mit -n festgelegt. Der Account des Paketadmins bekommt alle Rechte für diese Datenbank und kann diese Rechte mit den normalen Tools (mysql, psql, MySqlAdmin, ...) an andere Benutzer weitergeben. Vor dem Anlegen der ersten Datenbank muss deshalb einmalig ein Account für den Paketadmin in der Datenbank angelegt werden.
xyz00@hopi:~$ dbadmin -c -i pgsql -n xyz00_demo
Löschen einer Datenbank
Die Option -d löscht eine existierende Datenbank vollständig aus dem System. Der Instanzname wird wieder über -i und der Datenbankname mit -n angegeben.
xyz00@hopi:~$ dbadmin -d -i pgsql -n xyz00_demo
Achtung: Es gibt keine weitere Sicherheitsabfrage!
Auflisten der User in einer Instanz
Mit -l kann eine Liste der zum eigenen Paket gehörenden Datenbank-Benutzer auf der angegebenen Instanz angezeigt werden. Für dieses Kommando braucht man keine speziellen Rechte, es kann von jedem Paketbenutzer aufgerufen werden.
xyz00@hopi$ dbadmin -l -i mysql
Username
--------------------
xyz00@localhost
xyz00_otto@%
Anlegen eines neuen Datenbankbenutzers
Die Option -a wird zum Anlegen eines neuen Benutzers mit dem einzugebenden Passwort in der mit -i spezifizierten Instanz verwendet. Der Benutzer hat zunächst nur das Recht, eine Verbindung zur Datenbank aufzubauen. Zusätzliche Rechte an Tabellen und anderen Objekten müssen vom Paketadmin getrennt vergeben werden. Wenn der Datenbankaccount des Paketadmin noch nicht angelegt wurde, dann muss dies einmalig gemacht werden:
Account für den Paketadmin anlegen (einmalig):
xyz00@hopi:~$ dbadmin -a -i pgsql -u xyz00
Password:
Normalen Useraccount anlegen:
xyz00@hopi:~$ dbadmin -a -i pgsql -u xyz00_otto
oder:
xyz00@hopi:~$ dbadmin -a -i mysql -u xyz00_otto@localhost
Password:
Die letzte Variante ist eine Besonderheit für MySQL, weil dort neben dem Benutzernamen auch der Name des Hosts, von dem man sich anmeldet, zur Überprüfung der Zugriffsrechte benutzt wird. So kann der Account xyz00_otto@%.hostsharing.net mit ganz anderen Rechten als xyz00_otto@localhost ausgestattet werden. Wurde kein Hostname angegeben, so wird dafür automatisch der Wildcard-Host % gesetzt.
Einige Beispiele hierzu:
- xyz00_otto@localhost
Hierbei ist zu beachten, dass unsere phpmyadmin-Version diesen User nicht akzeptieren wird. - 'xyz00_otto'@'%'
Diese User können sich von jedem beliebigen Rechner in der Welt anmelden. - xyz00@'%'
Dies ist ein Spezialfall vom vorigen. So legt dbadmin die Accounts für Paketadmins an. - 'xyz00_otto'@'xyz00.hostsharing.net'
Ein solcher MySQL-User ist an das Paket xyz00 gebunden und existiert nur auf dem Host mit diesem Paket.
- 'xyz00_otto'@'example.com'
Wirkt genauso, wie der vorherige, nur dass hier der Host mit der Domain example.com den User beherbergt.
Löschen eines Benutzers
Mit der Option -r wird ein Benutzer aus der mit -i angegebenen Instanz gelöscht.
xyz00@hopi:~$ dbadmin -r -i pgsql -u xyz00_otto
Achtung: Es gibt keine weitere Sicherheitsabfrage!
Für MySQL-Accounts kann der Username durch einen Hostnamen ergänzt werden, wie es beim Anlegen eines neuen Benutzers beschrieben wurde.
Ändern eines Passwortes
Das Passwort für den mit -u angegeben Benutzer kann mit der Option -m geändert werden. Dies erfordert nicht das ursprüngliche Passwort, so dass damit auch vergessene Passwörter neu vergeben werden können.
xyz00@hopi:~$ dbadmin -m -i mysql -u xyz00_otto@%
Password:
Für MySQL-Accounts kann der Username durch einen Hostnamen ergänzt werden (vgl. Anlegen eines neuen Datenbankbenutzers).
Für Hostmaster
Konfiguration
Die zentrale Konfigurationsdatei wird in /etc/dbadmin.con ferstellt. In dieser Datei wird definiert, welche Datenbank Instanzen mit dbadmin verwaltet werden können. Für jede Instanz sind die Zugriffsdaten und eine Liste der freigeschalteten Pakete definiert:
#
# Kommentar
#
INSTANCES="pgsql mysql"
PGSQL_TYPE="postgresql"
PGSQL_HOST="hopi.hostsharing.net"
PGSQL_PORT="5432"
PGSQL_USER="admin"
PGSQL_PASS="secret"
PGSQL_AUTH="xyz00 xyz01"
MYSQL_TYPE="mysql"
MYSQL_HOST="mysql.hostsharing.net"
MYSQL_PORT="3307"
MYSQL_USER="admin"
MYSQL_PASS="secret"
MYSQL_AUTH="*"
Diese Datei enthält mit den Passwörtern der privilegierten Accounts natürlich sensitive Informationen und kann deshalb nur vom dbadmin-Programm gelesen werden. Die Dateirechte sollten deshalb so aussehen:
xyz00@hopi:~$ ls -l /etc/dbadmin.conf
-rw------- 1 dbadmin root 1951 Jul 23 23:57 /etc/dbadmin.conf
Weiterhin kann der Paketadmin durch eine private Konfigurationsdatei in ~/etc/dbadmin.conf steuern, welche seiner Benutzer weitere Aufgaben durchführen können. Die Datei definiert dazu für jedes Privileg eine Liste der zulässigen Paketbenutzer:
#
# Dies sind UNIX-User:
#
ALTERUSER="xyz00-hugo xyz00-otto"
CREATEUSER="xyz00-hugo xyz00-lisa"
DROPUSER=xyz00-lisa
Alle so vergebenen Berechtigungen gelten nur für die Datenbanken des xyz00-Paketes (d.h. Datenbanken, deren Name mit 'xyz00_' beginnt). Bei diesem Beispiel dürfen also xyz00-hugo und xyz00-otto die Passwörter aller User in den DBs ändern, xyz00-hugo und xyz00-lisa können neue Benutzer anlegen und nur xyz00-lisa darf Benutzer löschen. Einträge von fremden Paketen werden ignoriert. Adminrechte lassen sich deshalb nicht über Paketgrenzen hinweg vergeben.
Implementierung
Zunächst wird eine Validierung des aufrufenden Benutzers gemacht. Jede Operation wird nur dann durchgeführt, wenn die Änderung für den Benutzer erlaubt ist. Dabei werden die folgenden Regeln beachtet:
- Für jede mögliche Instanz wird eine Liste der freigeschalteten Pakete in einer zentralen Datei hinterlegt. Die Nutzung einer Instanz ohne Freischaltung ist nicht möglich. Eine globale Freischaltung einer Instanz für alle Pakete kann durch ein *-Zeichen in der Konfiguration ermöglicht werden.
- Nur der Paket Admin kann Datenbanken anlegen und löschen.
- Der Datenbankname muß mit dem Paketnamen und einem Unterstrich beginnen (z.B. 'xyz00_test').
- Der Paket Admin hat für die Datenbanken seines Paketes alle Rechte.
- Ein Paket Admin kann User in seinen DBs anlegen, löschen und das Passwort ändern. Die Benutzernamen müssen wieder mit dem Paketnamen und einem Unterstrich beginnen (z.B. 'xyz00_otto'). Die Benutzernamen für MySQL können zusätzlich durch einen Hostnamen qualifiziert werden. Dieser wird durch ein @-Zeichen abgetrennt. Wird kein Host angegeben, so entspricht dies der Wildcard '%'.
- Ein Paket Admin kann Rechte für die Benutzerverwaltung (anlegen, löschen, Paßwort ändern) einzeln und unabhängig an seine User weitergeben.
- Ein Benutzer kann nur normale Benutzer innerhalb seines Paketes modifizieren, aber nicht den Account des Paket Admins.
Die Datenbank-Benutzer (incl. des Paket Admins) erhalten innerhalb der Datenbank keine zusätzlichen Rechte zur Administration. Damit wird gewährleistet, dass alle Änderungen nur mit dbadmin durchgeführt werden können und keine unerwünschten Änderungen gemacht werden können.
dbadmin verwendet einen Account mit zusätzliche Rechten für seine Aufgaben. Da der Zugriff auf die Datenbank unter Programmkontrolle ablaufen, gibt es kein Risiko, dass unbefugte Abfragen gegen die Datenbank laufen. Das Passwort dieses Accounts muss dem Programm natürlich bekannt sein und damit bestehen folgende Alternativen:
- Username und Paßwort werden im Programm fest codiert
=> unflexibel und unsicher - Username und Paßwort werden in einer Datei gepflegt
=> der Zugriff auf die Datei darf nur aus dbadmin möglich sein
Die zweite Lösung bedeutet, dass das dbadmin Executable als Setuid-Programm installiert sein muss. Zur Minimierung des Risikos kann hierfür ein speziell für dbadmin angelegter Benutzer verwendet werden, der ansonsten im System keine weiteren Rechte hat. dbadmin öffnet nur die Konfigurationsdatei mit den Setuid-Privilegien und schaltet danach wieder auf die normalen Rechte des Benutzers zurück.
Datenbankspezifische Details
Bei der Implementierung sind die folgenden Dinge berücksichtigt worden:
PostgreSQL
Anlegen des Accounts 'dbadmin'
Vor der Benutzung von dbadmin muss ein Benutzer mit den notwendigen Rechten angelegt werden:
CREATE USER admin PASSWORD 'secret' CREATEUSER CREATEDB;
Diese Zugangsdaten müssen in der globalen Konfigurationsdatei abgelegt werden, damit dbadmin darauf zugreifen kann.
Normalen User anlegen
dbadmin benutzt das folgende SQL-Kommando zum Anlegen eines normalen Benutzers:
CREATE USER xyz00_otto PASSWORD 'pass';
Paket Admin einrichten
Der Paket Admin wird in PostgreSQL ebenso angelegt:
CREATE USER xyz00 PASSWORD 'pass';
Im Gegensatz zu MySQL, wo der Paket Admin besondere Rechte schon beim Anlegen zugewiesen bekommt, werden diese Rechte in PostgreSQL beim Anlegen einer Datenbank vergeben.
Datenbank anlegen
Eine neue Datenbank wird von dbadmin folgendermaßen erzeugt:
CREATE DATABASE xyz00_demo WITH TEMPLATE=template1 ENCODING=default
UPDATE pg_database
SET datdba = pg_user.usesysid
WHERE pg_user.usename = 'xyz00'
AND pg_database.datname = 'xyz00_demo';
Die neue Datenbank wird als Klon von 'template1' mit dem Default-Zeichensatz erstellt. In diesem Template können allgemeine User oder z.B. PL/pgSQL installiert werden und dies wird dann in alle danach angelegten Datenbanken übernommen. Eventuell ist es auch sinnvoll, für diesen Zweck eine eigene Datenbank (z.B. hsh00_template) anzulegen.
Anschließend wird der Paket Admin als Eigentümer der Datenbank gesetzt. Damit darf dieser die Rechte an einzelnen Objekten in dieser Datenbank per GRANT weitervergeben.
Ein Benutzer mit CREATEDB Recht darf Datenbanken anlegen, die ihm dann gehören. Ein Benutzer mit CREATEUSER Recht kann andere Benutzer anlegen. Außerdem wird er damit zum Superuser, der alle Zugriffsrechte umgeht. Deshalb können diese Rechte nicht direkt an den Paket Admin vergeben werden.
MySQL
Anlegen des Accounts 'dbadmin'
Vor der Benutzung von dbadmin muss ein Benutzer mit den notwendigen Rechten angelegt werden:
GRANT USAGE ON *.* TO admin IDENTIFIED by 'manager';
UPDATE mysql.user
SET Create_priv = 'Y',
Drop_priv = 'Y',
Select_priv = 'Y',
Insert_priv = 'Y',
Update_priv = 'Y',
Delete_priv = 'Y',
Grant_priv = 'Y',
Reload_priv = 'Y'
WHERE User = 'admin';
FLUSH PRIVILEGES;
Diese Zugangsdaten müssen in der globalen Konfigurationsdatei abgelegt werden, damit dbadmin darauf zugreifen kann.
Normalen User anlegen
dbadmin benutzt das folgende SQL-Kommando zum Anlegen eines normalen Benutzers:
GRANT USAGE ON *.* TO xyz00_otto IDENTIFIED by 'pass';
Paket Admin einrichten
Für das Anlegen des Paket Admins in MySQL werden von dbadmin die folgenden Statements verwendet:
GRANT USAGE ON *.* TO xyz00 IDENTIFIED by 'pass';
INSERT INTO mysql.db (host, db, user, Select_priv, Insert_priv, Update_priv,
Delete_priv, Create_priv, Drop_priv, Grant_priv,
References_priv, Index_priv, Alter_priv)
VALUES ('%','xyz00\_%', 'xyz00', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
FLUSH PRIVILEGES;

