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