dokuro Posté(e) le 18 février 2015 Signaler Share Posté(e) le 18 février 2015 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. 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 : 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. 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. 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. 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. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Rejoindre la conversation
Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.