Tutoriel : installer un serveur Debian (wheezy)

Tutoriel : installer un serveur Debian (wheezy)

C'est sans aucun doute le plus gros tutoriel que je vous propose. Installer un serveur et le sécuriser au minimum représente une jolie masse de travail. J'ai installé 3 serveurs (2 en production et 1 de test) qui tournent impeccablement en suivant la procédure que je vais décrire.

Un tutoriel Debian complet

J'ai passé des heures à lire des docs, à consulter des tutos qui parfois n'avaient ni queue ni tête et faire de nombreux tests, voire de nouvelles installations de zéro, pour trouver la configuration qui fonctionnait. Au total, j'ai passé 19 jours pour peaufiner ma routine avant de commencer à installer les premiers sites sur le nouveau serveur. O_o

Il y a une bonne vingtaine d'étapes avec un énorme morceau qui concerne la gestion des e-mails avec le couple Postfix/Dovecot. Ce tutoriel est basé sur l'installation d'une Debian 7 (wheezy) sur une dédibox. Il est possible que vous ayez des petits ajustements à faire chez un autre hébergeur.

Pour info, les informations à remplacer sont indiquées en majuscule pour vous aider à les repérer plus facilement. Comme ce tutoriel est extrêmement complet, je vous propose un sommaire pour vous rendre plus facilement aux sections qui vous intéressent.

Avant de commencer, j'en profite pour passer un petit coucou à Guillaume qui a eu la gentillesse de répondre à quelques unes de mes interrogations quand je me suis lancé le premier jour sur la configuration du serveur. Merci l'ami. ;)

Sommaire

01 - Un petit cadeau pour commencer 02 - Modification du mot de passe root
03 - Gestion de la carte réseau 04 - Mise à jour des paquets
05 - Création d'un nouvel utilisateur 06 - Installation d'Apticron (alerte e-mail)
07 - Mise à jour de NTP (horloge système) 08 - Installation d'utilitaires
09 - Installation d'Apache 2 10 - Installation de PHP 5
11 - Installation de MySQL 12 - Installation de phpMyAdmin
13 - Installation de proftpd 14 - Installation de Postfix et Dovecot
15 - Installation de suphp 16 - Installation de Spamd, Clamav, Postgrey
17 - Gestion des tâches cron 18 - Installation d'iptables
19 - Installation de fail2ban 20 - Installation de Potsentry
21 - Installation de Rkhunter 22 - Configuration de Bind
23 - Gestion des noms de domaine 24 - Mise en place des sauvegardes
25 - Outils de monitoring 26 - Quelques astuces

NB : ce tutoriel est à suivre pour installer un nouveau serveur. Évitez de vous lancer dans la MAJ d'un serveur en production.

Je pars du principe que vous avez installé Debian depuis la console Online. C'est parti !

1 - Un petit cadeau pour commencer

Dans ce tutoriel, vous aurez besoin de mots de passe sécurisés. Je vous livre un bout de code maison pour les générer automatiquement avec 15 caractères mélangeant des lettres, des chiffres, des majuscules et des minuscules. J'ai volontairement oublié les caractères accentués pour cause éventuelle de conflit.

<?php
// Generation du mot de passe
$chaine = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789";
srand((double)microtime()*1000000);
for($i=0; $i<15; $i++) {
    // Mot de passe de 15 caracteres
    $pass .= $chaine[rand()%strlen($chaine)];
}
echo $pass;
?>

2 - Modification du mot de passe root

Commencez par vous connecter au serveur et indiquez le mot de passe quand il vous sera demandé :

$ ssh root@IP_DU_SERVEUR

Si le mot de passe root vous a été fourni par l'hébergeur du serveur dédié, il est conseillé de le changer. Il faudra le saisir à deux reprises.

$ passwd root

3 - Gestion de la carte réseau

Par défaut, la carte réseau est réglé sur DHCP. Comme j'utilise beaucoup les IP failover, je modifie les paramètres. Ouvrez le fichier de la carte réseau :

$ nano /etc/network/interfaces

Juste en dessous de # The primary network interface, remplacer par :

auto eth0
iface eth0 inet static
    address IP_DU_SERVEUR
    netmask 255.255.255.0
    gateway 3_PREMIERS_BLOCS_IP_DU_SERVEUR.1

Et si vous souhaitez utiliser une IP failover, ajouter en dessous :

auto eth0:0
iface eth0:0 inet static
    address IP_FAILOVER
    netmask 255.255.255.255

Enregistrez le fichier. Pour que cette modification soit prise en compte, redémarrer la machine :

$ reboot

Une fois que le serveur est reparti et que vous êtes connecté, faites un ping pour vous assurer que la carte réseau (et toutes les IP) répondent parfaitement.

Si toutefois la carte réseau ne réponde pas sur l'IP principale, il y a de fortes chances que le serveur ne redémarre pas. Si cela arrive, rendez-vous sur l'interface Online et cliquez sur le bouton Secours pour démarrer le serveur sur un autre OS et déboguer ainsi votre carte réseau. Online affiche les identifiants à utiliser à l'écran.

On lance donc le ping en le limitant à 4 tentatives :

$ ping -c 4 IP_DU_SERVEUR
$ ping -c 4 IP_FAILOVER

Si tout est OK, les différentes IP doivent répondre au 4 essais.

4 - Mise à jour des paquets

Avant d'installer quoi que ce soit, on vérifie si une mise à jour de Debian est disponible. Lorsque le serveur est opérationnel et en production, c'est la première étape à effectuer avant chaque installation.

$ aptitude update
$ aptitude upgrade

5 - Création d'un nouvel utilisateur

On verra l'utilité plus loin dans le tutoriel, il est conseillé de créer un nouvel utilisateur pour interdire les connexions en root au serveur. Par défaut, Online permet de renseigner cette information lors de l'installation d'une Dédibox. Ce n'est par contre pas le cas chez OVH. Pour ce faire, exécutez les commandes suivantes.

On commence par créer un groupe d'utilisateurs dédié à SSH :

$ groupadd sshusers

On créé l'utilisateur :

$ useradd -m NOM_UTILISATEUR

On indique le mot de passe pour l'utilisateur (celui-ci vous sera demandé à deux reprises) :

$ passwd NOM_UTILISATEUR

On attribue l'utilisateur au groupe sshhusers

$ usermod -a -G sshusers NOM_UTILISATEUR

A partir de là, vous pourrez vous connecter au serveur sans utiliser le compte root. Au niveau sécurité c'est mieux mais cela reste insuffisant. Il faut maintenant interdire la connexion SSH avec le compte root et procéder à quelques réglages supplémentaires.

Ouvrez le fichier de configuration SSH.

$ nano /etc/ssh/sshd_config

La première chose à faire est de modifier le numéro de port de SSH. Choisissez un numéro au dessus de 1024 (en dessous les ports sont attribués au système) :

Port NOUVEAU_PORT

Juste en dessous, ajoutez les informations suivantes :

# Interdire l'acces en root
PermitRootLogin no
# Nom de l'utilisateur
AllowUsers NOM_UTILISATEUR

Même si ce n'est pas conseillé, vous pouvez créer plusieurs utilisateurs. Dans ce cas, modifiez comme suit :

# Nom de l'utilisateur
AllowUsers NOM_UTILISATEUR_1 NOM_UTILISATEUR_2

Redémarrez le service pour la prise en compte des modifications :

$ service ssh restart

On peut maintenant tester les différents accès SSH. Commencez par vous déconnecter :

$ exit

Tentez maintenant de vous connecter avec le compte root :

$ ssh root@IP_DU_SERVEUR

Vous devriez avoir ce message :

ssh: connect to host IP_DU_SERVEUR port 22: Connection refused

Nous allons donc nous connecter avec notre nouveau compte utilisateur sur le port que l'on a indiqué dans les paramètres un peu plus haut :

$ ssh NOM_UTILISATEUR@IP_DU_SERVEUR -p NOUVEAU_PORT

Il vous sera demandé de saisir le mot de passe de l'utilisateur.

Maintenant que vous êtes connecté, il faut pouvoir agir sur le serveur avec les droits root. Pour ce faire, tapez la commande suivante :

$ su root

Lorsque cela vous est demandé, tapez votre mot de passe root. Vous avez à présent tous les droits pour gérer le serveur.

6 - Installation d'apticron (alerte MAJ)

Lorsque l'on gère un serveur, il faut le maintenir à jour. Plutôt que se connecter chaque jour pour vérifier si une mise à jour est disponible, nous allons utiliser apticron qui nous alertera automatiquement par e-mail une fois par jour.

$ aptitude install apticron -y

Éditez le fichier de configuration :

$ nano /etc/apticron/apticron.conf

Et effectuez les réglages suivants :

EMAIL="VOTRE_EMAIL"

Enregistrez le fichier et lancez le service :

$ apticron

7 - Mise à jour de NTP (horloge système)

Il n'y a rien de plus chiant qu'une horloge qui ne se met pas à jour, notamment lors du passage de l'heure d'hiver à l'heure d'été et vice-versa. Pour pallier à ce problème, on va installer un utilitaire qui va se charger d'effectuer la mise à jour via des serveurs :

$ aptitude install ntp ntpdate -y

Le service est lancé après l'installation, on l'arrête :

$ service ntp stop

Et on lance la mise à jour (uniquement cette fois-ci) :

$ ntpdate 0.fr.pool.ntp.org

Ensuite on règle les paramètres des serveurs à interroger :

$ nano /etc/ntp.conf

Au dessus de la liste des serveurs, ajouter les serveurs français :

server 0.fr.pool.ntp.org
server 1.fr.pool.ntp.org
server 2.fr.pool.ntp.org
server 3.fr.pool.ntp.org

Enregistrez le fichier et relancez le service :

$ service ntp start

8 - Installation d'utilitaires

Pour le fonctionnement du serveur, nous allons avoir besoin de quelques utilitaires. Cette liste est non exhaustive, vous pouvez en rajouter si besoin.

$ aptitude install zip unzip gcc libc6-dev linux-kernel-headers mailutils ncftp libc6-i386 -y

9 - Installation d'Apache 2

J'ai choisi Apache car je ne n'avais pas le temps de me pencher sérieusement sur Nginx. Libre à vous d'opter pour ce dernier si vous l'appréciez davantage.

$ aptitude install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert -y

Une fois l'installation terminée, on active différents modules (le 4ème est normalement activé mais on vérifie quand même) :

$ a2enmod rewrite expires headers deflate

On vérifie les index (et leur extensions qui sont autorisées sur le serveur) :

$ nano /etc/apache2/mods-available/dir.conf

Vous devriez y voir cette configuration que vous pouvez modifier si besoin :

<IfModule mod_dir.c>
    DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>

J'ai pour habitude de préciser l'adresse IP du serveur dans le fichier de configuration des ports d'Apache :

$ nano /etc/apache2/ports.conf

Et modifiez comme suit en haut du fichier :

NameVirtualHost IP_DU_SERVEUR:80

Avant :

<IfModule mod_gnutls.c>

Ajoutez :

NameVirtualHost IP_DU_SERVEUR:443

Enregistrez le fichier. Nous allons ensuite configurer le site par défaut. On commence par supprimer celui qui est actuellement renseigné :

$ a2dissite default

Cette modification est importante car le fichier par défaut doit être le premier qu'Apache va appeler. Si vous créez un site avec un nom comme "agenda" par exemple, il se positionne alphabétiquement avant "default". J'aime bien aussi créer un dossier spécifique à ce site :

$ mkdir /var/www/default

On crée 3 fichiers pour rendre les pages du site par défaut plus sexy :

$ nano /var/www/default/index.html
$ nano /var/www/default/403.html
$ nano /var/www/default/404.html

Dans chacune d'elle, vous pouvez copier le code suivant. A améliorer bien entendu. ;)

<!DOCTYPE html>
<html lang="fr">
<head>
<title>Coucou</title>
<meta name="robots" content="noindex" />
</head>
<body>
<p>Cette page n'existe pas</p>
</body>
</html>

Lorsque vous appellerez votre serveur par l'adresse http://IP_DU_SERVEUR, cela évitera d'avoir la page d'Apache It Works! affichée. Idem pour les erreurs 403 et 404. Vous pouvez évidemment créer un fichier pour chaque code d'erreur d'Apache.

On peux maintenant créer notre site par défaut :

$ nano /etc/apache2/sites-available/00-default

Et y insérer le contenu suivant :

<VirtualHost IP_DU_SERVEUR:80>
    ServerAdmin VOTRE_EMAIL
    ServerName IP_DU_SERVEUR
    DocumentRoot /var/www/default
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/default/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    ErrorDocument 403 /403.html
    ErrorDocument 404 /404.html
    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 ${APACHE_LOG_DIR}/error.log
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Enregistrez le fichier et activez le site par défaut :

$ a2ensite 00-default

On redémarre Apache pour prendre les modifications en compte :

$ service apache2 restart

10 - Installation de PHP 5

On va maintenant procéder à l'installation de PHP 5 et de tous ses modules :

$ aptitude install libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-json php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl -y

Pour vérifier que PHP 5 est opérationnel, créons un fichier de test :

$ nano /var/www/default/test.php

Copiez le contenu suivant :

<?php
phpinfo();
?>

Enregistrez le fichier et rendez-vous à cette adresse : http://IP_DU_SERVEUR/test.php. Si tout est OK, vous devriez voir les informations de PHP à l'écran.

On va maintenant protéger un chouilla PHP des regards indiscrets. Ouvrez le fichier de configuration de PHP :

$ nano /etc/php5/apache2/php.ini

Libre de modifier son contenu, voici quelques paramètres à régler qui sont primordiaux :

// Cacher la version de PHP
expose_php = Off
// Augmenter la mémoire utilisée
memory_limit = 512M
// Utile pour l'import de grosses bases de données
post_max_size = 128M
// Ajouter le phpinfo avant les autres fonctions
disable_functions = phpinfo,...

Enregistrez le fichier et ouvrez le fichier suivant :

$ nano /etc/apache2/conf.d/security

Il y a trois paramètres à vérifier et à modifier :

ServerTokens Prod
ServerSignature Off
TraceEnable Off

Enregistrez le fichier et retournez à l'adresse http://IP_DU_SERVEUR/test.php. Vous devriez avoir une page blanche. C'est normal puisque l'on a interdit la fonction phpinfo dans notre fichier php.ini.

On redémarre Apache :

$ service apache2 restart

Et on supprime le fichier de test :

$ rm /var/www/default/test.php

11 - Installation de MySQL

Là encore j'ai choisi MySQL pour mon confort, libre à vous de choisir ce que vous voulez à la place. On installe le paquet comme suit :

$ aptitude install mysql-server -y

Lors de l'installation, on vous propose un bel écran. Ne paniquez pas, on n'est pas sur Windows, tout est normal. Il faudra indiquer deux fois un mot de passe root (évitez de choisir le même que SSH ^^).

NB : appuyez sur TAB pour vous positionner sur OK et sur Entrée pour valider.

On édite le fichier de configuration :

$ nano /etc/mysql/my.cnf

Et on renseigne les paramètres suivants :

[client]
port = NOUVEAU_PORT_MYSQL
default-character-set=utf8

[mysqld]
port = NOUVEAU_PORT_MYSQL
default_storage_engine = MYISAM
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
#log_bin = /var/log/mysql/mysql-bin.log
#expire_logs_days = 10

[mysql]
default-character-set=utf8

On redémarre MySQL pour prendre en compte les modifications :

$ service mysql restart

12 - Installation de phpMyAdmin

Utiliser MySQL depuis SSh peut vite vous faire perdre la tête. Pour plus de confort, installons phpMyAdmin :

$ aptitude install phpmyadmin -y

Là aussi, une pagaille d'écrans bleus vont apparaitre. Sur le premier, choisissez Apache2 ou Nginx si vous avez installé Nginx.

Il faut ensuite créer un compte et les tables pour phpMyadmin. En écrivant ce tutoriel, je me demande si cela est bien utile vu que je ne les utilise pas. :-)

Si vous choisissez de le faire, renseignez le mot de passe root MySQL et deux fois un autre mot de passe pour phpMyAdmin.

Maintenant que l'installation est terminée, on va cacher notre phpMyAdmin en faisant quelques modifications :

$ nano /etc/phpmyadmin/apache.conf

Remplacez le nom du dossier par un autre dossier de votre choix au niveau de l'Alias :

Alias /NOUVEAU_NOM_PHPMYADMIN /usr/share/phpmyadmin

Enregistrez le fichier et créez le lien symbolique :

ln -s /usr/share/phpmyadmin /var/www/NOUVEAU_NOM_PHPMYADMIN

On va maintenant renforcer la protection de l'accès à nos bases de données. La première opération est de passer par une URL en HTTPS afin que les données ne transitent pas en clair sur le réseau. Tapez les deux lignes suivantes pour activer le mode SSL :

$ a2enmod ssl
$ a2ensite default-ssl

On va maintenant créer les certificats auto-signés. Commencez par vous rendre dans le dossier dédié au SSL :

$ cd /etc/ssl/

On créé maintenant le certificat.key :

$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out certificat.key

Avant de lancer la création du certificat.csr, on récupère le FQDN du serveur (notez-le) :

$ hostname --fqdn

Copiez le résultat affiché à l'écran et mettez le bien au chaud. On s'occupe maintenant du certificat.csr :

$ openssl req -new -key certificat.key -out certificat.csr

Quelques questions vont vous êtres posées, voici un exemple de ce que je renseigne :

Country Name : FR
State or Province Name : France
Locality Name : Paris
Organization Name : NOM_SOCIETE
Organizational Unit Name : CE_QUE_VOUS_VOULEZ
Common Name : HOSTNAME_FQDN
Email Address : VOTRE_EMAIL

Ensuite deux nouvelles questions vous sont posées :

A challenge password []: MOTDEPASSE_CHALLENGE
An optional company name []: NOM_SOCIETE

On termine en créant le certificat.crt :

$ openssl x509 -req -days 365 -in certificat.csr -signkey certificat.key -out certificat.crt

Et on protège nos certificats en exécutant les lignes suivantes :

$ chmod 400 certificat.key
$ chmod 444 certificat.crt

On déplace nos fichiers dans les répertoires respectifs :

$ mv certificat.key private/
$ mv certificat.crt certs/

On peut modifier le fichier de configuration du site SSL :

$ nano /etc/apache2/sites-available/default-ssl

Voici les informations à indiquer dans le fichier :

<VirtualHost IP_DU_SERVEUR:443>
ServerName HOSTNAME_FQDN:443
SSLEngine on
SSLCertificateFile /etc/ssl/certs/certificat.crt
SSLCertificateKeyFile /etc/ssl/private/certificat.key

Enregistrez le fichier et redémarrer Apache :

$ service apache2 restart

On peut vérifier que phpMyAdmin est opérationnel :

https://IP_DU_SERVEUR/NOUVEAU_NOM_PHPMYADMIN/ après avoir accepté et compris les risques.

Connexion non certifiée

Si tout est OK, on se connecte en root à phpMyAdmin et on crée un compte utilisateur avec tous les droits. Comme pour SSH, on interdira par la suite la connexion avec le compte root.

  • Onglet Privilèges
  • Ajouter un utlisateur => NOM_UTILISATEUR, Localhost et le MOT_DE_PASSE (2 fois)
  • Privilèges globaux => Tout cocher

On se déconnecte du compte root et on se connecte avec le nouveau compte pour s'assurer que tout est OK. Si c'est le cas, on ouvre le fichier de configuration de phpMyAdmin :

$ nano /etc/phpmyadmin/config.inc.php

Et on ajoute les deux lignes suivantes à l'intérieur du if (!empty($dbname)) { :

$cfg['Servers'][$i]['AllowRoot'] = false;

Enregistrez le fichier et redémarrez Apache :

$ service apache2 restart

Essayez maintenant de vous connecter en root à phpMyAdmin. Le système doit vous jeter. On termine par sécuriser MySQL en tapant la ligne suivante :

$ mysql_secure_installation
Enter current password for root (enter for none): tapez votre mot de passe root MySQL
Set root password ? N
Remove anonymous users ? Y
Disallow root login remotely ? Y
Remove test database and access to it ? Y
Restart privilege tables now ? Y

13 - Installation de proftpd

Si vous souhaitez héberger plusieurs sites clients ou des sites des copains et leur donner accès au FTP, il faut installer un FTP pou gérer les comptes. J'ai choisi Proftpd :

$ aptitude install proftpd proftpd-mod-mysql -y

Un premier écran bleu, vous demande de choisir entre From inetd et Standalone. Le premier choix ouvrira les accès à Proftpd à la demande afin de limiter l'utilisation des ressources du serveur, le second en permanence. Choisissez Standalone.

Il faudra ensuite taper votre mot de passe root MySQL et à deux reprises le mot de passe dédié à Proftpd. Une fois que l'installation est terminée, allez dans phpMyAdmin pour créer un utilisateur dédié au FTP. Créez ensuite les tables suivantes :

CREATE TABLE IF NOT EXISTS `ftpgroup` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `groupname` varchar(16) NOT NULL,
  `gid` smallint(6) NOT NULL DEFAULT '4001',
  `members` varchar(16) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `ftpquotalimits` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) CHARACTER SET utf8 DEFAULT NULL,
  `quota_type` enum('user','group','class','all') CHARACTER SET utf8 NOT NULL DEFAULT 'user',
  `par_session` enum('false','true') CHARACTER SET utf8 NOT NULL DEFAULT 'false',
  `limit_type` enum('soft','hard') CHARACTER SET utf8 NOT NULL DEFAULT 'soft',
  `bytes_up_limit` float NOT NULL DEFAULT '0',
  `bytes_down_limit` float NOT NULL DEFAULT '0',
  `bytes_transfer_limit` float NOT NULL DEFAULT '0',
  `files_up_limit` int(10) unsigned NOT NULL DEFAULT '0',
  `files_down_limit` int(10) unsigned NOT NULL DEFAULT '0',
  `files_transfer_limit` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `ftpquotatotal` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL DEFAULT '',
  `quota_type` enum('user','group','class','all') NOT NULL DEFAULT 'user',
  `bytes_up_total` float NOT NULL DEFAULT '0',
  `bytes_down_total` float NOT NULL DEFAULT '0',
  `bytes_transfer_total` float NOT NULL DEFAULT '0',
  `files_up_total` int(10) unsigned NOT NULL DEFAULT '0',
  `files_down_total` int(10) unsigned NOT NULL DEFAULT '0',
  `files_transfer_total` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `ftpuser` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` varchar(32) NOT NULL DEFAULT '',
  `passwd` varchar(32) NOT NULL DEFAULT '',
  `uid` smallint(6) NOT NULL DEFAULT '4001',
  `gid` smallint(6) NOT NULL DEFAULT '4001',
  `homedir` varchar(255) NOT NULL DEFAULT '',
  `shell` varchar(16) NOT NULL DEFAULT '/bin/false',
  `count` int(11) NOT NULL DEFAULT '0',
  `accessed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `LoginAllowed` enum('true','false') CHARACTER SET latin1 NOT NULL DEFAULT 'true',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Je vous expliquerais plus tard comment insérer un nouveau compte FTP dans ces tables. On va éviter de multiplier les lignes pour rien. ;)

On ouvre le fichier de configuration de proftdp :

$ nano /etc/proftpd/proftpd.conf

Et on modifie pour obtenir les paramètres suivants :

UseIPv6 off
IdentLookups off
ServerName "NOM_DU_SERVEUR"
ShowSymlinks off

# On limite le nombre de tentatives de login à 5
MaxLoginAttempts                5

DefaultRoot                     ~
RootLogin                       off
RequireValidShell               off

umask                           022

Ensuite, on va ajouter les lignes qui vont nous permettre d'interroger la base de données lors d'une connexion FTP pour nous assurer que les identifiants indiqués sont corrects. Il y a trois infos (en majuscule à modifier) :

# Cryptage
SQLAuthTypes Crypt
SQLAuthenticate users* groups*

# Identifiants de connexion
SQLConnectInfo USER_PROFTPD@localhost DBNAME_PROFTPD MOTDEPASSE_PROFTPD

# Colonnes utilisées pour les utilisateurs
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLUserWhereClause "LoginAllowed = 'true'"

# Colonnes utilisées pour les groupes
SQLGroupInfo ftpgroup groupname gid members

# Mise à jour des compteurs de connexion
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Mise à jour des compteurs de trafic
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# Quota
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

# Requêtes SQL relatives aux quotas
SQLNamedQuery get-quota-limit SELECT "name, quota_type, par_session, limit_type, bytes_up_limit, bytes_down_limit, bytes_transfer_limit, files_up_limit, files_down_limit, files_transfer_limit FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_up_total, bytes_down_total, bytes_transfer_total, files_up_total, files_down_total, files_transfer_total FROM ftpquotatotal WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_up_total = bytes_up_total + %{0}, bytes_down_total = bytes_down_total + %{1}, bytes_transfer_total = bytes_transfer_total + %{2}, files_up_total = files_up_total + %{3}, files_down_total = files_down_total + %{4}, files_transfer_total = files_transfer_total + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatotal
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatotal

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally;

Enregistrez le fichier et ouvrez celui de la configuration des modules de proftpd :

$ nano /etc/proftpd/modules.conf

Il y a deux lignes à décommenter et une à commenter comme ceci :

LoadModule mod_sql.cLoad
Module mod_sql_mysql.c
#LoadModule mod_tls_memcache.c

Enregistrez le fichier et redémarrez proftpd :

$ service proftpd restart

14 - Installation de Postfix, Dovecot et Postfixadmin

C'est sans doute la partie, celle de la gestion des e-mails sur un serveur, où je me suis le plus arraché les cheveux. A un tel point que j'ai failli abandonner pour passer sur Qmail. Ce dernier n'étant plus mis à jour depuis des années, cela m'a permis de poursuivre l'installation de Postfix malgré ma nouvelle calvitie. C'est parti et c'est du lourd. :-)

On installe tous les paquets nécessaires :

$ aptitude install postfix postfix-mysql dovecot-pop3d dovecot-imapd dovecot-mysql dovecot-lmtpd libsasl2-modules libsasl2-modules-sql postfixadmin -y

Encore une fois, plusieurs écrans vous sont proposés. Plutôt que d'afficher toutes les images, je vous propose la liste à suivre :

  • 1er écran : Type de serveur de messagerie => Site Internet
  • 2ème écran : Nom de courrier => HOSTNAME_FQDN
  • 3ème écran : Serveur web => Apache2
  • 4ème écran : Base de données PostfixAdmin => Oui
  • 5ème écran : Type de serveur de BDD => MySQL
  • 6ème écran : Mot de passe administrateur MySQL => MOT_DE_PASSE_ROOT_MYSQL
  • 6ème et 7ème écran : Mot de passe postfixadmin MySQL => MOT_DE_PASSE_POSTFIXADMIN_MYSQL

On édite le fichier de configuration Apache pour Postfix :

$ nano /etc/postfixadmin/apache.conf

Comme pour phpMyAdmin, on va cacher le nom de notre outil de gestion d'e-mails :

Alias /NOUVEAU_NOM_POSTFIXADMIN /usr/share/postfixadmin

On enregistre le fichier et on créé le lien symbolique :

$ ln -s /usr/share/postfixadmin /var/www/NOUVEAU_NOM_POSTFIXADMIN

On édite maintenant le fichier de configuration de Postfix :

$ nano /etc/postfixadmin/config.inc.php

Je vous donne les principales lignes à modifier, à adapter bien sur selon vos besoins :

$CONF['default_language'] = 'fr';
$CONF['postfix_admin_url'] = 'https://IP_DU_SERVEUR/NOUVEAU_NOM_POSTFIXADMIN';

$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'USER_POSTFIXADMIN';
$CONF['database_password'] = 'MOTDEPASSE_POSTFIXADMIN';
$CONF['database_name'] = 'DBNAME_POSTFIXADMIN';
$CONF['database_port'] = 'PORT_MYSQL';

$CONF['admin_email'] = 'VOTRE_EMAIL';
$CONF['smtp_port'] = '25';

'abuse' => 'VOTRE_EMAIL';
'hostmaster' => 'VOTRE_EMAIL';
'postmaster' => 'VOTRE_EMAIL';
'webmaster' => 'VOTRE_EMAIL';

$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';

Enregistrez le fichier et allez à cette adresse :

https://IP_DU_SERVEUR/NOUVEAU_NOM_POSTFIXADMIN/setup.php

Un premier écran liste que tout c'est bien passé. En bas, un formulaire vous propose de crypter le mot de passe de postfixadmin. Copiez-le dans les deux champs pour obtenir le mot de passe crypté. Copiez-le et ouvrez le fichier de configuration :

$ nano /etc/postfixadmin/config.inc.php

Copiez le code dans le champ suivant (sans oublier de supprimer changeme, y'a des têtes en l'air ^^) :

$CONF['setup_password'] = 'changeme';

Enregistrez le fichier et retournez à l'adresse pour créer le super administrateur de Postfix :

https://IP_DU_SERVEUR/NOUVEAU_NOM_POSTFIXADMIN/setup.php

Une fois que le compte est crée, pour vous connecter à l'adresse :

https://IP_DU_SERVEUR/NOUVEAU_NOM_POSTFIXADMIN/

Si vous souhaitez personnaliser le fichier de styles pour le rendre plus sexy, éditez le fichier suivant :

$ nano /usr/share/postfixadmin/css/default.css

Pour modifier les textes ou corriger les fautes d'orthographe, c'est ce fichier :

$ nano /usr/share/postfixadmin/languages/fr.lang

Nous allons maintenant créer un groupe et un utilisateur dédié aux e-mails :

$ groupadd -g 5000 vmail
$ useradd -d /var/vmail -m -u 5000 -g 5000 vmail

Ensuite, on crée le dossier et les permissions de celui-ci :

$ mkdir -p /var/vmail
$ chown -R vmail:vmail /var/vmail

On peut maintenant éditer le fichier de main de Postfix :

$ nano /etc/postfix/main.cf

Décommentez la ligne suivante et modifiez le temps de la file d'attente :

delay_warning_time = 1h

Modifiez les lignes ci-après :

smtpd_tls_cert_file = /etc/ssl/certs/certificat.crt
smtpd_tls_key_file  = /etc/ssl/private/certificat.key

En dessous de :

$ myhostname = HOSTNAME_FQDN

Ajoutez :

$ mail_name = postmaster@HOSTNAME_FQDN

Remplacez :

$ myorigin = /etc/mailname

Par :

# Modif pour Postgrey$ myorigin = $myhostname

En dessous de :

inet_interfaces = all

Ajoutez :

inet_protocols = ipv4<br>local_recipient_maps =

Ensuite vous pouvez ajouter toutes les informations qui suivent :

# Utilisateurs et chemin
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_mailbox_base = /var/vmail

# Fichiers MySQL
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

# Transport
virtual_transport = lmtp:unix:private/dovecot-lmtp

# Regles sur les adresses de destination
smtpd_recipient_restrictions =
     permit_mynetworks,
     permit_sasl_authenticated,
     reject_non_fqdn_recipient,
     reject_unauth_destination,
     reject_unknown_recipient_domain

# Regles avant la connexion
smtpd_helo_restrictions =
     permit_mynetworks,
     permit_sasl_authenticated

# Regles de connexion des clients
smtpd_client_restrictions =
     permit_mynetworks,
     permit_inet_interfaces,
     permit_sasl_authenticated

# Regles sur les expéditeurs
smtpd_sender_restrictions =
     reject_non_fqdn_sender,
     reject_unknown_sender_domain

# TLS
smtpd_tls_auth_only = no
smtpd_tls_security_level = may

# Parametres de connexion SASL
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_authenticated_header = yes

Enregistrez le fichier et créez le fichier :

$ nano /etc/postfix/mysql-virtual-mailbox-domains.cf

Dans lequel vous ajoutez le code suivant :

hosts = 127.0.0.1:PORT_MYSQL
user = USER_POSTFIXADMIN
password = PASSWORD_POSTFIXADMIN
dbname = DBNAME_POSTFIXADMIN
query = SELECT domain FROM domain WHERE domain='%s'

Enregistrez le fichier et créez le fichier :

$ nano /etc/postfix/mysql-virtual-mailbox-maps.cf

Copiez le code suivant :

hosts = 127.0.0.1:PORT_MYSQL
user = USER_POSTFIXADMIN
password = PASSWORD_POSTFIXADMIN
dbname = DBNAME_POSTFIXADMIN
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

Enregistrez le fichier et créez le fichier :

$ nano /etc/postfix/mysql-virtual-alias-maps.cf

Copiez le code suivant :

hosts = 127.0.0.1:PORT_MYSQL
user = USER_POSTFIXADMIN
password = PASSWORD_POSTFIXADMIN
dbname = DBNAME_POSTFIXADMIN
query = SELECT goto FROM alias WHERE address='%s' AND active = 1

On protège ces 3 fichiers en limitant l'accès au groupe Postfix :

$ chmod 640 /etc/postfix/mysql-*
$ chgrp postfix /etc/postfix/mysql-*

Editez le fichier suivant :

$ nano /etc/postfix/master.cf

Décommentez les lignes suivantes :

submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Enregistrez le fichier et ouvrez :

$ nano /etc/dovecot/dovecot.conf

Modifiez les paramètres comme suit :

!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp
listen = *
!include conf.d/*.conf

Enregistrez le fichier et ouvrez le suivant :

$ nano /etc/dovecot/dovecot-mysql.conf.ext

Copiez le code :

driver = mysql
connect = host=127.0.0.1 dbname=DBNAME_POSTFIXADMIN user=USER_POSTFIXADMIN password=PASSWORD_POSTFIXADMIN
default_pass_scheme = MD5-CRYPT
user_query = SELECT '/var/vmail/%d/%n' as var, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u'
password_query = SELECT password FROM mailbox WHERE username = '%u'

Enregistre le fichier et passez au suivant :

$ nano /etc/dovecot/conf.d/10-auth.conf

Modifiez pour avoir les paramètres suivants :

disable_plaintext_auth = yes
auth_mechanisms = plain login
#!include auth-system.conf.ext
!include auth-sql.conf.ext

Enregistrez le fichier et ouvrez :

$ nano /etc/dovecot/conf.d/10-mail.conf

Apportez les modifications suivantes (décommentez si nécessaire) :

mail_location = maildir:/var/vmail/%d/%n
mail_privileged_group = vmail

Enregistrez et ouvrez le fichier ci-dessous :

$ nano /etc/dovecot/conf.d/10-ssl.conf

Modifiez le fichier comme suit :

ssl = required
# Attention de bien conserver le <
ssl_cert = </etc/ssl/certs/certificat.crt
ssl_key = </etc/ssl/private/certificat.key

Enregistrez le fichier et passez au suivant :

$ nano /etc/dovecot/conf.d/20-imap.conf

Une toute petite modification à apporter :

mail_max_userip_connections = 10

Enregistrez et ouvrez :

$ nano /etc/dovecot/conf.d/auth-sql.conf.ext

Pour obtenir la configuration suivante :

passdb {
  driver = sql
  # Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}

Enregistrez ce fichier et passez au suivant :

$ nano /etc/dovecot/conf.d/10-master.conf

Voici mes réglages :

inet_listener imap {
  #port = 143
}
inet_listener imaps {
  port = 993
  ssl = yes
}
inet_listener pop3 {
  #port = 110
}
inet_listener pop3s {
  port = 995
  ssl = yes
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}
service auth {
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  # On indique à Dovecot les permissions du conteneur local
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }
  user = dovecot
}
service auth-worker {
  user = vmail
}

Enregistrez ce fichier et ouvrez le petit dernier (ouf ^^) :

$ nano /etc/dovecot/dovecot-sql.conf.ext

Apportez les modifications suivantes :

driver = mysql
connect = host=127.0.0.1 dbname=DBNAME_POSTFIXADMIN user=USER_POSTFIXADMIN password=PASSWORD_POSTFIXADMIN
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'

Enregistrez le fichier et limitez l'accès des e-mails à Dovecot comme suit :

$ chown -R vmail:dovecot /etc/dovecot
$ chmod -R o-rwx /etc/dovecot

On redémarre les services :

$ service dovecot restart
$ service postfix restart

Vous pouvez maintenant vous connecter à Postfixadmin pour gérer les administrateurs, les domaines, les e-mails et les redirections.

Voilà, le gros morceau est terminé. On a tous mérité une petite pause pour se boire un café. Elle sera salvatrice car ce n'est pas encore terminé. :-)

15 - Installation de suphp

Ces deux services permettent d'enfermer les fichiers d'un site dans un espace confiné. Autrement dit, seul l'utilisateur autorisé pourra agir sur les fichiers de son compte FTP. De fait, si une personne parvient à profiter d'une faille dans un script php, son accès sera limité au dossier du site sans pourvoir accéder aux autres fichiers du serveur.

On installe suexec et suphp comme suit :

$ aptitude install apache2-suexec-custom libapache2-mod-suphp -y

Et on commence le paramétrage :

$ nano /etc/apache2/suexec/www-data

Vérifiez que les deux premières lignes comme suit :

/home/

Enregistrez le fichier et passez à la suite :

$ nano /etc/suphp/suphp.conf

Indiquez les principaux réglages comme suit :

loglevel=error
docroot=/var/www:/${HOME}:/usr/share/phpmyadmin:/usr/share/postfixadmin
check_vhost_docroot=false
umask=0022
min_uid=33
min_gid=33

Enregistrez le fichiez et ouvrez le suivant :

$ nano /etc/apache2/mods-enabled/suphp.conf

Ajouter le contenu suivant :

<IfModule mod_suphp.c>
    AddType application/x-httpd-suphp .php .php3 .php4 .php5 .phtml
    suPHP_AddHandler application/x-httpd-suphp    suPHP_Engine on
</IfModule>

Enregistrez le fichiez et exécutez les commandes suivantes pour désactiver PHP 5 et passer le relais à suphp :

$ a2dismod php5
$ a2enmod suexec
$ a2enmod suphp

Il faut à présent copier le fichier de configuration de PHP pour suphp. On fait une sauvegarde par sécurité avec la commande mv :

$ mv /etc/php5/cgi/php.ini /etc/php5/cgi/php.ini-old
$ cp /etc/php5/apache2/php.ini /etc/php5/cgi/php.ini

On ouvre le fichier de configuration de PHP-CGI :

$ nano /etc/php5/cgi/php.ini

Pour éviter l'affichage de messages d'erreur sur les sessions, on recherche la ligne session.save_path et on ajoute juste en dessous :

session.save_path = "/tmp"

Les modifications sont en place et nos sites seront confinés à leur espace. Il reste à modifier le propriétaire des fichiers de phpMyAdmin et Postfixadmin car ils ne fonctionnent plus avec cette configuration.

$ chown -R www-data:www-data /usr/share/phpmyadmin
$ chown -R www-data:www-data /usr/share/postfixadmin

On redémarre Apache :

$ service apache2 restart

Le module est prêt à l'emploi et vous devriez avoir de nouveau accès à phpMyadmin et Postfixadmin. Nous verrons plus bas comment l'intégrer aux noms de domaine.

16 - Installation de Spamassassin, Clamav et Postgrey

Le spam et les virus, tout le monde connait. Pour les réduire, on installe les paquets comme suit :

$ aptitude install clamav clamav-daemon clamav-freshclam spamassassin spamc postgrey -y

Avant de lancer Clamav, il faut effectuer la mise à jour de la base virale :

$ freshclam

Et on lance le service :

$ service clamav-daemon start

Pour lancer un scan, tapez la commande suivante par exemple :

$ clamscan -i -r /var/www

On doit apporter une modification au fichier de configuration de Postfix :

$ nano /etc/postfix/master.cf

Modifiez comme suit :

smtp      inet  n       -       -       -       -  smtpd
  -o content_filter=spamassassin
#smtp      inet n      -      -      -      1      postscreen
#smtpd     pass -      -      -      -      -      smtpd
#dnsblog   unix -      -      -      -      0      dnsblog
#tlsproxy  unix -      -      -      -      0      tlsproxy
submission inet n       -       -       -       -  smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o content_filter=spamassassin

Tout en bas du fichier, ajoutez :

spamassassin unix -     n       n       -       -       pipe
  user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Enregistrez le fichier et ouvrez le fichier de configuration de spamassasin :

$ nano /etc/spamassassin/local.cf

Modifiez les paramètres comme ci-dessous :

rewrite_header Subject *****SPAM*****
report_safe 0
required_score 3.0
use_bayes 1
bayes_auto_learn 1

On enregistre le fichier et on en profite pour modifier le fichier spamassassin :

$ nano /etc/default/spamassassin

Il y a deux infos à modifier pour la MAJ automatique de la base de données de spamassassin :

ENABLED=1CRON=1

On enregistre et on démarre le service :

$ service spamassassin start

Ouvrez le fichier suivant :

$ nano /etc/default/postgrey

Remplacez la ligne par celle ci-dessous :

POSTGREY_OPTS="--inet=127.0.0.1:10023 --delay=60 --hostname=HOSTNAME_FQDN --auto-whitelist-clients"

Enregistrez et ouvrez le fichier :

$ nano /etc/postfix/main.cf

Remplacez :

     reject_unknown_recipient_domain

Par :

     reject_unknown_recipient_domain,
     reject_unauth_pipelining,
     check_policy_service inet:127.0.0.1:10023,
     reject_invalid_hostname

Enregistrez le fichier et redémarrez les services :

$ service clamav-daemon restart
$ service postfix restart
$ service postgrey restart

17 - Gestion des tâches cron

On profite de l'installation de spamassasin pour porter un regard sur les tâches cron. Sur Debian, chaque fichier est propre à l'utilisateur connecté. Pour ajouter des règles dans le fichier, il suffit de taper :

$ crontab -e

Un fichier temporaire est ouvert dans lequel on va placer nos règles. On commence par copier les lignes suivantes (reprise du fichier /etc/crontab) avant d'aller plus loin (nécessaire pour apticron par exemple) :

# Laisser à vide pour ne pas envoyer de mail après chaque tâche cron
MAILTO=""

# m h dom mon dow command
17 * * * * root cd / && run-parts --report /etc/cron.hourly2
5 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

On place la règle de MAJ de Spamassassin en dessous :

# Mise à jour de spamassassin
0 2 * * * /usr/bin/sa-update -v

Et une autre pour Clamav :

# Scan Clamav
0 3 * * * clamscan -i -r /var/www

On enregistre le fichier. Je vous conseille de conserver une copie locale de ces données. Un simple copier-coller dans un fichier texte suffit.

Pour modifier le fichier, il suffira de l'éditer comme ceci :

$ crontab -e

18 - Installation d'iptables

iptables est le service qui permet d'autoriser les entrées et les sorties sur les ports du serveur. On installe donc le service comme suit :

$ aptitude install iptables -y

On crée les règles d'iptables comme suit et c'est à adapter en fonction de votre configuration ou de vos besoins :

$ nano /etc/init.d/firewall

Voici la configuration que je vous propose dans laquelle il y a quelques modifications à apporter (SSH, MYSQL et monitoring du serveur) :

### Infos
# Provides:          firewall
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Demarrage du script du firewall
# Description:       Regles du firewall
### Fin Infos

#!/bin/sh
case "$1" in
start) ########## Initialisation ########## # Vidage des tables iptables -t filter -F iptables -t filter -X # Interdire toutes connexions entrantes et sortantes iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT DROP # Ne pas casser les connexions etablies iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ########## Regles ########## # Trafic local iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT # Ping iptables -t filter -A INPUT -p icmp -j ACCEPT iptables -t filter -A OUTPUT -p icmp -j ACCEPT # SSH iptables -t filter -A INPUT -p tcp --dport PORT_SSH -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport PORT_SSH -j ACCEPT # DNS iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT # NTP iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT # FTP modprobe ip_conntrack modprobe ip_conntrack_ftp iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # FTP passif iptables -A OUTPUT -o eth0 -p tcp --dport 1024:65535 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # HTTP iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT # HTTPS iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT # MYSQL iptables -t filter -A INPUT -p tcp --dport PORT_MYSQL -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport PORT_MYSQL -j ACCEPT # SMTP iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT # POP3 iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT # IMAP iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT # SMTPS iptables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT # IMAPS iptables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT # POP3S iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT # Postgrey iptables -t filter -A INPUT -p tcp --dport 10023 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 10023 -j ACCEPT # Monitoring du serveur iptables -A INPUT -i eth0 -s 3_PREMIERS_BLOCS_IP_DU_SERVEUR.0/24 -p tcp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -s 3_PREMIERS_BLOCS_IP_DU_SERVEUR.0/24 -p udp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -d 3_PREMIERS_BLOCS_IP_DU_SERVEUR.0/24 -p tcp --sport 161 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -d 3_PREMIERS_BLOCS_IP_DU_SERVEUR.0/24 -p udp --sport 161 -m state --state ESTABLISHED -j ACCEPT # Flood iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT iptables -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT # Scan de ports iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT # Monit iptables -t filter -A INPUT -p tcp --dport PORT_MONIT -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport PORT_MONIT -j ACCEPT echo Firewall start ;;
status) echo - Liste des regles :
iptables -L ;;
stop) # Vidage des tables iptables -t filter -F iptables -t filter -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT echo Firewall stop
;; esac exit 0

Vous enregistrez le fichier et vous le rendez exécutable :

$ chmod +x /etc/init.d/firewall

On peut démarrer le service :

$ /etc/init.d/firewall start

Et l'ajouter à la séquence de boot du serveur :

$ update-rc.d firewall defaults

A savoir :

# Pour démarrer iptables
$ /etc/init.d/firewall start

# Pour arrêter iptables
$ /etc/init.d/firewall stop

# Pour lister la configuration d'iptables
$ /etc/init.d/firewall status

Si vous n'utilisez pas IPV6, autant le désactiver. Commencez par vérifier s'il est activé :

$ more /proc/net/if_inet6

Normalement cela doit vous retourner les infos comme ceci (s'il n'y aucun résultat, IPV6 est désactivé) :

fe80000000000000b283fefffec18bdb 02 40 20 80     eth000000000000000000000000000000001 01 80 10 80       lo

Ouvrez le fichier :

$ nano /etc/sysctl.conf

Et ajoutez les lignes suivantes :

# Désactivation des interfaces
net.ipv6.conf.all.disable_ipv6 = 1
# Désactivation de l'auto configuration des interfaces
net.ipv6.conf.all.autoconf = 0
# Désactivation des nouvelles interfaces
net.ipv6.conf.default.disable_ipv6 = 1
# Désactivation de l'auto configuration des nouvelles interfaces
net.ipv6.conf.default.autoconf = 0

Activez la configuration :

$ sysctl -p

Faites de nouveau le test qui doit vous retourner cette fois aucun résultat.

$ more /proc/net/if_inet6

NB : Si vous rencontrez un souci sur le fonctionnement d'un paquet, commencez par stopper iptables pour vérifier que l'une des règles n'est pas bloquante ou absente. J'ai rencontré un problème de sauvegarde avec un script bash, et c'est iptables qui me bloquait. J'ai cherché deux bonnes heures avant de penser à stopper ce service.

19 - Installation de fail2ban

Maintenant que l'on a déterminé quels ports pouvaient être écoutés, on va s'attacher à bannir les connexions un peu trop persistantes. Pour ce faire, on installe fail2ban :

$ aptitude install fail2ban -y

On ouvre le fichier de configuration :

$ nano /etc/fail2ban/jail.conf

Et on modifie selon ses besoins :

ignoreip = 127.0.0.1 3_PREMIERS_BLOCS_IP_DU_SERVEUR.0/24 8.8.8.8
bantime  = 600
action = %(action_mw)s

[ssh]
enabled = true
port = PORT_SSH
filter = sshd
logpath = /var/log/auth.log
maxretry = 6

[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 6
...

Enregistrez le fichier et redémarrez le service

$ service fail2ban restart

Si vous souhaitez aller plus loin, je vous invite à lire la doc de Fail2ban : http://www.fail2ban.org/wiki/index.php/FAQ_french

20 - Installation de Portsentry

Cet outil permet de surveiller le scan des ports du serveur. On l'installe comme ceci :

$ aptitude install portsentry -y

On ouvre le fichier de configuration :

$ nano /etc/portsentry/portsentry.conf

Décommentez la ligne suivante afin de bloquer le scan via iptables :

KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"

Puis vérifiez que toutes les lignes commençant par KILL_HOSTS_DENY sont commentées :

#KILL_HOSTS_DENY="ALL: $TARGET$"
#KILL_HOSTS_DENY="ALL: $TARGET$ : DENY"

On peut ensuite lancer le service :

$ portsentry –audp
$ portsentry –atcp

21 - Installation de Rkhunter

Cet utilitaire permet de surveiller le système et d'envoyer des mails d'alerte si un fichier système à été modifié. Attention, il se peut que vous ayez de temps en temps des faux positifs.

Pour l'installer :

$ aptitude install rkhunter -y

Éditez le fichier de configuration :

$ nano /etc/default/rkhunter

Apportez les modifications suivantes :

CRON_DAILY_RUN="yes"
REPORT_EMAIL="VOTRE-EMAIL"

Enregistrez le fichier.

22 - Configuration de Bind

Voilà un autre gros morceau qui mérite une attention particulière. J'ai toujours géré les noms de domaine avec Bind via les VirtualHost. Je continue donc à faire la même chose. Pour cela, il est nécessaire d'apporter quelques modifications pour la gestion des DNS. Dans le cas contraire, la galère est assurée pour transférer ou installer des noms de domaine. :-)

On commence par récupérer les infos du hostname qu'il faut noter :

$ hostname
$ hostname --fqdn

On ouvre le fichier de configuration du host :

$ nano /etc/host.conf

Au début du fichier, ajoutez :

order hosts, bind

Enregsitrez le fichier et ouvrez celui des hosts :

$ nano /etc/hosts

Remplacez la ligne (la seconde normalement) :

127.0.0.1   HOSTNAME_FQDN HOSTNAME

Par :

IP_DU_SERVEUR   HOSTNAME_FQDN HOSTNAME

Enregistrez le fichier et rendez-vous dans votre console Online pour modifier le reverse. Dans le champ, indiquez le hostname --fqdn, à savoir HOSTNAME_FQDN. (avec un point à la fin).

Ouvrez le fichier suivant :

$ nano /etc/resolv.conf

Au dessus des deux nameserver, ajoutez la ligne :

nameserver IP_DU_SERVEUR

Enregistrez le fichier. Copiez la commande suivante pour créer un nouveau fichier afin de paramétrer le reverse sur le serveur :

$ cp /etc/bind/db.127 /etc/bind/db.3_PREMIERS_BLOC_IP_INVERSE.in-addr.arpa

Ouvrez le fichier qui vient d'être créé :

$ nano /etc/bind/db.3_PREMIERS_BLOC_IP_INVERSE.in-addr.arpa

Et remplacez les infos comme suit :

$TTL    10800@       IN      SOA     HOSTNAME_FQDN. postmaster.HOSTNAME_FQDN. (                              1         ; Serial                          10800         ; Refresh                          86400         ; Retry                        2419200         ; Expire                          10800 )       ; Negative Cache TTL;3_PREMIERS_BLOC_IP_INVERSE.in-addr.arpa.        IN      NS      DNS_1.3_PREMIERS_BLOC_IP_INVERSE.in-addr.arpa.        IN      NS      DNS_2.220                               IN      PTR     HOSTNAME_FQDN.

Ouvrez le fichier de configuration de named.local :

$ nano /etc/bind/named.conf.local

On va renseigner les informations de notre reverse comme ceci :

zone "3_PREMIERS_BLOC_IP_INVERSE.in-addr.arpa" {
     type master;
     file "/etc/bind/db.3_PREMIERS_BLOC_IP_INVERSE.in-addr.arpa";
     forwarders {};
};

Enregistrez le fichier et ouvrez celui de la configuration des options de named :

$ nano /etc/bind/named.conf.options

Dans ce fichier, on va indiquer les DNS de Google pour accélérer la résolution. Il faut décommenter la zone et remplacer l'IP et on ajoute 3 nouveaux paramètres avant la fermeture par ;} :

forwarders {
    8.8.8.8;
};

listen-on port 53 {any;};
allow-recursion {127.0.0.1;};
version none;

Enregistrez le fichier et redémarrez Bind pour la prise en compte des modifications :

$ /etc/init.d/bind9 restart

Pour tester la bonne configuration, tapez la commande suivante :

$ nslookup IP_DU_SERVEUR

Vous devriez avoir un message qui ressemble à ceci :

Server:     IP_ONLINE
Address:    IP_ONLINE#53

Non-authoritative answer:
IP_INVERSE.in-addr.arpa
name = HOSTNAME_FQDN.

Authoritative answers can be found from:
3_PREMIERS_BLOC_IP_INVERSE.in-addr.arpa
nameserver = DNS_1_ONLINE.
3_PREMIERS_BLOC_IP_INVERSE.in-addr.arpa
nameserver = DNS_2_ONLINE.

Il est important de tester votre configuration de Bind. Pour cela, utilisez cet outil qui vous aidera à détecter les éventuelles erreurs : http://mxtoolbox.com/

Je vous invite à tester un nom de domaine sur les points suivants afin de n'avoir aucune erreur :

  • DNS Check
  • Test Email Server

NB : pour les tests, je vous recommande d'arrêter le firewall (iptables). Ce type de services envoi beaucoup de requêtes sur le serveur en quelques secondes et il est automatiquement banni. Une fois les tests effectués, pensez à réactiver le firewall.

23 - Gestion des noms de domaines

Cette partie vous explique comment installer un nom de domaine. Il se résume en plusieurs étapes :

  • Création d'un groupe et d'un utilisateur
  • Insertion des paramètres FTP dans MySQL
  • Création des fichiers de configuration
  • Ajout d'un domaine et d'une adresse e-mail dans PostfixAdmin
  • Exemple de configuration d'un client e-mail
  • Utilisation d'un certificat SSL
  • Mise en place d'un système de vacation

Création d'un groupe et d'un utilisateur

Comme expliqué dans la section suphp, il faut créer un groupe pour l'ensemble des noms de domaine et un utilisateur propre à un site. De cette manière, il pourra exécuter des commandes php. On commence par créer un groupe (GID 3001) :

$ groupadd -g 3001 NOM_GROUPE

On ajoute un utilisateur (on commence avec l'UID 3002) rattaché à ce groupe (GID 3001) et on crée son dossier en même temps dans le répertoire home :

$ useradd -d /home/DOSSIER -m -u 3002 -g 3001 NOM_UTILISATEUR

NB : pour chaque nouveau site (ou nom de domaine) à installer, il faudra incrémenter le numéro d'utilisateur (UID) : 3002, 3003, 3004, etc. Le groupe sera toujours 3001.

Nous allons pouvoir utiliser ces informations dans la configuration ci-dessous.

Insertion des données FTP dans MySQL

On créée le compte FTP dans MySQL. Pour ce faire copiez les requêtes suivantes dans phpMyAdmin :

INSERT INTO ftpgroup (groupname, members) VALUES ('NOM_GROUPE', 'NOM_UTILISATEUR');
INSERT INTO ftpuser (id, userid, passwd, uid, gid, homedir, shell, count, accessed, modified, LoginAllowed) VALUES ('', 'NOM_UTILISATEUR', ENCRYPT('MOTDEPASSE_EN_CLAIR'), '3002', '3001', '/var/www/DOSSIER/', '/bin/false', '0', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'true');
INSERT INTO ftpquotatotal (name, bytes_up_total) VALUES ('NOM_UTILISATEUR', 'QUOTA_MO');

Création des fichiers de configuration

On commence par ouvrir le fichier de configuration locale de named :

$ nano /etc/bind/named.conf.local

Si vous souhaitez gérer les zones du nom de domaine directement sur le site de l'hébergeur, cette modification n'est pas nécessaire. Dans le cas contraire, vous y insérez les informations suivantes en bas du fichier :

zone "DOMAINE.COM" {
    type master;
    file "/etc/bind/db.DOMAINE.COM";
    forwarders {};
};

Vous enregistrez le fichier et créez le fichier du site :

$ nano /etc/apache2/sites-available/DOMAINE.COM

Vous copiez le code ci-dessous en apportant les modifications nécessaires :

# VirtualHost DOMAINE.COM
<VirtualHost IP_DU_SERVEUR:80>
    # Email admin
    ServerAdmin postmaster@DOMAINE.COM
    # Adresse du site
    ServerName  www.DOMAINE.COM
    # Alias du site
    ServerAlias DOMAINE.COM
    # Chemin du site
    DocumentRoot /home/DOSSIER/www
    # Options du site
    <Directory /home/DOSSIER/www/>
        Options -Indexes +FollowSymLinks
        Order allow,deny
        allow from all
        # Si besoin
        RewriteBase /
    </Directory>
    # Logs erreurs
    ErrorLog /var/log/apache2/DOMAINE.COM-error.log
    # Logs acces
    TransferLog /var/log/apache2/DOMAINE.COM-access.log
    # Droits modifs (suphp)
    SuexecUserGroup NOM_UTILISATEUR NOM_GROUPE
</VirtualHost>

Enregistrez le fichier et terminez en créant le fichier de configuration des DNS du site :

$ nano /etc/bind/db.DOMAINE.COM

Là aussi, si vous gérez les zones ci-dessous chez votre hébergeur de noms de domaine, inutile de vous en préoccuper. Il faudra indiquer l'IP du serveur dans les champs appropriés. Sinon, copiez le contenu ci-dessous et apportez les modifications nécessaires :

$ttl 10800@   IN      SOA     HOSTNAME_FQDN. postmaster.DOMAINE.COM. (
                      2015020901 // A incrémenter d'un chiffre à chaque modif
                      21600
                      3600
                      604800
                      10800 )

              IN      NS      DNS_1.
              IN      NS      DNS_2.
              IN      MX      10 mail.DOMAINE.COM.
              IN      A       IP_DU_SERVEUR
www           IN      A       IP_DU_SERVEUR
mail          IN      A       IP_DU_SERVEUR
smtp          IN      A       IP_DU_SERVEUR
pop           IN      A       IP_DU_SERVEUR
pop3          IN      A       IP_DU_SERVEUR
imap          IN      A       IP_DU_SERVEUR
sql           IN      A       IP_DU_SERVEUR
mysql         IN      A       IP_DU_SERVEUR

DOMAINE.COM. IN TXT "v=spf1 ip4:IP_DU_SERVEUR ~all"

Enregistrez le fichier et activez le site :

$ a2ensite DOMAINE.COM

Si vous gérez la zone DNS chez votre hébergeur, il faut modifier le fichier de configuration locale de named :

$ nano /etc/bind/named.conf.local

Et commentez la zone de votre domaine :

#zone "DOMAINE.COM" {
    #type master;
    #file "/etc/bind/db.DOMAINE.COM";
    #forwarders {};
#};

Vous pouvez maintenant redémarrer les services :

$ service apache2 restart
$ service bind9 restart

Pour tester la conformité de la configuration du domaine (doit vous retourner OK) :

$ named-checkzone DOMAINE.COM /etc/bind/db.DOMAINE.COM

La dernière étape consiste à vous rendre dans votre console Online et d'ajouter le domaine aux DNS secondaires.

Ajout d'un domaine et d'une adresse e-mail dans PostfixAdmin

La première étape consiste à créer le dossier sur le serveur et lui donner les bons droits :

$ mkdir -p /var/vmail/DOSSIER.COM
$ chown -R vmail:vmail /var/vmail/DOMAINE.COM

Ensuite, rendez-vous dans Postfixadmin et créez le domaine dans la section appropriée. Si vous souhaitez déléguer la gestion des e-mails à votre client, créez-lui un compte administrateur rattaché à ce domaine uniquement.

Vous pouvez ensuite créer les adresses e-mails.

Exemple de configuration d'un client e-mail

Je vous montre en image un exemple de configuration que j'ai mis en place.

Configuration POP ou IMAP d'un compte e-mail

Configuration SMTP d'un compte e-mail

Lorsque vous vous connecterez la première fois en POP ou en IMAP, vous devrez accepter le certificat. Il en sera de même lors du premier envoi d'un e-mail via SMTP.

Utilisation d'un certificat SSL

Si votre serveur gère les e-mails de plusieurs noms de domaine (vos clients par exemple), je vous conseille d'utiliser un certificat signé tel que le propose le site http://www.certificats-ssl.com/. Quitte à choisir, prenez le certificat Comodo Essential Wildcard. Ainsi vous pourrez également mettre un webmail en sous-domaine.

J'ai rencontré beaucoup de soucis principalement avec Outlook qui ne conservait pas les informations du certificat et affichait une fenêtre demandant de l'accepter à chaque ouverture du logiciel.

Nous partons du principe que vous achetez le certificat SSL pour domaine1.com (assurez-vous que ce soit un domaine dont vous êtes le propriétaire). Il servira pour tous les domaines installés sur le serveur (domaine2.com, domaine3.com, domaine4.com, etc.).

Voici un exemple de configuration POP avec Outlook :

Serveur de courrier entrant : pop.domaine1.com
Serveur de courrier sortant : smtp.domaine1.com
Utilisateur : email@domaine2.com
Serveur entrant (POP) : 995
Cocher la case Ce serveur nécessite une connexion chiffrée (SSL)
Serveur sortant (SMTP) : 587
Utiliser le type de connexion chiffré suivant : Automatique

Et un exemple de configuration IMAP avec Outlook :

Serveur de courrier entrant : imap.domaine1.com
Serveur de courrier sortant : smtp.domaine1.com
Utilisateur : email@domaine2.com
Serveur entrant (POP) : 993
Utiliser le type de connexion chiffré suivant : SSL
Serveur sortant (SMTP) : 587
Utiliser le type de connexion chiffré suivant : TLS

Si vous optez pour ce choix, pensez à modifier le nom des certificats dans les paramètres de Postfix et Dovecot indiqués plus haut dans le tutoriel.

Mise en place d'un système de vacation

Lorsque vous partez en vacances, vous aimeriez envoyer un message automatique en réponse. Voici comment procéder. On commence par ajouter un utilisateur :

$ useradd vacation

On créé ensuite le dossier et on règle les droits et permissions sur celui-ci :

$ mkdir /var/spool/vacation
$ chown -R vacation:vacation /var/spool/vacation
$ chmod -R 700 /var/spool/vacation

Il faut maintenant extraire le fichier vacation.pl qui se trouve dans la doc de Postfixadmin. On copie le fichier dans le dossier que nous venons de créer :

$ cp /usr/share/doc/postfixadmin/examples/VIRTUAL_VACATION/vacation.pl.gz /var/spool/vacation/

On extrait le fichier compressé :

$ gunzip /var/spool/vacation/vacation.pl.gz

On peut maintenant l'ouvrir :

$ nano /var/spool/vacation/vacation.pl

Modifiez les champs suivants :

#our $db_type = 'Pg';
our $db_type = 'mysql';
our $db_username = 'USER_POSTFIXADMIN';
our $db_password = 'MOTDEPASSE_POSTFIXADMIN';
our $db_name     = 'DBNAME_POSTFIXADMIN';
our $vacation_domain = 'autoreply.HOSTNAME_FQDN';

Enregistrez le fichier et rendez-le exécutable :

$ chmod +x /var/spool/vacation/vacation.pl

Modifiez l'utilisateur et le groupe :

$ chown -R vacation:vacation /var/spool/vacation

On va maintenant installer les paquets nécessaires au fonctionnement du service de vacation :

$ aptitude install libmail-sender-perl libmail-sendmail-perl libmailtools-perl libdbd-mysql-perl libemail-valid-perl libmime-perl liblog-log4perl-perl liblog-dispatch-perl libgetopt-argvfile-perl libmime-charset-perl libmime-encwords-perl

On peut commencer la configuration. Ouvrez le premier fichier :

$ nano /etc/postfix/master.cf

Tout en bas, ajoutez :

vacation    unix  -       n       n       -       -       pipe
  flags=DRhu user=vacation argv=/var/spool/vacation/vacation.pl -f ${sender} ${recipient}

Enregistrez le fichier et ouvrez le suivant :

$ nano /etc/postfix/main.cf

Ajoutez :

# Transport vacation
transport_maps = hash:/etc/postfix/transport
vacation_destination_recipient_limit = 1

Il faut maintenant créer le fichier de transport des e-mails par vacation :

$ nano /etc/postfix/transport

Ajoutez le contenu suivant :

autoreply.HOSTNAME_FQDN   vacation:

Enregistrez le fichier et activez-le :

postmap /etc/postfix/transport

Ouvrez le fichier suivant :

$ nano /etc/postfixadmin/config.inc.php

Modifiez les paramètres comme suit :

$CONF['vacation'] = 'YES';
$CONF['vacation_domain'] = 'autoreply.HOSTNAME_FQDN';

Enregistrez le fichier et redémarrez les services :

$ service postfix restart
$ service dovecot restart

Il vous suffit de vous rendre dans Postfixadmin pour activer le message de vacation pour l'adresse e-mail concernée et effectuer les tests. Pensez à regarder le log des e-mails pour vous assurer que tout est OK :

$ nano /var/log/mail.log

Vous devriez y trouver une info comme celle-ci :

status=sent (delivered via vacation service)

24 - Mise en place des sauvegardes

C'est la partie à ne pas oublier. En cas de crash d'une base de données ou d'une suppression accidentelle de fichiers, il faut pouvoir restaurer rapidement les données.

Personnellement, j'utilise mes propres scripts pour sauvegarder le serveur. Je m'attache à faire un backup des sites, des bases de données et du système tous les jours. La sauvegarde des e-mails se fait toutes les semaines.

Pour la petite info, il y a Backup-Manager qui est un très bon outil de sauvegarde automatique. Il est facilement configurable et semble avoir une très bonne réputation.

25 - Outils de monitoring

Suite à quelques demandes, je rajoute deux outils de monitoring. Le premier pour surveiller l'était des services du serveur, le deuxième pour les logs.

Installation de Monit

Comme indiqué, il est important de surveiller les services du serveur. Monit est l'outil idéal pour le faire puisqu'il offre une interface web très pratique. C'est parti pour l'installation.

$ aptitude install monit -y

On peut ouvrir le fichier de configuration. La plupart des lignes étant commentées, plutôt que de cherche ligne ce qui doit être activé ou pas, je vous propose de placer notre configuration tout en bas du fichier. Ce serait plus pour s'y retrouver :

$ nano /etc/monit/monitrc

Voici comment j'ai configuré les paramètres. Libre à vous d'adapter selon vos besoins :

########## Configuration ##########
set daemon 120 # 2 minutes
set mailserver localhost
set alert VOTRE_EMAIL
set mail-format { from: postmaster@HOSTNAME_FQDN }
set httpd port PORT_MONIT andallow VOTRE_LOGIN:VOTRE_MOTDEPASSE

# Monitoring Apache 2
check process apache with pidfile /var/run/apache2.pid
group root
start program = "/etc/init.d/apache2 start"
stop program  = "/etc/init.d/apache2 stop"
if cpu > 50% for 2 cycles then alert
if cpu > 85% for 5 cycles then restart
if 3 restarts within 5 cycles then timeout

# Monitoring SSH
check process sshd with pidfile /var/run/sshd.pid
start program  "/etc/init.d/ssh start"
stop program  "/etc/init.d/ssh stop"
if failed port PORT_SSH protocol ssh then restart
if 5 restarts within 5 cycles then timeout

# Monitoring MySQL
check process mysql with pidfile /var/run/mysqld/mysqld.pid
group mysql
start program = "/etc/init.d/mysql start"
stop program = "/etc/init.d/mysql stop"
if failed unix "/var/run/mysqld/mysqld.sock" then restart
if failed host 127.0.0.1 port PORT_MYSQL then restart
if 5 restarts within 5 cycles then timeout

# Monitoring Bind
check process named with pidfile /var/run/named/named.pid
start program = "/etc/init.d/bind9 start"
stop program = "/etc/init.d/bind9 stop"
if failed host 127.0.0.1 port 53 type tcp protocol dns then alert
if failed host 127.0.0.1 port 53 type udp protocol dns then alert
if 5 restarts within 5 cycles then timeout

# Monitoring Proftpd
check process proftpd with pidfile /var/run/proftpd.pid
start program = "/etc/init.d/proftpd start"
stop program  = "/etc/init.d/proftpd stop"
if failed port 21 protocol ftp then restart
if 5 restarts within 5 cycles then timeout

# Monitoring Postfix
check process postfix with pidfile /var/spool/postfix/pid/master.pid
group vmail
start program = "/etc/init.d/postfix start"
stop  program = "/etc/init.d/postfix stop"
if failed port 587 protocol smtp then restart
if 5 restarts within 5 cycles then timeout

# Monitoring Dovecot
check process dovecot with pidfile /var/run/dovecot/master.pid
start program = "/etc/init.d/dovecot start"
stop program = "/etc/init.d/dovecot stop"
group vmail
if failed host imap.DOMAINE.COM port 993 type tcpssl sslauto protocol imap for 5 cycles then restart
if 3 restarts within 5 cycles then timeout

# Monitoring spamassassin
check process spamd with pidfile /var/run/spamd.pid
group vmail
start program = "/etc/init.d/spamassassin start"
stop  program = "/etc/init.d/spamassassin stop"
if 5 restarts within 5 cycles then timeout
if cpu usage > 85% for 5 cycles then alert
if mem usage > 85% for 5 cycles then alert

# Monitoring disque
check device sda1 with path /dev/sda1
if space usage > 85% then alertgroup system

NB : si vous avez installé iptables, pensez à ajouter une règle pour le numéro de port que vous avez choisi.

Enregistrez le fichier et (re)démarrez le service :

$ service monit restart

Vous pouvez accéder à l'inteface web (après avoir saisi votre login et votre de passe) :

http://IP_DU_SERVEUR:PORT_MONIT/

Comme le montre l'image ci-dessous, vous obtenez un récapitulatif des services surveillés. Un clic sur le nom de l'un d'eux vous amènera sur une page un peu plus détaillée.

Outil de monitoring serveur

Installation de Logwatch

Logwatch va surveiller les logs du serveur et envoyer un e-mail récapitulatif des erreurs tous les jours.

$ aptitude install logwatch -y

Entrez dans le fichier de config :

$ nano /usr/share/logwatch/default.conf/logwatch.conf

Et indiquez votre adresse e-mail :

MailTo = VOTRE_EMAIL

Enregistrez le fichier.

NB : un dernier point important, rendez-vous dans votre console Online et activez les services de monitoring que vous souhaitez pour être alerté par e-mail en cas d'arrêt d'un service.

26 - Quelques astuces

La configuration du serveur est à présent terminée. Avant de vous expliquer comment gérer les noms de domaine, voici une liste de tâches à affectuer pour vérification.

Pour modifier la rotation des logs :

$ nano /etc/logrotate.conf

Pour corriger une erreur aperçue dans les logs :

$ nano /etc/php5/cli/conf.d/ming.ini

Remplacez la première ligne par :

;configuration for php MING module

Enregistrez le fichier. Si vous souhaitez être alerté par mail lorsqu'une connexion se fait avec le compte root (ce qui normalement n'est pas possible), éditez le fichier suivant :

$ nano /root/.bashrc

En bas du fichier, ajoutez :

# Alerte login root
echo 'Connexion Root le ' `date` `who` | mail -s `hostname` Shell Root de `who | cut -d"(" -f2 | cut -d")" -f1` VOTRE_EMAIL

On en profite pour spécifier l'éditeur par défaut en ajoutant :

# Editeur par defautexport EDITOR=nano

Pour vous assurer que votre serveur est sain, lancez de temps en temps cette commande :

$ lsattr -R / 2>/dev/null | grep 's---ia--------'

Si aucun résultat n'est retourné, c'est qu'à priori tout est OK. :)

Pour l'installation d'un certificat SLL certifié, je vous invite à lire l'article que j'avais rédigé sur le sujet. Il a été mis à jour pour coller à la configuration Debian : https://blog.infiniclick.fr/articles/installer-certificat-ssl.html

NB : lorsque vous rencontrez un problème avec un service, ayez le réflexe de consulter les logs concernés. Dans la plupart des cas, la raison s'y trouve.

Voilà, ce tutoriel est (enfin) terminé. Si vous avez des questions, des remarques ou si vous pensez que j'ai oublié quelque chose d'important, laissez-moi un mot doux en commentaire. ;)

Catégorie Tutoriels - Écrit par le 10/02/2015 - Article lu 26 161 fois - 53 commentaires

53 réflexions sur ce billet

Écrit par Aurélien du site http://www.dediconcept.com/
Le 10/02/2015 à 16h27

Super tuto Hervé, je voulais savoir si tu utilisais un tool de monitoring ? Un script pour créer une BDD, c'est assez pratique ?

Écrit par Hervé
Le 10/02/2015 à 16h34

Aurélien

Non, je consulte les logs. Pour la BDD, je passe par phpMyAdmin, je trouve cela beaucoup plus simple. ;)

Écrit par marian du site http://www.dmweb.fr/
Le 10/02/2015 à 22h04

Ah excellent tutoriel. Vraiment très complet et je confirme tes dires sur le début de l'article, j'ai essayé par le passé de configurer un serveur et beaucoup de tuto étaient incomplets surtout sur la partie Bind et la gestion e-mail.

Concernant un système de sauvegarde de BDD/FTP tu conseilles un outil / script ? (Backup manager ?).

Connais tu des outils de monitoring éventuellement ?

Encore merci je vais essayer de reconfigurer un serveur pour l'occasion.

Écrit par Polnareff du site http://www.memoinfo.fr/
Le 10/02/2015 à 22h51

Franchement gros boulot. Bien joué !
Un truc pour iptables, faudrait gérer aussi ip6tables. Parce que si ca ne rentre pas en ipv4, ca peut en ipv6 :)

Déjà chapeau.
Je serai curieux de connaître les stats liées à la consultation de cet article fleuve. Qui va lire jusqu'au bout ce pavé ? Et qui va commenter sans lire le tout (moi le premier). Personnellement, ça me conforte dans ma façon de travailler : chacun son boulot et sysadmin ce n'est vraiment pas pour moi.

Écrit par Hervé
Le 11/02/2015 à 09h47

@Marian : pour la sauvegarde, tu peux choisir Backup Manager qui est très simple à configurer et fait bien le job. Pour le monitoring, tu as Logwatch pour les logs, tu as Monit pour surveiller les ressources du serveur, etc.

@Polnareff : pas bête pour ipv6. :-)

@Christophe : il faut bien se lancer un jour non ? Perso, ça doit faire 6/7 ans que je gère mes propres serveurs. Je suis juste passé de Gentoo à Debian.

Écrit par Mathieu
Le 12/02/2015 à 10h37

Très propre comme tuto.

Juste un truc, il existe un outil bien sympa pour générer des mots de passe, c'est apg :
https://packages.debian.org/wheezy/admin/apg

Écrit par Hervé
Le 12/02/2015 à 12h20

Merci Mathieu pour l'info. ;)

Écrit par Etienne
Le 17/02/2015 à 10h08

Très bon article, moi qui essaye depuis un moment en suivant des tutos ici et là sur internet, beaucoup ne sont plus à jour, pas forcement précis, erronés.

En tant que pur débutant, je fais ton tuto sur un vps neuf (j'en suis à iptables) j'ai remarqué quelques coquilles ou parties un peu floues (que je n'ai pas compris en tout cas), si tu le veux je peux te faire un retour de tout ça quand j'ai fini le tuto.

Attention pour iptable entre POP3S et Postgrey tu as un truc qui a sauté.

Merci beaucoup pour ton article.

Écrit par Hervé
Le 17/02/2015 à 19h27

Etienne

Ce sera avec plaisir si je peux répondre à tes questions. Normalement le tuto est carré car je l'ai suivi pour installer deux serveurs. Je dois le refaire de 0 pour un 3ème pour être sur que tout est OK.

Écrit par Rémi
Le 03/03/2015 à 17h45

Bonjour, superbe tuto pour le débutant que je suis en administration de serveur, merci pour toutes ces infos ! J'ai cependant une question : à l'étape 11 (installation de MySQL), vous précisez qu'il faut renseigner le " NOUVEAU_PORT_MYSQL " dans le fichier /etc/mysql/my.cnf. À quoi cela correspond t-il ? Un numéro de port est déjà renseigné dans le fichier. Merci d'avance !
Rémi

Écrit par Hervé
Le 03/03/2015 à 17h49

Rémi

Tout simplement pour ne pas laisser le port par défaut (3306) que tout le monde connait. Tu peux donc indiquer un autre port (au dessus de 1024 et pas encore utilisé). Par exemple, le 2525. Tu choisis celui que tu veux.

Il faudra penser à le renseigner dans iptables et partout où cela est nécessaire.

Écrit par BonoVox
Le 15/03/2015 à 00h26

Bonjour,

Votre tutoriel est vraiment très bien détaillé. Par contre je n'ai pas bien saisi ce que vous voulez dire par :

"Enregistrez le fichier et rendez-vous dans votre console Online pour modifier le reverse. Dans le champ, indiquez le hostname --fqdn, à savoir HOSTNAME_FQDN. (avec un point à la fin)."

Cordialement,
Hassan Bekhchouch

Écrit par Hervé
Le 15/03/2015 à 00h30

Hassan

Il faut juste penser à rajouter un point à la fin après le nom du hostname FQDN sinon cela ne sera pas pris en compte.

Par exemple:

Votre hostname FQDN = sd-xxxxx.dedibox.fr

Indiquer dans la console Online = sd-xxxxx.dedibox.fr. <= avec le point à la fin après fr ;)

C'est dans le cas où vous avez un serveur chez Online. De mémoire, ce n'est pas utile chez OVH.

Écrit par BonoVox
Le 15/03/2015 à 02h46

Bonjour,

J'avais mon site qui fonctionnait bien, mon phpmyadmin aussi. J'ai voulu mettre de l'ordre sur mon serveur dédié OVH en suivant tout le tuto à la lettre. Résultat : Plus rien ne fonctionne.

1°/ Lorsque j'essaie d'ouvrir une session MySQL sur phpmyadmin une popup s'ouvre me demandant si je veux enregistrer le fichier index.php ==> Impossible d'accéder à mes BD

2°/ Lorsque je tape mon url de mon site j'ai une page d'erreur : "Internal Server Error. The server encountered an internal error or misconfiguration and was unable to complete your request."

Là je suis perdu et mon site n'est plus accessible. Pouvez-vous m'aider à y voir plus clair ?

Merci de votre compréhension.

Écrit par Hervé
Le 15/03/2015 à 02h52

Hassan

Étonnant ce qu'il t'arrive. J'ai installé 3 serveurs en suivant le tuto et je n'ai rencontré aucun problème de ce genre.

Hormis reprendre le tuto de 0 pour vérifier que tout est OK, je ne vois pas d'autre solution (surtout à cette heure tardive).

Bon courage.

Écrit par BonoVox
Le 15/03/2015 à 03h20

Bon,

Après avoir retirer petit à petit les utilitaires, il se trouve que c'est en désactivant php5 que rien ne fonctionne.

J'ai donc réactiver php5 et désactiver suexec et suphp. Du coup je retrouve mon site et j'arrive à me connecter à phpmyadmin (MySQL).

Voilà, maintenant je vais essayer de comprendre la raison de ce dysfonctionnement. :-)

Cordialement,
Hassan Bekhchouch

Écrit par Hervé
Le 15/03/2015 à 03h22

Bonne nouvelle. ;)

Bon courage pour trouver la raison du bug dès que suphp est activé. Commences par regarder les logs, tu auras sans doute une piste.

Hervé

Écrit par BonoVox
Le 15/03/2015 à 13h50

Bonjour Hervé,

Merci beaucoup pour ton support !! :-)

Malheureusement je tombe encore de haut parce depuis que j'ai configuré le bind comme expliqué dans le tuto, mon site web n'envoie plus les mails automatique (contact, nouvelle commande, etc). Je suis encore en galère.

Aurais-tu une idée ? De plus j'ai même essayé de désactivé (stop) le bind et toujours pas de mail qui arrive quand je valide mon formulaire de contact sur mon site. Là ça me fait peur.

Cordialement,
Hassan Bekhchouch

Écrit par Hervé
Le 15/03/2015 à 13h54

Hassan

Bind fonctionne bien avec cette configuration. J'ai un serveur avec 80 sites et un autre avec 12 sites et les mails sont parfaitement envoyés.

As-tu regardé la configuration de la zone DNS du nom de domaine concerné chez l'hébergeur ?

Écrit par BonoVox
Le 15/03/2015 à 14h48

Y a t-il quelque chose de spécial à modifier là-bas ? Dedans j'ai www, pop, imap, webmail.

Y a t-il autre chose à mettre ?

Écrit par BonoVox
Le 15/03/2015 à 17h43

Alors aussi je viens de faire un test avec postfix, j'envoie un mail. Il me dit que le mail a été envoyé, mais je ne reçois rien nulle part. Il y a bien un souci d'envoi de mail sur mon serveur. Et cela est dû à des modifications que j'ai faites en suivant le tuto car avant ça marchait bien.

Avez-vous une idée où je pourrai commencer à regarder ?

Excusez-moi pour ces messages, mais j'ai vraiment envie de comprendre d'où viennent les impacts que j'ai eu sur mes configurations.

Cordialement,
Hassan Bekhchouch

Écrit par Hervé
Le 15/03/2015 à 17h47

Hassan

Commences par regarder les logs des mails => nano /var/log/mail.log

Écrit par BonoVox
Le 15/03/2015 à 18h10

Merci pour ce conseil !!! :-)
Effectivement j'ai plein d'erreurs PostFix déjà :

Warning: connect to mysql server 127.0.0.1:3306: Access denied for user 'mon_adresse@mondomaine'@'localhost' (using password: YES)

Warning: mysql:/etc/postfix/mysql-virtual-alias-maps.cf lookup error for "adressemaildest@mondomaine"

Warning: AC49D20B6A: virtual_alias_maps map lookup problem for adressemaildest@mondomaine -- deferring delivery

Et plein d'autres du même type que : mysql:/etc/postfix/mysql-virtual-alias-maps.cf lookup error

J'ai dû rater quelque chose à un moment donné.

Écrit par BonoVox
Le 15/03/2015 à 19h01

Bon ça avance. En fait de même que sur PostFix, le dovecot n'avais pas non plus le plus user/passwd admin.

Maintenant j'arrive à envoyer un mail depuis mon site mais seulement quand c'est une adresse autre qu'une adresse liée à mon NDD. En gros j'arrive à envoyer des mails vers tout sauf les adresses "adressemaildest@mondomaine".

Donc c'est presque bon, reste encore un truc à corriger, si vous avez déjà vu ce genre de problème n'hésitez pas, merci.

Cordialement,
Hassan Bekhchouch

Écrit par Hervé
Le 15/03/2015 à 20h30

Le mieux est de reprendre le tuto pas à pas pour voir où cela cloche au niveau des e-mails. Je ne peux pas t'aider plus.

Écrit par Sébastien
Le 20/06/2015 à 17h00

Bonjour,
Bravo et merci pour ce tuto magnifique.
Je suis entrain de créer mon serveur avec vos explications mais j'obtiens une erreur avec proftpd.

Dans le fichier : nano /etc/proftpd/proftpd.conf
j'ajoute les lignes suivantes:
# Cryptage
SQLAuthTypes
CryptSQLAuthenticate users* groups*
...

Je sauvegarde et au redémarrage du service j'obtiens l'erreur:
Starting ftp server: proftpdns387721.ip-176-31-251.eu proftpd[6234]: Fatal: SQLAuthTypes: expected at least one SQLAuthType on line 193 of '/etc/proftpd/proftpd.conf'
failed!

Pourriez-vous me dire pourquoi cette erreur? Est-ce que j'ai mal positionné ce code

Merci pour vos réponses

Cordialement

Écrit par Hervé
Le 20/06/2015 à 21h26

Bonsoir Sébastien

Le mieux est de reprendre la partie consacrée à Proftpd depuis le début pour contrôler que tout est OK. Pour info, je n'ai jamais rencontré le problème.

Écrit par Sébastien
Le 20/06/2015 à 22h18

Bonsoir
Merci pour votre réponse. J'ai trouvé d'où venait le problème

Explication:
En copiant votre texte:
Crypt est attaché à SQLAuthenticate

Ce qui me donnait:
# Cryptage
SQLAuthTypes
CryptSQLAuthenticate users* groups*

Au lieu de:
# Cryptage
SQLAuthTypes Crypt
SQLAuthenticate users* groups*

Merci encore pour votre aide.

Cordialement

Écrit par Hervé
Le 21/06/2015 à 12h33

Sébastien

Merci pour le retour, j'ai corrigé.

Écrit par Sébastien
Le 21/06/2015 à 16h59

Bonjour,

Me revoilà pour un autre problème. J'en suis à la partie 15 - Installation de suphp. Une fois l'installation et la configuration faite j'ai un problème. Que ce soit dans phpmyadmin ou postfixadmin il m'est impossible d'y accéder. Les fichiers php se téléchargent au lieu de s'exécuter. Savez-vous d'où peut venir ce problème et comment le corriger ?

Merci encore

Écrit par Sébastien
Le 24/06/2015 à 08h44

Bonjour,
Je voudrais utiliser le serveur DNS de mon serveur Dedibox mais quand je veux changer les serveurs DNS en sd-xxxxx.dedibox.fr et nssec.online.net , je me retrouve systématiquement avec l'erreur :
sd-xxxxx.dedibox.fr : Ce serveur dns n'est pas listé comme autoritaire,
nssec.online.net : Ce serveur dns n'est pas listé comme autoritaire

J'aurai voulus savoir si vous savez comment faire ?

Cordialement

Écrit par Hervé
Le 25/06/2015 à 23h20

Sébastien

Je n'ai pas rencontré ce problème avec suphp. Quant aux DNS, à quel endroit tu as ces messages ?

Écrit par Sébastien
Le 01/07/2015 à 09h34

Bonjour,

Désolé pour pour ce retour tardif. Pour suphp j'ai laissé tomber je reviendrai dessus plus tard.

Pour les DNS j'ai résolu mon problème. Voila quel était mon problème sur la console online. Dans la partie domaine je voulais changer les DNS qui étaient "ns0.online.net" et "ns1.online.net" par "sd-xxxxx.dedibox.fr" et "nssec.online.net" mais en validant j'avais le message "Ce serveur dns n'est pas listé comme autoritaire".

Ma zone était renseignée comme ça:
$ttl 10800
@ IN SOA HOSTNAME_FQDN. postmaster.DOMAINE.COM. (
2015020901
21600
3600
604800
10800 )

IN NS ns0.online.net.
IN NS ns1.online.net.
....

Alors qu'il fallait faire comme ça:
$ttl 10800
@ IN SOA HOSTNAME_FQDN. postmaster.DOMAINE.COM. (
2015020901
21600
3600
604800
10800 )

IN NS sd-xxxxx.dedibox.fr.
IN NS nssec.online.net.
....

Ce qui m'a permis de valider dans la console. En tout cas merci beaucoup pour vos réponses et votre tutoriel qui ma vraiment beaucoup aidé.

Cordialement

Écrit par Laure
Le 06/07/2015 à 17h26

Bonjour,

Des soucis tout pleins avec DOVECOT qui me fait des misères ! Ainsi
doveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/10-mail.conf line 30: Unknown setting: mail_location
[....] Restarting IMAP/POP3 mail server: dovecotdoveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/10-mail.conf line 30: Unknown setting: mail_location

mais il y a aussi

doveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/10-director.conf line 29: Unknown setting: service
[....] Restarting IMAP/POP3 mail server: dovecotdoveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/10-director.conf line 29: Unknown setting
failed!

sans compter un petit peu de Postfix pour agrémenter

postconf: warning: /etc/postfix/main.cf: unused parameter: mail-name=postmaster@FQDN
dans Postfix, résolu en supprimant la ligne en question

donc pour parler de la même chose, un petit coup de
> apt-cache show postfix | grep "Version"
Version: 2.11.2-1~bpo70+1
Version: 2.9.6-2
et la même pour Dovecot-common et Dovecot-Core
> apt-cache show dovecot-common | grep "Version"
Version: 1:2.1.7-7+deb7u1
> apt-cache show dovecot-core | grep "Version"
Version: 1:2.2.13-11~bpo70+1
Version: 1:2.1.7-7+deb7u1

Voili, voilou
en tout cas c'est un sacré tuto, et surtout avec une date de rédaction, chose rare !!!
Merci
Bon Courage

Écrit par Hervé
Le 06/07/2015 à 17h39

Bonjour Laure

Pour Dovecot, c'est corrigé. Il y a deux lignes à modifier dans le fichier /etc/dovecot/conf.d/10-mail.conf et non pas une seule.

Pour /etc/dovecot/conf.d/10-director.conf, je n'ai rien dans le tuto à ce sujet.

Pour Postfix idem, rien à propos de postmaster@FQDN mais plutôt :
mail_name = postmaster@HOSTNAME_FQDN

Attention à bien utiliser les underscores plutôt que les tirets (au cas où ^^).

Écrit par Lapin
Le 16/07/2015 à 16h50

Le tuto est assez long mais les résultats sont là. Merci pour tout.

Écrit par Sébastien
Le 26/07/2015 à 18h49

Salut et merci pour ce tuto.

Cependant dans la partie où l'on tape la commande a2dissite default, cela me dit qu'il n'y a pas de site par défaut qui existe. Est-ce normal ?

Cordialement

Écrit par Hervé
Le 26/07/2015 à 20h47

Sébastien

Rien d'inquiétant. :)

Écrit par Sébastien
Le 27/07/2015 à 17h42

Bonjour,

J'en suis à l'étape 13 et après l'installation de Proftpd (donc après avoir validé Standalone), il est écrit ceci dans le tuto :

Il faudra ensuite taper votre mot de passe root MySQL et à deux reprises le mot de passe dédié à Postfix. Une fois que l'installation est terminée, allez dans phpMyAdmin pour créer un utilisateur dédié au FTP. Créez ensuite les tables suivantes :

Cependant, je n'ai pas eu à taper 2x le mot de passe root SQL et ni celui de Postfix (surtout qu'à l'étape 13, nous n'y sommes pas encore à Postfix ?), je pense que ce paragraphe est peut-être une erreur ?

Ou peut-être est-ce moi :)

Merci en tout cas, super tuto pour le moment !!

Écrit par Hervé
Le 27/07/2015 à 22h27

Sébastien

C'est bien évidemment Proftpd dont il s'agit. Pour le mot de passe root, c'est bien une seule fois qu'il faut le taper et deux fois pour Proftpd.

Écrit par Ange
Le 20/11/2015 à 04h27

Hello mec,

Super tuto !
Suis sur VPS de OVH, ça pour l'info, pour le hic c'est après. Au chapitre 18 après le "START" de /etc/init.d.firewall, voici le résultat :

root@MON_VPS:/# /etc/init.d/firewall restart
Mise à 0 des tables: OK
Connexion entrantes et sortantes interdites: OK
Acceptation des connexions en cours: OK
Acceptation du trafic local: OK
Acceptation du Ping: OK
Ouverture du port SSH: OK
Gestion des DNS: OK
Gestion de l'horloge atomique NTP: OK
Gestion FTP: OK
Gestion des restrictions FTP: OK
Gestion du port HTTP: OK
Gestion du port HTTPS: OK
Gestion du port MySQL: OK
Gestion du port SMTP: OK
Gestion du port POP3: OK
Gestion du port IMAP: OK
Gestion du port SMTPS: OK
Gestion du port IMAPS: OK
Gestion du port POP3S: OK
Gestion du port de Postgrey: OK
iptables v1.4.14: unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.4.14: unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.4.14: unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.4.14: unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
Monitoring du serveur: OK
Firewall start
/etc/init.d/firewall: ligne155: Erreur de syntaxe près du symbole inattendu « ; »
/etc/init.d/firewall: ligne155: `;status)'

Aurais-tu une idée à propos de ces erreurs STP.
Dans /firewall:

=> Pour postgrey j'ai ça:
# Postgrey
iptables -t filter -A INPUT -p tcp --dport 10023 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 10023 -j ACCEPT

=> Pour la ligne 154 à 157 j'ai ça:
echo Firewall start;
;status)
echo - Liste des regles :iptables -L;
;stop)

=> Pour ceux qui sont chez OVH en VPS:
iptables -A INPUT -i eth0 -s IP_PROPOSE_PAR_OVH --dport 24 -p ICMP -j ACCEPT
iptables -A INPUT -i eth0 -s IP_PROPOSE_PAR_OVH --dport 24 -p ICMP -j ACCEPT
iptables -A INPUT -i eth0 -s IP_PROPOSE_PAR_OVH --dport 24 -p ICMP -j ACCEPT
iptables -A INPUT -i eth0 -s IP_PROPOSE_PAR_OVH --dport 32 -p ICMP -j ACCEPT
echo "Monitoring du serveur: OK"

Merci de ton retour

Écrit par TRK
Le 23/11/2015 à 21h47

Excellent tutorial ! Le meilleur que j'ai suivi. Bon, je reste sur vsFTP mais pour le reste, c'est béton, bien articulé (jamais de bug de dépendance ou de configuration). Je recommande chaudement !

Un petit bug de postfix (qui marche admirablement et en TLS)

inet_protocols = ipv4local_recipient_maps =

devient :

inet_protocols = ipv4
local_recipient_maps =

C'est stupide et quand on lit, on le voit. Quand un copie colle, ça bug et c'est chiant à débugguer !

Écrit par TRK
Le 23/11/2015 à 21h50

Pour Ange :

il faut editer le script tel que :

echo "Blabla"
;;
status)
...
echo "Truc"
;;
...
echo "Machin"
;;
esac
exit 0

Écrit par Hervé
Le 23/11/2015 à 22h03

@TRK : merci de m'avoir signalé l'erreur dans ton premier commentaire. Un retour à la ligne manquant dans le tuto. Merci d'avoir répondu à Ange, j'ai aussi corrigé cette partie.

@Ange : tu as ta réponse. ;)

Écrit par Ange
Le 24/11/2015 à 07h12

Hello la bande !

Merci @TRK et @Hervé !

@Hervé:

Au début de ton fichier il y a la ligne commentée:
#!/bin/shcase "$1" instart)

Faut-il la décommenter ? S'écrit-elle comme cela ?

Je demande cela car en avant-dernière ligne tu as "esac" mais je ne vois pas de "case" plus haut...

Maintenant j'obtiens bien ce résultat:

root@MON_VPS:/# /etc/init.d/firewall start
Mise à 0 des tables: OK
Connexion entrantes et sortantes interdites: OK
Acceptation des connexions en cours: OK
Acceptation du trafic local: OK
Acceptation du Ping: OK
Ouverture du port SSH: OK
Gestion des DNS: OK
Gestion de l'horloge atomique NTP: OK
Gestion FTP: OK
Gestion des restrictions FTP: OK
Gestion du port HTTP: OK
Gestion du port HTTPS: OK
Gestion du port MySQL: OK
Gestion du port SMTP: OK
Gestion du port POP3: OK
Gestion du port IMAP: OK
Gestion du port SMTPS: OK
Gestion du port IMAPS: OK
Gestion du port POP3S: OK
Gestion du port de Postgrey: OK
Monitoring du serveur: OK

===== FIREWALL START =====

Vidage des tables: OK

===== FIREWALL STOP =====

___________________________________

Autre chose selon mon commentaire précédent :
Pour le monitoring d'un VPS chez OVH ou ailleurs, c'est plus ça qu'il faut:
# Monitoring du serveur selon les IPs proposés par OVH
iptables -A INPUT -i eth0 -s IP_PROPOSES_PAR_OVH/24 -p ICMP -j ACCEPT
iptables -A INPUT -i eth0 -s IP_PROPOSES_PAR_OVH/24 -p ICMP -j ACCEPT
iptables -A INPUT -i eth0 -s IP_PROPOSES_PAR_OVH/24 -p ICMP -j ACCEPT
iptables -A INPUT -i eth0 -s IP_PROPOSES_PAR_OVH/24 -p ICMP -j ACCEPT
iptables -A INPUT -i eth0 -s IP_PROPOSES_PAR_OVH/32 -p ICMP -j ACCEPT
echo "Monitoring du serveur: OK"

Voilou !

P S: A priori le chapitre 22 va causer souci avec un VPS selon la géniale conf proposée par Hervé... To be follow

Écrit par Hervé
Le 24/11/2015 à 09h15

Ange

Les retours à la ligne avaient sautés aussi sur cette partie du code. C'est corrigé.

Écrit par Ange
Le 27/11/2015 à 04h43

Hello Hervé,

Désolé de te déranger mais mon FileZilla me renvoi dans les 60 yards lorsque je veux me connecter.

Voici le message d'erreur:

Statut : Résolution de l'adresse de MON_VPS.ovh.net
Statut : Connexion à MON_IP:21...
Statut : Connexion établie, attente du message d'accueil...
Statut : Initialisation de TLS...
Statut : Vérification du certificat...
Statut : Connexion TLS établie.
Commande : USER MON_USER
Réponse : 331 Mot de passe requis pour MON_USER
Commande : PASS ***************
Erreur : Erreur GnuTLS -110: The TLS connection was non-properly terminated.
Statut : Le serveur n'a pas correctement fermé la connexion TLS
Erreur : Impossible d'établir une connexion au serveur

Sur les forums ils parlent de rétrograder FZ, ce que j'ai fait mais pas de changement :(

Écrit par Hervé
Le 27/11/2015 à 09h51

Bonjour Ange

Je n'ai pas de problème pour me connecter en FTP. Tu n'utilises pas le compte root je présume ? Tu as essayé le mode passif ?

Hormis te conseiller de revoir la partie FTP du tutoriel, je n'ai pas d'autre idée pour l'instant.

Écrit par TRK
Le 08/12/2015 à 09h20

Salut.
+1 pour le mode passif. Pense à ouvrir la plage de ports correspondant ! (le mode actif nécessite que ton routeur/firewall coté client soit aussi configuré pour écouter sur d'autre ports +- aléatoires qui sont imposés par ton serveur...)

Par sécu moi j'encouragerai à avoir une règle iptables restrictive pour la routine (start) qui ne laisse passer QUE ce qu'il faut pour que le serveur soit utilisable et une règle permissive (admin) à lancer lors de l'utilisation d'autre services "exceptionnel" comme le FTP.

Écrit par Cidebian
Le 05/02/2016 à 13h58

Bonjour, je tiens à vous remercier pour ce tuto aussi dense que complet.

Je suis arrivé à la partie iptables, hors etant novice, je ne sais ou trouver les 3_PREMIERS_BLOCS_IP_DU_SERVEUR, j'ai une ip principale accompagnée de son reverse, mon serveur est chez so you start.

Pourriez vous m'éclairer s'il vous plait, car apparemment j'en aurais aussi besoin pour la suite du tuto.

En vous remerciant et en espérant que cette question ne soit pas trop "bête"...

Écrit par Hervé
Le 05/02/2016 à 14h22

Salut

Imaginons que l'IP de ton serveur soit 12.34.56.789, les 3 premiers blocs sont 12.34.56 ;)

Écrit par Cidebian
Le 10/02/2016 à 11h45

Merci Hervé, effectivement vu comme ça, c'est de suite limpide.

Encore merci pour le Tuto !

Écrire un commentaire

Pseudo

E-mail (non publié)

Votre commentaire

Recevoir une notification par e-mail lorsqu'une réponse est postée

Veuillez recopier le code de sécurité : jpazb5vgg2

Haut de page