Voici un nouveau tutorial qui vous sera sans doute utile si vous venez d'installer la distribution linux Debian (Ou Ubuntu) sur votre serveur.

L'objectif du tutorial est d'obtenir un serveur linux debian permettant d'héberger et de gérer vos sites web PHP / MySQL à distance, uniquement avec un accès SSH.
Voici les différentes parties du tutorial qui seront divisées en 5 billets:
Pour réaliser ce tutorial, vous devrez au préalable avoir des connaissances en ligne de commande linux (Au moins les commandes basiques: cd, mkdir, mv ...).
Disposer d'un client SSH (Comme Putty), d'un client FTP (Comme FileZilla), et bien sûr de votre serveur avec une Debian fraichement installée.
Vous aurez aussi besoin d'au moins un nom de domaine pointant sur votre serveur.
Nous allons mettre en place 2 types de backup:
Pour mettre en place ce backup, il est conseillé de disposer au préalable d'un autre FTP sur lequel vous pourrez stocker vos archives de sauvegarde.
Nous allons voir comment installer et configurer Backup Manager.
Un dernier petit coup d'apt-get en ssh pour l'installer :
root [~] > apt-get install perl gettext backup-manager
A la fin de l'installation, le programme de configuration se lance autmatiquement.
On commence par spécifier le chemin du répertoire local de stockages des archives :

Puis l'utilisateur système qui sera le seul à pouvoir y accéder :

Enfin les répertoires que l'on souhaite sauvegardés :

Le fichier de configuration est sauvegardé dans /etc/backup-manager.conf. Nous allons l'éditer pour affiner les réglages:
root [~] > nano /etc/backup-manager.conf
export BM_ARCHIVE_TTL="30"
export BM_ARCHIVE_METHOD="tarball-incremental mysql"
export BM_ENCRYPTION_METHOD="tar.gz"
export BM_TARBALL_DIRECTORIES="/etc /var/www/laferme/site /var/www/laferme/forum"
export BM_TARBALL_NAMEFORMAT ="short"
export BM_TARBALLINC_MASTERDATETYPE="weekly"
export BM_TARBALLINC_MASTERDATEVALUE="1"
export BM_UPLOAD_METHOD ="ftp"
export BM_UPLOAD_FTP_USER ="ftplogin"
export BM_UPLOAD_FTP_PASSWORD ="ftppassword"
export BM_UPLOAD_FTP_HOSTS ="mybackup.serv.fr"
export BM_UPLOAD_FTP_PURGE ="true"
export BM_UPLOAD_FTP_DESTINATION ="/"
export BM_MYSQL_DATABASES ="laferme forumlaferme"
export BM_MYSQL_ADMINLOGIN ="root"
export BM_MYSQL_ADMINPASS ="sqlpassword"
export BM_MYSQL_HOST ="localhost"
export BM_MYSQL_PORT ="3306"
export BM_MYSQL_FILETYPE ="gzip"
Pour plus d'informations sur les autres options, consulter la documentation officielle.
root [~] > backup-manager
Par défaut, l'installation programme déjà l'exécution de Backup Manager, tous les jours. Une petite vérification :
root [~] > cat /etc/cron.daily/backup-manager
#!/bin/sh
# cron script for backup-manager
test -x /usr/sbin/backup-manager || exit 0
/usr/sbin/backup-manager
Notre système de backup est maintenant fonctionnel.
Voici plusieurs astuces permettant d'ajouter de la sécurité sur notre serveur.
En général, la plupart des attaques serveur sont lancées de manière automatique.
Des scripts scannent des plages d'IP et attaquent SSH, FTP, Mail par bruteforce en essayant de pénétrer le système en général pour augmenter leur flotte de PC Zombie !
Penchons nous dans un premier temps sur la sécurité SSH.
Comment les scripts vont trouver notre compte SSH ? En scannant le port 22, s'il y'a réponse, ils vont ensuite lancer leur script de bruteforce.
Première chose à faire, changer le port 22 par défaut.
root [~] > nano /etc/ssh/sshd_config
Modifiez le port dans le fichier de config:
Port 6060
Le port 6060 n'appartient pas à un protocole connu ou majeur donc vous pouvez l'utiliser.
Le mieux est de vérifier si ce port n'est pas actuellement utilisé sur votre serveur en tapant la commande suivante:
root [~] > netstat -l|grep 6060
Si vous avez un résultat, choisissez un autre port qui soit supérieur à 1024.
Toujours dans le même fichier de configuration, nous allons ajouter les utilisateurs ayant le droit de s'authentifier en SSH. Cela permettra aux scripts qui lancent des bruteforce login et mot de passe d'être très vite contrés.
root [~] > nano /etc/ssh/sshd_config
Modifiez les utilisateurs autorisés dans le fichier de config:
AllowUsers djo ouark
Mettez le login des comptes que vous souhaitez activer. Seuls ces comptes pourront accéder au SSH.
Il n'y'a rien de pire que de laisser la possibilité de se loguer en root en SSH. Les robots essayent de bruteforcer ce login en premier, qui est le césame à toute possibilité sur votre serveur.
root [~] > nano /etc/ssh/sshd_config
Ajoutez ou activez la commande suivante:
PermitRootLogin no
Ensuite vous devrez vous loguer avec votre compte linux, puis taper "su" et le mot de passe root pour passer en mode root.
Cela parait très logique, mais une option permet d'autoriser les passwords vides, vérifiez qu'elle soit bien à off:
root [~] > nano /etc/ssh/sshd_config
Vérifiez la ligne ou ajoutez là:
PermitEmptyPasswords no
Si le protocole SSH que vous avez est le 1, passez au 2 ! Des failles ont été corrigées.
root [~] > nano /etc/ssh/sshd_config
Vérifiez la ligne ou ajoutez là:
Protocol 2
Il ne nous reste plus qu'à redémarrer le service ssh.
root [~] > /etc/init.d/ssh restart
Le redémarrage devrait provoquer la fin de votre connexion. Dorénavant, pour vous connecter, il faudra spécifié le port 6060 à la place du port 22.
Connexion en ligne de commande :
root [~] > ssh -p 6060 VOTRE_IP
Nous allons mettre en place un firewall pour contrer les attaques ou requêtes non autorisées.
Nous allons utiliser iptables pour créer les règles de notre firewall sous debian.
Attention à bien suivre les instructions, vous pourriez bloquer tout votre serveur ...
Créez le fichier dans votre repértoire root par exemple:
root [~] > nano firewall.sh
Première chose à faire, par défaut nous bloquons tout le trafic sortant et entrant.
Ajoutez ces lignes dans votre fichier:
#!/bin/bash
echo Setting firewall rules...
#
#
###### Debut Initialisation ######
# Interdire toute connexion entrante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
echo - Interdire toute connexion entrante : [OK]
# Interdire toute connexion sortante
iptables -t filter -P OUTPUT DROP
echo - Interdire toute connexion sortante : [OK]
# Vider les tables actuelles
iptables -t filter -F
iptables -t filter -X
echo - Vidage : [OK]
Il est évident qu'il ne faut pas exécuter le script maintenant, sauf si vous avez des tendances SM...
Pour contrer les relais SMTP et autres requêtes sur votre serveur mail, ajoutez les lignes suivantes:
#Creation d'une chaine
iptables -N LOG_REJECT_SMTP
iptables -A LOG_REJECT_SMTP -j LOG --log-prefix ' SMTP REJECT PAQUET : '
iptables -A LOG_REJECT_SMTP -j DROP
# Anti-Taiwanais
iptables -t filter -A INPUT -i eth0 -s 61.64.128.0/17 -j LOG_REJECT_SMTP
iptables -t filter -A INPUT -i eth0 -s 122.120.0.0/13 -j LOG_REJECT_SMTP
iptables -t filter -A INPUT -i eth0 -s 168.95.0.0/16 -j LOG_REJECT_SMTP
echo - Bloquer Taiwanais : [OK]
Après quelques expériences personnelles, il s'avère que les Taiwanais sont très friands des serveurs SMTP et n'hésitent pas à , voici donc quelques IP à bloquer par défaut pour être plus tranquille.
Pour le moment tout est bloqué sauf le SSH, nous allons ajouter des exceptions au blocage:
# 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
echo - Ne pas casser les connexions établies : [OK]
# Autoriser la Supervision du serveur (SNMP)
iptables -t filter -A INPUT -p tcp --dport 161 -s IP_SUPERVISION/32 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 161 -s IP_SUPERVISION/32 -j ACCEPT
echo - Autoriser Supervision : [OK]
# Autoriser les requetes DNS, FTP, HTTP, NTP
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo - Autoriser les requetes DNS, FTP, HTTP : [OK]
Même chose pour le PING et loopback:
# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo - Autoriser loopback : [OK]
# Autoriser ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo - Autoriser ping : [OK]
Il faut aussi autoriser les serveurs locaux:
On commence par Apache qui doit pouvoir être accessible de l'extérieur sur les ports 80 et 443 (HTTPS)
# HTTP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
echo - Autoriser serveur Apache : [OK]
Même chose pour notre serveur FTP avec le port 21:
modprobe ip_conntrack_ftp
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo - Autoriser serveur FTP : [OK]
Notre serveur DNS (Si vous en avez installé un, comme Bind) sur le port 53:
#DNS
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
echo - Autoriser serveur Bind : [OK]
et enfin notre serveur mail sur les ports 25 (SMTP), 110 (POP) et 143 (IMAP):
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
echo - Autoriser serveur Mail : [OK]
Faites de même pour les ports que vous souhaitez débloquer.
Sauvegardez le fichier firewall.sh et quittez nano.
Ajoutez les droits d'exécution sur votre script et lancez le :
root [~] > chmod +x firewall.sh
root [~] > ./firewall.sh
Vérification :
root [~] > iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
LOG_REJECT_SMTP 0 -- adsl-tpe-NET.STATIC.so-net.net.tw/17 anywhere
LOG_REJECT_SMTP 0 -- 122-120-0-0.dynamic.hinet.net/13 anywhere
LOG_REJECT_SMTP 0 -- 168-95-0-0.hinet-ip.hinet.net/16 anywhere
LOG tcp -- anywhere anywhere tcp dpt:6060 recent: CHECK seconds: 60 hit_count: 2 name: SSH side: source LOG level warning
DROP tcp -- anywhere anywhere tcp dpt:6060 recent: UPDATE seconds: 60 hit_count: 2 name: SSH side: source
ACCEPT tcp -- anywhere anywhere tcp dpt:6060 state NEW recent: SET name: SSH side: source
DROP tcp -- 192.168.0.11 anywhere tcp dpt:ssh recent: UPDATE seconds: 60 hit_count: 4 name: SSH side: source
tcp -- 192.168.0.11 anywhere tcp dpt:ssh recent: SET name: SSH side: source
ACCEPT tcp -- 192.168.0.11 anywhere tcp dpt:ssh
ACCEPT 0 -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- 192.168.0.200 anywhere tcp dpt:snmp
ACCEPT udp -- 192.168.0.200 anywhere udp dpt:snmp
ACCEPT 0 -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT 0 -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT 0 -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:ntp
ACCEPT 0 -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
Chain LOG_REJECT_SMTP (3 references)
target prot opt source destination
LOG 0 -- anywhere anywhere LOG level warning prefix ` SMTP REJECT PAQUET : '
DROP 0 -- anywhere anywhere
Maintenant que nous avons vérifié que tout fonctionnait correctement, nous allons pouvoir ajouter des règles pour le SSH
# Autoriser SSH
//Sur une seule ligne
iptables -t filter -A INPUT -p tcp --dport 6060 -m recent --rcheck --seconds 60
--hitcount 2 --name SSH -j LOG --log-prefix "SSH REJECT"
//Sur une seule ligne iptables -t filter -A INPUT -p tcp --dport 6060 -m recent --update --seconds 60 --hitcount 2 --name SSH -j DROP
//Sur une seule ligne iptables -t filter -A INPUT -p tcp --dport 6060 -m state --state NEW -m recent --set --name SSH -j ACCEPT
Changez bien le port 6060 par celui que vous avez finalement choisi.
Dans la règle, nous autorisons le port 6060 pour le SSH, avec deux essais d'identification possibles. Si les 2 essais échouent, l'IP est bloquée pendant une minute.
Si jamais vous voulez accéder au SSH par le port 22 (par exemple de votre boulot) car le port 6060 est bloqué, vous pouvez rajouter une règle d'exception:
//Sur une seule ligne iptables -t filter -A INPUT -p tcp --dport 22 -s VOTRE_IP/32 -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
//Sur une seule ligne iptables -t filter -A INPUT -p tcp --dport 22 -s VOTRE_IP/32 -m recent --set --name SSH
//Sur une seule ligne iptables -t filter -A INPUT -p tcp --dport 22 -s VOTRE_IP/32 -j ACCEPT
Attention à ce stade, si vous n'arrivez plus à accéder à votre serveur en SSH, suite à une mauvaise configuration des règles correspondantes, vous serez obligé de provoquer un reboot software ou hardware de votre serveur...
Passons maintenant à la mise en place de manière automatique du script:
root [~] > nano /etc/rc.local
Et rajoutez le chemin complet vers votre script:
/root/firewall.sh
Les règles du firewall seront, dès lors activées, dès le démarrage du serveur, donc vérifier bien avant de n'avoir aucune erreur, sans quoi votre serveur ne serait plus accessible, même avec un reboot !
Notre environnement web est désormais complet.
Aide & Questions: Pour tous problèmes ou questions à propos de ce tutorial, merci d'utiliser le topic dédié dans le forum de La Ferme du Web
A voir aussi sur le même sujet:
Pour poster un commentaire, vous devez être identifié. Vous pouvez choisir parmi ces trois méthodes d'identification:
Compte la Ferme du WebIdentifiez-vousInscrivez-vous |
Compte Facebook
|
Compte Twitter
|