Pessoal,
Eu poderia usar sua ajuda para tornar meu design de controle de acesso de usuário do Postgres melhor e mais alinhado às práticas recomendadas. Estou ajudando a implantar um pequeno servidor Postgres de produção, mas não sou um administrador de banco de dados, portanto sei o suficiente para ser perigoso.
Há um servidor com uma instalação do Postgres v9.2. Esta instalação hospeda vários bancos de dados, cada um atendendo totalmente a um "cliente" diferente. Em outras palavras, o cliente1 não utilizará o banco de dados2 e assim por diante. Durante as operações normais, os bancos de dados são acessados por uma instância correspondente do CakePHP, todos localizados no mesmo servidor do Postgres. Embora possa haver possíveis otimizações nessa implantação, estou principalmente interessado nas funções do Psql.
Com base no que li, parece que três tipos de papéis fariam sentido:
- Postgres de superusuário com senha não padrão
- Uma função de administrador que não possui privilégios de superusuário para manutenção de rotina, criação de banco de dados, backup e restauração. Deve ser capaz de fazer qualquer coisa com todos os bancos de dados do cliente.
- Funções de usuário com apenas a capacidade de CRUD em seu respectivo banco de dados. Mais direitos por conta própria poderão ser tolerados se limpar a implementação.
Implementar esse design é onde estou muito menos confiante. Propriedade do banco de dados versus a tabela e quem deve herdar de quem é um pouco enlameado. Abaixo estão meus bancos de dados e meus usuários. São informações suficientes para avaliar a implementação?
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
Para evitar conexões e senhas externas em claro, o pg_hba.conf é o seguinte:
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
fonte
Respostas:
Sei que essa é uma pergunta antiga, mas tentarei responder ainda agora, pois fiz algumas pesquisas relacionadas a isso.
O que você está tentando fazer é chamado de multilocação no nível do banco de dados. Isso pode ser alcançado de duas maneiras:
Em um único cluster de banco de dados, de alguma maneira como o OP descreveu, no entanto, minha escolha pessoal seria esta:
Cada cliente obtém seu próprio cluster de banco de dados. Essa é a minha solução preferida, especialmente porque geralmente trabalho com aplicativos que possuem grandes bancos de dados por cada cliente.
Você também pode usar uma combinação dos itens acima e usar o pgBouncer como um roteador.
fonte