Comment écrire du code Python sûr. Repas Kushal Das

Voici la version originale anglaise de cette interview.

Cette année, l'entreprise de conférenciers Moscow Python Conf ++ a ramassé ce qui était nécessaire (c'est-à-dire comment, ramassé - le comité de programme a ramassé ). Mais qui s'intéresse à l'étude des réalisations, il est beaucoup plus intéressant de savoir ce que le conférencier pense des questions qui nous concernent. Pour le savoir, obtenez des informations privilégiées ou les conseils d'un développeur plus expérimenté, et vous devez communiquer lors de conférences. Mais j'ai profité de la situation et pris une courte interview de notre conférencier Kushal Das.

Une caractéristique distinctive des discours de Kushal est qu'il publie régulièrement des méthodes «secrètes» pour casser le code Python et, en revanche, montre comment écrire du code pour que la NSA ne puisse pas le casser. Lors de notre conférence, j'ai mangévous dira comment développer et déployer du code Python en toute sécurité, alors je lui ai posé des questions sur la sécurité.



- J'ai mangé, parlez-nous un peu de vous et de votre travail avec Python et autres.

Kushal Das: J'habite en Inde, maintenant je travaille en tant que technologue d'intérêt public à l'organisation à but non lucratif américaine Freedom of the Press Foundation, où j'aide à soutenir le projet SecureDrop. SecureDrop est une plateforme d'information open source. Le langage principal ici est Python.

De plus, je suis impliqué dans d'autres projets open source, y compris le langage Python lui-même. Je suis l'un des développeurs de CPython Core et membre du conseil d'administration de la Python Software Foundation.

Je travaille avec Python depuis 2005, et presque toute ma carrière a été liée à ce langage, ainsi qu'à Linux. Ce sont deux domaines principaux de mes intérêts. Je suis également membre de l'équipe de base du projet Tor. Comme beaucoup le savent déjà, Tor aide à garder votre vie privée en ligne.

- Tor est un projet formidable, il est utilisé par les développeurs du monde entier pour bloquer l'accès à l'API et à la documentation, par exemple, en raison des lois locales. Votre présentation sera construite autour de la sécurité, j'ai donc quelques questions.

Tout d'abord, il y a une opinion que pour un développeur ordinaire sans formation spéciale, la sécurité en soi est trop compliquée. On pense que nous, en tant qu'industrie, devons fournir des outils et un écosystème afin que les logiciels que nous créons soient sûrs par défaut.

Selon vous, qu'est-ce qui est encore mieux: éduquer les agents de sécurité ou leur fournir des outils?

J'ai mangé Das: Je pense que les deux. En effet, la sécurité est un problème complexe. Cependant, si un programmeur novice suit une formation de base ou travaille en équipe, il apprend à éviter les problèmes les plus courants.

Le plus souvent, de vraies erreurs de sécurité, telles que le piratage, la fuite de données ou le vol, surviennent en raison d'une configuration incorrecte, d'un manque de mises à jour ou d'un code incorrect, parfois hooligan.

Je pense que la plupart des erreurs de base peuvent être évitées si nous formons à la fois les débutants et les «anciens» de l'industrie. De plus, certaines choses inaccessibles à l'œil humain peuvent être révélées à l'aide de nouveaux outils, d'une nouvelle automatisation, de nouveaux processus.

Un exemple très simple est les vérifications de dépendance que GitHub a maintenant. Si une application Python contient des erreurs ou utilise une ancienne version d'un module indépendant, et qu'il existe une certaine vulnérabilité décrite dans CVE, GitHub peut vous dire en tant que développeur: «Hé! Une mise à jour est requise ici! ” - et le bot essaiera automatiquement de faire PR pour mettre à jour le module.

Ainsi, la formation et les outils sont mieux combinés, mais personnellement, je préférerais toujours autant de formation que possible. Ce sont des personnes qui saisissent des données et commettent des erreurs. La technologie ne peut pas corriger toutes ces erreurs.

- Oui, malheureusement, ça l'est. Le développement de logiciels modernes repose fortement sur des référentiels ouverts tels que l'index de package Python, node.js, npm, etc. Au niveau de développement actuel, cela se produit généralement lors de l' installation de pip ou de l' ajout de poésie.

À votre avis, quels sont les risques de sécurité pour un développeur backend Python régulier dans une entreprise de taille moyenne s'il utilise uniquement ces outils? Ces risques sont-ils acceptables ou les développeurs devraient-ils même envisager des vulnérabilités insignifiantes?

Kushal Das: C'est une question vraiment importante, car dans tous les référentiels que nous prenons en charge, où vous pouvez télécharger des modules pour différentes langues, nous essayons de rendre ce processus simple et accessible pour les développeurs.

Pour Python, par exemple, il existe une liste de diffusion de sécurité Python qui vous avertit des problèmes liés aux derniers modules chargés pour Python. Il y a des cas de ce que l'on appelle la typosquattage, lorsque le nom du package est similaire à un package très connu, et que les développeurs utilisent le mauvais par inadvertance. Du côté Python, PyPI s'occupe de ces choses.

De plus, lorsque vous installez un package à l'aide de pip, vous pouvez vraiment le vérifier et vous assurer que c'est ce dont vous avez besoin, ainsi que vérifier la sécurité du téléchargement. Par exemple, il y a PEP 458, qui vous conseille de protéger les téléchargements avec la signature de paquets PyPI.

Les travaux d'élaboration des instruments de sécurité sont toujours en cours. Je recommanderais aux développeurs qui commencent à travailler avec tout nouveau module non signé de découvrir qui est l'auteur, combien de personnes sont impliquées dans le développement, où elles sont hébergées, quels grands projets sont utilisés, ce qui est dans le code source, y a-t-il des plaintes concernant des problèmes ou des erreurs, etc.

Cela ne prend que 15 à 30 minutes de recherche, mais ils offrent de nombreux avantages. Si personne au monde, à l'exception de l'auteur, n'utilise ce package, vous ne devriez peut-être pas l'utiliser. Si ce module particulier est utilisé dans d'autres packages ou logiciels, il sera probablement plus sûr pour votre code.

— , , - , , , .

, , node.js npm, npm install something.

NPM vérifie la sécurité des données et affiche les résultats. Par exemple, il affiche le message: «Parmi les packages que vous venez d'installer, il y en a deux avec un risque de sécurité élevé et dix avec un risque moyen. Vous pouvez exécuter les commandes suivantes pour les corriger ou les mettre à jour, ou refuser d'installer. " Ceci est similaire aux outils intégrés. Que pensez-vous de telles solutions et pouvez-vous vous attendre à quelque chose de similaire pour PyPI?

Eaten Das: Je n'ai jamais utilisé de NPM, sauf peut-être une ou deux fois dans ma vie quand je devais tester quelque chose. Par conséquent, je ne peux pas commenter directement à quel point c'est bon, mais il semble s'agir de donner au développeur une interface utilisateur plus intuitive.

En général, tout cela fait partie de l'histoire de l'interaction avec l'utilisateur, lorsque la tâche des développeurs et des concepteurs est d'identifier la meilleure façon de présenter les données, étant donné qu'elles sont réellement vues par le développeur final, le tiers qui installera tous ces outils et modules. Parce que quand il y a trop d'informations, nous cliquons ou sautons généralement sans lire. La vérité est quelque part entre les deux.

Quant aux futurs plans de développement de Python et pip, je ne peux pas les commenter, ils me sont inconnus. Cependant, je pense, ou plutôt, j'espère que quelqu'un a déjà soumis une demande pour une fonction similaire afin que les auteurs pip puissent en tenir compte dans leurs plans. Maintenant, l'équipe de support est un peu plus grande qu'auparavant - environ sept personnes ayant le droit d'accepter des commits.

- Merci, j'espère qu'avec le temps, les gens penseront davantage à la sécurité et construiront plus de contrôles dans notre écosystème. Parlons un peu de votre prochaine performance au Moscow Python Conf ++. Il est construit autour de la sécurité des dépendances et de l'empaquetage intégrés.

Nous ne gâcherons pas ici, mais du point de vue d'un expert en sécurité, de votre point de vue, de quoi d'autre les développeurs devraient-ils tenir compte lorsqu'ils vérifient la sécurité des applications?

Nous avons déjà expliqué comment sécuriser la gestion des dépendances et les packages. Quoi d'autre doit être vérifié par le développeur ordinaire? Que dois-je rechercher?

J'ai mangé Das: je pense que l'un des points principaux devrait être les mises à jour. Assurez-vous qu'au moins vous avez l'ordre avec cela, et tout ce dont vous dépendez est mis à jour, y compris le système d'exploitation, que ce soit Linux, Mac, Windows ou même iOS. Sinon, assurez-vous de modéliser au moins les processus pour comprendre ce qui pourrait mal se passer.

Le problème pour les débutants (et cela m'est arrivé) dans la plupart des cas, c'est que nous faisons aveuglément confiance aux entrées des utilisateurs. Vous devez moins compter sur le fait que l'entrée est en effet correcte et que cela ne causera pas d'autres problèmes. Tout doit être revérifié.

De plus, si vous avez ouvert quelque chose, assurez-vous de ne pas oublier de le fermer.. Imaginez une porte ordinaire: lorsque nous entrons dans le bureau, nous vérifions si nous avons oublié de fermer la porte derrière nous. Toujours dans la programmation, lorsque nous ouvrons des fichiers, des sockets ou autre chose, ou que nous accédons à quelque chose, vous devez vous assurer après l'achèvement que tout est propre et fermé.

Du point de vue de la programmation, je pense que ce sont deux points principaux que beaucoup de gens oublient.

- Oui, il y a beaucoup de choses que les gens oublient, et maintenant, je pense, la dernière question. D'après votre expérience personnelle, quel type d'erreurs de sécurité les développeurs de back-end de niveau intermédiaire Python font-ils le plus souvent? Entrée utilisateur? Addictions? Emballage d'application sécurisé? Quoi de plus commun?

Eaten Das: Les problèmes que j'ai vus étaient principalement dus à une entrée incorrecte.

En 2011, je développais un outil pour le projet Fedora et j'ai oublié de nettoyer mes fichiers temporaires. Dans ce cas particulier, il s'agissait de décharges et leur absence dans le nouvel environnement a causé des problèmes imprévus pour l'infrastructure - elle est tombée à cause de mon, pour le moins, un mauvais code.

Il s'agit d'une continuation du même sujet, lorsque vous devez vous assurer que le code est «nettoyé» si vous créez ou ouvrez quelque chose. C'était donc une leçon sérieuse pour moi. Quand vous pensez: «Oui, je l'ai fait! Tout fonctionne sur mon ordinateur portable! ", Ce n'est pas un fait que cela fonctionnera dans une version ou une production réelle.

Pour une raison quelconque, nous pensons souvent que l'environnement sera identique à notre environnement local, mais cela n'arrive jamais. Même les grandes entreprises sont souvent difficiles à déterminer l'environnement réel du côté client. Il est important de garder cela à l’esprit.

Et plus loin -faire plus de commentaires sur votre code , écrire de la documentation. Cette astuce s'adresse non seulement aux débutants, mais également aux développeurs expérimentés. Si vous n'avez pas examiné le code depuis plusieurs mois ou plusieurs années, il peut être très difficile de comprendre pourquoi vous avez écrit quelque chose.

Kushal Das se produira au Moscow Python Conf ++ . Nous avons été obligés de reporter une grande conférence hors ligne pour l'automne, mais le 27 mars, nous avons organisé une mini-conférence en ligne, dont nous partagerons bientôt les documents, restez en contact.

All Articles