gente,
Potrei usare il vostro aiuto per migliorare la progettazione del controllo degli accessi degli utenti Postgres e allinearla alle migliori pratiche. Sto aiutando a implementare un piccolo server Postgres di produzione ma non sono un amministratore DB, quindi so quanto basta per essere pericoloso.
Esiste un server con una installazione di Postgres v9.2. Questa installazione ospita più database, ognuno dei quali serve completamente un "cliente" diverso. In altre parole, customer1 non dovrà, non utilizzare database2 e così via. Durante le normali operazioni, i database sono accessibili ciascuno da un'istanza corrispondente di CakePHP, tutti situati nello stesso server di Postgres. Sebbene possano esserci possibili ottimizzazioni su questa distribuzione, sono principalmente interessato ai ruoli di Psql.
Sulla base di quello che ho letto, sembra che tre tipi di ruoli avrebbero senso:
- Postgres superutente con password non predefinita
- Un ruolo di amministratore che non dispone dei privilegi di superutente per la manutenzione ordinaria, la creazione di DB, il backup e il ripristino. Dovrebbe essere in grado di fare qualsiasi cosa con tutti i database dei clienti.
- Ruoli utente con la sola capacità di CRUD nel rispettivo database. Ulteriori diritti sul proprio DB potrebbero essere tollerati se si ripulisce l'implementazione.
L'implementazione di quel design è dove sono molto meno fiducioso. Proprietà di DB rispetto a tabella e anche di chi dovrebbe ereditare da chi è un po 'confuso. Di seguito sono riportati i miei database e i miei utenti. Sono sufficienti informazioni per valutare l'implementazione?
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
Per impedire connessioni esterne e password in chiaro, pg_hba.conf è come tale:
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5