====== OpenSSL ====== Dans ce TP vous utiliserez l'outil OpenSSL pour expérimenter le chiffrement de fichiers sous Unix. ==== Premières manipulations ==== Pour cette première partie, vous aurez besoin des ''manpages'' des commandes ''openssl'' et ''dd'' * Quels sont les algorithmes de chiffrement symétriques offerts par OpenSSL ? * Quelles sont les commandes d'OpenSSL permettant de chiffrer et déchiffrer des fichiers ? * A l'aide de ''dd'', créez un fichier de données aléatoires de 1Go dans le répertoire ''/tmp'' * Chiffrez ce fichier à l'aide de ''openssl'' via le cryptosystème ''AES-128'' en mode ''CBC''. Chronométrez le chiffrement à l'aide de la commande ''time'' * Chiffrez ce fichier à l'aide de ''openssl'' via le cryptosystème ''AES-256'' en mode ''CBC''. Chronométrez le chiffrement à l'aide de la commande ''time'' * Chiffrez ce fichier à l'aide de ''openssl'' via le cryptosystème ''3-DES''. Chronométrez le chiffrement à l'aide de la commande ''time'' * Observez-vous des différences dans les temps de chiffrement * Si pour le déchiffrement, vous utilisez une clé différente de celle choisie pour le chiffrement, comment réagit ''openssl'' ? Le temps de réaction est-il de l'ordre du temps de chiffrement. Expliquez pourquoi ? Pour cela, comparez les tailles des fichiers chiffrés avec celles des fichiers originaux : comment expliquez-vous les différences ? ==== Chiffrer avec OpenSSL ==== * Chiffrez un fichier de votre choix avec le chiffrement ''AES-256'' bits en utilisant le mot de passe ''motDePasse''. * Chiffrez un fichier de votre choix avec le chiffrement ''3-DES'' en utilisant la clé explicite de code hexadécimal ''0x0102030405060708'' et du vecteur d'initialisation ''0x1234''. * Récupérez la clé, le vecteur d'initialisation et le "grain de sel" aléatoire correspondant au mot de passe ''motDePasse''. * Réessayez une nouvelle fois. Que se passe-t-il ? * Fixez maintenant le "grain de sel" et recommencez. Que constatez-vous ? * Essayez la même commande avec plusieurs algorithmes fournis par ''OpenSSL'', qu'est-ce qui change ? Pourquoi ? ==== Cryptographie asymétrique avec OpenSSL ==== La commande ''genrsa'' d' ''OpenSSL'' permet la création d'une paire de clés RSA de taille donnée. * Générez des clés RSA dans un fichier ''keys.pem''. * Visualisez le contenu du fichier grâce à la commande ''rsa'' de ''openssl''. * Quelles informations retrouvez-vous dans le fichier ? * Exportation des clés * Le fichier que vous avez généré contient à la fois la clé privée et la clé publique. Sous cette forme, il vous est donc impossible de distribuer votre clé publique. * Exportez la clé publique du fichier ''keys.pem'' vers un fichier ''public.pem''. * Observez le contenu du fichier. * Chiffrement/Déchiffrement * Toujours à l'aide dé ''openssl'', vous allez maintenant échanger des messages chiffrés avec RSA. * Chiffrez un message court de votre choix avec votre clé privée. * Transmettez ce message chiffré ainsi que votre clé publique à la personne de votre choix. * Récupérez la clé publique et le message chiffré de cette même personne. Déchiffrez-le. * Récupérez un message chiffré avec votre clé publique et déchiffrez le. * RSA comme complément à la cryptographie symétrique * Comme vous l'avez vu, vous ne pouvez pas chiffrer des messages de grande taille avec RSA. Comment pouvez-vous utiliser cet algorithme pour faire des transferts sécurisés de données de grande taille ? * Ecrivez un script (''bash'' ou autre) automatisant le chiffrement et le déchiffrement de messages de grande taille à faisant intervenir exclusivement l'algorithme ''rsa''. Expérimentez votre solution par le biais d'un transfert par mail. * Vous pouvez expérimenter sur les fichiers suivants : * {{:upjv.png?100|}}, {{ :rand_mess.pdf |}} * Améliorez votre solution à l'aide des commandes ''dgst'' et ''rsautl'' de ''openssl''. Au final votre solution devra assurer les contraintes de confidentialité, d'intégrité et d'authenticité. ==== Création d'une autorité de certification X.509 ==== Grâce à la commande ''req'' de ''openssl'', créez un certificat racine ''X.509'' qui servira à votre autorité de certification. Pour cela, créez un fichier ''config.cnf'' qui contiendra les paramètres de votre CA. Le certificat racine devra avoir les caractéristiques suivantes : * Il utilisera l'algorithme de chiffrement RSA. * Il utilisera une clé de 2048 bits. * Il utilisera l'algorithme de résumé (hachage) ''SHA-1'' * Sa période de validité s'étendra de la date du jour jusqu'à 10 ans après. Grâce à la commande ''x509'' de ''openssl'', observez le contenu de votre certificat racine. * Création d'une demande de certificat pour un serveur * Utilisez la commande ''req'' de ''openssl'' pour créer une demande de certificat pour votre machine (vous utiliserez par exemple son adresse IP pour l'identifier). * Vous utiliserez une clé de 1024 bits. * La commande ''req'' permet de générer automatiquement le couple de clés à utiliser ou bien d'utiliser une clé déjà générée. Testez les deux manières de générer une requête de certificat. * Création d'une demande de certificat pour un client * Utilisez la commande ''req'' de ''openssl'' pour créer une demande de certificat pour vous-même. * Vous utiliserez une clé de 1024 bits. * Vous préciserez votre adresse mail dans les attributs de la requête. * Signature des certificats par l'autorité de certification * À l'aide de la commande ''ca'' de ''openssl'', créez un certificat pour votre machine, signé par votre autorité de certification. * Récupérez une demande de certificat client et créez un certificat signé par votre autorité de certification. * Le certificat de votre machine sera valable 2 ans. * Le certificat client sera valable 1 an. Ces deux certificats peuvent notamment servir respectivement à l'identification d'un serveur web et à votre identification pour la connexion à ce serveur. Une telle configuration dans une salle de TP n'est pas facile à expérimenter. Vous pouvez cependant essayer d'installer un serveur web léger gérant SSL sur votre compte (''Nginx'' ou autre) pour les utiliser. ==== OpenSSH ==== Idée générale. Appréhender la manipulation et la configuration client de ''OpenSSH''. L'option ''-v'' de la commande client ''ssh'' vous permettra d'activer le mode ''verbose''. Cette option vous permettra de visualiser les différentes procédures d'authentification déjà vues. == Premiers pas avec OpenSSH == * Choisissez une machine distante de la salle. Connectez-vous sur cette machine à l'aide du client ''ssh'' sous le nom de login d'un autre utilisateur (celui d'un binôme que vous aurez choisi). Quelle(s) question(s) vous sont posées ? Répondez par l'affirmative à ces questions ? * Déloguez-vous. Recommencez la même procédure de connexion. Quelles questions vous sont posées ? Editez le fichier ''.ssh/known_hosts''. * Déloguez-vous. Repérez et commentez la ligne correspondant (mettre un e''#'' au début de la ligne) à la machine distante contactée à la question précédente. Recommencez la procédure de connexion. Que remarquez-vous ? Expliquez pourquoi. == Génération de Clés == * Générer un jeu de clefs RSA de 2048 bits. Faites en sortes de renouveler la procédure d'authentification à l'aide d'un challenge RSA. D'après vous laquelle de ces deux procédures de connexion préserve le mieux les données d'authentification ? Pourquoi ? == Automatisation de la procédure de connexion == * Faites en sortes de ne plus saisir la ''passphrase'' pour vous connecter * Rédigez un fichier ''config'' afin que la commande ''ssh myconnect'' vous logue automatiquement sur la machine distante avec un login différent == Transfert de Ports == * Choisissez une machine distante avec votre binôme. Réalisez une connexion distante à l'aide de la commande ''telnet''. Déloguez-vous * Refaites la procédure de connexion précédente et analysez le flux ''TCP'' grâce à l'utilitaire ''wireshark'' par exemple. Que remarquez-vous ? * Refaites la procédure de connexion précédente à l'aide du client ''ssh'' et analysez le flux ''TCP'' grâce à l'utilitaire ''wireshark'' par exemple. Que remarquez-vous ? * Créez un tunnel ''ssh'' en transférant le port distant ''telnet'' (25 ou 23) sur un port local de votre choix. Initiez une connexion ''telnet'' sur le port local que vous avez choisi et vérifiez grâce à ''wireshark'' le chiffrement de cette connexion.