Compte- rendu PTI #05
Transcription
Compte- rendu PTI #05
FALZON Marc BTS IG-2 2003-2005 Compte - rendu PTI #05 Cette quatrième PTI couvre le domaine du déploiement d'infrastructures de gestion de clés publiques en Intranet. Objectifs Les certificats numériques permettent à des utilisateurs de signer numériquement des messages (e- mails, documents administratifs numériques, etc ...) et de s'authentifier sur des sites web sécurisés ou des tunnels VPN ; ils permettent également à des machines (serveurs web, passerelles VPN, etc ...) de confirmer leur identité pour éviter tout détournement de flux de données. Une PKI a pour fonction de fournir un service de création, puis de gestion de certificats numériques au sein d'une organisation. Compétences Cette PTI couvre les compétences suivantes : • C21 - Installer et configurer un micro- ordinateur • C22 - Installer et configurer un réseau • C23 - Installer et configurer un dispositif de sécurité Outils utilisés Au cours de la réalisation de la PTI, les outils suivants ont été utilisés : Matériel : • Micro- ordinateur (serveur) Logiciels : • Système d'exploitation • Serveur web • Cryptographie • Certification • Scripting GNU/Linux Gentoo 2004.3- r1 (noyau 2.6.11) Apache (version 1.3.33) + mod_ssl (version 2.8.22) OpenSSL (version 0.9.7e) PHPKI (version 0.60, modifiée pour les besoins de l'AP) PHP (version 5.0.3) Couche cryptographique : OpenSSL Note : Nous compilerons tous les logiciels à parti r de leur code source de manière à activer des options particulières si besoin, comme par exemple le suppor t de SSL par Apache. Toutes les opérations cryptographiques (génération de clés asymétriques, chiffrement, signature numérique...) réalisées côté serveur par la PKI sont assurées par OpenSSL, une collection d'utilitaires libres et de bibliothèques de fonctions qui fournissent une couche cryptographique aux systèmes UNIX/BSD. Voici la méthode employée pour installer OpenSSL à partir des sources du logiciel, en suivant la procédure habituelle de compilation sous les OS libres : $ $ $ $ $ $ tar xvzf openssl-0.9.7e.tar.gz cd openssl-0.9.7e/ ./configure make make test make install Vérifions que l'application soit bien installée et fonctionne correctement : $ openssl version Compterendu PTI #05 FALZON Marc BTS IG-2 2003-2005 OpenSSL 0.9.7e 25 Oct 2004 Serveur HTTP(S) : Apache + mod_ssl + PHP Pour pouvoir accéder depuis n'importe où aux services fournis par la PKI, nous avons besoin d'une interface web qui sera garantie par le serveur HTTP libre Apache. Mais avant de compiler Apache nous devons préparer le module de chiffrement des communications HTTP entre l'interface web de la PKI et les utilisateurs / administrateurs. En effet, le protocole HTTP n'est pas sécurisé et il est possible d'intercepter le contenu des échanges comme les mots de passe ou pire encore, les clés générées par la PKI. mod_ssl est un module pour Apache qui ajoute une couche de chiffrement SSL (HTTPS) - et maintenant TLS (11) - de façon à créer un tunnel virtuel sécurisé entre les 2 entités communicantes, généralement un client et un serveur HTTPS. $ $ $ $ tar xvzf apache_1.3.33.tar.gz tar xvzf mod_ssl-2.8.22-1.3.33.tar.gz cd mod_ssl-2.8.22-1.3.33/ ./configure --with-apache=../apache_1.3.33 A ce stade, les sources d'Apache ont été modifiées par la commande précédente de manière à leur ajouter le code de mod_ssl à compiler en même temps que les autres modules du serveur. Voici la procédure suivie pour installer le serveur web et créer le certificat numérique du serveur web : $ cd ../apache_1.3.33 $ SSL_BASE=../openssl-0.9.7e/ ./configure --prefix=/web/apache\ --enable-module=most --enable-module=ssl --enable-shared=ssl $ make $ make certifcate $ make install Il convient à présent de modifier le fichier de configuration du serveur web (httpd.conf) : ServerName bouh DocumentRoot "/web/www/" Note : il existe dans /etc /hosts une entrée "bouh" associée à l'adresse IP du serveur. On vérifie que le serveur se lance correctement : $ /web/apache/bin/apachectl startssl Apache/1.3.33 mod_ssl/2.8.22 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide us with the pass phrases. Server bouh:8443 (RSA) Enter pass phrase: Ok: Pass Phrase Dialog successful. /web/apache/bin/apachectl startssl: httpd started Il ne reste plus que PHP à installer, qui servira à automatiser le traitement de certaines opérations de la PKI, notamment l'interfaçage avec OpenSSL. De même que pour toutes les applications précédemment installées nous allons le compiler sous forme de module pour Apache à partir de ses sources : Compterendu PTI #05 FALZON Marc BTS IG-2 2003-2005 $ tar xvjf php-5.0.3.tar.bz2 $ cd php-5.0.3/ $ ./configure --prefix=/web/php –with-apxs=/web/apache/bin/apxs --enable-ssl $ make $ make install Nous devons encore une fois éditer le fichier de configuration d'Apache pour lui préciser de charger le module PHP au démarrage : LoadModule php5_module AddModule libexec/libphp5.so mod_php5.c AddType application/x-httpd-php .php .php4 .php3 On crée maintenant un petit script PHP phpinfo.php censé afficher les paramètres de l'interpréteur pour tester son bon fonctionnement : <?php phpinfo(); ?> Pour achever la vérification, on ouvre un navigateur (au hasard : Mozilla Firefox ;) et on le pointe vers l'adresse https://bouh:8443/phpinfo.php : une fenêtre s'ouvre en nous demandant d'accepter le certificat numérique du serveur. Une fois vérifié et accepté, on constate que nous sommes bien dans un tunnel SSL (apparition du petit cadenas fermé dans la barre d'adresses) et que la page d'info de PHP s'affiche. Solution de PKI : PHPKI Maintenant que tous les outils nécessaires au bon fonctionnement de la PKI sont installés et fonctionnent correctement, il ne reste plus qu'à installer la PKI à proprement parler. La solution de PKI retenue est PHPKI(13) , un front - end (une surcouche) pour OpenSSL codé en PHP. La finalité de mon projet étant de fournir un service de génération de certificats électroniques que ce soit pour des utilisateurs (signature de données/e - mails) ou bien pour des serveurs (authentification VPN/serveurs SSL), le tout gratuitement et en utilisant uniquement des logiciels libres. ATTENTION : Lors de ma première installation de PHPKI (parce qu'il y en a eu beaucoup ;) j'ai été confronté à quelques erreurs d'écriture sur les fichiers d'installation, et par conséquent l'application, puisque mal installée, fonctionnait peu voire pas du tout. Après avoir passé quelques jours à déboguer les sources, il est apparu que PHPKI ne peut fonctionner si le "Safe Mode" de PHP est activé et si les "Register Globals" (la portée des variables globales) sont désactivées ; j'ai donc dû adapter la configuration de PHP en conséquence, sachant toutefois que la modification de ces options sont des failles potentielles et connues du public. Après avoir récupéré les sources sur le site officiel, on procède à l'installation comme illustré par la copie d'écran suivante : Compterendu PTI #05 FALZON Marc BTS IG-2 2003-2005 Exploitation du système Compterendu PTI #05 FALZON Marc BTS IG-2 2003-2005 Selon le principe d'une PKI, PHPKI est séparé en entités distinctes, mais moins bien délimités que le modèle théorique à savoir que l'application remplit bien les rôles d'autorité de certification (CA), d'enregistrement (RA), de stockage (Repository) de séquestre mais pas d'entité finale. De plus, la PKI est ici scindée en deux parties : • l'une publique où les utilisateurs peuvent télécharger le certificat de la CA, la dernière CRL et tous les certificats qui ont été délivrés par la CA; • l'autre est privée et son accès est restreint au niveau du serveur où l'administrateur de la PKI peut créer les certificats demandés par les utilisateurs, les renouveler et les révoquer. Dans un premier temps nous allons jouer le rôle de l'administrateur en créant un nouveau certificat numérique pour notre serveur HTTPS. Toutes les opérations de pilotage de la PKI sont à effectuer avec un navigateur web. Nous nous rendons donc dans la section prévue à cet effet et nous remplissons les champs avec les informations requises; il est ensuite demandé de confirmer les informations fournies avant de valider la création. Une fois validé, le certificat est généré côté serveur par OpenSSL (qui reçoit ses paramètres par PHPKI) puis il est demandé d'enregistrer le certificat sur notre machine. Maintenant que nous avons notre certificat (... et sa clé privée, le format PEM fusionnant ces deux éléments dans un seul fichier). On copie donc le fichier téléchargé avec les autres certificats du serveur web et on édite son fichier de configuration : SSLCertificateFile /web/apache/conf/ssl.crt/www.alternatives87.eu.org.pem SSLCertificateKeyFile /web/apache/conf/ssl.crt/www.alternatives87.eu.org.pem On redémarre le serveur HTTPS... $ /web/apache/bin/apachectl stop /web/apache/bin/apachectl stop: httpd stopped $ /web/apache/bin/apachectl startssl Apache/1.3.33 mod_ssl/2.8.22 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide us with the pass phrases. Server bouh:8443 (RSA) Enter pass phrase: Ok: Pass Phrase Dialog successful. /web/apache/bin/apachectl startssl: httpd started ...et on retourne à notre navigateur pour vérifier si le nouveau certificat est disponible : Compterendu PTI #05 FALZON Marc BTS IG-2 2003-2005 Maintenant, imaginons que nous recevons une demande d'un utilisateur nécessitant un certificat numérique pour signer ses e- mails : une fois dans la section adéquate nous suivons la même procédure que pour un certificat de site web, à la différence qu'on demande cette fois une adresse e- mail et non plus une adresse web. Une fois le certificat téléchargé (format PKCS12 pour les certificats utilisateurs), on lance notre client mail (ici Mozilla Thunderbird) et on importe notre nouveau certificat; après avoir rappelé le mot de passe entré lors de la génération du certificat au niveau de la CA le logiciel nous informe que ce dernier est convenablement intégré à la base de données de certificats interne. Il faut également importer dans le client mail le certificat de la CA sinon les certificats ne seront pas valides (not trusted ) : ceci fait on peut désormais envoyer et recevoir des e- mails dignes de confiance si on a importé le certificat du correspondant. Ci- dessous une copie d'écran d'un e- mail signé envoyé à moi- même avec le client mail Thunderbird de Mozilla : Compterendu PTI #05 FALZON Marc BTS IG-2 2003-2005 En cliquant sur "View Signature Certificate" on constate en effet que l'e- mail que j'ai reçu provient bien de moi- même : Si un certificat délivré par notre CA venait à être perdu ou volé il est impératif que son propriétaire nous en informe dans les plus brefs délais afin que l'administrateur puisse le révoquer et mettre à jour la CRL. Pour l'exemple, nous imaginons qu'un pirate se soit infiltré sur le serveur d'Alternatives 87 et ai copié son certificat et sa clé privée; l'administrateur du serveur s'en aperçoit (trop tard) et nous demande de révoquer le certificat actuel : pour ce faire l'administrateur de la PKI se rend dans la section de gestion où il contrôle la "vie" des certificats qu'il a délivrés. Après révocation du certificat et confirmation de sa révocation, il faut à présent régénérer la CRL pour avertir les utilisateurs de ne plus faire confiance à ce certificat : nous devons nous rendre dans la section (non visible par défaut) de génération de CRL. Ceci fait, il faut importer la nouvelle CRL dans le navigateur (et il appartient AUX UTILISATEURS de mettre à jour fréquemment leur CRL). Voici une copie d'écran de liste des certificats générés par notre CA; on le certificat que nous venons de révoquer apparaît en rouge : Compterendu PTI #05 FALZON Marc BTS IG-2 2003-2005 Désormais toute tentative de connexion sécurisée avec le serveur web utilisant ce certificat se soldera par ce message : Compterendu PTI #05