Protegendo dados confidenciais de desenvolvedores

61

Eu tenho um aplicativo corporativo em execução que usa armazenamentos de dados MySQL e MongoDB . Minha equipe de desenvolvimento tem acesso SSH à máquina para executar lançamentos, manutenção de aplicativos etc.

Recentemente, aumentei o risco nos negócios, quando os usuários começaram a armazenar dados altamente confidenciais no aplicativo, de que os desenvolvedores têm acesso indireto a esses dados, o que causou um pouco de tempestade. Por isso, agora fui encarregado de proteger os dados para que não sejam acessível.

Para mim, isso não parece possível, porque se o aplicativo tiver acesso ao banco de dados, um desenvolvedor com acesso à máquina e à fonte do aplicativo sempre poderá acessar os dados.

Clinton Bosch
fonte
30
Os usuários devem armazenar dados confidenciais apenas na forma criptografada. Não deve haver um grande problema se os desenvolvedores puderem acessar o formulário criptografado, desde que as chaves correspondentes estejam protegidas adequadamente.
precisa saber é o seguinte
3
@Clinton Você tem equipes de administração e desenvolvedor separadas? O administrador do servidor sempre pode ler os dados e a criptografia não ajuda, pois eles podem facilmente obter a chave.
CodesInChaos
14
Para ser completamente honesto, esse é um assunto complicado e fazer o que é certo exige muita experiência em segurança de dados. Mesmo se você soubesse exatamente o que fazer, enfrentará oposição de negócios, obstáculos políticos e técnicos. Eu sugiro que você chame um consultor de segurança de dados. Eles não apenas sabem o que fazer aqui, como também a alta gerência dá mais credibilidade a terceiros que estão dizendo para mudar. A alta gerência geralmente não coloca tanto estoque no que seus especialistas internos estão dizendo.
maple_shaft
3
Pode valer a pena perguntar no Information Security Stack Exchange. Há algumas informações relacionadas a esta questão
Paj28 /
23
Por que os humanos estão tocando no servidor e implantando código?
Wyatt Barnett

Respostas:

89

A segurança não é uma varinha mágica que você pode acenar no final de um projeto, ela precisa ser considerada e incorporada a partir do dia 1. Não é um problema, é a aplicação consistente de uma variedade de soluções aplicadas iterativamente e revisadas regularmente como parte de um sistema inteiro, que é tão forte quanto o elo mais fraco.

Como está, você sinalizou uma preocupação de segurança, que é um bom primeiro passo. Agora, no mínimo, você deve definir: -

  • Quais dados você está tentando proteger?
  • De quem você está tentando proteger esses dados?
  • Quem realmente precisa de acesso a quê (e quando)?
  • Qual o impacto legal / financeiro / comercial desses dados que estão sendo comprometidos?
  • Qual é a necessidade legal / financeira / comercial de uma pessoa / grupo ter acesso aos dados?
  • Qual orçamento a empresa está disposta a atribuir a uma estratégia de "fique seguro, fique seguro" quando não era um requisito comercial anteriormente?
  • De que acesso o sistema precisa para os dados?
  • Em que esse processo e sistemas se baseiam neste aplicativo?
  • O que é feito para proteger esses ambientes?
  • Quem será responsável por implementá-lo e revisar todo o processo?

Até você conhecer todos esses detalhes, você realmente não tem nada com o que trabalhar. Essas informações definirão quais atenuações para essas ameaças você pode (e não pode) aplicar e por quê.

Pode ser que a melhor coisa a fazer é reconhecer que você não tem a experiência necessária e que seria melhor trazer alguém novo com essa experiência. Frequentemente ouço a resposta de que não há orçamento - se for considerado genuinamente importante, o orçamento será encontrado.

James Snell
fonte
33
Uau ... isso faz a segurança parecer ... não trivial. (Desculpem o sarcasmo, eu vi um monte de pessoas surpreendido por esta.)
Paul Draper
4
Eu acredito que várias pessoas pensam que existe um make-application-securecomando mágico que elas só precisam executar.
TMH
27

Você está certo. Se um aplicativo é capaz de acessar conteúdo armazenado em máquinas corporativas sem que o usuário passe informações extras todas as vezes , os programadores, mantenedores, administradores de sistemas etc. do provedor de serviços podem acessar esse conteúdo. Isso é fundamentalmente inevitável e uma das principais fontes de insegurança (Edward Snowden era um administrador de sistemas e tinha privilégios especiais acima de "Top Secret" porque simplesmente não há como não concedê-los).

A única maneira de evitar isso é exigir que o usuário forneça informações que nunca chegam às máquinas corporativas. Isso é tedioso e propenso a erros, já que ninguém pode se lembrar de informações suficientes para formar uma barreira de acesso segura e, portanto, as pessoas imediatamente começarão a armazenar suas credenciais eletronicamente em algum lugar, que se tornará o novo alvo de ataque (e provavelmente um alvo mais fraco do que o que você está mantendo). Mas se você deseja afirmar com sinceridade "Nossos funcionários não são fisicamente capazes de acessar o conteúdo de nossos usuários", é a única maneira.

(Observe também que esse modelo de negócios parece estar se tornando politicamente insustentável. As empresas foram forçadas a sair de operação pelos serviços de segurança por tentarem fazer exatamente isso. Entendo que dar garantias de privacidade tem valor comercial, mas não pode ter mais valor comercial do que o objetivo fundamental de permanecer no negócio.)

Kilian Foth
fonte
6
É possível projetar hardware de tal maneira que seja fisicamente impossível acessar determinados dados sem criar um registro permanente desse acesso que não possa ser destruído sem a colaboração de várias pessoas independentes e que mesmo com essa colaboração não possa ser destruído sem deixar evidências claras de destruição deliberada. Atualizar esses sistemas para lidar com os requisitos variáveis, no entanto, pode custar muito caro em comparação com a atualização de sistemas de segurança baseados em software.
supercat
5
Você está certo, eu esqueci completamente de mencionar a auditabilidade como uma possível alternativa à hospedagem com zero conhecimento. É um pouco mais fácil de alcançar e com frequência suficiente para o business case.
Kilian Foth
Seu último parágrafo. Você está se referindo a histórias do tipo LavaBit? Estou confuso.
jpmc26
11
@ supercat Você também deve confiar que os criadores do hardware fizeram com que ele fizesse o que eles disseram que faz.
precisa saber é o seguinte
2
@immibis: Verdade, mas eu gostaria que o design e a fabricação de hardware seguro pudessem ser auditados por várias pessoas independentes. Além disso, em um sistema convencional, seria possível que um pedaço de código "furtivo" fizesse alguma coisa e se excluísse sem deixar rastro, mas se um pedaço de hardware seguro não deveria ter um armazenamento de controle gravável, tal coisa seria impossível. O código furtivo teria que estar permanentemente no armazenamento de controle ou o armazenamento de controle teria que ter um meio de modificação permanentemente conectado, qualquer um dos quais seria detectável posteriormente.
supercat
15

Você está certo; alguns desenvolvedores sempre precisarão acessar os dados do Live, apenas para diagnosticar problemas de produção. O melhor que você pode fazer é limitar o dano potencial, reduzindo o número de pessoas envolvidas.

With great power comes great ... opportunity to really, *really* foul things up. 

Muitos desenvolvedores não querem essa responsabilidade e outras, apenas não estarão "prontas" para cumpri-la e, portanto, não deveriam.

Pergunta: Por que sua equipe de desenvolvimento está executando lançamentos ao vivo ?
Eu sugiro que você precise de uma "equipe" do Gerenciamento de Liberação (mesmo que seja apenas um subconjunto da sua equipe, além da representação comercial para tomar quaisquer "decisões" diárias, como "Ir / Não-Ir")? Isso removeria grande parte da "necessidade" de os desenvolvedores tocarem em qualquer coisa do Live.

Você tem algum tipo de acordo de não divulgação / confidencialidade entre desenvolvedores e empresa? É pesado, mas pode ter algum mérito.

Phill W.
fonte
O que ainda não impedirá que determinados criminosos ocultem a porta dos fundos no aplicativo, mas reduz a oportunidade que faz o ladrão.
Jan Hudec
Sim, não é toda a equipe de desenvolvimento, mas uma equipe de gerenciamento de subconjuntos / versões. Certamente temos uma cláusula no contrato de trabalho sobre bisbilhotar dados que você não deveria ser, é um crime descartável.
Clinton Bosch
@JanHudec Especialmente desde a adição de código, o aplicativo deixa rastros no controle de versão.
CodesInChaos
@CodesInChaos: Um bom programador pode fazer com que o backdoor pareça um erro honesto. Você suspeitará deles, mas nunca fará um caso contra eles. Mas sim, é outra linha de defesa.
Jan Hudec
@ Jan: É por isso que todas as alterações de código devem ser revisadas e assinadas antes de serem permitidas no ramo de lançamento.
SilverlightFox
9

O problema é que seus desenvolvedores têm acesso aos sistemas. Se eles precisarem de dados de produção para depuração, forneça um despejo de banco de dados em que todas as informações confidenciais serão removidas. Em seguida, os desenvolvedores podem trabalhar com esse despejo.

A implantação de uma nova versão não deve envolver nenhum desenvolvedor - uma tarefa administrativa pura, ou melhor ainda - uma tarefa totalmente automatizada. Também esteja ciente de liberar e implantar sendo duas tarefas muito diferentes. Se o seu processo não estiver ciente disso, altere-o de acordo.

SpaceTrucker
fonte
11
Não precisamos de dados de produção da depuração, temos um despejo de dados higienizado para isso, mas às vezes uma implantação exige várias migrações de dados etc. que são executadas por alguns desenvolvedores na equipe de gerenciamento de versões (mas ainda são desenvolvedores)
Clinton Bosch
2
@ClintonBosch Então você não separou claramente os papéis de administradores e desenvolvedores. Depois, mais uma pergunta que você deve se perguntar: como garantir que o software lançado também seja realmente implantado? Você precisaria assinar a liberação e permitir apenas a implantação de pacotes assinados na produção. Além disso, novamente a automação é sua amiga. As migrações não devem exigir nenhuma etapa manual.
SpaceTrucker
4
@ClintonBosch Identifique quais campos de dados são altamente confidenciais e criptografe-os. Certifique-se de colocar a segurança do sistema operacional de produção para poder acessar quais IDs de usuário estão lendo o arquivo-chave para garantir que ninguém, exceto o usuário do aplicativo, esteja fazendo isso. Não dê aos desenvolvedores a senha de usuário do aplicativo. Faça-os sudo para obter direitos sobre a produção e registrar o que estão fazendo. Essa é provavelmente a maneira mais segura de garantir que você cuide das poucas pessoas que teriam acesso e que elas não possam ver de forma casual ou acidental os dados que não deveriam.
maple_shaft
6

Regra nº 1 de segurança: se alguém tiver acesso a informações, ele terá acesso a essas informações

Essa tautologia é irritante, mas é verdade. Se você der acesso a um indivíduo, ele terá acesso aos dados. Para os usuários, isso geralmente significa controle de acesso, mas para desenvolvedores ... bem ... são eles que precisam escrever o controle de acesso.

Se esse é um problema importante para você (e parece que é), considere incorporar segurança ao seu software. Um padrão comum é projetar software seguro em camadas. Na camada mais baixa, uma equipe de desenvolvimento confiável projeta software que gerencia o controle de acesso mais nu. Esse software é validado e verificado pelo maior número de pessoas possível. Qualquer pessoa que crie esse código terá acesso a tudo, portanto, a confiança é essencial.

Depois disso, os desenvolvedores podem criar um controle de acesso mais flexível sobre a camada principal. Esse código ainda precisa ser de pesquisa e desenvolvimento, mas não é tão rigoroso, porque você sempre pode confiar na camada principal para cobrir o essencial.

O padrão se estende para o exterior.

A parte difícil, na verdade a arte de projetar esses sistemas, é como criar cada camada para que os desenvolvedores possam continuar desenvolvendo e depurando enquanto ainda fornecem à sua empresa a segurança que você espera. Em particular, você precisará aceitar que a depuração exige mais privilégios do que você pensa que deveria, e tentar bloquear isso resultará em alguns desenvolvedores muito irritados.

Como uma solução secundária, considere criar bancos de dados "seguros" para fins de teste, nos quais os desenvolvedores podem eliminar todos os mecanismos de segurança e fazer uma depuração séria.

No final, você e seus desenvolvedores precisam entender um princípio fundamental de segurança: Toda segurança é um equilíbrio entre segurança e usabilidade. Você deve atingir seu próprio equilíbrio como empresa. O sistema não será perfeitamente seguro e não será perfeitamente utilizável. Esse equilíbrio provavelmente mudará à medida que sua empresa cresce e / ou as demandas dos desenvolvedores mudam. Se você está aberto a essa realidade, pode resolvê-la.

Cort Ammon
fonte
3

Configure duas implantações do aplicativo que também usam implantações de banco de dados separadas. Uma é a implantação de produção e a outra é a implantação de teste.

A implantação de teste deve ter apenas dados de teste. Podem ser dados de fantasia criados para esse fim ou uma cópia dos dados de produção que foram anonimizados para impedir que os desenvolvedores descubram as pessoas e entidades reais por trás dos dados.

Philipp
fonte
Sim, este é exatamente o cenário que temos. Mas em algum momento alguém precisa de trabalhar no ambiente de produção para facilitar a migração de implantação / dados
Clinton Bosch
3

Em duas empresas financeiras, os desenvolvedores não tiveram acesso às máquinas de produção. Todas as solicitações para modificar máquinas de produção tiveram que passar por um processo de aprovação, com um script, e foram aprovadas pelos gerentes. A equipe de desenvolvedores concluiu as implantações reais. Eu suponho que essa equipe era apenas funcionários e passou nas verificações de antecedentes. Eles também não tinham conhecimento de desenvolvedor, então provavelmente não poderiam bisbilhotar se quisessem. Além disso, você criptografaria todas as entradas do banco de dados usando uma chave secreta armazenada nas variáveis ​​de ambiente. Mesmo que os bancos de dados vazassem publicamente, ninguém poderia lê-lo. Essa chave pode ser protegida por senha adicional (PBKDF), para que apenas um executivo possa desbloqueá-la. Seu sistema pode exigir a senha executiva na inicialização (ou provavelmente delegada a dev-ops ou a um gerente de dev-ops). Basicamente, a estratégia é dispersar o conhecimento, para que uma massa crítica de conhecimento necessário não exista em uma pessoa e haja balanços. É assim que a Coca-Cola protege sua fórmula. Honestamente, algumas dessas respostas são imitações.

Chloe
fonte
-1

O MongoDB possui controles de segurança limitados e depende de um ambiente seguro. Vinculação a um IP e porta específicos (e ssl desde 2.2) e uma autenticação bruta, é isso que ele oferece. O MYSQL adiciona GRANT o ON db.t TO ... Os dados em repouso não são criptografados e o ssl não é usado por padrão. Crie uma cerca. O acesso somente leitura dos desenvolvedores aos arquivos de log relacionados ao aplicativo deve ser suficiente para depurar. Automatize o ciclo de vida do aplicativo.

A Ansible nos ajudou a automatizar operações padrão (implantar, atualizar, restaurar) em muitos ambientes de um único inquilino, usando vaults criptografados distintos para armazenar variáveis ​​de ambiente sensíveis, como hosts, portas e credenciais. Se cada cofre puder ser descriptografado apenas por funções diferentes, e apenas em um host bastião, para operações registradas, a capacidade de auditoria fornecerá segurança aceitável. Se você conceder o SSH, use o selinux para evitar violações de chave, use um host bastião com autenticação ldap / kerberos para administração e use o sudo com sabedoria.

bbaassssiiee
fonte