Permissões de máquina de desenvolvimento MySQL

1

Estou administrando dois servidores que seguem o modelo de desenvolvimento e produção de máquinas.

A máquina de produção é um software bare-bone despojado que é executado sob um conjunto restritivo de regras e acesso limitado. A máquina de desenvolvimento, no entanto, é muito mais aberta - os desenvolvedores podem pedir que praticamente qualquer coisa (com algumas exceções) seja instalada e eles obtêm uma quantidade ilimitada de bancos de dados MySQL para seus testes.

No entanto, em ambos os servidores, os desenvolvedores precisam solicitar uma nova combinação de nome de usuário / senha / banco de dados, que geralmente é aceita na máquina de desenvolvimento e aceita somente na máquina de produção quando um aplicativo da Web é finalizado, polido, seguro e pronto para decolar.

Existe uma maneira de criar cada um dos desenvolvedores na máquina de desenvolvimento um usuário com a permissão para criar (apenas criar, não ler / modificar / apagar) os usuários do modelo com permissão fixa definida? Dessa forma, eles poderiam criar seu próprio conjunto seguro de nome de usuário / senha / banco de dados sem esperar que eu aceitasse a consulta.

Nosso servidor de desenvolvimento está exposto externamente (para que os desenvolvedores possam trabalhar com ssh e trabalhar em casa), por isso não quero dar a um usuário muitas permissões, devido à natureza experimental dos aplicativos hospedados no servidor. (Se o banco de dados for comprometido, o melhor que ele pode fazer é eliminar o banco de dados do aplicativo em vez de todos os bancos de dados aos quais o usuário tem acesso).

    
por LiraNuna 28.06.2009 / 21:34

2 respostas

2

O MySQL não tem o conceito de "permissões padronizadas". Existem alguns tipos de permissão de sondagem úteis fornecidos, mas estes não são suficientemente granulados para construir algo equivalente.

Existem três etapas que seu usuário criador de banco de dados teria que fazer:

  • Criando o novo banco de dados - permitido concedendo CREATE ao usuário de criação de banco de dados.
  • Criando o novo usuário - permitido concedendo o comando CREATE USER ao usuário de criação do banco de dados. Infelizmente, a permissão CREATE USER também permite o uso de DROP USER, RENAME USER e REVOKE ALL PRIVILEGES. Fatalmente, isso permite que você execute DROP USER 'root' @ 'localhost'; e similar.
  • Concedendo permissões de leitura / gravação . As permissões fluem do usuário de criação de banco de dados para o novo usuário, portanto, o usuário de criação de banco de dados deve ter permissões existentes no banco de dados recém-criado. Isso é possível concedendo ALL PRIVILEGES em todos os bancos de dados que começam com um prefixo (por exemplo, dev1_) e exigem que novos bancos de dados iniciem com esse prefixo. A permissão WITH GRANT OPTION permite que um usuário conceda suas permissões ao usuário recém-criado.

Como você pode ver, tudo quase funciona, além da parte de criação do usuário. Um possível comprometimento é criar usuários por desenvolvedor, que podem criar e usar vários bancos de dados de teste:

grant all privileges on 'dev1_%'.* to 'dev1'@'%' identified by 'password';
grant create on 'dev1_%'.* to 'dev1'@'%' identified by 'password';

Isso criará um usuário "dev1" que só pode criar e usar bancos de dados começando com "dev1 _".

Como o MySQL não pode fornecer uma solução sozinho, eu recomendo apenas escrever um programa para executar as etapas de criação de banco de dados e nome de usuário. Os desenvolvedores podem invocar o problema como:

create_dev_database --comment "xyz app test database" database_name username

Como o seu programa está controlando a criação de banco de dados / usuário, você pode:

  • Aplicar senhas strongs (sem senhas de 'senha', como acima:))
  • Impor restrições de acesso por nome de host (restringir conexões a '% .example.com' em vez de permitir que desenvolvedores escolham '%')
  • Registre os detalhes de acesso e a finalidade de novos bancos de dados (não deseja centenas de bancos de dados ativos / inativos e nenhuma documentação de sua finalidade)

Tal programa teria que usar e proteger sua senha de root do MySQL. Como isso seria alcançado depende da plataforma.

Boa sorte!

    
por 28.06.2009 / 23:32
0

Umm, por que os desenvolvedores não administram seus próprios servidores dentro de suas VMs de desenvolvimento, com os mesmos bloqueios de segurança que a produção (embora senhas diferentes, etc.)?

Estou sentindo falta de algo aqui? O desenvolvimento não deve ser o mesmo que a produção, e cada um dos desenvolvedores não deve ter seu próprio ambiente, eles podem tocar o quanto quiserem?

    
por 29.06.2009 / 07:47