Je suis aussi développeur et voici mon avis:
Le problème est pire que vous ne le pensez
Il n'y a pas de cuillère
Le développement n'est pas une question Logiciel. Le développement consiste à fabriquer ou à améliorer des produits, des services et des processus. Le logiciel est un équipement important, mais ce n'est pas le seul. Les bons développeurs définiront les processus au sens large pour savoir quels composants logiciels créer ainsi que quel processus humain, logistique et de gestion des risques proposer. Cela n'a aucun sens de développer un système logiciel qui dépend de processus humains, logistiques et papier qui ne sont pas implémentés.
Il n'y a pas de règles pour le développement car le développement définit les règles. C'est ce qui fait du développement le pire environnement à sécuriser.
Mais cela ne veut pas dire que certains contrôles ne doivent pas être établis. Au contraire, de nombreux contrôles doivent être mis en place par l'équipe de développement elle-même.
Processus d'ingénierie
Il existe des entreprises qui préconisent la séparation entre les activités et la technologie dans un processus descendant. C'est en fait très populaire car cela suggère que les gens d'affaires sans connaissances techniques devraient être au top. Les paresseux adorent ça . Mais en ingénierie, une conception descendante ne fonctionne tout simplement pas. Feyman (1985) a fait un bel article à ce sujet dans la commission présidentielle qui a analysé l'explosion du Challenger. Fondamentalement, l'ingénierie des processus descendants finit par briser l'entreprise. Et mon expérience du marché renforce cette compréhension.
L'explosion du Challenger en est un excellent exemple. Les responsables de la Nasa témoignent devant une caméra lors d'une commission d'enquête qu'ils ont développé un caoutchouc qui peut rester flexible sous 60 degrés sous le point de congélation. Une chose qui a été contredite par une simple expérience physique au lycée faite par l'un des commissaires (mettre le composant en caoutchouc dans de l'eau glacée pressée par une pince). C'était un excellent exemple parce que ce composant en caoutchouc devait être flexible pour que le booster n'explose pas; comme il fallait des températures estivales pour ce faire, le booster ne fonctionnait qu'en été. Une caractéristique d'un seul composant définit une caractéristique visible de l'ensemble du produit qui est très limitative.
L'ingénierie doit se faire de bas en haut car vous devez connaître les limites et les faiblesses de chaque composant pour élaborer des processus pour les atténuer . Le plus souvent, les processus d'atténuation ne sont pas des logiciels et auront une incidence sur le coût du produit. Cela signifie que les caractéristiques et les limites des composants individuels définiront les caractéristiques des produits, services et processus.
Les processus descendants sont fondamentalement interrompus. De nombreuses entreprises qui adoptent cette philosophie sur papier ont encore un certain succès sur le marché. Mais lorsque vous vous penchez sur leurs projets importants et les plus réussis, vous apprenez qu'ils ont été menés en dehors des règles normales de l'entreprise. Les plus grands succès sont atteints lorsqu'une personne possédant des connaissances approfondies en ingénierie et une vision du marché est habilitée de manière informelle. Puisque cela se produit de manière informelle, la direction pense que le processus descendant fonctionne. Ils signalent que toutes les autres équipes sont incompétentes. Fermer les yeux sur le fait que le plan initial du projet lorsqu'il a quitté la "phase supérieure" a été complètement ignoré et ne décrit pas les produits, services et processus créés.
Votre responsable peut définir que vous concevrez un appareil de téléportation d'ici la fin du mois, car il a conclu que cela permettrait un profit élevé dans le secteur du voyage ... mais cela ne le fera pas. Les projets descendants sont comme ça, définissent des attentes qui ne sont pas technologiquement solides.
Ne vous méprenez pas, il est bon de voir le problème sous plusieurs angles. De bas en haut, de haut en bas, SWOT et plus sont sains pour l'analyse, mais le véritable effort d'ingénierie est ascendant. Il n'y a pas de véritable objectif sans viabilité technique.
Sécurité du développement
Nous devons nous rappeler que les développeurs de logiciels changeront régulièrement le logiciel de l'entreprise et, de cette façon, ils peuvent: changer ce qui apparaît sur l'écran de n'importe qui, envoyer des e-mails automatisés à n'importe qui, y compris lui-même, ou ouvrir des portes dérobées pour faire ce qu'il veut. Cela signifie qu'un criminel embauché en tant que développeur peut causer des dommages importants à l'entreprise.
Pire que cela, il existe de nombreuses entreprises qui n'appliquent pas la provenance d'un référentiel de code source, puis le développeur embauché peut fournir un binaire différent de la source donnée. Cela permet aux développeurs criminels de détourner les systèmes de l'entreprise, s'ils ne sont pas embauchés, les choses cesseront bientôt de fonctionner.
Pour moi, la sécurité du développement devrait se concentrer sur:
- Contrôle de version du code source : pour s'assurer que le code source et les composants tiers nécessaires sont stockés dans un emplacement sécurisé.
- Division stratégique du travail : junior et temporaire les développeurs doivent avoir un accès limité au code source et aux données. Ils n'ont besoin que d'accéder aux composants qu'ils modifient pour éviter qu'un développeur junior ne puisse comprendre le fonctionnement interne de tous les systèmes et pouvoir l'exploiter.
- Faites confiance aux développeurs principaux : les développeurs principaux / principaux devront tout savoir, avoir accès à tout, planifier et distribuer les tâches et diagnostiquer les problèmes graves. Ce noyau doit avoir accès à l'ensemble, tant dans le développement que dans la production. Ils sont vos partenaires dans l'élaboration des politiques de sécurité. Nous devons accepter que les développeurs principaux soient en quelque sorte propriétaires de l'entreprise. Mon ancien patron disait: "Nous avons de la chance que Lucas soit de notre côté, de l'autre il nous détruirait". Les développeurs principaux peuvent faire beaucoup de dégâts s'ils le souhaitent et il n'y a pas de pare-feu et de contrôle de la production qui peuvent empêcher cela.
- Séparez l'environnement par des pare-feu : séparez votre réseau de développement de votre réseau de test, depuis votre réseau de production. Sur une entreprise, j'ai défini le réseau 10.1. comme développement, 10.2. comme test et 10.3. comme production. Les réseaux 10.2 et 10.3 ne reçoivent le code que via le CVS de l'entreprise et les construisent automatiquement sur la commande admin. Même si c'était une petite startup et que j'étais dans la production et dans les équipes de développement, j'ai fait quelques bureaucraties pour éviter mes propres erreurs (les développeurs peuvent être vos meilleurs alliés). J'ai également changé les couleurs du terminal par réseau: lors de la connexion à un serveur de production, l'arrière-plan du terminal était rouge, les tests étaient jaunes et le développement vert. Étant donné que tous mes serveurs utilisaient la même configuration, il était facile de les confondre si l'invite était ouverte. D'après mon expérience, la plupart des problèmes proviennent de logiciels mal testés et de nouvelles installations de logiciels. Pour être clair: où vous êtes est une fonction de sécurité puissante à mon avis. Cela n'a rien à voir avec l'accès, mais c'est la sécurité.
- Embaucher un développeur de tests qualifié : l'aspect clé des tests est de disposer de grandes quantités de bonnes données simulées qui soient pertinentes pour les problèmes auxquels l'entreprise est confrontée. Les simulations Monte-Carlo sont bonnes pour générer de grands ensembles de données qui ont un sens pour d'autres développeurs et peuvent conduire à des logiciels et des processus plus solides et résilients. Pour moi, il n'y a pas d'échecs de "production", le développeur est toujours à blâmer. Les tâches de maintenance et les imprévus doivent être écrits. Le logiciel doit être résilient.
- Vérification du code source : demandez aux gens de réviser le code source avant d'accepter la modification. Tous les projets doivent être branchés sur le contrôle de code source et la fusion doit être revue. L'examen du code source ne devrait se préoccuper que de la détection des logiciels malveillants, de l'escalade d'accès, des profils d'accès et d'une bonne explication de ce que le code source signifie et doit faire. La qualité du code sera assurée par les tests et non par la revue du code source. Vous pouvez voir cela en action dans la plupart des projets open source.
- Les tests de politiques de test sont bien plus une culture d'entreprise qu'un cadre. Certaines entreprises adoptent des cadres de marché, font des tests, mais la qualité de leur code est mauvaise. Cela se produit parce que vous avez besoin de personnes capables de concevoir des tests significatifs. En fait, le développement doit être piloté par les tests. Je ne connais pas d'autre moyen sûr de développement. Et ce qui est curieux, c'est que les humains, les achats et le conseil doivent tous être testés également. Les vendeurs affirment souvent que leurs produits fonctionnent parfaitement, mais je n'ai pas encore trouvé de produit irréprochable.
- Les politiques n'ont aucun sens si elles ne sont pas surveillées . Une entreprise que je connais a une bureaucratie selon laquelle chaque table de base de données devrait avoir une description au niveau des attributs. 95% des attributs sont décrits comme "le $ {nom d'attribut} de $ {nom de table}". Il n'explique pas ce qu'est réellement l'attribut, quelles valeurs peuvent contenir, etc.
- Rémunération et environnement de travail appropriés . Pour avoir de bons développeurs, à la fois en compétences et en personnalité, il faut avoir de bonnes politiques de rémunération. L'argent est important, bien sûr, mais ne suffit pas. Vous devez également avoir une perspective / stabilité, une vraie reconnaissance et un bon environnement de travail. Par exemple, à la place d'un bureau de développement à New York où les gens vivent dans de petits appartements, vous pouvez choisir une ville plus petite où la même compensation permet une maison plus grande et plus proche du travail. Des ordinateurs plus gros, de bons laboratoires sont également un plus pour les passionnés de technologie.
- Sécurité des données de nombreuses activités nécessitent des données de production sensibles et doivent être consultées dans un laboratoire spécial. À moins que vos informations ne soient publiques ou non sensibles, la meilleure politique est peut-être de placer les laboratoires dans de bons quartiers avec un accès physique contrôlé. Autorisez uniquement certaines données simulées à être placées sur les ordinateurs portables personnels et les composants qui ne sont pas sensibles. C'est possible. Par exemple, j'ai développé une archive de données de 4,5 milliards d'enregistrements pour une entreprise. Je l'ai fait chez moi et n'ai utilisé absolument aucune donnée d'entreprise à cette fin. Lorsque j'ai soumis le code, cela a fonctionné comme prévu lors de la première tentative. Outre les pannes matérielles et la migration des environnements de production, nous avons 100% de disponibilité en 10 ans. Le risque que le développeur emporte le code source avec lui n'est pas pertinent. Ce système particulier m'a pris 3 mois à développer, une grande partie de ce temps a été de comprendre les limites de performance des composants. C'est maintenant la connaissance dans ma tête. Même sans le code source, je peux re-développer cette solution dans environ une semaine maintenant.
- Les journaux solides sont importants pour connaître tous ceux qui ont fait quelque chose. Le mieux ici est que les journaux soient générés par un framework, en enregistrant pour des écrans détaillés de courte durée, pour des temps d'accès et d'activités plus longs et encore plus pour les journaux d'entreprise. Mes systèmes critiques enregistrent chaque fois qu'un écran est accédé (y compris la conception de l'écran). Certaines des ressources critiques doivent être journalisées par un déclencheur sur la base de données elle-même et les tables ou ressources critiques doivent être marquées pour l'audit du code source.
- Le filtrage des journaux est difficile à faire manuellement. Apprenez à créer des filtres sur les journaux pour voir les éléments critiques. Un filtre très utile consiste à croiser les rapports de plainte avec l'accès et les activités des utilisateurs. Si vous avez des journaux assez bons, vous verrez des coïncidences. Par exemple: avant un problème, l'utilisateur1 se connecte toujours.
À propos de ne pas accéder à la production
Les règles qui exigent que les développeurs n'accèdent pas aux systèmes de production car les utilisateurs sont là pour éviter que les développeurs soumettant le code pour montrer à son propre utilisateur des informations privilégiées. Je pense que c'est une mesure de sécurité très, très faible et facile à détecter dans l'audit du code source. Il existe plusieurs moyens simples de contourner cela:
- un développeur et un employé faiblement rémunéré;
- s'envoyer un e-mail;
- ouvrir un porte dérobée dans le système.
L'audit du code source à la recherche de portes dérobées, d'escalade d'accès et de logiciels malveillants semble plus productif. Il permet d'identifier les mauvais développeurs lorsqu'ils testent leurs exploits et de les renvoyer. Bien sûr, un développeur expérimenté peut cacher un exploit à la vue de tous, il est donc important d'utiliser des langages et des noms de variables clairs et clairs. Ne recourez à des solutions étranges que dans les points documentés des applications qui nécessitent des performances ou un masquage spéciaux. Par exemple, 1 << 4 est identique à 1 * 16. Cela n'aurait de sens que si le langage n'effectue pas cette optimisation par lui-même et que le point où cela se produit est un goulot d'étranglement des performances. Les langages trop symboliques sont mauvais pour cette même raison. Le code source doit être lisible par n'importe quel geek.
Le problème est pire que vous ne le pensez
Les dommages les plus simples et les pires qu'un développeur peut causer ne sont pas liés à l'installation de l'outil. Même si l'environnement de développement est géré, cela fera peu de différence si l'entreprise ne dispose pas de pare-feu puissants, de référentiels de code source, de builds basés exclusivement sur les référentiels de code source et de révision de code.