Partie 3 - Serveur: Installation et Sécurisation

Partie 3 - Serveur: Installation et Sécurisation

howto admin system

Nous allons donc voir maintenant comment héberger un site de manière sécurisé avec suexec et suPHP sur notre serveur, on va en profiter pour installer quelques outils pratiques comme webmin et phpmyadmin.Normalement, tous les paquets nécessaires ont été installés et pré-paramétrés dans le tuto "base"

Ce tuto fait suite au de articles précédents :

Installation de Webmin

On commence par le plus simple, il y a des dépots disponible pour webmin on va donc les ajouter à la fin de notre fichier /etc/apt/sources.list les lignes suivantes :

## Webmin repository
deb http://download.webmin.com/download/repository sarge contrib
deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib

Puis on fait :

apt-get update
apt-get install --assume-yes webmin

La première chose à faire est d'ouvrir le port dans UFW, par défaut
c'est le 10000

ufw allow 10000/tcp

puis rendez vous sur https://mail.example.com:10000, la première chose à faire sera de vous rendre dans la configuration de webmin et de modifier le port par défaut, il ne vous restera ensuite qu'a supprimer la règle UFW précédemment créée, et d'en ajouter une nouvelle avec le nouveau port. Et voila !! Facile non ;)

Installation de phpmyadmin

Celui-ci est normalement très simple à faire fonctionner, mais l'utilisation de suPHP, va nous compliquer la tache. Qu'à cela ne tienne, après la configuration du serveur mail, c'est pas ça qui va nous arrêter ;) Donc on y va :

apt-get update
apt-get install --assume-yes phpmyadmin

Si on essaie de se connecter à https://mail.example.com/phpmyadmin/, on a une belle page d'erreur, pas très compréhensible. On va corriger ça et en profiter pour désactiver l'alias ce qui évitera de se prendre toutes les attaques visant phpmyadmin pour cela, il faut commenter la ligne alias et encadrer toute la configuration avec les balises Virtualhost puis on ajoute ce qu'il faut pour forcer l'utilisation de suPHP à la place de php, pour cela on édite le fichier /etc/phpmyadmin/apache.conf comme suit (si on veut garder l'alias phpmyadmin, on n'a pas besoin d'encadrer la configuration avec les balises Virtualhost).

# phpMyAdmin default Apache configuration
#Alias /phpexecutoradmin /usr/share/phpmyadmin
<VirtualHost IP_EXTERNE:80>
ServerName CequeVousVoulez.example.com
DocumentRoot /usr/share/phpmyadmin

#On sépare les logs (utile pour fail2ban)
CustomLog ${APACHE_LOG_DIR}/phpmyadmin.log combined
ErrorLog ${APACHE_LOG_DIR}/phpmyadmin.log

<Directory /usr/share/phpmyadmin>
        Options FollowSymLinks
        DirectoryIndex index.php

#Activation de suPHP
        suPHP_Engine on
        AddHandler x-httpd-suphp .phpsu

        <IfModule mod_php5.c>
#Desactivation du mod php
#               AddType application/x-httpd-php .php

                php_flag magic_quotes_gpc Off
                php_flag track_vars On
                php_flag register_globals Off
<Directory /usr/share/phpmyadmin/setup/lib>
    Order Deny,Allow
    Deny from All
</Directory>
</VirtualHost>

Maintenant qu'on a fait tout ça, il va falloir modifier les droits des fichiers phpmyadmin sinon, on aura une belle erreur 500. donc on fait :

chown -R www-data:www-data /usr/share/phpmyadmin
chown  www-data:www-data /etc/phpmyadmin/config-db.php
chown  www-data:www-data /etc/phpmyadmin/htpasswd.setup

Et tadaaaaa !!! Ça fonctionne, si c'est pas le cas, c'est qu'il y a eu une erreur ;) Je dois avouer que comme ça, ça à l'air facile, mais j'ai mis un moment à trouver pourquoi ça ne fonctionnait pas au début. Maintenant que nos outils sont installés, on va héberger notre premier
site web

Configuration d'un VirtualHost sous apache

Le but étant d'avoir un user par site, on va commencer par le créer correctement, on l'ajoute au groupe ftponly pour lui donner un accés SFTP uniquement :

useradd --home /var/www/NOMDUSITE/ --create-home -s /usr/sbin/nologin NOMDUSITE
passwd NOMDUSITE
adduser NOMDUSITE ftponly

Avec cette configuration, l'utilisateur ne pourra pas avoir accès au shell. Ensuite on crée les différents dossiers avec les bonnes autorisations :

mkdir -p /var/www/NOMDUSITE/public_html
mkdir -p /var/www/NOMDUSITE/log
chown -R NOMDUSITE:NOMDUSITE /var/www/NOMDUSITE
chown root:NOMDUSITE /var/www/NOMDUSITE
cd /var/www/NOMDUSITE
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Retenez bien les deux dernières commandes, elles sont extrêmement pratiques pour régler les droits correctement en masse. Maintenant que l'environnement est créé, on va attaquer la configuration apache pour ce site, on crée donc le fichier /etc/apache2/sites-available/001-NOMDUSITE.conf

<VirtualHost IP_EXTERNE:80>
      ServerAdmin admin@example.com
#l'adresse complete permettant d'acceder au site sans le http bien sur ex: example.com
      ServerName NOMDEDOMAINE
#fait pointer tout les variantes vers ce dossier ex: www.example.com truc.example.com
      ServerAlias *.NOMDEDOMAINE
      DocumentRoot /var/www/NOMDUSITE/public_html/

      CustomLog /var/www/NOMDUSITE/log/NOMDUSITE.log combined
      ErrorLog /var/www/NOMDUSITE/log/NOMDUSITE.log

      SuexecUserGroup NOMDUSITE NOMDUSITE

      <Directory />
              Options FollowSymLinks
              AllowOverride none
      </Directory>
      <Directory /var/www/NOMDUSITE/public_html>
              Options Indexes FollowSymLinks MultiViews
              AllowOverride All
              Order allow,deny
              allow from all
      </Directory>
</VirtualHost>

On crée aussi le fichier qui va bien pour suexec :

cp /etc/apache2/suexec/www-data /etc/apache2/suexec/NOMDUSITE

On l'édite pour adapter la configuration à notre environnement :

/var/www/NOMDUSITE
public_html/cgi-bin
# The first two lines contain the suexec document root and the suexec userdir
# suffix. If one of them is disabled by prepending a # character, suexec will
# refuse the corresponding type of request.
# This config file is only used by the apache2-suexec-custom package. See the
# suexec man page included in the package for more details.

On active le site puis on relance apache :

a2ensite 001-NOMDUSITE
service apache2 reload

Et voila, vous pouvez tester en créant le fichier suivant dans
/var/www/NOMDUSITE/public_html/test.php

<?php
echo "<h1>ID utilisateur :</h1>";
system("id");
echo "<h1>Utilisateur Apache :</h1>";
system("whoami");
echo "<h1>Informations sur la configuration php :</h1>";
phpinfo();
?>

puis

chown NOMDUSITE:NOMDUSITE /var/www/NOMDUSITE/public_html/test.php
chmod 644 /var/www/NOMDUSITE/public_html/test.php

On se rend sur http://example.com/test.php, et on devrait voir en haut du fichier l'utilisateur et les groupes auxquels il appartient, ainsi que le user utilisé par apache, et enfin la configuration php de votre serveur. Voila, votre environnement est prêt à héberger votre site. Allez pour le fun (si,si) on va activer le https, parce que quand même,
le SSL c'est le bien

Activation du SSL

On édite donc le fichier
/etc/apache2/sites-available/001-NOMDUSITE.conf

<VirtualHost IP_EXTERNE:80>
      ServerAdmin admin@example.com
#l'adresse complete permettant d'acceder au site sans le http bien sur ex: example.com
      ServerName NOMDEDOMAINE
#fait pointer tout les variantes vers ce dossier ex: www.example.com truc.example.com
      ServerAlias *.NOMDEDOMAINE
      DocumentRoot /var/www/NOMDUSITE/public_html/

      CustomLog /var/www/NOMDUSITE/log/NOMDUSITE.log combined
      ErrorLog /var/www/NOMDUSITE/log/NOMDUSITE.log

      SuexecUserGroup NOMDUSITE NOMDUSITE

      <Directory />
              Options FollowSymLinks
              AllowOverride none
      </Directory>
      <Directory /var/www/NOMDUSITE/public_html>
              Options Indexes FollowSymLinks MultiViews
              AllowOverride All
              Order allow,deny
              allow from all
      </Directory>
</VirtualHost>

<VirtualHost IP_EXTERNE:443>
      ServerAdmin admin@example.com
#l'adresse complete permettant d'acceder au site sans le http bien sur ex: example.com
      ServerName NOMDEDOMAINE
#fait pointer tout les variantes vers ce dossier ex: www.example.com truc.example.com
      ServerAlias *.NOMDEDOMAINE
      DocumentRoot /var/www/NOMDUSITE/public_html/

      CustomLog /var/www/NOMDUSITE/log/NOMDUSITE.log combined
      ErrorLog /var/www/NOMDUSITE/log/NOMDUSITE.log

      SuexecUserGroup NOMDUSITE NOMDUSITE

#Activation du SSL avec certificat auto-signé à modifier si on possède des certificats achetés.
                SSLEngine on
                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

      <Directory />
              Options FollowSymLinks
              AllowOverride none
      </Directory>
      <Directory /var/www/NOMDUSITE/public_html>
              Options Indexes FollowSymLinks MultiViews
              SSLOptions +StdEnvVars
              AllowOverride All
              Order allow,deny
              allow from all
      </Directory>
</VirtualHost>

Et voila, ça fonctionne, votre site est accessible par le protocole http et https, vous pouvez forcer vos users à utiliser le https avec une règle dans votre .htaccess par exemple, mais pour site public (blog, e-commerce) je vous conseille de faire ça uniquement dans le cas où le certificat est un vrai certificat certifié et non un auto-signé, les messages d'alerte des navigateurs sont tellement flippant que l'impact serait très négatifs sur la fréquentation du site. Si vous voulez le https pour phpmyadmin, c'est la même procédure, vous pouvez ajouter ce qu'il faut pour directmeent dans le fichier /etc/phpmyadmin/apache.conf,ou lui créer un nouveau fichier de configuration.

Installation de Horde 5 via Pear

Maintenant que tous les prérequis nécessaires sont vu, on va installer Horde afin d'accéder à nos mail, parce que bon, c'est quand même bien pratique. On commence par installer les paquets dont on aura besoin :

apt-get install --assume-yes openssl-blacklist \
openssl-blacklist-extra \
php-pear

On crée ensuite la base de donnée de horde:

mysql -u root -p

create database horde;
grant all on horde.* to 'horde'@'localhost' identified by 'VOTREMDP';
exit;

On lance l'installation de horde via pear à proprement parler.

pear upgrade PEAR
pear channel-discover pear.horde.org
pear install horde/horde_role
pear run-scripts horde/horde_role

Lorsque pear vous demande le chemin d'installation de horde, vous devez lui indiquez /var/www/html/horde, la prochaine étape est un peu longue puisque pear va télécharger tous les packages de horde.

pear install -a -B horde/webmail

Ensuite on lance le script de configuration via la commande webmail-install On va ensuite répondre à une série de question afin de configurer horde comme il se doit. J'ai indiqué les réponses pour que ça fonctionne avec notre configuration, lorsqu'il y a juste indiqué "entrée", c'est que je laisse le choix par défaut.

What database backend should we use?
Type your choice []:    mysqli

Username to connect to the database as* []: horde
Password to connect with: VOTREMDP

How should we connect to the database?
Type your choice [unix]: tcp
Database server/host* []: 127.0.0.1
Port the DB is running on, if non-standard [3306]: entrée
Database name to use* []: horde
Internally used charset* [utf-8]: Entrée

Use SSL to connect to the server?
Type your choice [0]:   Entrée
Certification Authority to use for SSL connections []: Entrée

Split reads to a different server?
Type your choice [false]: false

Configuring administrator settings
Specify an existing mail user who you want to give administrator permissions (optional):    admin@example.com

Si jamais pour une raison ou une autre on souhaite recommencer à zéro, il suffit de faire :

pear uninstall `pear list -c horde | tail -n +4 | awk '{ print "horde/"$1 }'`

Et on supprime tous les paquets qui concerne horde. Le reste de la config se fait via l'interface de horde, on va donc les droits et les permissions :

chown -R www-data:www-data /var/www/html/horde
chmod 755 /var/www/html/horde
cd /var/www/html/horde
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Et on crée le vhost pour pouvoir acceder à horde :

<VirtualHost IP_EXTERNE:443>

        ServerName webmail.example.com
        DocumentRoot /var/www/html/horde/
        SuexecUserGroup www-data www-data

        #Séparation des logs
        CustomLog ${APACHE_LOG_DIR}/horde.log combined
        ErrorLog ${APACHE_LOG_DIR}/horde.log

        #Activation du SSL
        SSLEngine on
        SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

        #Rejet des header http invalide
        RewriteEngine On
        RewriteCond %{HTTP_HOST} !webmail.example.com
        RewriteRule (.*) [L]

      <Directory />
              Options FollowSymLinks
              AllowOverride none
      </Directory>

      <Directory /var/www/html/horde>
              Options Indexes FollowSymLinks MultiViews
              #Activation de l'environnement SSL
              SSLOptions +StdEnvVars
              AllowOverride All
              Order allow,deny
              allow from all
      </Directory>

</VirtualHost>

<VirtualHost IP_EXTERNE:80>
        ServerName webmail.example.com
        DocumentRoot /var/www/html/horde/
        SuexecUserGroup www-data www-data

        #Séparation des logs
        CustomLog ${APACHE_LOG_DIR}/horde.log combined
        ErrorLog ${APACHE_LOG_DIR}/horde.log

      <Directory />
              Options FollowSymLinks
              AllowOverride none
      </Directory>

      <Directory /var/www/html/horde>
              Options Indexes FollowSymLinks MultiViews
              AllowOverride All
              Order allow,deny
              allow from all
      </Directory>

</VirtualHost>

Dans nos contrée européenne nous avons le droit d'utiliser le protocole activesync, on va donc pas s'en priver afin de bénéficier du push, de la synchro calendrier etc... Pour que votre téléphone arrive à se connecter il vous faut rajouter la ligne suivante dans votre vhost, moi sur cette configuration j'ai du l'ajouter à la configuration ssl par défaut:

        Alias /Microsoft-Server-ActiveSync /var/www/html/horde/rpc.php

Et voila, vous n'avez plus qu'à vous connecter à horde avec le compte admin défini précédemment, pour vérifier que la connexion fonctionne et que vous avez bien accès aux mails. Toute la config se fait par l'interface de horde, on va quand meme être prudent, on va sauver le fichier de config "au cas où"

cp /var/www/html/horde/config/conf.php{,.bak}

On va quand même en profiter pour installer Sieve, histoire de pouvoir
gérer les règles de courrier via INGO et managesieve

apt-get install --assume-yes dovecot-managesieved

Ensuite on édite le fichier
/var/www/html/horde/ingo/config/backends.php comme suit

/* IMAP Example */
$backends['imap'] = array(
    // ENABLED by default
#    'disabled' => false,
    'disabled' => true,
    'transport' => array(
        Ingo::RULE_ALL => array(
            'driver' => 'null',
            'params' => array(),
        ),
    ),
    'script' => array(
        Ingo::RULE_ALL => array(
            'driver' => 'imap',
            'params' => array(),
        ),
    ),
    'shares' => false
);
/* Sieve Example */
$backends['sieve'] = array(
    // Disabled by default
#    'disabled' => true,
    'disabled' => false,
    'transport' => array(
        Ingo::RULE_ALL => array(
            'driver' => 'timsieved',
            'params' => array(
                // Hostname of the timsieved server
                'hostspec' => '127.0.0.1',
                // Login type of the server
                'logintype' => 'PLAIN',
                // Enable/disable TLS encryption
                'usetls' => true,
                // Port number of the timsieved server
                'port' => 4190,
                // Name of the sieve script
#                'scriptname' => 'ingo',
                'scriptname' => 'filtres',
                // Enable debugging. The sieve protocol communication is logged
                // with the DEBUG level.
                'debug' => false,
            ),
        ),
    ),

Et le truc qui m'a fait galérer pendant des heures, juste un petit bug dans dovecot, vous trouverez les explications sur un ticket qui date de 2011 !! C'est le seul endroit ou j'ai trouvé la raison du pourquoi du comment... Et donc la dernière chose à faire c'est de créer le fichier /var/www/html/horde/ingo/config/hook.php comme suit :

<?php

class Ingo_Hooks
{
     public function transport_auth($driver)
     {
         switch ($driver) {
         case 'timsieved':
             return array(
                 'username' => $GLOBALS['registry']->getAuth(null),
                 'euser' => $GLOBALS['registry']->getAuth(null)
             );

         }

         // DEFAULT: Use hordeauth (identical to not defining hook at all).
         return true;
     }
}

On édite la config lda de Dovecot /etc/dovecot/conf.d/15-lda.conf comme suit :

protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins sieve
}

Histoire de rendre horde plus user-friendly, On modifie quelques réglages par défaut :

  • Prévisualisation des mail en html, on édite
    /var/www/html/horde/imp/config/mime_drivers.php
    /* HTML driver settings */
    'html' => array(
        /* NOTE: Inline HTML display is turned OFF by default. */
        'inline' => true,
        'handles' => array(
            'text/html'
        ),
        'icons' => array(
            'default' => 'html.png'
        ),

        'limit_inline_size' => 1048576,

        /* Check for phishing exploits? */
        'phishing_check' => true
    ),
  •  Utilisation de la corbeille par défaut au lieu de marqué les
    messages comme effacés, on édite
    /var/www/html/horde/imp/config/prefs.php
$_prefs['use_trash'] = array(
    'value' => 1,
    'type' => 'checkbox',
    'desc' => _("Move deleted messages to your Trash mailbox instead of marking them as deleted in the current mailbox?"),
    'on_change' => function() {
        $GLOBALS['injector']->getInstance('IMP_Mailbox_SessionCache')
            ->expire(IMP_Mailbox_SessionCache::CACHE_SPECIALMBOXES);
        if ($GLOBALS['prefs']->getValue('use_trash') &&
            !$GLOBALS['prefs']->getValue('trash_folder')) {
            $GLOBALS['notification']->push(_("You have activated move to Trash but no Trash mailbox is defined. You will be unable to delete messages until you set a Trash mailbox in the preferences."), 'horde.warning');
        }
    }
);
  • Suppression des options blacklist et whithelist pour ne pas surcharger le script Sieves (puisque Spamassassin est installé), on édite /var/www/html/horde/ingo/config/prefs.php
// Blacklist.
$_prefs['blacklist'] = array(
    'value' => 'a:2:{s:1:"a";a:0:{}s:1:"f";s:0:"";}',
    // Lock this preference to disable blacklists.
    'locked' => true,
    'type' => 'implicit'
);

// Whitelist.
$_prefs['whitelist'] = array(
    'value' => 'a:0:{}',
    // Lock this preference to disable whitelists.
    'locked' => true,
    'type' => 'implicit'
);

Pour faire fonctionner la correction orthographique, il faut installer aspell et les packages de langue qui vont bien, par exemple pour le français et l'anglais :

apt-get install --assume-yes aspell aspell-fr aspell-en

Et voila, c'est fini, pour définir des nouveaux utilisateurs, il faudra les créer via postfixadmin (tuto précédent), pour le reste, c'est à vous de définir les options de fonctionnement, Pour le reste il y a plein de tuto sur horde et une doc complète, je vous laisse donc chercher ;) et surtout, ça sort du cadre de cet article. Le prochaine article concernera la sécurisation de tout ça via quelques modifications de configuration/droit, l'utilisation de fail2ban et la surveillance de ce petit monde via monit.

Add a comment

Previous Post Next Post