Gens,
Je pourrais utiliser votre aide pour améliorer la conception de mon contrôle d'accès utilisateur Postgres et l'aligner sur les meilleures pratiques. J'aide à déployer un petit serveur Postgres de production mais je ne suis pas administrateur de base de données, donc j'en sais juste assez pour être dangereux.
Il y a un serveur avec une installation de Postgres v9.2. Cette installation héberge plusieurs bases de données, chacune servant pleinement un "client" différent. En d'autres termes, customer1 n'utilisera pas, ne devrait pas utiliser database2, etc. Pendant les opérations normales, chacune des bases de données est accessible par une instance correspondante de CakePHP, tous co-localisés sur le même serveur que Postgres. Bien qu'il puisse y avoir des optimisations possibles sur ce déploiement, je suis principalement intéressé par les rôles Psql.
D'après ce que j'ai lu, il semble que trois types de rôles auraient du sens:
- Postgres de superutilisateur avec mot de passe non par défaut
- Un rôle d'administrateur qui n'a pas de privilèges de superutilisateur pour la maintenance de routine, la création de bases de données, la sauvegarde, la restauration. Devrait être capable de tout faire avec toutes les bases de données clients.
- Rôles d'utilisateur avec juste la possibilité de CRUD dans leur base de données respective. Plus de droits sur leur propre base de données pourraient être tolérés s'il nettoie l'implémentation.
La mise en œuvre de cette conception est l'endroit où je suis beaucoup moins confiant. Propriété de DB par rapport à table et qui devrait hériter de qui est un peu boueux. Voici mes bases de données et mes utilisateurs. Est-ce assez d'informations pour évaluer la mise en œuvre?
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
Pour empêcher les connexions externes et les mots de passe en clair, pg_hba.conf est comme tel:
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
la source
Réponses:
Je sais que c'est une vieille question, mais j'essaierai d'y répondre même maintenant, car je dois faire des recherches à ce sujet.
Ce que vous essayez de faire est appelé multi-location au niveau de la base de données. Cela peut être réalisé de deux manières:
Dans un cluster de base de données unique, un peu comme décrit l'OP, cependant, mon choix personnel serait le suivant:
Chaque client obtient son propre cluster de base de données. C'est ma solution préférée, surtout parce que je travaille généralement avec des applications qui ont de grandes bases de données pour chaque client.
Vous pouvez également utiliser une combinaison des éléments ci-dessus et utiliser pgBouncer comme routeur.
la source