[réseau] Sécuriser un serveur Apache/PHP/MySQL (LAMP)

Avant de poser une question, voyez si on n'y a pas déjà répondu pour vous !

Modérateur: Mods GNU/Linux

[réseau] Sécuriser un serveur Apache/PHP/MySQL (LAMP)

Messagede Malekal_morte » 25 Juin 2008 15:59

Une fois n'est pas coutume, nous allons parler de sécurité non pas sous Windows mais sous GNU/Linux.

À l'heure où les serveurs dédiés sont accessibles au grand public (Dedibox, OVH, etc.), vous pouvez vous retrouver avec un serveur dédié GNU/Linux sans avoir forcément les connaissances requises pour l'administrer et surtout le sécuriser.
Les auteurs de malwares recherchent des serveurs WEB vulnérables afin de les hacker, soit pour insérer une iframe pour infecter les visiteurs du site, soit pour héberger du code malicieux utilisé dans des infections.
Cette page a pour but de vous donner les bases pour sécuriser un serveur WEB PHP/MySQL, bien entendu, une connaissance minimale du système GNU/Linux est requise.

Introduction

Cette page vous donne quelques recettes et conseils pour sécuriser votre serveur GNU/Linux, la page sera découpée en quatre chapitres :

Cette page est destinée à des personnes qui ont un minimum de connaissance du système GNU/Linux, vous risquez de faire plus de dégâts qu'autre chose à modifier certaines configurations.
Tous les éléments sont donnés pour être effectués en console via SSH sur votre serveur distant. Pour ceux qui ne sont pas habitués, vous pouvez bien sûr vous inspirer de certains conseils et les appliquer via panels ou interfaces WEB pour modifier la configuration de votre système.

Dans le cas d'un serveur de production, essayez sur un serveur de test ou une machine personnelle avant d'effectuer des éventuelles modifications.
Enfin, effectuez une sauvegarde des fichiers de configuration avant toute modification afin de pouvoir revenir en arrière et bien sûr faites une sauvegarde du système.

Les conseils classiques en matière de sécurité

Bien entendu, vous devez aussi suivre les conseils classiques de tout système que ce soit un serveur ou un poste de travail à savoir :
  • Utiliser des mots de passe complexes (on évite les mots de passe faciles qui se trouvent dans les dictionnaires)
  • Maintenir son système à jour, encore et toujours, un système non à jour = un système comportant des failles. Si vous voulez donner du grain à moudre pour vous faire hacker, y a pas bien.
    • Maintenez votre système à jour : effectuez des mises à jour régulières, dans le cas d'un serveur Debian : apt-get update puis apt-get upgrade. Dans cette optique, installez au maximum les applications —notamment celles critiques (Apache, MySQL)— depuis les packages de votre distribution afin qu'elles soient maintenues à jour par votre distribution.
    • Inscrivez-vous sur des sites de news pour vous tenir au courant (vous trouverez une liste plus bas).
  • Faites bien attention aux permissions sur les fichiers et à la gestion des utilisateurs/groupes.
  • N'installez que les dæmons et applications utiles et requis par votre serveur. Moins d'applications qui tournent = moins de vulnérabilités possibles et aussi moins de problèmes.
    • Si vous faites des tests de forums, wiki etc... pensez à supprimer ces derniers, ce serait dommage de se faire compromettre son serveur pour un wiki oublié au fin fond d'un répertoire.
    • Attention aussi aux scripts PHP et autres que vous utilisez, si vous téléchargez des scripts PHP sur des sites attention... notamment aux SQL Injections
  • Maîtriser et connaître son système. Plus vous serez à l'aise sur votre système, moins il sera facile de hacker votre serveur. N'hésitez pas à vous documenter sur les systèmes GNU/Linux, Internet regorge d'informations.
  • Jeter un œil régulièrement aux logs systèmes afin de vérifier ce qui se passe.

NOTE : Dans cette page, les chemins de configuration et certaines commandes seront spécifiques à Debian, à vous d'utiliser les équivalents selon votre distribution.
De même le nom des packages peut différer d'une distribution à l'autre.
Première régle élémentaire de sécurité : on réfléchit puis on clic et pas l'inverse - Les fichiers/programmes c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas

Sécuriser son ordinateur (version courte)
Marre des Virus? Passez à GNU/Linux!
Soutenez malekal.com en effectuant un don!
Image
- spamhere-@wanadoo.fr - http://fofo.dyndns.org

* Ce n'est pas parce que les lendemains qui devaient chanter ont déchanté que le futur s'écrit au passé *
Avatar de l’utilisateur
Malekal_morte
Site Admin
Site Admin
 
Messages: 44596
Inscription: 10 Sep 2005 13:57

Re: Sécuriser un serveur Apache/PHP/MySQL (LAMP)

Messagede Malekal_morte » 25 Juin 2008 16:00

Sécuriser le système

Gestion des ports

Le but est de fermer les ports ouverts par divers dæmons après installation du système.
Ce sont en général des dæmons qui ouvrent des ports. Pour fermer un port, vous devez soit désactiver le dæmon du démarrage pour ne pas qu'il se lance, soit le désinstaller (en supprimant le package).

Pour visualiser les ports ouverts (LISTEN), utilisez la commande suivante :

Code: Tout sélectionner
demonux:/# netstat -lp
Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name   
tcp        0      0 *:4427                  *:*                     LISTEN     2016/rpc.statd     
tcp        0      0 *:sunrpc                *:*                     LISTEN     1644/portmap       
tcp        0      0 *:auth                  *:*                     LISTEN     1996/inetd         
tcp        0      0 localhost:smtp          *:*                     LISTEN     1984/exim4         
tcp6       0      0 *:ssh                   *:*                     LISTEN     2204/sshd           
udp        0      0 *:3072                  *:*                                2016/rpc.statd     
udp        0      0 *:920                   *:*                                2016/rpc.statd     
udp        0      0 *:bootpc                *:*                                1807/dhclient3     
udp        0      0 *:sunrpc                *:*                                1644/portmap


NOTE : la commande netstat -taupe donne des infos supplémentaires tel que le PID du programme etc...
Si vous avez à killer un programme.

inetd
tcp 0 0 *:auth *:* LISTEN 1996/inetd

inetd est un service réseau qui écoute les ports pour démarrer le service adéquat en fonction de la connexion sur le port.
Cela permet d'éviter d'avoir des services qui tournent en permanence afin de gagner en ressources.
Si vous n'en avez pas besoin, vous pouvez le supprimer : dpkg -P inetd

Par défaut le port auth (113) est ouvert, pour le fermer, éditez le fichier /etc/inetd.conf et commentez la ligne
ident stream tcp wait identd /usr/sbin/identd identd


Relancez la conf d'inetd par la commande :
Code: Tout sélectionner
/etc/init.d/openbsd-inetd start


RPC
Les RPC (développées par sun) permettent l’exécution de procédures sur une machine distante.
Les RPC sont utilisées par NFS, NID etc... si vous ne comptez pas utiliser ces programmes, vous pouvez les supprimer.
(plus d'infos : http://coredump.developpez.com/nfs/)

tcp 0 0 *:sunrpc *:* LISTEN 1644/portmap
tcp 0 0 *:4427 *:* LISTEN 2016/rpc.statd
udp 0 0 *:3072 *:* 2016/rpc.statd
udp 0 0 *:920 *:* 2016/rpc.statd


Vous pouvez désinstaller portmap & nfs-common:
Code: Tout sélectionner
apt-get remove portmap nfs-common


exim4 est le dæmon mail par défaut de Debian, et il écoute sur localhost.
Si ce n'est pas le cas, vous pouvez le reconfigurer, tapez la commande : dpkg-reconfigure exim4-config
Si votre serveur ne fait pas serveur mail, laissez la distribution en local, Il vous demandera alors sur quelle adresse écouter, laissez l'adresse: 127.0.0.1

Après installation d'Apache et MySQL, vous devez obtenir ceci :
Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name
tcp 0 0 localhost:mysql *:* LISTEN 2480/mysqld
tcp 0 0 localhost:smtp *:* LISTEN 7160/exim4
tcp6 0 0 *:www *:* LISTEN 6830/apache2
tcp6 0 0 *:ssh *:* LISTEN 1971/sshd
udp 0 0 *:bootpc *:* 1952/dhclient3



Sécuriser SSHD

Il peut être intéressant d'interdire de se logguer directement en root pour plus de sécurité.
Pour cela dans le fichier /etc/ssh/sshd_config, mettez la valeur PermitRootLogin à no
PermitRootLogin no


et pour encore plus de sécurité, vous pouvez restreindre l'accès SSH à certains utilisateurs ou groupes, via les paramètres : AllowUsers et AllowGroups

Vous pouvez aussi utiliser fail2ban pour filtrer les tentatives de connexions SSH (voir dans le paragraphe pour aller plus loin).

Firewall / Iptables

La dernière opération consiste à installer un pare-feu via un script iptables.

NOTE : Si vous n'êtes pas à l'aise avec les scripts iptables et que vous avez un accès graphiques à votre serveur (sic), vous pouvez utiliser les programmes suivants :
firestarter: http://doc.ubuntu-fr.org/firestarter
FirewallBuilder : http://www.fwbuilder.org/

Un peu de documentation sur iptables :
http://doc.ubuntu-fr.org/iptables
http://www.linux-france.org/prj/inetdoc ... -tutorial/

Voici un script de départ que vous pouvez modifier : http://www.malekal.com/fichiers/secure_ ... irewall.sh
Ce dernier n'ouvre que les ports 22 et 80, à vous de le customizer selon les ports à ouvrir sur votre serveur.

Dans le cas d'un serveur distant, il peut être dangereux d'effectuer des tests. Si vous fermez le port SSH, vous perdez la main sur le serveur.
Vous pouvez alors utiliser ce script qui reset toutes les tables iptables : http://www.malekal.com/fichiers/secure_ ... irewall.sh
Après avoir mis les scripts en exécution (chmod +x), pour effectuer un test, il suffit de lancer la commande suivante :
/root/firewall && sleep 120 && /root/no-firewall.sh

Le pare-feu sera alors lancé pendant 120s puis tout sera remis à zéro, dans le cas où vous avez fait une erreur de script, tout sera à nouveau accessible après ces 120s.
De quoi effectuer autant de test que vous voulez.

Une fois le script firewall OK, copiez le dans /etc/init.d et lancez la commande suivante pour que le script se charge au démarrage :
Code: Tout sélectionner
update-rc.d firewall defaults


Vous pouvez scanner votre serveur depuis une machine distance avec nmap : http://nmap.org/
ou éventuellement depuis un site testant les pare-feu.
https://www.grc.com/x/ne.dll?bh0bkyd2
http://www.auditmypc.com/firewall-test.asp

Note pour les utilisateurs Dedibox :
Dedibox utilise un système de monitoring qui se connecte sur le port 161, vous devez donc ouvrir ce port, pour cela, rajoutez les lignes suivantes :
# Monitoring Dedibox
iptables -A INPUT -i $wlan -s 88.191.254.0/24 -p tcp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i $wlan -s 88.191.254.0/24 -p udp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o $wlan -d 88.191.254.0/24 -p tcp --sport 161 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o $wlan -d 88.191.254.0/24 -p udp --sport 161 -m state --state ESTABLISHED -j ACCEPT

Sécuriser le service FTP

Dans un tout autre registre, il est fortement conseiller de renforcer la sécurité de votre serveur FTP en filtrant les connexions extérieures.
Dans la mesure du possible, créez des règles iptables pour filtrer les connexions et ne laisser passer que votre adresse IP fixe (ou vos classes d'IP si vous êtes en IP dynamique).

Certains infections volent les informations de connexion FTP, je vous conseille de lire cette page afin d'avoir un aperçu sur ces infections : hack-web-site-t22837.html

Quelques liens et programmes utiles et divers


Vous pouvez aussi désinstaller le package ppp qui ne sert à priori à rien : apt-get remove ppp

Enfin, vous pouvez aussi faire en sorte que seul le root puisse utiliser les programmes de compilations :
Code: Tout sélectionner
chmod o-x /usr/bin/gcc-4.1
chmod o-x /usr/bin/make
chmod o-x /usr/bin/apt-get
chmod o-x /usr/bin/dpkg
Première régle élémentaire de sécurité : on réfléchit puis on clic et pas l'inverse - Les fichiers/programmes c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas

Sécuriser son ordinateur (version courte)
Marre des Virus? Passez à GNU/Linux!
Soutenez malekal.com en effectuant un don!
Image
- spamhere-@wanadoo.fr - http://fofo.dyndns.org

* Ce n'est pas parce que les lendemains qui devaient chanter ont déchanté que le futur s'écrit au passé *
Avatar de l’utilisateur
Malekal_morte
Site Admin
Site Admin
 
Messages: 44596
Inscription: 10 Sep 2005 13:57

Re: Sécuriser un serveur Apache/PHP/MySQL (LAMP)

Messagede Malekal_morte » 25 Juin 2008 16:00

Sécuriser Apache 2

Sécuriser Apache : faites du ménage

Il convient de faire du ménage après l'installation d'Apache, afin de désactiver les éléments inutiles.
Encore une fois, faites tourner le strict minimum, c'est à dire ce dont vous vous servez et désactivez le reste qui peut mettre en péril la sécurité du serveur (surtout si vous oubliez à la longue que telle ou telle chose tourne).

un peu d'obscurentisme

Par défaut, Apache nous donne la version utilisée, ce qui peut permettre de savoir si telles ou telles vulnérabilités est présente.

Not Found

The requested URL /apache2-default/prout.html was not found on this server.
Apache/2.2.3 (Debian) Server at 192.168.1.10 Port 80


Ajoutez les directives suivantes dans le fichier de conf d'apache (/etc/apache2/apache2.conf) afin de masquer les versions et autres informations :
ServerTokens Prod
ServerSignature Off


nettoyer les sites/vhosts
Faites du ménage dans les sites-availables : /etc/apache2/sites-available/default

Notez que la commande suivante permet de désactiver un répertoire virtuel :
a2ensite mon_repertoire_virtuel

Celle-ci de le désactiver :
a2dissite mon_repertoire_virtuel


Supprimer les modules inutiles
Faites du ménage dans les modules. Les modules ajoutent des fonctionnalités (et donc des risques de vulnérabilités) au serveur Apache.
Encore une fois, ne faites tourner que les modules que vous utilisez, désactiver tous les autres modules.

La liste des modules et leurs descriptions respectives est disponible, en français, à cette adresse : http://httpd.apache.org/docs/2.2/mod/
Voir aussi cette page : http://www.formation.ssi.gouv.fr/stages ... dules.html

Par exemple pour désactiver le module cgi :
Code: Tout sélectionner
demonux:/etc/apache2/mod-security# a2dismod cgid
Module cgid disabled; run /etc/init.d/apache2 force-reload to fully disable.


Vous devez comme indiqué relancer Apache.

La commande a2enmod permet de réactiver le module.

mod-Security

Ce mods permet de mettre en place du filtrage au niveau des user agents, referer, header etc.

Code: Tout sélectionner
cd /tmp
apt-get install libxml2
wget http://etc.inittab.org/~agi/debian/libapache-mod-security2/etch/libapache2-mod-security2_2.1.5-1etch1_i386.deb
wget http://etc.inittab.org/~agi/debian/libapache-mod-security2/etch/mod-security2-common_2.1.5-1etch1_all.deb
dpkg -i *deb


ce qui nous donne :
(Lecture de la base de données... 20877 fichiers et répertoires déjà installés.)
Préparation du remplacement de libapache2-mod-security2 2.1.5-1etch1 (en utilisant libapache2-mod-security2_2.1.5-1etch1_i386.deb) ...
Dépaquetage de la mise à jour de libapache2-mod-security2 ...
Préparation du remplacement de mod-security2-common 2.1.5-1etch1 (en utilisant mod-security2-common_2.1.5-1etch1_all.deb) ...
Dépaquetage de la mise à jour de mod-security2-common ...
Paramétrage de mod-security2-common (2.1.5-1etch1) ...

Paramétrage de libapache2-mod-security2 (2.1.5-1etch1) ...
Forcing reload of web server (apache2)... waiting .


Note à l'heure où vous lisez les liens vers les packages ne sont peut-être plus bon.
Donc allez sur http://etc.inittab.org/~agi/debian/liba ... ity2/etch/ et récupérez les nouveaux noms de fichiers.

Il convient ensuite de configurer mods-security.
Pour cela, nous allons déjà créer le fichier de configuration.

Code: Tout sélectionner
cd /etc/apache2/
mkdir mod-security
cd mod-security
wget http://www.malekal.com/fichiers/secure_webserver/mods_security.conf
wget http://www.gotroot.com/downloads/ftp/mod_security/2.0/apache2/apache2-gotrootrules-modsec2.0-latest.tar.gz
tar xvfz apache2-gotrootrules-modsec2.0-latest.tar.gz && rm apache2-gotrootrules-modsec2.0-latest.tar.gz
echo Include /etc/apache2/mod-security/mods_security.conf >> /etc/apache2/apache2.conf
/etc/init.d/apache2 reload


Le serveur apache2 est relancé avec les règles mods-security

Il est ensuite possible de mettre en place un script qui va automatiquement mettre à jour ces règles.
Pour cela :

Code: Tout sélectionner
cd /etc/apache2/mod-security
wget http://www.malekal.com/fichiers/secure_webserver/modsec_update.sh
chmod +x modsec_update.sh
./modsec_update.sh


Si tout va bien, vous devriez obtenir ceci :
demonux:/etc/apache2/mod-security# ./modsec_update.sh
Changing PWD: /etc/apache2/mod-security
Updating blacklist.conf: ok.
Updating rules.conf: ok.
Updating apache2-rules.conf: ok.
Restarting apache: ok.


Il suffit alors de mettre en place un cron pour que la mise à jour se fasse automatiquement.
On notera que sur un serveur de production et selon le compte du/des site(s), la mise à jour des règles peut bloquer des sites, donc à vous de voir si vous tenez à mettre ces mises à jour de manière automatique.

crontab -e et ajouter la ligne suivante, pour que la mise à jour se lance tous les jours à 00h30 :
Code: Tout sélectionner
30 00 * * * /etc/apache2/mod-security/modsec_update.sh


Souces :
http://gotroot.com/tiki-index.php?page= ... d_security
http://gotroot.com/downloads/ftp/mod_se ... /modsec.sh


mod-evasive

module evasive est un module qui permet de se protéger des attaques DoS..
Ce module analyse le nombre de requêtes par sites/par page et interdit l'accès à la page pour l'IP en question (forbidden), il est aussi possible d'exécuter une commande par exemple l'ajout d'une règle iptables pour blacklister l'IP.

Par expérience, je vous dirais que ce module est inutile car le forbidden n'est pas suffisant pour stopper une attaque DoS. Dans le cas de l'ajout automatique de règles iptables, s'il y a beaucoup d'IP cela peut être plus néfaste que bénéfique.
Enfin, il arrive régulièrement que des IP soient ajoutées sans pour autant que cela ne soit des attaques.
Donc à faire attention, néanmoins, si vous voulez tester etc... voici comment installer ce module :

Pour compiler le module evasive, vous devez utiliser apxs qui se trouve dans le package apache2-prefork-dev sur Debian.
gcc est bien sur necessaire pour compiler.

Code: Tout sélectionner
demonux:/tmp/mod_evasive# apt-get install apache2-mpm-worker-dev gcc
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Les paquets supplémentaires suivants seront installés :
  comerr-dev libapr1-dev libaprutil1-dev libc6-dev libdb4.4-dev libexpat1-dev libkadm55 libkrb5-dev libldap2-dev libpcre3-dev libpcrecpp0 libpq-dev
  libsqlite3-dev libssl-dev linux-kernel-headers openssl uuid-dev zlib1g-dev binutils cpp cpp-4.1 gcc-4.1 libssp0
Paquets suggérés :
  doc-base glibc-doc manpages-dev db4.4-doc krb5-doc postgresql-doc-8.1 sqlite3-doc ca-certificates binutils-doc cpp-doc gcc-4.1-locales make manpages-dev autoconf automake1.9 libtool flex bison gdb gcc-doc gcc-4.1-doc libc6-dev-amd64 lib64gcc1
  lib64ssp0
Paquets recommandés :
  gcc c-compiler
Les NOUVEAUX paquets suivants seront installés :
  apache2-prefork-dev comerr-dev libapr1-dev libaprutil1-dev libc6-dev libdb4.4-dev libexpat1-dev libkadm55 libkrb5-dev libldap2-dev libpcre3-dev
  libpcrecpp0 libpq-dev libsqlite3-dev libssl-dev linux-kernel-headers openssl uuid-dev zlib1g-dev
0 mis à jour, 19 nouvellement installés, 0 à enlever et 1 non mis à jour.
Il est nécessaire de prendre 11,7Mo dans les archives.


Le site officiel du module est : http://www.zdziarski.com/projects/mod_evasive/
Vous pouvez récupérer les sources dans le cas où le lien ci-dessous n'est plus valide.

Code: Tout sélectionner
wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar xvfz mod_evasive_1.10.1.tar.gz
apxs2-i -a -c mod_evasive20.c


Si tout va bien, vous devez obtenir ceci :
demonux:/tmp/mod_evasive# apxs2 -i -a -c mod_evasive20.c
/usr/share/apr-1.0/build/libtool --silent --mode=compile --tag=disable-static i486-linux-gnu-gcc -prefer-pic -DLINUX=2 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_REENTRANT -I/usr/include/apr-1.0 -I/usr/include/openssl -I/usr/include/postgresql -I/usr/include/xmltok -pthread -I/usr/include/apache2 -I/usr/include/apr-1.0 -I/usr/include/apr-1.0 -I/usr/include/postgresql -c -o mod_evasive20.lo mod_evasive20.c && touch mod_evasive20.slo
/usr/share/apr-1.0/build/libtool --silent --mode=link --tag=disable-static i486-linux-gnu-gcc -o mod_evasive20.la -rpath /usr/lib/apache2/modules -module -avoid-version mod_evasive20.lo
/usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' mod_evasive20.la /usr/lib/apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install cp mod_evasive20.la /usr/lib/apache2/modules/
cp .libs/mod_evasive20.so /usr/lib/apache2/modules/mod_evasive20.so
cp .libs/mod_evasive20.lai /usr/lib/apache2/modules/mod_evasive20.la
PATH="$PATH:/sbin" ldconfig -n /usr/lib/apache2/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib/apache2/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 644 /usr/lib/apache2/modules/mod_evasive20.so
apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
apxs:Error: At least one `LoadModule' directive already has to exist..


Comme on peut le voir à la fin, le programme n'a pas réussi à activer le module, pas bien grave.
Editez le fichier suivant /etc/apache2/mods-available/mod_evasive.load
Code: Tout sélectionner
vim /etc/apache2/mods-available/mod_evasive.load

Ajoutez :
Code: Tout sélectionner
LoadModule evasive20_module   /usr/lib/apache2/modules/mod_evasive20.so


créez le dossier suivants :
Code: Tout sélectionner
mkdir /var/log/apache2/evasive/
chown www-data.www-data -R /var/log/apache2/evasive/


dans le fichier de conf d'Apache (/etc/apache2/apache2.conf), ajoutez ceci :
<IfModule mod_dosevasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10

# Destination du log.
DOSLogDir "/var/log/apache2/evasive/"

# Bannissement de l'IP en cas de bloquage.
#DOSSystemCommand "sudo iptables -A INPUT -s %s -j DROP"

# Liste blanche.
#DOSWhiteList 127.0.0.1
#DOSWhitelist 192.168.1.*
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*
</IfModule>


  • DOSHashTableSize : Taille de la table hash, plus grande est la valeur, plus de mémoire sera necessaire pour parcourir la table, plus la valeur sera petite, plus le parcourt de la table sera rapide. Laissez la valeur par défaut.
  • DOSPageCount Nombre de requête pour une même page dans l'intervale DOSPageInvernal, au delà, l'IP est bloquée.
  • DOSSiteCount Pareil qu'au dessus mais pour un site au lieu d'une page.
  • DOSPageInterval Intervalle du nombre de pages en secondes.
  • DOSSiteInterval Intervalle du nombre de sites par secondes.
  • DOSBlockingPeriod Période en seconde pendant laquelle l'IP sera bloquée (vous recevrez un forbidden).
  • DOSWhitelist Permet de mettre des IP en liste blanche, dans notre exemple ci-dessus, ce sont des IP du bot Google.
  • DOSSystemCommand Permet d'exécuter une commande, ici on peut lancer un script iptables

Pour activer le module, tapez la commande : a2enmod mod_evasive
relance Apache : /etc/init.d/apache restart




Pour aller plus loin...
Protéger vos données avec .htaccess : http://www.malekal.com/apache.php

Eventuellement mettre en place du SSL :
http://www.ac-creteil.fr/reseaux/system ... e-ssl.html
http://www.coagul.org/article.php3?id_article=351
http://doc.ubuntu-fr.org/tutoriel/secur ... 2_avec_ssl

Chrooter Apache2 :
http://www.cgisecurity.com/webservers/a ... howto.html

Apache et suEXEC : http://httpd.apache.org/docs/1.3/suexec.html

Documentation apache ubuntu : http://doc.ubuntu-fr.org/apache2



Je vous donne aussi ce script qui peut être interressant pour bloquer des IP sur des requêtes identiques : http://www.malekal.com/fichiers/secure_ ... /ban_ip.sh

Par exemple, si l'on prend cette portion de log d'attaque.

Code: Tout sélectionner
62.163.251.181 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Hotbar 4.3.1.0)"
80.200.13.7 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5) Gecko/20031007"
91.64.5.214 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Microsoft-WebDAV-MiniRedir/5.1.2600"
81.241.161.172 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1"
77.250.132.166 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)"
89.3.137.76 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.5) Gecko/20031021"


On peut voir que c'est la même page avec la même string qui est envoyée (http://www.malekal.com//search/index.ph ... sbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R ).
Le script fait un grep sur les logs pour récupérer cette string et récupère les IP des attaquants pour les bloquer.

Encore une fois, cela est suffisant pour certains DoS, plus le nombre d'IP est grand plus difficile l'attaque sera à bloquer.
Enfin dans le cas d'un syn flood, cela ne marche pas.
Première régle élémentaire de sécurité : on réfléchit puis on clic et pas l'inverse - Les fichiers/programmes c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas

Sécuriser son ordinateur (version courte)
Marre des Virus? Passez à GNU/Linux!
Soutenez malekal.com en effectuant un don!
Image
- spamhere-@wanadoo.fr - http://fofo.dyndns.org

* Ce n'est pas parce que les lendemains qui devaient chanter ont déchanté que le futur s'écrit au passé *
Avatar de l’utilisateur
Malekal_morte
Site Admin
Site Admin
 
Messages: 44596
Inscription: 10 Sep 2005 13:57

Re: Sécuriser un serveur Apache/PHP/MySQL (LAMP)

Messagede Malekal_morte » 25 Juin 2008 16:01

Sécuriser MySQL

Comme tout serveur, il est important de :
  • Limiter les connexions extérieures aux machines permises.
  • Avoir une gestion des utilisateurs stricte (supprimer les utilisateurs inutiles, limiter l'accès aux machines/IP, avoir des mots de passe forts etc.).
  • Maintenir MySQL à jour pour corriger les éventuelles failles de sécurités.
  • Jeter un oeil de temps en temps aux logs afin de vérifier ce qui se passent.

Par défaut, sur Debian, MySQL n'écoute que sur localhost, les connexions depuis des machines distances sont impossibles.
Ce qui est bien sûr une bonne chose en terme de sécurité, sauf dans le cas où la base de données et le serveur WEB sont des machines dissociées.
Vous pouvez alors filtrer les connexions par IP avec iptables par exemple.

A noter, qu'il est est aussi possible de se connecter à MySQL depuis un tunnel SSH : http://krierjon.developpez.com/mysql/se ... age_5#L5.2

C'est la directive bind-adresse qui permet de choisir l'adresse d'écoute du serveur MySQL dans le fichier de configuration (/etc/mysql/my.cnf sur Debian)
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1


Rappel quelques commandes simples
pour se connecter à MySQL :
mysql -u root -p

pour voir les bases :
show databases;

Pour se connecter à une base :
connect database;

pour voir les tables :
show tables;


Mettre un mot de passe sécurité, pour changer le mot de passe, se connecter à MySQL et passer la commande :
Code: Tout sélectionner
SET PASSWORD FOR root@localhost=PASSWORD('DlkeDl242');



Par défaut, vous pouvez avoir deux comptes root.
Il faut supprimer celui de la machine (dont le host est celui de votre machine)
mysql> select host,user,password from user;
+-----------+------------------+-------------------------------------------+
| host | user | password |
+-----------+------------------+-------------------------------------------+
| localhost | root | *D9BF15612BEA17FD0DF611CA11343517EA86F81D |
| demonux | root | |
| localhost | debian-sys-maint | *AE3297F7AA8487C489A1EA7D22252DF093844E3C |
+-----------+------------------+-------------------------------------------+
3 rows in set (0.00 sec)


ici on voit que la connexion pour l'utilisateur root est possible depuis demonux et ceci sans mot de passe.
Pour supprimer, une requete delete, comme ceci : delete from user where user='root' AND host='demonux';
remplacer demonux par le nom de votre host dans la requête.

Supprimer la base de données test :
Code: Tout sélectionner
DROP DATABASE test;
DELETE FROM db WHERE db='test' OR db='test\_%';


Une autre solution consiste à renommer le compte root.
Le pirate (ou un script) va chercher à hacker le compte root, s'il n'existe pas, ça marchera bcp moins bien...

Code: Tout sélectionner
update user set user='Ed3dELD' where user='root';
flush privileges;


Pour se connecter, il faudra donc utiliser l'utilisateur Ed3dELD


Enfin, pour empécher de lister les bases de données (show databases) pour les users
rajouter la directive safe-show-database dans le fichier de configuration.


Pour aller plus loin...
Sécuriser MySQL : http://krierjon.developpez.com/mysql/securiser/
Chrooter MySQL : http://krierjon.developpez.com/mysql/se ... age_13#L13
Première régle élémentaire de sécurité : on réfléchit puis on clic et pas l'inverse - Les fichiers/programmes c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas

Sécuriser son ordinateur (version courte)
Marre des Virus? Passez à GNU/Linux!
Soutenez malekal.com en effectuant un don!
Image
- spamhere-@wanadoo.fr - http://fofo.dyndns.org

* Ce n'est pas parce que les lendemains qui devaient chanter ont déchanté que le futur s'écrit au passé *
Avatar de l’utilisateur
Malekal_morte
Site Admin
Site Admin
 
Messages: 44596
Inscription: 10 Sep 2005 13:57

Re: Sécuriser un serveur Apache/PHP/MySQL (LAMP)

Messagede Malekal_morte » 25 Juin 2008 16:01

Sécuriser PHP

Comme indiqué dans l'introduction, le choix des scripts PHP est important.
Comme sur votre poste de travail, vous devez faire attention aux applications que vous installez, il convient aussi de faire attention aux applications PHP et scripts que vous installez et mettez en ligne.

Le simple faite de télécharger et installer un script PHP depuis un site WEB en proposant peut mettre en péril la sécurité de votre serveur, si la conception du script laisse à désirer (SQL injection etc..).

En outre certaines applications, si elles ont mal été pensées peuvent ne pas fonctionner suite à certaines modifications proposées ci-dessus.
A vous de tester avant.

Voici quelques vérification à effectuer quant à la configuration de votre serveur PHP.
Pour rappel, le fichier de configuration PHP5 sur une Debian se trouve ici : /etc/php5/apache2/php.ini

register_globals off


Une bonne explication des risques de laisser register_globals à on :
http://phpsec.org/projects/guide/fr/1.html
http://www.student-designer.com/fr/tuto ... s-failles/

Permet de désactiver certains fonctions et vérifie l'accès aux fichiers (UID / GID) :
safe_mode = Off


Eventuellement porter la variable allow_url_fopen à off.
allow_url_fopen = off


Vous pouvez aussi logguer les erreurs PHP afin d'obtenir d'éventuelles informations :
log_errors On
display_errors Off
error_log /var/log/php/errors


Le dossier de logs doit bien sûr être accessibles en écriture pour l'utilisateur apache (www-data).


Limiter l'exécution de script à certains répertoires.
Ceci est à rajouter dans le fichier de configuration Apache, dans vos vhosts :
<VirtualHost 127.0.0.1>
DocumentRoot /home/www/exemple.com/html
ServerName exemple.com
ServerAlias http://www.exemple.com
php_admin_value open_basedir /home/www/exemple.com/:/tmp
</VirtualHost>



Quelques liens :
Sécurisez votre installation PHP avec Hardened-PHP : http://www.hardened-php.net/
PhpSecInfo permet de tester la sécurité de votre installation PHP : http://phpsec.org/projects/phpsecinfo/
PHP Secure : http://thierrylhomme.developpez.com/php/php_secure/
Première régle élémentaire de sécurité : on réfléchit puis on clic et pas l'inverse - Les fichiers/programmes c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas

Sécuriser son ordinateur (version courte)
Marre des Virus? Passez à GNU/Linux!
Soutenez malekal.com en effectuant un don!
Image
- spamhere-@wanadoo.fr - http://fofo.dyndns.org

* Ce n'est pas parce que les lendemains qui devaient chanter ont déchanté que le futur s'écrit au passé *
Avatar de l’utilisateur
Malekal_morte
Site Admin
Site Admin
 
Messages: 44596
Inscription: 10 Sep 2005 13:57

Re: Sécuriser un serveur Apache/PHP/MySQL (LAMP)

Messagede Malekal_morte » 25 Juin 2008 16:02

Pour aller plus loin...


Sécuriser encore plus GNU/Linux
Tenez vous au courant des vulnérabilités et maintenez les applications installées à jour. Une seule vulnérabilité peut compromettre votre serveur - La sécurité se fait au quotidien[/b].

Quelques liens pour se tenir informer des vulnérabilités :
http://www.frsirt.com/bulletins/
http://www.securityfocus.com/vulnerabilities
http://www.debian.org/security/

SQL injection (en anglais) : http://www.owasp.org/index.php/Testing_ ... _Injection
SQL Power Injector : http://www.sqlpowerinjector.com/index.htm
Sqlbftools : http://www.reversing.org/node/view/11

Quelques programmes qui peuvent s'avérer utils :
Bastille pour sécuriser GNU/Linux : http://bastille-linux.sourceforge.net/
Pour les paranos - Rkhunter : http://www.rootkit.nl/
Toujours pour les paranos - chkrootkit : http://www.chkrootkit.org/

Connaître l'OS :
Sécuriser Debian : http://www.debian.org/doc/manuals/secur ... ian-howto/
Pour les Gentoo - Hardened Gentoo : http://www.gentoo.org/proj/en/hardened/
BABA du système GNU/Linux : http://www.debianworld.org/systemes.et.reseaux

Pour aller plus loin :
Installer grsecurity : http://www.grsecurity.net/
Installer LIDS : http://www.lids.org/
Installer un IDS - snort : http://www.snort.org/

Filtrage
Quelques autres programmes qui peuvent s'avérer utiles pour vous simplifier la vie.
Attention aux filtrages automatiquement (ajouts de règles iptables automatiques etc..), parfois cela peut faire plus de mal que de bien.

Bloquer les scans de ports avec Port Sentry :
http://aide.sivit.fr/index.php?2006/01/20/96-portsentry
http://www.funix.org/fr/linux/detection.htm

Filtrer avec fail2ban :
http://www.fail2ban.org/wiki/index.php/Main_Page
http://doc.ubuntu-fr.org/fail2ban
http://www.morefnu.org/post/2008/03/17/ ... pt-kiddies

Monitorer le système et connexions réseaux :
Monitorer les connexions réseaux et load avec mrtg : http://www.malekal.com/mrtg.php
Monitorer les connexions réseaux et load avec cacti :
http://openmaniak.com/fr/cacti_tutorial ... ti-browser
http://www.lanforums.com/tutorial-26_ca ... rveur.html
Note dans le cas d'un serveur OVH ou Dedibox, les graphs pour monitorer sont fournis.

Recevoir des logs par mail avec logwatch : http://doc.ubuntu-fr.org/logwatch
Première régle élémentaire de sécurité : on réfléchit puis on clic et pas l'inverse - Les fichiers/programmes c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas

Sécuriser son ordinateur (version courte)
Marre des Virus? Passez à GNU/Linux!
Soutenez malekal.com en effectuant un don!
Image
- spamhere-@wanadoo.fr - http://fofo.dyndns.org

* Ce n'est pas parce que les lendemains qui devaient chanter ont déchanté que le futur s'écrit au passé *
Avatar de l’utilisateur
Malekal_morte
Site Admin
Site Admin
 
Messages: 44596
Inscription: 10 Sep 2005 13:57

Re: [réseau] Sécuriser un serveur Apache/PHP/MySQL (LAMP)

Messagede Malekal_morte » 26 Fév 2009 00:04

Un AntiSpambot pour forum/blog etc.
Exemple d'intégration sur phpBB3 : http://www.malekal.com/hpHosts_Spambot_Search_Tool.php
Première régle élémentaire de sécurité : on réfléchit puis on clic et pas l'inverse - Les fichiers/programmes c'est comme les bonbons, quand ça vient d'un inconnu, on n'accepte pas

Sécuriser son ordinateur (version courte)
Marre des Virus? Passez à GNU/Linux!
Soutenez malekal.com en effectuant un don!
Image
- spamhere-@wanadoo.fr - http://fofo.dyndns.org

* Ce n'est pas parce que les lendemains qui devaient chanter ont déchanté que le futur s'écrit au passé *
Avatar de l’utilisateur
Malekal_morte
Site Admin
Site Admin
 
Messages: 44596
Inscription: 10 Sep 2005 13:57


Retourner vers Tutoriels et annonces

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

Partenaires du site : Geekeden - OxygenePC.com - Les partenaires du site
Hadopi vous surveille McAfee you Suck Securiser votre ordinateur contre les menaces