dokkun

Tutoriel : installer un serveur Debian (wheezy)

1 message dans ce sujet

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 Spamassassin et 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

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. 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 -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

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. 

capture-1-214643.png

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.

capture-2-215136.png

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 :

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.

capture-4-223919.png

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]['auth_type'] = 'cookie';

$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é à 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 :

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.c

LoadModule 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'] = '587';

'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 :

inet_interfaces = all

Ajoutez :

inet_protocols = ipv4

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,

reject_invalid_helo_hostname,

reject_non_fqdn_helo_hostname,

reject_unknown_helo_hostname

# 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 et Postgrey

Le spam, tout le monde connait. Pour le réduire, on installe spamassassin comme suit :

$ aptitude install spamassassin spamc postgrey -y

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}

On édite le fichier de configuration de spamassasin :

$ nano /etc/spamassassin/local.cf

Modifiez les paramètres comme ci-dessous :

report_safe 0

required_score 5.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=1

CRON=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=10023 --delay=300 --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 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) :

# m h dom mon dow command

17 * * * * root cd / && run-parts --report /etc/cron.hourly

25 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

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

# 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 eth0

00000000000000000000000000000001 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.

logmaxretry = 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.HOSTNAME.inv

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

$ nano /etc/bind/db.HOSTNAME.inv

Et remplacez les 3 infos comme suit (normalement la 2ème ligne et les deux dernières) :

@ IN SOA HOSTNAME_FQDN. email.HOSTNAME_FQDN. (

@ IN NS HOSTNAME.

230 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.HOSTNAME.inv";

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

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

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 /var/www/DOSSIER

# Options du site

<Directory /var/www/DOSSIER/>

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

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

Vous pouvez faire de même pour celle du serveur :

$ named-checkzone HOSTNAME_FQDN /etc/bind/db.HOSTNAME.inv

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.

capture-5-150057.jpg

capture-6-150124.jpg

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.

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 and

allow 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 1989 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 4712 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 mail.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 alert

group 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.

monit-020830.jpg

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 defaut export 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. :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant