Mon site             Mon blog          Mon Twitter        Mes lectures RSS        Mon Linked IN        Mon Viadeo        Mon DoYouBuzz       Mon Flavors

Debian Dedibox : Sécurisation VHCS avec SSL

Posted by on 5 octobre 2006

Presque 20 jours sans aucun article… Il m’a bien fallut tout ce temps pour tordre VHCS jusque dans ses plus profonds fichiers de configuration ! En faisant le tour de la sphère VHCS, j’ai pu me rendre compte que plusieurs personnes ont tenté (avec plus ou moins de succès) de coupler VHCS et SSL… Les différentes explications que l’on peut trouver ça et (ou encore ici et là-bas) ne m’ont pas complètement satisfait.

Je vais donc tenter de proposer une solution, non pas alternative car j’utilise les mêmes principes, non plus innovante car je n’invente rien, mais plutôt personnelle. Je pars evidement du principe que mon serveur se trouve dans l’état ou je l’ai laissé depuis mon dernier article.

Voici donc les objectifs :

  1. VHCS, Webmail, Phpmyadmin et le Filemanager en SSL (uniquement)
  2. POP et IMAP en SSL (presque uniquement, on verra pourquoi ensuite…)
    1. Accès au panel principal sur https://sd-XXX.dedibox.fr (Pour les dédiboxiens)
  3. Accès par sous domaines (uniquement) au lieu des URLs. (Pour chaque domaine !)
    • panel.domaine.tld
    • webmail.domaine.tld
    • files.domaine.tld
    • pma.domaine.tld
  4. Création des définitions POP et IMAP pour chaque domaine (futile mais pratique pour la configuration des clients mails.)

    • pop.domaine.tld
    • imap.domaine.tld

    Munissez vous d’une bonne dose de patience et en route !

OpenSSL

Tout d’abord installons openssl au cas ou vous ne l’auriez pas déjà :

# apt-get install openssl

Errata #2 : Activez le module apache SSL :

# a2enmod ssl

Ensuite il faut générer vos certificats SSL :

# cd /etc/apache2/ssl
# apache2-ssl-certificate

Une série de question vous sera posée, vous pouvez tappez sur ENTER et ne pas répondre à ces questions sauf la suivante au vous mettrez une étoile (*).

server name (eg. ssl.domain.tld; required!!!) []:*

En fait le programme génère un certificat « autosigné » qui sera placé dans le répertoire /etc/apache2/ssl (ou vous êtes actuellement).

Ceci fait, remontez vos manches, on entre dans les fichiers de conf VHCS !

Architecture et fonctionnement de VHCS.

Afin de ne pas faire (trop) n’importe quoi, j’ai passé un petit moment à comprendre le fonctionnement de VHCS. Au début cela parait un peu complexe mais finalement, on s’y retrouve :

Nous avons donc 2 répertoires importants :

  1. /etc/vhcs2 : c’est le répertoire des fichiers de configuration.
  2. /var/www/vhcs2 : répertoire des interfaces d’administration et de quelques fichiers de configuration perdus ;)

Le premier répertoire qui va nous interresser est celui des configurations, il est subdivisé en plusieurs sous répertoire correspondant chacun à un service pris en charge par VHCS (apache, postfix, proftpd, bind …). Chacun de ces sous-répertoires est lui aussi architecturé spécifiquement. Ainsi on trouvera un sous répertoire appelé « parts » contenant des parties de fichiers de configuration, ce sont ces parties (ou templates) qui sont ensuite utilisée pour générer les fichiers de configuration principaux du système. Nous allons donc nous attarder sur ces templates.

Mais avant tout, nous allons faire une petite sauvegarde de tout ce beau répertoire :

# cp -R /etc/vhcs2 /etc/vhcs2.bak

Configuration Apache

Commençons par modifier le fichier servant de base à la configuration apache :

# vi /etc/vhcs2/apache/parts/vhcs2_base.tpl

Choses à faire :

  1. Commenter l’alias vhcs2,
  2. En créer un nouveau (vhth) qui servira pour les thèmes
  3. Modifier l’ip, (Veillez à remplacer les XX.XX.XX.XX par votre IP serveur)
  4. Modifier le nom de votre serveur ( remplacer les YYYY par votre numéro de dédibox.)
  5. Ajouter les instruction SSL (SSLCertificateFile et SSLCertificateKeyFile doivent pointer vers les bons fichiers, c’est à dire ceux générés au début.)

Voici le contenu de ce fichier après modification : # httpd Data BEGIN.

#
# Web traffic accounting.
#

LogFormat "%B" traff

#
# GUI Location.
#

#Alias /vhcs2 /var/www/vhcs2/gui
Alias /vhth /var/www/vhcs2/gui/themes/
<Directory /var/www/vhcs2/gui/themes/>
    AllowOverride none
    Options MultiViews IncludesNoExec FollowSymLinks
</Directory>


<Directory /var/www/vhcs2/gui>
    AllowOverride none
    Options MultiViews IncludesNoExec FollowSymLinks
    ErrorDocument 404 /vhcs2/errordocs/index.php
    DirectoryIndex index.html index.php
</Directory>

<Directory /var/www/vhcs2/gui/tools/filemanager>
    php_flag register_globals On
    php_admin_value open_basedir "/var/www/vhcs2/gui/tools/filemanager/:/tmp/:/usr/share/php/"
</Directory>

Alias /vhcs_images /var/www/vhcs2/gui/images
<Directory /var/www/vhcs2/gui/images>
    AllowOverride none
    Options MultiViews IncludesNoExec FollowSymLinks
</Directory>

#
# Default GUI.
#

<VirtualHost XX.XX.XX.XX:443>
    ServerName sd-YYYY.dedibox.fr
    DocumentRoot /var/www/vhcs2/gui

    <Directory /var/www/vhcs2/gui>
            Options Indexes Includes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            Allow from all
    </Directory>
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.pem
    SSLCertificateKeyFile /etc/apache2/ssl/3271b39.0

</VirtualHost>


# httpd [{IP}] virtual host entry BEGIN.
# httpd [{IP}] virtual host entry END.

# httpd Data END.

Après avoir modifié ce fichier il faut s’attaquer au fichier définissant les domaines.

# vi /etc/vhcs2/apache/parts/dmn_entry.tpl

Voici les choses à faire avec ce fichier :

  1. Ajouter un virtualhost pour le panel
  2. Ajouter un virtualhost pour le webmail
  3. Ajouter un virtualhost pour le filemanager
  4. Ajouter un virtualhost pour le sqlmanager (phpmyadmin)

Chaque virtualhost doit être correctement configuré avec SSL (Veillez encore une fois à bien spécifier les chemins vers vos fichiers clés, ils doivent surement être différents des miens…)

Contenu du fichier après modification :

<VirtualHost panel.{DMN_NAME}:443>
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.pem
    SSLCertificateKeyFile /etc/apache2/ssl/3071d749.0

    DocumentRoot /var/www/vhcs2/gui

    <Directory /var/www/vhcs2/gui>
            Options Indexes Includes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            Allow from all
    </Directory>

    ServerName panel.{DMN_NAME}
</VirtualHost>
<VirtualHost webmail.{DMN_NAME}:443>
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.pem
    SSLCertificateKeyFile /etc/apache2/ssl/3071d749.0

    DocumentRoot /var/www/vhcs2/gui/tools/webmail

    <Directory /var/www/vhcs2/gui>
            Options Indexes Includes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            Allow from all
    </Directory>

    ServerName webmail.{DMN_NAME}
</VirtualHost>
<VirtualHost files.{DMN_NAME}:443>
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.pem
    SSLCertificateKeyFile /etc/apache2/ssl/3071d749.0

    DocumentRoot /var/www/vhcs2/gui/tools/filemanager

    <Directory /var/www/vhcs2/gui>
            Options Indexes Includes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            Allow from all
    </Directory>

    ServerName files.{DMN_NAME}
</VirtualHost>
<VirtualHost pma.{DMN_NAME}:443>
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.pem
    SSLCertificateKeyFile /etc/apache2/ssl/3071d749.0 # /!\ Modifiez bien ce lien en fonction de celui qui a été généré !

    DocumentRoot /var/www/vhcs2/gui/tools/pma

    <Directory /var/www/vhcs2/gui>
            Options Indexes Includes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            Allow from all
    </Directory>

    ServerName pma.{DMN_NAME}
</VirtualHost>


<VirtualHost {DMN_IP}:80>

#
#User {SUEXEC_USER}
#Group {SUEXEC_GROUP}
#

#
#SuexecUserGroup {SUEXEC_USER} {SUEXEC_GROUP}
#

ServerAdmin     root@{DMN_NAME}
DocumentRoot    {WWW_DIR}/{DMN_NAME}/htdocs

ServerName      {DMN_NAME}
ServerAlias     www.{DMN_NAME} {DMN_NAME} *.{DMN_NAME}

ErrorLog        {APACHE_USERS_LOG_DIR}/{DMN_NAME}-error.log
TransferLog     {APACHE_USERS_LOG_DIR}/{DMN_NAME}-access.log

CustomLog       {APACHE_LOG_DIR}/{DMN_NAME}-traf.log traff
CustomLog       {APACHE_LOG_DIR}/{DMN_NAME}-combined.log combined

Alias /errors   {WWW_DIR}/{DMN_NAME}/errors/

ErrorDocument 401 /errors/401/index.php
ErrorDocument 403 /errors/403/index.php
ErrorDocument 404 /errors/404/index.php
ErrorDocument 500 /errors/500/index.php

# httpd dmn entry cgi support BEGIN.
# httpd dmn entry cgi support END.

<Directory {GUI_ROOT_DIR}>
    php_admin_value open_basedir "{GUI_ROOT_DIR}/:/etc/vhcs2/:/proc/:{WWW_DIR}/:/tmp/"
</Directory>

# httpd dmn entry PHP2 support BEGIN.
# httpd dmn entry PHP2 support END.

<Directory {WWW_DIR}/{DMN_NAME}/htdocs>
    # httpd dmn entry PHP support BEGIN.
    # httpd dmn entry PHP support END.
    Options Indexes Includes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

</VirtualHost>

Dernière petite modification pour apache, il faut éditer le fichier définissant l’espace de nom des virtualhost :

# vi /etc/vhcs2/apache/parts/vh_entry.tpl

Il suffit d’ajouter une ligne afin d’indiquer à apache de prendre en compte les sites en SSL (port 443)

Contenu du fichier après modification :

NameVirtualHost {IP}:80
NameVirtualHost {IP}:443

# httpd [{DMN_GRP}] dmn group entry BEGIN.
# httpd [{DMN_GRP}] dmn group entry END.

# httpd [{ALS_NAME}] als entry BEGIN.
# httpd [{ALS_NAME}] als entry END.

Pour en terminer avec apache, nous allons maintenant faire en sorte que le site http://sd-XXX.dedibox.fr ne présente plus l’accès à VHCS afin de lui préférer un accès https://sd-XXX.dedibox.fr (SSL), pour cela nous allons tout simplement faire en sorte que http://sd-XXX.dedibox.fr pointe sur le site par défaut d’une fraiche installation d’apache.

Editez donc le fichier suivant :

# vi /etc/apache2/sites-available/default

Indiquez lui votre adresse IP (celle du serveur hein !) et ajouter la directive ServerName, après modification il devrait ressemble a cela : (XX.XX.XX.XX et YYYY : même combat que ci dessus !)

Errata #1 : Modifiez aussi les directives DocumentRoot et Directory.

<VirtualHost XX.XX.XX.XX:80>
    ServerName sd-YYYY.dedibox.fr
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www/apache2-default/
    <Directory />
            Options FollowSymLinks
            AllowOverride None
    </Directory>
    <Directory /var/www/apache2-default/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
            # This directive allows us to have apache2's default start page
            # in /apache2-default/, but still have / go to the right place
            # RedirectMatch ^/$ /apache2-default/
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

</VirtualHost>

Ok maintenant on est pas loin d’être bon en ce qui concerne apache, passons à la configuration de bind (le serveur de nom de domaine)

Edit (merci Frederic Nauleau) :

Editez le fichier ports.conf

# vi /etc/apache2/ports.conf

et ajoutez la ligne

# Listen 443

Configuration Bind

Je rappelle brièvement le but de cette configuration : ajouter des sous domaines par défaut à chaque création d’un nouveau domaine à travers VHCS. Nous n’avons besoin de modifier qu’un seul fichier :

# vi /etc/vhcs2/bind/parts/db_e.tpl

Il faut donc lui ajouter 2 entrées CNAME (pop et imap) et 4 entrées IN A (panel, webmail, files et pma). Voici la tête du fichier après édition :

$TTL 86400
@       IN      SOA     ns.{DMN_NAME}. root.{DMN_NAME}. (
; dmn [{DMN_NAME}] timestamp entry BEGIN.
                     {TIMESTAMP}
; dmn [{DMN_NAME}] timestamp entry END.
                     8H
                     2H
                     4W
                     1D )
             IN      NS      ns.{DMN_NAME}.
; dmn [{DMN_NAME}] dns2 entry BEGIN.
; dmn [{DMN_NAME}] dns2 entry END.
             IN      MX      10 mail.{DMN_NAME}.

{DMN_NAME}.     A       {DMN_IP}
ns              IN      A       {DMN_IP}
mail            IN      A       {DMN_IP}
www             CNAME   {DMN_NAME}.
ftp             CNAME   {DMN_NAME}.
pop             CNAME   {DMN_NAME}.
imap            CNAME   {DMN_NAME}.
panel.{DMN_NAME}.               IN      A   {DMN_IP}
webmail.{DMN_NAME}.                IN      A   {DMN_IP}
files.{DMN_NAME}.                IN      A   {DMN_IP}
pma.{DMN_NAME}.                IN      A   {DMN_IP}
; sub [{SUB_NAME}] entry BEGIN.
; sub [{SUB_NAME}] entry END.</code></pre>

NB : Faites extrèmenent attention à ne pas oublier de petit points… (je vous aurai prévenu !)

Page par défaut d’un nouveau site

Toute ces modifications sont bien jolies mais, lorsque l’on crée un nouveau domaine, une page est copiée par défaut, celle ci présente les liens vers les différents outils VHCS. Cependant, étant donné que nous nous sommes donné un mal de chien à modifier VHCS, il faudrait que cette page reflète les modifications.

Cela permettra de corriger les liens et le fait que les images ne s’affichent plus. Commençons par sauvegarder le fichier :

# cp /var/www/vhcs2/gui/domain_default_page/index.html /var/www/vhcs2/gui/domain_default_page/index.html.bak

puis modifions le :

# vi /var/www/vhcs2/gui/domain_default_page/index.html 

et faisons en sorte qu’il contienne le code (voir lien) suivant pour corriger tout les problèmes.

NB : Lors de la prochaine étape nous allons regénérer la configuration afin que les sites existants puissent profiter de toutes ces modifications. Cependant le fichier modifier à cette étape ne sera pas remis en place pour une raison évidente : il ne faut pas écraser votre index.html… A vous donc de traiter cela au cas par cas.

Mise à jour de la configuration VHCS

Afin d’appliquer toutes les modifications que nous avons effectuées depuis le début, il est nécessaire d’indiquer à VHCS de regénérer tous les fichiers de configurations système à partir de nos modifications.

Pour cela suivez la procédure suivante :

  1. Arrèter vhcs :
    # /etc/init.d/vhcs2_daemon stop
  2. Connectez vous au serveur MySQL et entrez votre mot de passe
    # mysql -u root -p 
  3. Sélectionnez la base de donnée VHCS
    > USE vhcs2
  4. Changez le statut des domaines
    > UPDATE domain SET domain_status = 'change' WHERE domain_status = 'ok';
  5. Changez le statut des alias
    > UPDATE domain_aliasses SET alias_status = 'change' WHERE alias_status = 'ok';
  6. Changez le statut des sous-domaines
    > UPDATE subdomain SET subdomain_status = 'change' WHERE subdomain_status = 'ok';
  7. Quittez MySQL
    > quit
  8. Redémarrez VHCS
    # /etc/init.d/vhcs2_daemon start
  9. Lancez le script suivant (Merci Frederic Nauleau)
    # /var/www/vhcs2/engine/vhcs2-rqst-mngr
  10. Rechargez apache
    # /etc/init.d/apache2 reload
  11. Rechargez bind
    # /etc/init.d/bind9 reload

Occupons nous maintenant de la mise en place de SSL pour nos emails…

POP SSL et IMAP SSL

Rien de bien compliqué dans cette étape, il suffit d’installer les bons paquages :

# apt-get install courier-imap-ssl courier-pop-ssl courier-ssl

L’installation va générer des clés automatiquement. Il suffit donc de démarrer les services associés pour pouvoir interroger notre serveur en SSL en plus de l’interrogation normale.

# /etc/init.d/courier-pop-ssl restart

# /etc/init.d/courier-imap-ssl restart

Evidement, le fait de mettre en place un accès SSL doit être fait dans le but de supprimer l’accès classique. Cependant on ne peut pas le faire car le webmail de VHCS utilise un accès classique et non un accès SSL. L’idée dans un futur proche sera donc grâce à un firewall (iptable) de bloquer l’accès provenant de l’extérieur sur les ports classiques et de laisser l’accès sur les ports SSL…

Cela fera surement être l’objet d’un futur article dédié à la mise en place d’un firewall adpaté à l’utilisation de VHCS…

Ouf !

Ce fut long ! Si vous relevez des incorrections n’hésitez pas à abuser des commentaires…

57 Comments on Debian Dedibox : Sécurisation VHCS avec SSL

Respond | Trackback

  1. Marcusii dit :

    Bonjour « Monsieur » Pierre, c’est le minimum, apres c’est monsieur le président !! (enfin pas tout de suite ..) Bref apres cette petite pommade, quelques questions suite à une install sur dedibox avec Ubuntu. Lors des commandes mysql, j’ai eu quelques soucis du type: les ‘ (apostrophe) transformés en . (poing) du coup j’avais toujours une erreur de syntaxe sql, je les ai passé à la main directement dans la page de commande sql de myAdmin … meme chose, alors que je retapai la commande à la main. pas grave j’ai changé directement à la main pour les 2 domaines hébergés dans la table ‘domain’ le champ ‘domain_status’ par la valeur indiqué dans la commande. jusque là ça va … par contre dans les commandes suivantes …. pour ‘domain_aliasses’ et ’subdomain’ .. rien à faire je n’avais pas de sous domaines Est ce à dire que si je « fais » de nouveaux sous domaines je devrait faire à nouveau la manip ???

    puis, dans ce fichier là –> /etc/apache2/sites-available/default, j’ai en tete de celui ci un:

    NameVirtualHost *

    celui n’apparait pas dans le fichier du meme nom du tutoriel Doit on le supprimer (le « NameVirtualHost * ») ?

    Enfin lors du reload de Apache, j’au plusieurs Warning du meme type:

    • Reloading apache 2.0 configuration… apache2: Could not determine the server’s fully qualified domain name, using 88.191.XXX.XXX for ServerName

    et associé à ceci :

    [Wed May 09 00:13:24 2007] [warn] VirtualHost files.mondomaine.net:443 overlaps with VirtualHost pma.mondomaine.net:443, the first has precedence, perhaps you need a NameVirtualHost directive

    pour terminer, je croyais avoir suivi correctement le tutoriel mais: https://panel.mondomaine.net ou webmail.mondomaine.net m’envoient vers le panel d’admin en https (dommage pour le webmail ..) et http://www.mondomaine.net vers l’ancien panel sans https sd-XXXX.dedibox.fr pointe bien vers la page d’apache par defaut ….. bon aller je regarde ca demain et je poste si je trouve

    Marcusii

  2. Pierre Rigal dit :

    Marcusii > Quel long commentaire ! Je vais essayer de répondre dans la limite de ce dont je me rappelle ;)

    La manip de « mise à jour de la configuration VHCS » (car je pense que c’est celle dont tu parles) n’est pas à faire à chaque domaine ! Il faut la faire lorsque l’on touche aux fichier de configuration à la main, afin d’appliquer les modifications aux domaines existants. Le problème des apostrophes doit probablement venir de mon blog et de l’interprétation des apostrophes par « markdown ».

    Concernant le NameVirtualHost, il ne devrait pas être comme ça, en effet c’est ce fichier qui le configure :

    vi /etc/vhcs2/apache/parts/vh_entry.tpl 
    

    et on peut remarquer à l’intérieur qu’il y a normalement l’ip de spécifiée pour chaque NameVirtualHost.

    Enfin les warnings d’apache découlent directement des problèmes que tu as ci dessus… Concernant les adresses qui n’envoient pas au bon endroit, c’est peut être aussi un problème avec la déclaration de ton nom de domaine au niveau de ton registrar…

  3. SypenryKapy dit :

    +à+Ñ+á+Ã+à+Ô+à++à+++à++à+Å+à+Ñ+á+Ï]+à+×+á+Â+à+

  4. kadoudal dit :

    trouvé le problème.. il faut une librairie non mentionnée dans tuto

    apt-get install libopenssl-ruby

    gem install rails -y

  5. David dit :

    Très bon tuto!

    Par contre, il y a un problème de sécurité majeur dans VHCS2, qui n’est pas couvert par ce tuto: les utilisateurs virtuels sont authentifiés à partir du fichier /etc/sasl2db, dans lequel les mots de passe sont stockés en clair…

    J’ai essayé de régler ça il y a un bout de temps, mais sans succès.

    Si qqun a réussi ou a envie d’y passer du temps :)

  6. Bonjour voila j’ai une erreur après ce tuto : lesite.info a renvoyer un message incorrect ou inattendu code : -12263 j’ai refait 2 fois les manipulation est rien n’a changer J’ai bien mis mes valeur personnel ( si vous voulez fichier de conf dite le moi ) sinon j’ai aussi une erreur au niveau de la modif mysql :

    mysql> UPDATE domain SET domain_status = .change. WHERE domain_status = .ok.; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘WHERE domain_status = .ok.’ at line 1

    Merci de m’aider

  7. Excellent!!!

    Thank you very much :-)

Respond

Comments

Comments: