Fundamentos de estratégias seguras de desenvolvimento de software

18 de novembro de 2018 // 17 min read

image

A confiança é a base do relacionamento entre empresas de software e seus clientes. A base dessa confiança está na capacidade de impedir que dados confidenciais caiamnas mãos erradas.

Introdução

Em nível global, os governos têm respondido com uma variedade de estruturas regulatórias que obrigam as empresas a proteger os dados confidenciais dos clientes, com severas sanções impostas às empresas que não o fizerem. A falha em proteger os dados adequadamente pode ter um impacto profundo e permanente na reputação e nos resultados de uma empresa.

Para tornar as coisas ainda mais complexas, os softwares se tornaram um componente central dos negócios em todos os setores e continuarão a crescer em importância. No entanto, requisitos regulatórios e de conformidade rígidos podem determinar de que maneira as equipes criam seus softwares, desde os processos que elas seguem até as ferramentas que utilizam. Esses requisitos são muitas vezes proibitivos o suficiente para comprometer o desempenho e sufocar a inovação, especialmente para empresas em setores altamente regulamentados, como os de saúde, governo e serviços financeiros.

A boa notícia é que o desenvolvimento seguro não precisa ser uma barreira à colaboração ou à inovação. As empresas de hoje estão em uma posição única para criarem experiências de usuário inovadoras e de impacto, e muitas delas estão fazendo exatamente isso. Milhares de organizações estão usando o GitHub para liberar seus fluxos de trabalho do desenvolvimento isolado e criar processos seguros que proporcionam às equipes de engenharia a flexibilidade necessária para fazerem seu melhor trabalho. Com as expectativas dos consumidores mais altas do que nunca e a crescente pressão para reduzir os custos, fluxos de trabalho eficientes, colaborativos e seguros podem ajudar as equipes a se concentrar em onde é mais importante: em criar o melhor e mais inovador software para seus clientes.

Neste guia, descreveremos os desafios regulatórios e técnicos únicos que as empresas de software enfrentam, como solucioná-los e como o GitHub pode ajudar.

Proteção dos dados do cliente

Atualmente, os clientes compartilham alguns de seus dados mais confidenciais com empresas em transações online e outros intercâmbios de dados. As equipes de segurança estão envolvidas em uma constante corrida armamentista com aqueles que tentam obter esses dados para fins criminosos, desde hackers individuais até agentes estatais que empregam habilidades e recursos consideráveis em seus esforços para minar a segurança. Felizmente, existem melhores práticas e ferramentas que podem ajudar as empresas a proteger seus processos de desenvolvimento e a manter dados confidenciais em segurança.

Não existe uma solução ou abordagem única que possa garantir a segurança. Em vez disso, uma segurança efetiva depende de uma abordagem em camadas, impondo verificações e garantias em vários pontos em todos os caminhos de dados e fluxos de trabalho. Essa abordagem em camadas inclui uma combinação de ferramentas, práticas e cultura.

Crie uma cultura de segurança

Uma cultura corporativa que coloca a segurança no centro de tudo é fundamental para aplicar políticas de segurança em grande escala. Criar uma cultura de segurança significa construir processos que façam o trabalho de todos. Alguns exemplos incluem treinamentos regulares sobre práticas seguras, destacando o perigo de caminhos sociais para a infiltração, como ataques de phishing, bem como meios técnicos. As melhores práticas específicas incluem:

  • Imposição de políticas de senha, incluindo senhas complexas, alterações regulares de senhas e o uso de gerenciadores e geradores de senhas para reforçar a segurança das senhas
  • Uso da autenticação de dois fatores
  • Educação e treinamento sobre os perigos das redes públicas, bem como a proteção física de dispositivos como laptops, tablets e telefones celulares
  • Uso de VPNs para proteger o acesso a redes corporativas internas

Sempre criptografe os dados

A criptografia é uma das melhores maneiras de evitar o acesso não autorizado aos dados. Mesmo que um agente mal-intencionado obtenha acesso à transmissão de dados, uma criptografia forte pode tornaresse sucesso de pouco ou nenhum valor. Mais uma vez, empregar uma abordagem em camadas é mais eficiente ao implementar uma estratégia de criptografia. Isso significa:

  • Criptografar dados em trânsito quando estão sendo transmitidos entre um repositório permanente e um usuário final
  • Criptografar dados inativos nos bancos de dados em que estão armazenados

Criptografia em trânsito

Como prática padrão, qualquer esforço baseado na Web deve empregar a criptografia de ponta a ponta usando protocolos de criptografia modernos, como o TLS. O TLS ajuda a proteger a comunicação, usando uma criptografia forte baseada em certificados que pode ser essencialmente inquebrável em qualquer sentido prático. O TLS também verifica cada parte em uma transação de rede, evitando ataques "man-in-the-middle", nos quais um agente mal-intencionado se apresenta como um parceiro confiável em uma transação. Serviços como o LetsEncrypt reduziram consideravelmente os custos e a complexidade da implementação de um TLS eficaz e da obtenção dos certificados necessários.

Criptografia em repouso

Alguns aplicativos fornecem serviços de criptografia na camada de software. Esse tipo de criptografia é melhor do que nada, mas pode gerar custos significativos em termos de complexidade e desempenho reduzido. As soluções de criptografia executadas o mais próximo possível do hardware de armazenamento, como criptografia do sistema de arquivos ou criptografia em nível de dispositivo de hardware, podem fornecer uma camada transparente de criptografia para todos os aplicativos.

Criptografia com o GitHub

Todas as comunicações bidirecionais com a nossa solução auto-hospedada, o GitHub Enterprise Server, são protegidas por TLS, com a opção de usar o LetsEncrypt para manutenção simples e econômica de certificados. O GitHub também protege a comunicação entre o servidor e os clientes Git usados pelos desenvolvedores usando SSH. Ambos são protocolos criptográficos fortes que apresentam barreiras robustas à interceptação não autorizada ou ao vazamento de dados confidenciais.

Adote práticas sólidas de gerenciamento de identidades

Quanto mais senhas os usuários precisarem memorizar, maior a probabilidade de eles adotarem práticas inseguras, como anotar senhas ou reutilizar senhas fáceis de lembrar (e, portanto, fáceis de decifrar). Usar um sistema centralizado de gerenciamento de identidades, como o LDAP, em conjunto com uma solução de logon único (SSO), pode reduzir consideravelmente o número de senhas que os usuários precisam gerenciar, tornando mais fácil para eles seguirem práticas sólidas de gerenciamento de senhas.

Usando o GitHub com sistemas de gerenciamento de identidades

O GitHub Enterprise inclui suporte para autenticação e autorização usando uma variedade de soluções de gerenciamento de identidades, como o Active Directory e o LDAP. O GitHub também oferece suporte para SAML, que permite às empresas proporcionar uma experiência de logon único para os usuários

Evite ataques ao banco de dados

Os dados que entram em uma organização podem ser um vetor perigoso utilizado por agentes mal-intencionados para tentar obter acesso aos seus sistemas. Muitas dessas estratégias dependem da transferência de conteúdo perigoso para sistemas mal projetados, explorando falhas para obtenção de controle. A injeção de SQL é um exemplo clássico, que ocorre quando um agente mal-intencionado anexa código SQL intencionalmente a dados aparentemente inofensivos, como o nome de um cliente em um aplicativo Web. Falhas no software subjacente podem resultar na execução arbitrária desse código, levando à devolução involuntária de dados ao usuário. Esses ataques são particularmente perigosos porque podem não causar erros ou outros eventos capazes de atrair a atenção dos administradores de TI que supervisionam a segurança.

Mais uma vez, uma abordagem em camadas é mais eficaz para garantir que somente dados válidos entrem no seu ambiente. Isso começa com o código na interface do usuário e se estende ao longo de todo o caminho de dados, passando pelo middleware até os armazenamentos de dados subjacentes. Criar validação no código em cada etapa pode reduzir drasticamente sua vulnerabilidade a esses tipos de ataques. Uma combinação de revisões e testes manuais e automatizados frequentes é essencial para apoiar esse esforço.

Separe dados confidenciais

Quanto menos locais houver com dados confidenciais, menos oportunidades (ou menos “área de superfície”) os atacantes terão disponíveis para explorar. Reduzir a área de superfície significa implementar práticas como armazenar senhas em um gerenciador de senhas em vez de confiá-las a indivíduos e nunca faça commit de senhas, tokens de acesso/API, chaves de criptografia e outros dados confidenciais em repositórios acessíveis ao público em geral.

Dados confidenciais nunca devem ser usados ou armazenados em sistemas que não sejam de produção. É claro que as equipes podem precisar de grandes quantidades de dados que simulem de forma confiável o ambiente real para testes, o que pode levar alguns engenheiros a "atualizar" os ambientes de desenvolvimento e teste com dados de produção. Em vez de usar dados de produção, considere usar uma ferramenta que permita configurar e gerar grandes conjuntos de dados fictícios. Isso possibilita testes confiáveis e realistas sem arriscar informações confidenciais.

Impedir que dados confidenciais cheguem aos repositórios com hooks de pré-recebimento

Além de armazenar dados confidenciais separadamente, você pode evitar o envio inadvertido (ou deliberado) de dados protegidos para repositórios com hooks de pré-recebimento - scripts simples que são executados em um ambiente isolado no appliance do GitHub. Esses scripts são acionados antes que o código seja enviado ao GitHub para examinar commits, identificar informações confidenciais e impedir que elas sejam adicionadas aos seus repositórios.

Após examinar o código, os hooks de pré-recebimento retornam apenas um de dois valores possíveis: sucesso ou falha. No caso de uma falha, os desenvolvedores verão uma mensagem informando que o commit falhou, juntamento com quaisquer outras informações úteis que a sua equipe decida incluir. O código é confirmado no repositório somente se os hooks de pré-recebimento forem bem-sucedidos. O resultado? Nenhum código indesejado chega aos seus repositórios, o que protege sua empresa contra violações, ameaças de responsabilidade e possíveis penalidades regulatórias.

Aplique proteções ao código-fonte

Uma segurança eficaz exige o controle do acesso às informações confidenciais e ao código-fonte do software que as gerencia. Controles granulares significam que é possível proteger essas informações efetivamente sem criar um ambiente vinculado à segurança que negue o acesso de maneira muito abrangente. O GitHub pode oferecer suporte às suas políticas de acesso com branches protegidas. As branches protegidas ajudam a manter a integridade do seu código, limitando vários recursos do Git em qualquer branch que um administrador opte por proteger. Por exemplo, os administradores podem restringir desde quem pode postar em uma branch até usuários e equipes específicos de forma programática. Eles também podem desabilitar envios por push forçados capazes de alterar ou excluir o código em determinadas branches. Garantias adicionais incluem:

  • Impedir a exclusão de uma branch
  • Evitar que o código que não passa nos testes automatizados e nas verificações de integração contínua (CI) seja unificado
  • Exigir revisões manuais e auditáveis por uma ou mais pessoas
  • Especificar “proprietários do código” para qualquer parte de uma base de código e exigir sua revisão

Proteção de todo o processo de desenvolvimento

Sua base de código de software e os processos de desenvolvimento que modelam a maneira como sua equipe desenvolve estão no centro de uma estratégia de segurança em camadas. À medida que os desenvolvedores trabalham juntos e contribuem com alterações, é importante implementar certas garantias por meio de uma combinação de práticas recomendadas e recursos do GitHub que garantem que o código que chega à produção esteja seguro.

Incluir sistemas legados principais

Ferramentas como mainframes continuam a ser fundamentais para as operações de algumas empresas mais de 50 anos após a sua introdução inicial. Esses sistemas oferecem recursos inigualáveis, mas também podem representar desafios únicos para a segurança. As equipes de desenvolvimento devem avaliar periodicamente todos os sistemas legado e equilibrar os custos de atualizá-los com os riscos potenciais de causar uma violação de segurança. A substituição de um sistema legado pode não parecer econômica até que a ameaça de multas de bilhões de dólares ou uma violação de segurança devastadora que destrua a reputação pública da empresa seja incluída na equação.

Seleção de um sistema de mainframe

O ecossistema de parceiros do GitHub inclui muitos fornecedores que produzem, vendem e mantêm sistemas de mainframe. Por exemplo, a IBM anunciou recentemente extensões para o Git, a tecnologia que sustenta o GitHub, permitindo que práticas modernas de DevSecOps sejam aplicadas a fluxos de trabalho de desenvolvimento de mainframe. Encontre integrações para potencializar seu fluxo de trabalho do GitHub.com no GitHub Marketplace ou saiba mais sobre quais aplicativos funcionam com a nossa solução auto-hospedada, o GitHub Enterprise Server.

Automatize processos para evitar bugs e erros

A supervisão manual é um componente essencial de uma estratégia eficiente de segurança em camadas. No entanto, confiar demais nas pessoas pode ser perigoso. As pessoas se cansam, se distraem ou simplesmente cometem erros. Coloque as pessoas para trabalhar onde suas habilidades são mais importantes e delegue às máquinas as tarefas repetitivas e tediosas, mas ainda assim essenciais. Sua equipe pode aproveitar a integração e a entrega contínuas (CI/CD) totalmente automatizadas em seus fluxos de trabalho do GitHub.

As ferramentas de CI/CD testam e avaliam seu código todas as vezes que um commit é enviado para um repositório. Com a CI/CD em vigor, o GitHub pode testar o novo código com o código de produção existente para garantir que as alterações propostas funcionem conforme o esperado e não introduzam falhas de segurança nos sistemas existentes. Esses testes também podem se estender à análise de todo o código do qual seu código depende (suas dependências). Implementar a automação não é difícil e pode gerar resultados imediatos e mensuráveis. Em um estudo de 2017, o IEEE constatou que as organizações que implementaram o gerenciamento automatizado de dependências, por exemplo, tiveram 60% menos vulnerabilidades de segurança nos softwares fornecidos do que aquelas que não o fizeram.

Integrando CI/CD ao GitHub

A integração de CI/CD ao GitHub é um processo fácil que não afeta os fluxos de trabalho existentes dos desenvolvedores, a menos que um resultado de teste automatizado exija que eles tomem medidas. Quanto menos invasiva for a automação para os desenvolvedores, maior a probabilidade de ela ser amplamente adotada e de seus benefícios serem sentidos em toda a organização.

O GitHub se integra a uma variedade de ferramentas de CI, como Jenkins, Travis e CircleCI. Elas extraem automaticamente o código de um repositório do GitHub todas as vezes que esse código é enviado, executam testes e retornam os resultados ao GitHub com status de aprovação/reprovação. Também retornam notificações sobre o status de cada teste, para que os desenvolvedores possam ver onde o código está falhando. E com a API Checks, as equipes podem criar ferramentas personalizadas sofisticadas para CI que tornam o feedback contínuo e altamente informativo.

Você e sua equipe podem decidir se querem ou não que os resultados dos testes de CI evitem o merge do código na base de código ou se preferem simplesmente alertar os desenvolvedores sem tomar medidas. Se status de CI forem necessários, a pull request apenas poderá receber merge quando todos os trabalhos de CI necessários forem concluídos. Se você optar por evitar merges, a pull request não poderá receber um merge até que os testes necessários sejam retornados com êxito.

Imponha revisões manuais com a revisão de código necessária

A automação é importante, mas a revisão manual do código sempre será um componente essencial da sua estratégia de segurança. Quanto mais olhos estiverem voltados para uma determinada base de código, maior a probabilidade de serem detectados erros ou vulnerabilidades. Revisões também desempenham uma função valiosa além da segurança, ajudando a garantir que o conhecimento institucional seja compartilhado e proporcionando oportunidades de aprendizado e orientação para desenvolvedores de todos os níveis de habilidades. O resultado de revisões regulares sancionadas pela organização é uma base de código que não só é mais segura, como também mais íntegra e consistente.

O GitHub fornece uma estrutura flexível para exigir revisões de código. Você pode:

  • Exigir revisões por um ou mais usuários com acesso de gravação ao repositório que contém as alterações
  • Exigir revisão e aprovação adicionais de um ou mais proprietários do código. Os proprietários do código podem ser qualquer combinação de usuários ou equipes individuais com responsabilidades específicas por uma seção de uma base de código, uma tecnologia específica ou qualquer combinação das duas
  • Capacite os revisores a fornecer feedback detalhado, linha por linha, sobre quaisquer alterações propostas
  • Garanta que todas as revisões sejam registradas e auditáveis no futuro

Audite seu fluxo de trabalho e proteja-o com garantias de conformidade

Os padrões regulatórios sob os quais algumas empresas trabalham atualmente exigem uma funcionalidade robusta de registro em log e auditoria. As equipes não só precisam criar uma estratégia de segurança eficaz, como também provar esse feito aos reguladores. O GitHub fornece estruturas flexíveis e poderosas de registro em log, auditoria e relatórios para ajudar a garantir a conformidade e a capacidade de comprová-la.

Log de auditoria

O GitHub Enterprise mantém logs abrangentes da atividade dos usuários e do sistema. Atividades auditadas incluem todas as operações git push, incluindo quem iniciou o push, seu endereço IP e repositórios afetados pela operação. Os logs podem ser encaminhados para um sistema externo (como Logstash ou Splunk) para análise, geração de relatórios e armazenamento, garantindo a conformidade com os requisitos normativos.

Arquivamento de repositórios

Os repositórios que não são mais mantidos podem ser arquivados e configurados para o modo “somente leitura”. Isso garante que nenhum código novo possa ser enviado a eles por commit e, ao mesmo tempo, possibilita que os usuários visualizem seu conteúdo.

Bloqueando pushes forçados

O Git permite que os desenvolvedores reescrevam o histórico de commits “forçando o push” das alterações. Embora às vezes seja necessário para corrigir erros, esse recurso representa um desafio quando as regulamentações exigem que os dados sejam imutáveis. O GitHub Enterprise permite que os administradores bloqueiem pushes forçados para repositórios individuais ou para todo o dispositivo, garantindo que o histórico de commits nunca possa ser reescrito.

Prevenindo usuários de excluir repositórios

A capacidade de excluir repositórios pode ser restrita aos administradores.

Desloque a segurança totalmente para a esquerda

No passado, a segurança era muitas vezes uma reflexão tardia. Na verdade, os protocolos que executam a Internet não foram de forma alguma projetados pensando na segurança. Medidas adicionais de segurança pós-venda são melhores do que nada, mas estão longe de serem suficientes no atual ambiente frenético de ameaças. Para ser eficaz, a segurança deve ser incorporada a cada projeto de software desde o início. Deslocar a segurança para a esquerda significa deslocá-la do lado direito da sua linha do tempo, perto da entrega, até o lado esquerda, no início do processo. Isso garante que a segurança permaneça em primeiro plano durante todo o ciclo de vida do produto.

O envolvimento antecipado das equipes de segurança também pode influenciar as decisões de projeto, desenvolvimento e manutenção antes que elas se tornem muito difíceis e caras para serem alteradas. Esse conselho é bastante simples, mas o processo significará muito pouco se as equipes de liderança e engenharia não estiverem envolvidas. O desenvolvimento seguro exige que todos adotem uma cultura de segurança efetiva.

Criar uma cultura de segurança

O DevSecOps é uma forma de pensar em segurança durante todo o ciclo de desenvolvimento e de distribuí-la entre equipes e funções. Não faz mais sentido que as equipes de segurança participem do processo após a criação de um aplicativo apenas para descobrirem falhas exploráveis. Com especialistas em segurança estreitamente alinhados desde o início, as equipes podem criar processos colaborativos que oferecem suporte proativo para a segurança à medida que são desenvolvidos.

Os princípios de DevSecOps podem exigir que as organizações mudem sua cultura de equipe além de sua infraestrutura. Porém, softwares mais confiáveis e menos surpresas são resultados que valem a pena. Algumas empresas até mesmo convidam especialistas em segurança para equipes de SCRUM para garantir que isso seja uma prioridade durante todo o processo.

História do cliente: Anaplan

A Anaplan ajuda as empresas a tomar decisões inteligentes e orientadas por dados com um software de modelagem avançado. Com foco em velocidade, flexibilidade e integridade, a Anaplan apoia o planejamento em mais de 500 empresas, ajudando-as a se manterem ágeis, descobrirem oportunidades e planejarem o futuro.

Por detrás de sua plataforma inteligente, há uma grande quantidade de dados. Os mais de 150 desenvolvedores da Anaplan precisam criar uma plataforma que seja flexível o suficiente para tornar os dados significativos para empresas de todos os setores e, ao mesmo tempo, garantir que esses dados sejam suficientemente protegidos para mantê-los privados. Os clientes da Anaplan confiam nela para armazenar planos financeiros confidenciais em seus próprios data centers. Como resultado, a empresa tem requisitos rigorosos de conformidade e segurança para garantir a proteção e a privacidade de dados financeiros regulamentados.

Para ajudar suas equipes a criar uma plataforma flexível e inovadora, a Anaplan usa o GitHub Enterprise Server.

A conformidade é muito importante, e criamos muitas ferramentas para garantir nossa blindagem contra falhas. Todos os commits são marcados com IDs do JIRA que unem tudo, incluindo todas as nossas ferramentas para desenvolvedores. O GitHub teve um grande impacto na conformidade, ao mesmo tempo em que nos ajudou a gerar mais transparência.

Jon Sandles, gerente de release, Anaplan

No centro dos pipelines de compilação e implantação da Anaplan está um conjunto de ferramentas automatizadas que otimizam a API do GitHub Enterprise para consultar e sondar regularmente e também para produzir relatórios e alertas em todos os repositórios. Isso mantém a equipe de produtos em sintonia com o que está acontecendo, enviando emails aos desenvolvedores, criando relatórios no Confluence e atualizando os canais do JIRA e do Slack.

Os gerentes de produtos são informados quando o código é verificado nos repositórios errados em relação a projetos incorretos do JIRA. Os engenheiros são informados quando pull requests permanecerem abertas por muito tempo. O código é escaneado continuamente por ferramentas como Sonar e Checkmarx; dispositivos de implantação, como os scripts da Chef, recebem o mesmo tratamento. Tudo o que vai para a produção segue os mesmos pipelines.

A qualquer momento, especialmente perto do momento de implantação em produção, a equipe de gerenciamento de lançamentos e programas está totalmente atualizada sobre a conformidade e a prontidão da base de código.

Resumo

Manter os dados seguros nunca foi tão importante para o sucesso e até mesmo para a sobrevivência da sua empresa. Implementar uma segurança eficaz pode parecer complicado, mas não precisa ser assim. Uma das vantagens de uma defesa em camadas é a fragmentação da tarefa de implementar a segurança em vários subprojetos menos assustadores. A coisa mais importante a fazer é começar ou, se você já começou, continuar testando, examinando, questionando e melhorando. Os invasores nunca descansam, e você também não deveria.

Parte do desafio de implementar uma segurança eficaz está em equilibrá-la com a liberdade de que os desenvolvedores de software precisam para inovar, prosperar e serem produtivos. Uma segurança insuficiente é simplesmente ineficaz. O excesso, por outro lado, pode sufocar a criatividade ou incentivar as pessoas a evitarem completamente seus esforços de segurança. Ferramentas como o GitHub fornecem os controles necessários para ajudar você a encontrar esse equilíbrio para a sua organização.

Em última análise, nosso objetivo é ajudar você a deixar de encarar a segurança sob o ponto de vista de ameaças e passar a percebê-la como uma oportunidade de aumentar a satisfação dos clientes, atrair novos clientes e diferenciar ainda mais a sua empresa. A recompensa de uma boa segurança é confiança do cliente, e parceiros como o GitHub podem ajudar você a traçar uma estratégia de segurança eficaz.



Estamos aqui para ajudar! O GitHub oferece suporte para a criação de código robusto e seguro. Pronto para explorar como o GitHub se encaixa no seu processo de desenvolvimento seguro? Entre em contato!

Tags

Quer saber como o GitHub pode ajudar sua empresa?

Fale mais sobre suas necessidades

octocaptcha spinner