Leute,
Ich könnte Ihre Hilfe gebrauchen, um das Design meiner Postgres-Benutzerzugriffskontrolle besser und besser auf die Best Practices abzustimmen. Ich helfe bei der Einführung eines kleinen Postgres-Produktionsservers, bin aber kein DB-Administrator und weiß gerade genug, um gefährlich zu sein.
Es gibt einen Server mit einer Installation von Postgres v9.2. Diese Installation hostet mehrere Datenbanken, von denen jede einen anderen "Kunden" vollständig bedient. Mit anderen Worten, Kunde1 wird nicht Datenbank2 verwenden und so weiter. Während des normalen Betriebs wird auf die Datenbanken jeweils von einer passenden Instanz von CakePHP zugegriffen, die sich alle auf demselben Server wie Postgres befinden. Während es bei dieser Bereitstellung Optimierungsmöglichkeiten gibt, interessieren mich hauptsächlich Psql-Rollen.
Basierend auf dem, was ich gelesen habe, scheinen drei Arten von Rollen sinnvoll zu sein:
- Superuser-Postgres mit nicht voreingestelltem Passwort
- Eine Administratorrolle ohne Superuser-Berechtigungen für die routinemäßige Wartung, DB-Erstellung, Sicherung und Wiederherstellung. Sollte in der Lage sein, alles mit allen Kundendatenbanken zu tun.
- Benutzerrollen mit nur der Möglichkeit, CRUD in ihrer jeweiligen Datenbank auszuführen. Weitere Rechte an der eigenen Datenbank könnten toleriert werden, wenn die Implementierung bereinigt wird.
Bei der Umsetzung dieses Entwurfs bin ich viel weniger zuversichtlich. Besitz von DB versus Tisch und auch wer von wem erben soll ist etwas matschig. Unten sind meine Datenbanken und meine Benutzer. Reichen diese Informationen aus, um die Implementierung zu bewerten?
Role name | Attributes | Member of
-----------+------------------------------------------------+-------------------
admin | Create role, Create DB | {user1, user2}
postgres | Superuser, Create role, Create DB | {}
user1 | | {}
user2 | | {}
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
admin | postgres | UTF8 | en_US | en_US | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | admin=CTc/postgres
postgres | postgres | UTF8 | en_US | en_US |
template0 | postgres | UTF8 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
user1 | admin | UTF8 | en_US | en_US | =Tc/admin +
| | | | | admin=CTc/admin +
| | | | | user1=CTc/admin
user2 | admin | UTF8 | en_US | en_US | =Tc/admin +
| | | | | admin=CTc/admin +
| | | | | user2=CTc/admin
Um externe Verbindungen und Passwörter im Klartext zu verhindern, lautet pg_hba.conf wie folgt:
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
quelle
Antworten:
Ich weiß, dass dies eine alte Frage ist, aber ich werde versuchen, sie auch jetzt noch zu beantworten, da ich diesbezüglich Nachforschungen anstellen muss.
Was Sie versuchen, heißt Mandantenfähigkeit auf Datenbankebene. Dies kann auf zwei Arten erreicht werden:
In einem einzelnen Datenbankcluster, so wie es das OP beschrieben hat, wäre meine persönliche Wahl jedoch:
Jeder Kunde erhält einen eigenen Datenbankcluster. Dies ist meine bevorzugte Lösung, insbesondere weil ich normalerweise mit Anwendungen arbeite, die pro Kunde große Datenbanken haben.
Sie können auch eine Kombination der oben genannten Optionen verwenden und pgBouncer als Router verwenden.
quelle