2010-12-15 1 views
0

Où irais-je apprendre à écrire du code qui devait être très, très sécurisé et qui expose des services externes (fonctionnant sur un système d'exploitation Windows ou Linux standard). Savoir quels services peuvent et ne peuvent pas être exposés en toute sécurité ferait partie du problème. Notez que je ne cherche pas un choix favori entre Linux et Windows, car le choix n'est pas susceptible d'être le mien à faire dans un cas donné. Cependant, le niveau de sécurité doit être de qualité militaire. J'ai presque l'impression d'être gêné de donner cela par exemple, mais comment pourrais-je savoir si je pourrais utiliser, disons, WCF, dans un tel contexte.Où irais-je apprendre à écrire du code qui devait être très, très sécurisé mais qui expose des services externes (fonctionnant sur un système d'exploitation Windows ou Linux standard)

+1

Juste une note de côté "grade militaire" ne semble plus vouloir dire grand-chose. – NotMe

+2

Je préfère le terme «avocat-grade» - ils sont plus liés à vous faire frire que le gouvernement dans la plupart des cas. – thkala

+2

'très sécurisé' n'est pas un terme significatif. S'il y a une réponse à votre question, cela dépend de l'actif que vous sécurisez (information? Contrôle?) De la menace qui vous inquiète et du coût économique associé à une violation. Habituellement, la plus grande menace pour la sécurité est l'ingénierie sociale et/ou corrompu (personne corrompue pour voler les données ou ouvrir un port), pas un logiciel malveillant, sauf si vous êtes le département du génie nucléaire iranien ou si vous avez ennuyé des Israéliens. – bmargulies

Répondre

2

La haute sécurité est un concept difficile car il implique généralement beaucoup plus que le code que vous avez écrit.

Fondamentalement, chaque couche du OSI model doit être prise en compte. Des choses comme, empêcher la capture du flux de données (ou être redirigé) entre les points d'extrémité (quantum cryptography).

Aux niveaux supérieurs, vous avez des choses comme diverses choses comme

  1. La sécurité physique des dispositifs (tous les points d'extrémité si possible).
  2. Renforcement du système d'exploitation (par exemple: fermeture des ports, désactivation des services inutilisés, utilisation de kerberos, tunnels VPN et optimisation des listes blanches de machines autorisées à se connecter, etc.);
  3. Cryptage des données au repos (cryptage de fichier), en transmission (SSL) et en mémoire (cryptage colonne/table).
  4. Assurer et appliquer une authentification et une autorisation appropriées à tous les niveaux (dans l'application, dans sql, etc.).
  5. Log TOUT. À un minimum, il devrait répondre «who/what/when/where/how»
  6. En même temps que la journalisation, surveillez-la activement. aka: détection d'intrusion.

Ensuite, nous pouvons passer à d'autres choses comme regarder d'autres vecteurs d'attaque comme l'injection sql, XSS, internes/employés mécontents, etc.

Et une fois que vous avez fait tout cela être prêt lorsqu'une Les hackers s'en tirent avec tout ce qu'ils veulent simplement par l'ingénierie sociale. En bref, le meilleur moyen de sécuriser les applications informatiques est d'écouter l'esprit de Fox Mulder et de Trust No One. Un autre de mes préférés qui s'applique est: Ce n'est que de la paranoïa s'ils ne sont pas après vous.

+0

Oui, exactement. Le code que je n'ai pas écrit est exactement ce qui me préoccupe. Ce n'est pas que je ne puisse pas faire d'erreurs, mais ce sont les erreurs invisibles (dans le style de Hacking: The Art of Exploitation) qui me préoccupent le plus. Cependant, puisque l'argent ne disparaît pas simplement de mon compte bancaire comme un tamis (enfin, sauf si je le dépense) alors au moins les banques ont accompli une sécurité raisonnable, et probablement l'armée, l'IRS, etc .... Avec toutes les couches cachées , comment font-ils? Comment pourrais-je apprendre à le faire? –

+1

@John: Votre première étape va être de rechercher les mots-clés que j'avais ci-dessus. par exemple. le cryptage des fichiers, le cryptage des serveurs SQL, etc. Chacun d'entre eux vous mènera vers des voies qui ouvriront d'autres domaines de recherche. Un autre domaine à examiner sont les boîtes à outils actuelles pour craquer des applications, comme metasploit. Tout ce que j'ai appris sur la façon d'implémenter correctement la sécurité a commencé par apprendre à déchiffrer des sites, des applications, etc. Une fois que vous avez compris la multitude de façons de prendre quelque chose, vous commencez à comprendre comment les protéger. – NotMe

+1

Faites attention à "tout enregistrer". Il est facile de créer une attaque par déni de service en remplissant la HD d'un serveur avec des entrées de journal. Ou cela peut rendre les problèmes légitimes difficiles à trouver car ils sont enfouis dans plusieurs balles de paille. – Gabe

0

Eh bien, la question de savoir où peut être répondu simplement. Pas à l'école. Je suggère de créer un chemin d'apprentissage pour vous-même. Choisissez une technologie que vous aimez et apprenez-la à l'envers. Un livre de base pour vous aider à démarrer devrait suffire, mais le reste des choses que vous apprenez au fur et à mesure, ou via la documentation de cette technologie. Par exemple - l'apprentissage sous .NET (Microsoft) implique un manuel de base A-Press (je suggère Pro C# et la plate-forme .NET 4.0). Par la suite, la recherche à travers le .NET Framework Reference sur MSDN vous donnera le reste.

Si vous recherchez une référence WCF, je suggère le (MCTS Exam 70-503, Microsoft .NET Framework 3.5 Windows Communication Foundation) et MSDN.Gardez à l'esprit que pas une seule technologie n'atteindra ce que vous recherchez. Par exemple: WCF est associé à WF (Windows Workflow Foundation), SQL Data Services et Entity Framework. Être exposé à plusieurs technologies va certainement élargir votre vision.

============================================== =====================================

WCF est une bête à cet égard. Voici les avantages par rapport à d'autres moyens de communication:

Les messages (données) transmis entre les points d'extrémité peuvent être sécurisés via une sécurité de niveau message (cryptage). Le canal de transport choisi peut également être sécurisé au niveau du protocole via la sécurité de la couche de transport (cryptage).

Les points d'extrémité eux-mêmes peuvent autoriser et usurper l'identité des clients (sécurité au niveau du client). Vous pouvez implémenter un suivi de service de bout en bout, des compteurs de performance & de surveillance de l'état de santé, la journalisation des messages, ainsi qu'une compatibilité ascendante et descendante avec les clients plus récents/anciens (dégradation gracieuse du format de message fournie dans WCF). Si vous choisissez de le faire, vous pouvez même implémenter le routage comme sécurité intégrée pour votre canal de communication. WCF prend également en charge les transactions (ACID), la simultanéité, ainsi que la limitation par instance, ce qui vous donne la plus grande flexibilité dans l'écriture de code de classe militaire sécurisé/robuste.

Rétrospectivement, la sécurité et la flexibilité de WCF sont étonnantes. Une technologie similaire (sinon la même) est la spécification WS-Security. Il fait partie des spécifications WS- * pour les services Web et traite de la signature Xml et du cryptage Xml pour fournir un canal de communication sécurisé entre deux points d'extrémité.

Les inconvénients de WS- * sont cependant qu'il s'agit d'un moyen de communication à sens unique. WCF peut faciliter la communication bidirectionnelle. Un client peut envoyer une requête à un serveur, mais un serveur peut également envoyer des requêtes au client. WS- * dicte qu'un client peut seulement envoyer et recevoir des réponses au serveur, mais pas vice versa. Je ne suis pas un développeur WCF donc je pensais que les faits saillants pourraient vous inciter à faire votre propre recherche. "Il ya des centaines de façons de peler un animal, aucun d'entre eux est faux ..."

1

Vous pouvez utiliser formal methods pour (en quelque sorte) prouver les parties critiques de votre logiciel. Un outil comme Frama-C (gratuit, licence LGPL, ciblant les systèmes embarqués) pourrait être pertinent (au moins si votre logiciel est critique, intégré, écrit en C). Mais la qualité militaire ne veut pas dire grand-chose. Votre client (et devrait) définir exactement les normes à respecter. Par exemple, un logiciel d'avion critique [civil] doit suivre quelque chose comme DO-178C (ou son prédécesseur, DO-178B). Différentes industries ont des normes différentes similaires à cela. (les chemins de fer et les industries médicales ont leurs propres normes, qui pourraient être différentes en Amérique du Nord qu'en Europe). Si votre système (client &) est moins exigeant (c'est-à-dire qu'aucun milliard de dollars ou des centaines de vies ne sont menacées par des bogues), vous pouvez envisager de personnaliser votre compilateur ou d'utiliser un autre outil. Par exemple, GCC est personnalisable à travers les plugins ou à travers MELT extensions. N'oubliez pas que la fiabilité logicielle a un grand prix (cela signifie un gros coût pour vous, donc pour votre client).

Questions connexes