Ce tuto fait suite au de articles précédents :
- Installation et Sécurisation d’un serveur dédié – Base
- Installation et Sécurisation d’un serveur dédié – Serveur mail
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 »
1/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 :
1 2 3 |
## Webmin repository deb http://download.webmin.com/download/repository sarge contrib deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib |
Puis on fait :
1 2 |
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
1 |
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 😉
2/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 :
1 2 |
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).
1 2 |
# phpMyAdmin default Apache configuration #Alias /phpexecutoradmin /usr/share/phpmyadmin |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<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 |
1 2 3 4 5 |
<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 :
1 2 3 |
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
3/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 :
1 2 3 |
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 :
1 2 3 4 5 6 7 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<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 :
1 |
cp /etc/apache2/suexec/www-data /etc/apache2/suexec/NOMDUSITE |
On l’édite pour adapter la configuration à notre environnement :
1 2 3 4 5 6 7 |
/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 :
1 2 |
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
1 2 3 4 5 6 7 8 |
<?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
1 2 |
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
4/Activation du SSL
On édite donc le fichier /etc/apache2/sites-available/001-NOMDUSITE.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<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.
5/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 :
1 2 3 |
apt-get install --assume-yes openssl-blacklist \ openssl-blacklist-extra \ php-pear |
On crée ensuite la base de donnée de horde:
1 2 3 4 5 |
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.
1 2 3 4 |
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.
1 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 :
1 |
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 :
1 2 3 4 5 |
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<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:
1 |
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ù »
1 |
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
1 |
apt-get install --assume-yes dovecot-managesieved |
Ensuite on édite le fichier /var/www/html/horde/ingo/config/backends.php comme suit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* 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 ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/* 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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?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 :
1 2 3 4 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* 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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$_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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 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 :
1 |
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.