Como posso impedir o carregamento acidental de um banco de dados de produção?

31

Recentemente, um desenvolvedor tentou acidentalmente restaurar um banco de dados para produção, quando deveria estar restaurando uma cópia de teste. É fácil, pois os nomes de banco de dados são semelhantes, ou seja, CustomerName_Staging versus CustomerName_Production.

Idealmente, eu os teria em caixas totalmente separadas, mas isso é proibitivo em termos de custos e, estritamente falando, não impede que a mesma coisa aconteça se o usuário se conectar à caixa errada.

Isso não é um problema de segurança, por si só - era o usuário correto que trabalhava com o banco de dados temporário e, se há trabalho a ser feito no banco de dados de produção, seria ele também. Eu adoraria ter um oficial de implantação para separar essas preocupações, mas a equipe não é grande o suficiente para isso.

Eu adoraria ouvir alguns conselhos em termos de prática, configuração e controles sobre como evitar isso.

Chris B. Behrens
fonte
25
Os desenvolvedores não devem ter acesso de gravação aos bancos de dados de produção ou, de preferência, qualquer acesso.
Michael Hampton
12
@ MichaelHampton - Somos eu e ele. Eu também sou desenvolvedor. O que você sugere?
Chris B. Behrens
10
Contas de usuário separadas para cada função (dev vs ops / DBA). E muita cautela.
Michael Hampton
2
Eu recomendo fortemente que você tenha seu ambiente de produção em uma caixa separada. Caso contrário, a preparação e a produção terão que compartilhar recursos - disco, CPU, etc. - e se a preparação estiver monopolizando um recurso, seu ambiente de produção poderá sofrer.
Thorbjørn Ravn Andersen
11
Apenas tenha usuário / senha separados para esses bancos de dados.
Neutrinus

Respostas:

32

Se isso é algo que você se vê fazendo com frequência, automatize-o. E como vocês são desenvolvedores, escrever algum código deve estar na sua casa do leme. :) Mas falando sério ... ao automatizá-lo, você pode fazer coisas como:

  • Verifique se você está restaurando no servidor correto (ou seja, sem dev -> prod restaurações)
  • Verifique se é o "tipo" correto de banco de dados (no seu caso, "teste" e "produção")
  • Descobrir quais backups devem ser restaurados automaticamente, observando as tabelas de backup em msdb

Et cetera. Você é limitado apenas pela sua imaginação.

Ben Thul
fonte
11
Essa é uma ideia interessante ... já temos um código que gerencia restaurações de banco de dados (para testes automatizados). Poderíamos colocar uma camada de abstração entre isso só já apontou para encenar para que restaurar a produção foi um processo totalmente diferente ...
Chris B. Behrens
11
Agora você está pensando com portais. :)
Ben Thul
4
Para trabalhos automatizados que afetam a produção, eu gosto de adicionar uma etapa manual que exige que o usuário digite a palavra "produção" para reduzir a possibilidade de que eles acham que estão olhando, por exemplo, o equivalente de teste.
Joe Lee-Moyet
2
Fiz o voto negativo, já que ninguém deveria ter acesso à produção por padrão. Você precisa ter um processo especial para recuperar uma senha de prod. É inconveniente, mas realmente o mínimo.
OliverS
11
Adicionar uma conta diferente para acesso a produtos e torná-la mais uma etapa inconveniente ainda é a solução correta para mim. A necessidade comercial não é que o DEV economize 2 minutos, mas restaure o banco de dados que pode ser perfeitamente movido para uma conta de produto.
Olivers
32

Discordo do pressuposto da pergunta - isso é segurança -, mas também discordo que a automação salvará o dia por si própria. Vou começar com o problema:

Você não deve poder acidentalmente fazer nada na produção!

Isso inclui fazer coisas automatizadas acidentalmente.

Você está confundindo a segurança do sistema com conceitos como "quem tem permissão para fazer o quê". Suas contas de desenvolvimento só devem poder gravar em suas cópias, no servidor de controle de versão e no banco de dados dev. Se eles podem ler / gravar a produção, eles podem ser invadidos e explorados para roubar dados do cliente ou (como você demonstrou) podem ser manipulados incorretamente para perder dados do cliente.

Você precisa começar classificando seu fluxo de trabalho.

  • Suas contas de desenvolvedor devem poder gravar em suas próprias cópias, controle de versão e, talvez, extrair do controle de versão para um ambiente de teste.

  • Os usuários de backup só devem poder ler da produção e gravar no seu armazenamento de backup (que deve ser adequadamente protegido).

  • Fazer qualquer outra leitura / gravação na produção deve exigir especial e autenticação inconveniente . Você não deve entrar nele ou esquecer que está logado. O controle de acesso físico é útil aqui. Cartões inteligentes, comutadores para "armar" a conta, acesso de chave dupla com giro simultâneo.

    O acesso à produção não deve ser algo que você precisa fazer todos os dias. A maior parte do trabalho deve estar em sua plataforma de testes e implementações fora do horário comercial, produzidas após uma análise cuidadosa. Um pequeno inconveniente não vai te matar.

Automação é parte da solução.

Não estou cego para o fato de que a recuperação total (upload para VCS, verificação de cobertura, extração para servidor de teste, execução de testes automatizados, nova autenticação, criação de backup e extração de VCS) é um processo longo.

É aí que a automação pode ajudar, de acordo com a resposta de Ben. Existem muitas linguagens de script diferentes que facilitam muito a execução de determinadas tarefas. Apenas certifique-se de não facilitar demais coisas estúpidas. Suas etapas de nova autenticação ainda devem ser pronunciadas (e, se perigosas), devem ser inconvenientes e difíceis de executar sem pensar.

Mas , sozinha , a automação é pior que inútil. Isso apenas o ajudará a cometer erros maiores com menos reflexão.

Adequado para equipes de todos os tamanhos.

Percebi você apontando o tamanho da sua equipe. Eu sou um cara e me envolvi nisso porque é preciso apenas uma pessoa para sofrer um acidente. Há uma sobrecarga, mas vale a pena. Você acaba com um ambiente de desenvolvimento e produção muito mais seguro e muito mais seguro.

Oli
fonte
2
Além disso, uma coisa que gosto de fazer é usar duas contas nomeadas por usuário. Uma é para login, operação, trabalho diário do usuário, etc., enquanto a segunda conta (geralmente com algum tipo de sufixo como um + ou um sublinhado) tem todos os direitos de produção e desenvolvimento exigidos pelo usuário. Dessa forma, o usuário deve tomar uma decisão ativa de pressionar para prod ao invés de dev. Isso é semelhante ao marcador 3 descrito acima, mas não requer infraestrutura ou despesa adicional significativa para demonstrar o valor.
precisa saber é o seguinte
3
Também é importante evitar o hábito de fazer qualquer coisa, exceto a manutenção de prod em sua conta de prod. Para o efeito, certifique-se prod não pode ver o código fonte, não pode iniciar um IDE, etc.
Eric Lloyd
Onde encontro uma dessas engenhocas de chave dupla de giro simultâneo e vem com USB?
Lilienthal 8/15
Outra coisa que pode ajudar é automatizar completamente (um ou dois cliques) os procedimentos no preparo e desenvolvimento, mas não automatizando totalmente as implantações de produção. Ter que manualmente remotamente na caixa para fazer qualquer coisa na produção, mas não em outros ambientes, é uma diferença significativa na conveniência, como você sugere. (Você ainda pode criar um script de todas as etapas envolvidas e usá-lo em todos os ambientes; o que quero dizer é que você teria que disparar manualmente a execução dos referidos scripts para produção.) É claro que isso pode ser feito além do tipo de autenticação procedimentos recomendados.
Jpmc26 9/01/15
11
@ Lilienthal Era uma metáfora para o teatro de alta segurança, mas você poderia emular ataques USB baratos a cada desenvolvedor e depois fazer com que sua automação verifique pelo menos dois de seus números de série ao executar coisas perigosas. Em equipes maiores, você pode registrar-se para ver quem está interferindo na produção e responsabilizar as pessoas certas quando tudo der errado.
Oli
12

Um dos meus colegas de trabalho tem uma abordagem interessante para isso. Seu esquema de cores terminal para produção é imprudente . Cinza, rosa e difícil de ler, o que teoricamente deveria garantir que, o que quer que ele escreva, ele realmente pretenda escrever.

Sua milhagem pode variar ... e eu provavelmente não tenho que dizer que não é à prova de balas. :)

Robhol
fonte
2
Eu também uso uma cor de fundo vermelha grande em terminais / conexões de banco de dados para servidores de produção, bem como papéis de parede vermelhos brilhantes para admin-accoungs em PCs ...
Falco
Sim, eu estava pensando isso. Tornar a produção de vermelho-fogo ...
Chris B. Behrens
A codificação por cores ajuda. Assim como em um IDE.
Thorbjørn Ravn Andersen
1

Os desenvolvedores não devem saber a senha do banco de dados de produção. A senha do prod deve ser aleatória e não memorável - algo como o resultado do esmagamento do teclado ( Z^kC83N*(#$Hx). Sua senha do desenvolvedor pode ser $YourDog'sNameou correct horse battery stapleou o que for.

Claro, você pode descobrir qual é a senha, especialmente se você é uma equipe pequena, olhando para o arquivo de configuração do aplicativo cliente. Esse é o único lugar onde a senha do prod deve existir. Isso garante que você teria que fazer um esforço deliberado para obter a senha do prod.

(Como sempre, você deve ter backups pontuais para o banco de dados de produção. Por exemplo, no MySQL, arquive os logs binários como backups incrementais. No PostgreSQL, arquive os logs write-ahead. Essa é a sua proteção de último recurso para qualquer tipo de desastre, auto-infligido ou não.)

200_success
fonte
Não posso concordar totalmente com isso, porque em qualquer ambiente grande e realista existem casos regularmente em que desenvolvedores / administradores precisam acessar o banco de dados de produção. Certamente, em um mundo perfeito, com um sistema sem falhas, isso nunca deve acontecer, mas na maioria dos sistemas eu sei que você precisa corrigir alguns dados críticos da produção manualmente ... Então, eu estou com a Oli, o login da produção deve ser inconveniente, mas viável
Falco
11
@ Falco Isso é exatamente o que estou sugerindo. Inconveniente, mas viável.
200_success
O problema com sua abordagem é apenas, se houver uma emergência e a produção cair, o tempo conta. Portanto, seus desenvolvedores devem saber onde encontrar a senha e obtê-la rapidamente. Se eles tiverem que perguntar, procure no repositório e nos arquivos de configuração e tente perder um tempo valioso = dinheiro. Então, eu prefiro ter a senha em um lugar onde todo mundo sabe onde procurar, mas ainda é inconveniente, mas rapidamente se for necessário
Falco
2
@Falco Como os ambientes de produtos devem espelhar de perto os ambientes de desenvolvimento, o arquivo de configuração estaria no local análogo no servidor de produção, assim como nas máquinas de desenvolvimento. Qualquer desenvolvedor competente deve saber para onde procurar e, se não souber onde procurar, você deseja esse atraso - precisamente para evitar danos do tipo indicado na pergunta.
200_success
Não conhecer senhas não impede acidentes. Pelo contrário, cria motivação para fazer a pesquisa de senha apenas uma vez e, depois disso, o desenvolvedor pode começar a usar o histórico do bash ou até criar um alias para se conectar ao banco de dados. E então, é mais provável que os acidentes aconteçam.
K0pernikus
0

A resposta curta é RBAC - controle de acesso baseado em função.

Suas permissões para todos os ambientes precisam ser diferentes - e, por mais irritantes que sejam as coisas como UAC, você precisa delas: especialmente para ambientes PROD.

NUNCA existe uma razão para os desenvolvedores terem acesso direto ao Prod - independentemente de quão pequena a organização / equipe seja. Seu "Dev" também pode usar os chapéus "Stage" e "Prod", mas ele precisa ter credenciais e processos diferentes para atingir ambientes diferentes.

Isso é chato? Absolutamente. Mas isso [ajuda] a impedir que os ambientes sejam prejudicados? Absolutamente.

Warren
fonte
0

Uma solução rápida e simples: use duas contas de usuário diferentes, uma para o seu trabalho normal de desenvolvimento, que tem apenas acesso ao banco de dados de desenvolvimento, e outra para realmente operar no banco de dados de produção, com acesso total a ele. Dessa forma, você terá que alterar ativamente a conta que está usando antes de fazer qualquer alteração na produção, o que deve ser suficiente para evitar erros acidentais.

A mesma abordagem pode ser usada se você tiver dois sites, dois servidores ou dois ambientes inteiros: uma conta de usuário para desenvolvimento sem acesso (ou pelo menos sem acesso de gravação ) à produção, outra conta de usuário para trabalhar no sistema de produção ( s)


Essa é a mesma abordagem que um administrador de sistemas que possui uma conta padrão de não administrador para o trabalho de rotina (leitura de email, navegação na web, tickets de rastreamento, folhas de ponto de arquivamento, documentação de redação etc.) e uma conta de administrador completo distinta a ser usada quando realmente estiver em operação em servidores e / ou no Active Directory.

Massimo
fonte