Como escrever um código Python seguro. Refeições Kushal Das

Aqui está a versão original em inglês desta entrevista.

Este ano, a empresa de palestrantes Moscow Python Conf ++ pegou o que era necessário (ou seja, como foi atendido - o Comitê de Programas atendeu ). Mas quem está interessado em estudar realizações, é muito mais interessante o que o orador pensa sobre questões que nos interessam. Para descobrir, obtenha informações privilegiadas ou conselhos de um desenvolvedor mais experiente, e você precisa se comunicar em conferências. Mas aproveitei a situação e fiz uma breve entrevista com nosso palestrante Kushal Das.

Uma característica distintiva dos discursos de Kushal é que ele publica regularmente maneiras "secretas" para quebrar o código Python e, por outro lado, mostra como escrever código para que a NSA não possa decifrá-lo. Na nossa conferência eu comilhe dirá como desenvolver e implantar com segurança o código Python, então perguntei a ele sobre segurança.



- Comi, por favor, conte-nos um pouco sobre você e sobre o seu trabalho com o Python e afins.

Kushal Das: Moro na Índia, agora trabalho como tecnólogo de interesse público na organização americana sem fins lucrativos Freedom of the Press Foundation, onde ajudo a apoiar o projeto SecureDrop. SecureDrop é uma plataforma de informações de código aberto. A linguagem principal aqui é Python.

Além disso, estou envolvido em outros projetos de código aberto, incluindo a própria linguagem Python. Sou um dos desenvolvedores do CPython Core e membro do Conselho de Administração da Python Software Foundation.

Trabalho com Python desde 2005 e quase toda a minha carreira está conectada a essa linguagem e ao Linux. Essas são duas áreas principais de meus interesses. Também sou membro da equipe principal do projeto Tor. Como muitos já sabem, o Tor ajuda a manter sua privacidade online.

- Tor é um projeto fantástico, é usado por desenvolvedores em todo o mundo para obter acesso à API e documentação bloqueadas, por exemplo, devido às leis locais. Sua apresentação será construída em torno da segurança, por isso tenho algumas perguntas.

Antes de tudo, há uma opinião de que, para um desenvolvedor comum sem treinamento especial, a segurança em si é muito complicada. Acredita-se que nós, como um setor, devamos fornecer ferramentas e um ecossistema para que o software que criamos seja seguro por padrão.

O que você acha ainda melhor: educar as pessoas de segurança ou fornecer algumas ferramentas?

Comi Das: acho que os dois. De fato, a segurança é uma questão complexa. No entanto, se um programador iniciante passa por um treinamento básico ou trabalha em equipe, ele aprende a evitar os problemas mais comuns.

Na maioria das vezes, erros reais de segurança, como hackers, vazamento de dados ou roubo de dados, ocorrem devido a configuração incorreta, falta de atualizações ou código incorreto, às vezes hooligan.

Penso que a maioria dos erros básicos pode ser evitada se treinarmos os novatos e os "veteranos" da indústria. Além disso, algumas coisas inacessíveis ao olho humano podem ser reveladas com a ajuda de novas ferramentas, nova automação, novos processos.

Um exemplo muito simples é a verificação de dependência que o GitHub agora possui. Se um aplicativo Python contiver erros ou usar alguma versão antiga de um módulo independente, e houver uma certa vulnerabilidade descrita no CVE, o GitHub poderá dizer como desenvolvedor: “Ei! Uma atualização é necessária aqui! ” - e o bot tentará automaticamente fazer PR para atualizar o módulo.

Assim, o treinamento e as ferramentas são melhor combinados, mas, pessoalmente, eu ainda preferiria o máximo de treinamento possível. São pessoas que inserem dados e cometem erros. A tecnologia não pode corrigir todos esses erros.

- Sim, infelizmente é. O desenvolvimento de software moderno depende muito de repositórios abertos, como o Python Package Index, node.js, npm, etc. No nível atual de desenvolvimento, isso geralmente acontece quando a instalação do pip ou a adição de poesia.

Na sua opinião, qual é o risco de segurança de um desenvolvedor de back-end Python comum em uma empresa de médio porte, se ele usar apenas essas ferramentas? Esses riscos são aceitáveis ​​ou os desenvolvedores devem considerar vulnerabilidades triviais?

Kushal Das: Essa é uma pergunta realmente importante, porque em todos os repositórios que suportamos, onde você pode baixar módulos para diferentes idiomas, tentamos tornar esse processo simples e acessível para desenvolvedores.

Para o Python, por exemplo, existe uma lista de correio de segurança do Python que alerta sobre problemas com os módulos carregados mais recentes do Python. Existem casos do chamado typosquatting, quando o nome do pacote é semelhante a um pacote muito conhecido e os desenvolvedores usam o incorretamente inadvertidamente. No lado do Python, o PyPI cuida dessas coisas.

Além disso, ao instalar qualquer pacote usando o pip, você pode realmente verificá-lo e garantir que é disso que precisa, além de verificar a segurança do download. Por exemplo, existe o PEP 458, que aconselha a proteger downloads com a assinatura de pacotes PyPI.

O trabalho de desenvolvimento de instrumentos de segurança ainda está em andamento. Eu recomendaria que os desenvolvedores que começaram a trabalhar com qualquer novo módulo não assinado descubram quem é o autor, quantas pessoas estão envolvidas no desenvolvimento, onde estão hospedadas, quais grandes projetos são usados, o que está no código-fonte, há alguma reclamação sobre problemas ou erros, etc.

São apenas 15 a 30 minutos de pesquisa, mas eles oferecem muitas vantagens. Se nenhuma pessoa no mundo, exceto o autor, usa este pacote, talvez você não deva usá-lo. Se este módulo em particular for usado em outros pacotes ou software, provavelmente será mais seguro para o seu código.

— , , - , , , .

, , node.js npm, npm install something.

O NPM verifica a segurança dos dados e mostra os resultados. Por exemplo, ele exibe a mensagem: “Entre os pacotes que você acabou de instalar, há dois com alto risco de segurança e dez com risco médio. Você pode executar os seguintes comandos para corrigi-los ou atualizá-los ou recusar a instalação. " Isso é semelhante às ferramentas internas. O que você acha dessas soluções e pode esperar algo semelhante para o PyPI?

Comido Das: Eu nunca usei o NPM, exceto talvez uma ou duas vezes na minha vida quando eu precisava testar alguma coisa. Portanto, não posso comentar diretamente o quanto isso é bom, mas parece ser sobre oferecer ao desenvolvedor uma interface de usuário mais intuitiva.

Em geral, tudo isso faz parte da história sobre a interação do usuário, quando a tarefa dos desenvolvedores e designers é identificar a melhor forma de apresentar os dados, levando em consideração o fato de que eles são realmente visualizados pelo desenvolvedor final, um terceiro que instalará todas essas ferramentas e módulos. Porque quando há muita informação, geralmente clicamos ou pulamos sem ler. A verdade está em algum lugar.

Quanto aos planos futuros de desenvolvimento de Python e pip, não posso comentar sobre eles; eles são desconhecidos para mim. No entanto, acho que, ou melhor, espero que alguém já tenha enviado uma solicitação para uma função semelhante, para que os autores do pip possam considerá-la em seus planos. Agora, a equipe de suporte é um pouco maior do que era antes - cerca de sete pessoas com o direito de aceitar confirmações.

- Obrigado, espero que, com o tempo, as pessoas pensem mais em segurança e façam mais verificações em nosso ecossistema. Vamos falar um pouco sobre sua próxima apresentação no Moscow Python Conf ++. Ele é construído em torno da segurança e do empacotamento internos da dependência.

Não vamos estragar aqui, mas do ponto de vista de um especialista em segurança, do seu ponto de vista, o que mais os desenvolvedores devem levar em consideração ao verificar a segurança do aplicativo?

Já discutimos como proteger o gerenciamento de dependências e pacotes. O que mais precisa ser verificado pelo desenvolvedor comum? O que devo procurar?

Comi Das: acho que um dos pontos principais deve ser atualizações. Certifique-se de que pelo menos você tenha um pedido com isso, e tudo o que você depende esteja atualizado, incluindo o sistema operacional, seja Linux, Mac, Windows ou até iOS. Como alternativa, certifique-se de pelo menos modelar os processos para entender o que mais pode dar errado.

O problema para iniciantes (e isso aconteceu comigo) na maioria dos casos é que confiamos cegamente na entrada do usuário. Você precisa confiar menos no fato de que a entrada está realmente correta e que isso não causará outros problemas. Tudo precisa ser verificado duas vezes.

Além disso, se você abriu algo, não se esqueça de fechá-lo.. Imagine uma porta comum: quando entramos no escritório, verificamos se esquecemos de fechar a porta atrás de nós. Também na programação, quando abrimos arquivos, soquetes ou qualquer outra coisa, ou acesso a alguma coisa, você precisa garantir, após a conclusão, que tudo esteja limpo e fechado.

Do ponto de vista da programação, acho que esses são dois pontos principais que muitas pessoas esquecem.

- Sim, há muitas coisas que as pessoas esquecem e agora, acho, a última pergunta. Com base na sua experiência pessoal, que tipo de erros de segurança os desenvolvedores de back-end de nível intermediário do Python costumam fazer? Entrada do usuário? Vícios? Embalagem segura de aplicativos? O que é mais comum?

Comido Das: Os problemas que eu vi foram principalmente devido à entrada incorreta.

Em 2011, eu estava desenvolvendo uma ferramenta para o projeto Fedora e esqueci de limpar meus arquivos temporários. Nesse caso em particular, esses eram despejos, e sua ausência no novo ambiente causou problemas imprevistos para a infraestrutura - ele caiu devido ao meu, para dizer o mínimo, código ruim.

Esta é uma continuação do mesmo tópico, quando você precisa garantir que o código seja "limpo" se você criar ou abrir algo. Então foi uma lição séria para mim. Quando você pensa: “Sim, eu consegui! Tudo funciona no meu laptop! ”, Não é fato que funcione em uma versão ou produção real.

Por alguma razão, geralmente pensamos que o ambiente será idêntico ao local, mas isso nunca acontece. Mesmo grandes empresas costumam ser difíceis de determinar o ambiente real do lado do cliente. É importante ter isso em mente.

E mais -faça mais comentários sobre o seu código , escreva a documentação. Essa dica não é apenas para iniciantes, mas também para desenvolvedores experientes. Se você não analisa o código há vários meses ou anos, pode ser muito difícil entender por que você escreveu algo.

Kushal Das se apresentará no Moscow Python Conf ++ . Fomos obrigados a adiar uma grande conferência offline para o outono, mas em 27 de março realizamos uma mini conferência online, cujos materiais compartilharemos em breve, permanecerão em contato.

All Articles