Créer un serveur web complet sous debian - #5 Backup & Sécu

Statut
N'est pas ouverte pour d'autres réponses.

Xavier Mustin

Administrator
Staff member
#1
Tutorial: Créer un serveur web complet sous debian - #5 Backup & Sécurité

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

Introduction

Objectif de ce tutorial


L'objectif du tutorial est d'obtenir un serveur linux debianpermettant d'héberger et de gérer vos sites web PHP / MySQL à distance,uniquement avec un accès SSH.


Pré requis


Pour réaliser ce tutorial, vous devrez au préalable avoir desconnaissances en ligne de commande linux (Au moins les commandesbasiques: cd, mkdir, mv ...).

Disposer d'un client SSH (Comme Putty), d'un client FTP (CommeFileZilla), et bien sûr de votre serveur avec une Debian fraichementinstallée.

Vous aurez aussi besoin d'au moins un nom de domaine pointant sur votre serveur.

 
Installation du script de Backup


Nous allons mettre en place 2 types de backup:
  • Le backup quotidient: Tous les soirs, sauvegarde de la base de données MySQL.
  • Le backup hebdomadaire: Tous les dimanches soirs, backup des fichiers.

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 :
Code:
[i]root [~] >[/i] apt-get install perl gettext backup-manager
Configuration


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:
Code:
[i]root [~] >[/i] nano /etc/backup-manager.conf
Principales options
  • BM_ARCHIVE_TTL : nombre de jours de conservation d'une archive
    Code:
    export BM_ARCHIVE_TTL="30"
  • BM_ARCHIVE_METHOD : méthode d'archivage à utiliser entre tarball, tarball-incremental, mysql et svn
    Code:
    export BM_ARCHIVE_METHOD="tarball-incremental mysql"
  • BM_ENCRYPTION_METHOD : type de compression (false, tar, tar.gz, tar.bz2)
    Code:
    export BM_ENCRYPTION_METHOD="tar.gz"
  • BM_TARBALL_DIRECTORIES : répertoires à sauvegarder
    Code:
    export BM_TARBALL_DIRECTORIES="/etc /var/www/laferme/site /var/www/laferme/forum"
  • BM_TARBALL_NAMEFORMAT : format du fichier d'archive court (short) ou longue (long)
    Code:
    export BM_TARBALL_NAMEFORMAT ="short"
  • BM_TARBALLINC_MASTERDATETYPE : fréquence des sauvegardes complètes : weekly ou monthly
    Code:
    export BM_TARBALLINC_MASTERDATETYPE="weekly"
  • BM_TARBALLINC_MASTERDATEVALUE : jour des sauvegardes complètesPour weekly, jour de la semaine, entre 1 (lundi) et 7 (dimanche)Pour monthly, jour du mois, du 1 à 31
    Code:
    export BM_TARBALLINC_MASTERDATEVALUE="1"
Options Ftp
  • BM_UPLOAD_METHOD : méthode de transfert distante (ftp, scp, ssh, rsync, s3 ou none)
    Code:
    export BM_UPLOAD_METHOD ="ftp"
  • BM_UPLOAD_FTP_USER : identifiant de connexion
    Code:
    export BM_UPLOAD_FTP_USER ="ftplogin"
  • BM_UPLOAD_FTP_PASSWORD : mot de passe de connexion
    Code:
    export BM_UPLOAD_FTP_PASSWORD ="ftppassword"
  • BM_UPLOAD_FTP_HOSTS : adresse du serveur distant (IP ou nom DNS)
    Code:
    export BM_UPLOAD_FTP_HOSTS ="mybackup.serv.fr"
  • BM_UPLOAD_FTP_PURGE : effacer le fichier distant (true ou false)
    Code:
    export BM_UPLOAD_FTP_PURGE ="true"
  • BM_UPLOAD_FTP_DESTINATION : répertoire de destination où les archives doivent être copiées
    Code:
    export BM_UPLOAD_FTP_DESTINATION ="/"
Options MySQL
  • BM_MYSQL_DATABASES : nom des bases de données à sauvegarder(séparés par des espaces ou __ALL__ pour toutes les bases)
    Code:
    export BM_MYSQL_DATABASES ="laferme forumlaferme"
  • BM_MYSQL_ADMINLOGIN : identifiant de connexion MySQL
    Code:
    export BM_MYSQL_ADMINLOGIN ="root"
  • BM_MYSQL_ADMINPASS : mot de passe de connexion MySQL
    Code:
    export BM_MYSQL_ADMINPASS ="sqlpassword"
  • BM_MYSQL_HOST : adresse du serveur mysql (IP, localhost ou nom DNS)
    Code:
    export BM_MYSQL_HOST ="localhost"
  • BM_MYSQL_PORT : port du serveur mysql (par défaut 3306)
    Code:
    export BM_MYSQL_PORT ="3306"
  • BM_MYSQL_FILETYPE: format de compression pour l'archive (gzip ou bzip2)
    Code:
    export BM_MYSQL_FILETYPE="gzip"

Pour plus d'informations sur les autres options, consulter la documentation officielle.
Exécution manuelle
Code:
[i]root [~] >[/i] backup-manager
Automatisation de la sauvegarde


Par défaut, l'installation programme déjà l'exécution de Backup Manager, tous les jours.Une petite vérification :
Code:
[i]root [~] >[/i] 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.

 

 
Un peu de sécurité sur notre serveur debian


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 !

 
Sécurité SSH


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.
1) Diminuer la visibilité du SSH


Première chose à faire, changer le port 22 par défaut.
Code:
[i]root [~] >[/i] nano /etc/ssh/sshd_config
Modifiez le port dans le fichier de config:
Code:
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:
Code:
[i]root [~] >[/i] netstat -l|grep 6060
Si vous avez un résultat, choisissez un autre port qui soit supérieur à 1024.

 
2) Contrôlez les login valables en SSH


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.
Code:
[i]root [~] >[/i] nano /etc/ssh/sshd_config
Modifiez les utilisateurs autorisés dans le fichier de config:
Code:
AllowUsers djo ouark
Mettez le login des comptes que vous souhaitez activer. Seuls ces comptes pourront accéder au SSH.

 
3) Désactiver le login root


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.
Code:
[i]root [~] >[/i] nano /etc/ssh/sshd_config
Ajoutez ou activez la commande suivante:
Code:
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.

 
4) Empêcher les passwords vides


Cela parait très logique, mais une option permet d'autoriser les passwords vides, vérifiez qu'elle soit bien à off:
Code:
[i]root [~] >[/i] nano /etc/ssh/sshd_config
Vérifiez la ligne ou ajoutez là:
Code:
PermitEmptyPasswords no
 
5) Désactivez le protocole SSH 1


Si le protocole SSH que vous avez est le 1, passez au 2 ! Des failles ont été corrigées.
Code:
[i]root [~] >[/i] nano /etc/ssh/sshd_config
Vérifiez la ligne ou ajoutez là:
Code:
Protocol 2
 
6) Redémarrer SSH


Il ne nous reste plus qu'à redémarrer le service ssh.
Code:
[i]root [~] >[/i] /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 :
Code:
[i]root [~] >[/i] ssh [b]-p 6060[/b] VOTRE_IP
 
Mise en place d'un Firewall


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 ...
1) Créez un fichier firewall.sh


Créez le fichier dans votre repértoire root par exemple:
Code:
[i]root [~] >[/i] nano firewall.sh
 
2) Bloquer tout le trafic entrant et sortant


Première chose à faire, par défaut nous bloquons tout le trafic sortant et entrant.

Ajoutez ces lignes dans votre fichier:
Code:
#!/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...

 
3) Protection de notre serveur Mail


Pour contrer les relais SMTP et autres requêtes sur votre serveur mail, ajoutez les lignes suivantes:
Code:
#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.

 
4) Autorisation des protocoles principaux


Pour le moment tout est bloqué sauf le SSH, nous allons ajouter des exceptions au blocage:
Code:
# 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 [b]IP_SUPERVISION[/b]/32 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 161 -s [b]IP_SUPERVISION[/b]/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:
Code:
# 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]
 
5) Autorisation serveur


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)
Code:
# 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:
Code:
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:
Code:
#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):
Code:
# Mail
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.
6) Exécution du script


Ajoutez les droits d'exécution sur votre script et lancez le :
Code:
[i]root [~] >[/i] chmod +x firewall.sh
[i]root [~] >[/i] ./firewall.sh
Vérification :
Code:
[i]root [~] >[/i] iptables -L
Chain INPUT (policy DROP)
targetprot opt sourcedestination
LOG_REJECT_SMTP0--adsl-tpe-NET.STATIC.so-net.net.tw/17anywhere
LOG_REJECT_SMTP0--122-120-0-0.dynamic.hinet.net/13anywhere
LOG_REJECT_SMTP0--168-95-0-0.hinet-ip.hinet.net/16anywhere
LOGtcp--anywhereanywheretcp dpt:6060 recent: CHECK seconds: 60 hit_count: 2 name: SSH side: source LOG level warning
DROPtcp--anywhereanywheretcp dpt:6060 recent: UPDATE seconds: 60 hit_count: 2 name: SSH side: source
ACCEPTtcp--anywhereanywheretcp dpt:6060 state NEW recent: SET name: SSH side: source
DROPtcp--192.168.0.11anywheretcp dpt:ssh recent: UPDATE seconds: 60 hit_count: 4 name: SSH side: source
tcp--192.168.0.11anywheretcp dpt:ssh recent: SET name: SSH side: source
ACCEPTtcp--192.168.0.11anywheretcp dpt:ssh
ACCEPT0--anywhereanywherestate RELATED,ESTABLISHED
ACCEPTtcp--192.168.0.200anywheretcp dpt:snmp
ACCEPTudp--192.168.0.200anywhereudp dpt:snmp
ACCEPT0--anywhereanywhere
ACCEPTicmp --anywhereanywhere
ACCEPTtcp--anywhereanywheretcp dpt:www
ACCEPTtcp--anywhereanywheretcp dpt:https
ACCEPTtcp--anywhereanywheretcp dpt:ftp
ACCEPT0--anywhereanywherestate RELATED,ESTABLISHED
ACCEPTtcp--anywhereanywheretcp dpt:domain
ACCEPTudp--anywhereanywhereudp dpt:domain
ACCEPTtcp--anywhereanywheretcp dpt:smtp
ACCEPTtcp--anywhereanywheretcp dpt:pop3
ACCEPTtcp--anywhereanywheretcp dpt:imap2

Chain FORWARD (policy DROP)
targetprot opt sourcedestination

Chain OUTPUT (policy DROP)
targetprot opt sourcedestination
ACCEPT0--anywhereanywherestate RELATED,ESTABLISHED
ACCEPTtcp--anywhereanywheretcp dpt:ftp
ACCEPTtcp--anywhereanywheretcp dpt:www
ACCEPTtcp--anywhereanywheretcp dpt:domain
ACCEPTudp--anywhereanywhereudp dpt:domain
ACCEPTudp--anywhereanywhereudp dpt:ntp
ACCEPT0--anywhereanywhere
ACCEPTicmp --anywhereanywhere
ACCEPTtcp--anywhereanywheretcp dpt:smtp
ACCEPTtcp--anywhereanywheretcp dpt:pop3
ACCEPTtcp--anywhereanywheretcp dpt:imap2

Chain LOG_REJECT_SMTP (3 references)
targetprot opt sourcedestination
LOG0--anywhereanywhereLOG level warning prefix ` SMTP REJECT PAQUET : '
DROP0--anywhereanywhere
 
7) Autorisation du SSH et protection


Maintenant que nous avons vérifié que tout fonctionnait correctement, nous allons pouvoir ajouter des règles pour le SSH
Code:
# Autoriser SSH
/Sur une seule ligne
iptables -t filter -A INPUT -p tcp --dport [b]6060[/b] -m recent --rcheck --seconds 60
 --hitcount 2 --name SSH -j LOG --log-prefix "SSH REJECT"
/Sur une seule ligneiptables -t filter -A INPUT -p tcp --dport [b]6060[/b] -m recent --update --seconds 60--hitcount 2 --name SSH -j DROP
/Sur une seule ligneiptables -t filter -A INPUT -p tcp --dport [b]6060[/b] -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:
Code:
/Sur une seule ligneiptables -t filter -A INPUT -p tcp --dport 22 -s [b]VOTRE_IP[/b]/32 -m recent --update--seconds 60 --hitcount 4 --name SSH -j DROP
/Sur une seule ligneiptables -t filter -A INPUT -p tcp --dport 22 -s [b]VOTRE_IP[/b]/32 -m recent --set--name SSH
/Sur une seule ligneiptables -t filter -A INPUT -p tcp --dport 22 -s [b]VOTRE_IP[/b]/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:
Code:
[i]root [~] >[/i] nano /etc/rc.local
Et rajoutez le chemin complet vers votre script:
Code:
/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 !

 
Conclusion


Notre environnement web est désormais complet.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut