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