Reverse Proxy, Apache et sécurisation d`application
Transcription
Reverse Proxy, Apache et sécurisation d`application
RAHME.FR Reverse Proxy, Apache et sécurisation d'application Soumis par Johnny RAHME Difficulté (Admin Systèmes et Réseaux) 1. Introduction Je traiterai dans cet article de la sécurisation d'accès externe vers des applications internes d'une entreprise, à l'aide d'un Reverse Proxy implémenté avec Apache, sur plateforme Linux (GNU/Debian). {mospagebreak title=2. Environnement} 2. Environnement Voici la situation: Je prendrai le cas d'une entreprise, car c'est le cas avec le plus de contraintes, mais rien n'empêche d'appliquer ce cas aux particuliers (comme je l'ai également fait moi-même chez moi). Une entreprise possède plusieurs site intranet, ou applications internes, qui doivent absolument être accessible depuis l'extérieur de l'entreprise, à savoir depuis internet. Ceci pour divers raisons, entre autres, pour faciliter le travail des commerciaux, des consultants travaillants à distance, des techniciens en intervention chez un client, etc .. De plus, dans le cadre de cet article, considérons que les applications en question sont des boîtes noires, dont nous ignorons le fonctionnement interne. Prenons le cas d'une application interne, myApp, et deux de ses fonctionnalités, fonc1 et fonc2 qui doivent être accédées depuis l'extérieur du réseau de la société. {mospagebreak title=3. Le Reverse Proxy} 3. Le Reverse Proxy Traitons le cas de l'application interne myApp, accessible en interne (depuis le réseau interne de l'entreprise) par l'url http://myApp.domaine-interne.fr/. Fonc1 est à l'adresse http://fonc1.myApp.domaine-interne.fr/, et fonc2 à http://fonc2.myApp.domaine-interne.fr/. http://hercule.rahme.fr Propulsé par Joomla! Généré: 30 September, 2016, 11:18 RAHME.FR Il est bien évidemment très dangereux, et fortement déconseillé de se contenter d'ouvrir un accès FireWall depuis l'extérieur aux url susmentionnées, en guise d'accès externe à l'application, pour des raisons évidentes de sécurité, d'autant plus que nous considérons que le fonctionnement interne de l'application ne nous est pas connu (et donc ni ses bugs et failles..). De plus, ce mode d'accès n'ajouterait aucune couche de séurisation, sinon le filtrage des adresses source IP, et quand on sait la facilité avec laquelle on peut trafiquer une telle adresse, .. Nous utiliserons donc l'architecture suivante: Nous placerons, dans la DMZ de l'entreprise, en aval du FireWall d'entrée depuis internet (ou sur ce routeur, pour les petits parcs), notre serveur Reverse Proxy (RP): Internet ----------- ||| FireWall_ent || ---{DMZ} ----RP--- {DMZ}------ || FireWall_dmz-interne || ------{interne}---serveur applicatif (http://myApp.domaine-interne.fr)------{interne}-- Notre application, accessible en interne par http://myApp.domaine-interne.fr/, le sera par l'exterieur, depuis internet, par l'url https://myApp.domaine-entreprise-externe.fr/. Ceci nous permettra donc de chiffrer les communications entre l'extérieur et le RP (https, ssl). 3.1. Configuration d'Apache2 Attaquons à présent la configuration de l'architecture. Côté Apache, j'ai effectué mes tests sur Apache 2.0, et Apache 2.2, sans pour autant profiter des nouvelles fonctionnalités de la version 2.2. La plateforme est une Debian en version stable. Les modules à activer sur Apache2, autre que ceux par défaut, sont les suivants: mod_proxy, mod_ldap, mod_auth_ldap, mod_proxy_http, mod_ssl, mod_proxy_connect, mod_proxy_html, mod_auth_basic. http://hercule.rahme.fr Propulsé par Joomla! Généré: 30 September, 2016, 11:18 RAHME.FR Pour activer ces modules, on peut se servir de la commande a2enmod: rahme.fr # a2enmod nom_du_module Autrement, on peut également, pour Debian, créer manuellement un lien statique dans {répertoire_apache2}/modsenabled/ des modules présents dans {répertoire_apache2}/mods-available. En se trouvant dans {répertoire_apache2}/sites-available: rahme.fr # ln -s nom_du_module ../sites-enabled/ Personnellement, et dans l'optique de la modularité de la solution (plusieurs clients peuvent s'abonner au service, avec plusieurs comptes distincts et plusieurs cibles différentes), je préfère ne pas concentrer la configuration dans le fichier mods-enabled/proxy.conf. En effet, dans ce fichier, je me contente d'interdire tout accès: [..] ProxyRequests Off [..] C'est tout ce que je modifie dans ce fichier. Cela inactive la fonction de proxy ouvert. Je ne toucherai plus à ce fichier, sauf pour des tunings qui sortent du cadre de cet article. A noter qu'il faut absolument positionner ce paramètre à off, si vous n'avez pas envie que votre machine serve de proxy ouvert sur internet. http://hercule.rahme.fr Propulsé par Joomla! Généré: 30 September, 2016, 11:18 RAHME.FR Côté SSL, il faut préciser les options de ssl (les niveaux acceptés ainsi que les fichiers de certificat et de clé) dans modsenabled/ssl.conf: [..] SSLEngine on SSLCertificateFile /etc/apache2/cert/myCert.crt SSLCertificateKeyFile /etc/apache2/cert/myKey.key SSLCipherSuite HIGH:+MEDIUM SSLProtocol all -SSLv2 [..] Notre apache2 écoutera sur le port 443. Spécifions-le dans le fichier ports.conf ( {répertoire_apache2}/ports.conf ): Listen 443 Passons aux hosts. C'est là que j'effectue le coeur de la configuration. Reprenons l'exemple de myApp. Rappelons, pour prendre encore une fois le cas le plus contraignant, que cette application présente 2 fonctionnalités http://hercule.rahme.fr Propulsé par Joomla! Généré: 30 September, 2016, 11:18 RAHME.FR intéressantes, accessibles comme suit: http://fonc1.myApp.domain-interne.fr/ http://fonc1.myApp.domain-interne.fr/ Ces 2 fonctionnalités doivent être, de plus, accédées depuis l'extérieur par 2 équipes de gens différentes ! Jetons un coup d'oeil sur la configuration du VirtualHost correspondant et commentons-la après coup: NameVirtualHost 192.168.0.70 <VirtualHost myApp.domaine-entreprise-externe.fr> ServerAdmin [email protected] ServerName myApp.domaine-entreprise-externe.fr ProxyPass /fonc1/ http://fonc1.myApp.domaine-interne.fr/ ProxyPassReverse /fonc1/ http://fonc1.myApp.domaine-interne.fr/ ProxyPass /fonc2/ http://fonc2.myApp.domaine-interne.fr/ ProxyPassReverse /fonc2/ http://fonc2.myApp.domaine-interne.fr/ ProxyPassReverseCookieDomain .domaine-interne.fr .domaine-entreprise-externe.fr <Proxy http://fonc1.myApp.domaine-interne.fr/> Order Deny,Allow Deny From all Allow from 10.118.0.10/26 172.24.0.30 AuthName "myApp - Fonctionnalite 1" http://hercule.rahme.fr Propulsé par Joomla! Généré: 30 September, 2016, 11:18 RAHME.FR AuthType Basic AuthLDAPURL ldaps://myLDAP/ou=People,dc=ReverseProxy,dc=domaine-interne,dc=fr?uid require user myappUser1 </Proxy> <Proxy http://fonc2.myApp.domaine-interne.fr/> Order Deny,Allow Deny From all Allow from 10.118.1.10/26 172.24.0.30 AuthName "myApp - Fonctionnalite 2" AuthType Basic AuthLDAPURL ldaps://myLDAP/ou=People,dc=ReverseProxy,dc=domaine-interne,dc=fr?uid require user myappUser2 </Proxy> # SSL # -SSLEngine on SSLCertificateFile /etc/apache2/cert/myCert.crt SSLCertificateKeyFile /etc/apache2/cert/myKey.key SSLCipherSuite HIGH:+MEDIUM SSLProtocol all -SSLv2 DocumentRoot /local/myApp/ <Directory /> Options FollowSymLinks AllowOverride None Order allow,deny Deny from all allow from 10.118.0.10/26 10.118.1.10/26 172.24.0.30 </Directory> http://hercule.rahme.fr Propulsé par Joomla! Généré: 30 September, 2016, 11:18 RAHME.FR ErrorLog /var/log/apache2/myApp.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/myAppaccess.log combined ServerSignature Off </VirtualHost> A noter que ce VHost est créé dans sites-available, et un lien symbolique doit en être créé dans sites-enabled/ pour l'activer (ne pas oublier de reloader apache2 !). Commentaires: De prime abord, nous remarquons que l'adresse du serveur RP est 192.168.0.70, et qu'il a le nom DNS de myApp.domaine-entreprise-externe.fr. Bien évidemment, il faudra, à chaque nouveau VHost, et donc nouveau "client" accédant à une application différente, créer dans le DNS un autre nom mappé sur cette adresse IP. Ceci pour bien cloisonner les différents clients de notre RP. Par exemple, on peut imaginer un autre VHost, pour une application mySecondApp, et donc création d'une nouvelle entrée DNS de l'alias mySecondApp.domaine-entreprise-externe.fr à l'IP 192.168.0.70. Les lignes ProxyPass et ProxyPassReverse font en sorte que tout accès vers https://myApp.domaine-entrepriseexterne.fr/fonc1/ soit redirigé vers http://fonc1.myApp.domaine-interne.fr/, et pareil pour fonc2. ProxyPassReverseCookieDomain permet la réécriture d'éventuels Set-Cookie et Location dans les réponses de fonc1 et fonc2. Les sections <proxy ..> .. </proxy> sont assez explicites. En effet, on restreint l'accès IP aux seuls sous-réseaux spécifiés dans la directive Allow from. http://hercule.rahme.fr Propulsé par Joomla! Généré: 30 September, 2016, 11:18 RAHME.FR De plus, on met en place une authentification par LDAP, en exigeant l'authentification uniquement par l'utilisateur myappUser1 pour fonc1, et myappUser2 pour fonc2. Evidemment, il y a encore beaucoup plus d'options avec l'authentification LDAP, que ne couvre pas cet article. {mospagebreak title=4. Conclusion} 3. Conclusion Nous avons dans cet article configuré un Reverse Proxy avec Apache 2.0 ou Apache 2.2, sur plateforme Debian. L'article ne couvre pas toutes les possibilités, mais doit déjà vous permettre de configurer un accès externe assez sécurisé. http://hercule.rahme.fr Propulsé par Joomla! Généré: 30 September, 2016, 11:18