[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

Malekal_morte
Messages : 116752
Inscription : 10 sept. 2005 13:57

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

par Malekal_morte »

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 !
Comment protéger son PC des virus
Windows 11 : Compatibilité, Configuration minimale requise, télécharger ISO et installer Windows 11

Comment demander de l'aide sur le forum
Partagez malekal.com : n'hésitez pas à partager les articles qui vous plaisent sur la page Facebook du site.
Malekal_morte
Messages : 116752
Inscription : 10 sept. 2005 13:57

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

par Malekal_morte »

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 : https://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 : https://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

Firewall et DoS

On peux aussi définir des règles pour limiter le nombre de connexion sur le port 80.
Pour tester, vous pouvez utiliser le programme ab qui est fournit avec le package Apache.

Exemple :
Voici un exemple de script qui permet de filtrer le nombre de connexions sur le port 80 :
#!/bin/bash
IPT=/sbin/iptables
# Max connection in seconds
SECONDS=10
# Max connections per IP
BLOCKCOUNT=10
# ....
# ..
# default action can be DROP or REJECT
DACTION="DROP"

$IPT -F
$IPT -N LOGDROP
$IPT -A LOGGING -j LOG -m limit --limit 10/m --log-prefix "Possible-DoS: " --log-level 4
$IPT -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
$IPT -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds ${SECONDS} --hitcount ${BLOCKCOUNT} -j LOGGING
$IPT -A LOGDROP -j ${DACTION}
# ....
Je vous donne aussi ce script qui peut être interressant pour bloquer des IP sur des requêtes identiques : https://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 https://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 https://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 https://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 https://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 https://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 https://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 (https://www.malekal.com//search/index.p ... U*@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.

A customisez selon le type d'attaque :
DoS.png

iptables et strings :
iptables est capable de filtrer sur les strings - exemple pour les attaques :
GET /w00tw00t.at.ISC.SANS
Vous pouvez utiliser la commande :
iptables -I INPUT -d xxx.xxx.xxx.xxx -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t.at.ISC.SANS.' -j DROP
On limite la recherche aux strings de 70 octets maximum (sinon cela peux faire ramer le serveur).
Cette commande peux donc être utile sur les attaques avec des stings spécifiques.

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.

Firewall DOS et IPSET

IPSET peux aussi s'avérer utile pour bannir un nombre assez conséquent d'IPs.
IPSET nécessite des modules dans le kernel, par exemple, sur les kernel OVH ce dernier n'est pas disponible.
modprobe ip_set_hash_net
modprobe ip_set_list_set

Créer une chain ipset et la bloquer sur ipatbles :
ipset -N attaquant iphash --hashsize 4096 --probes 2 --resize 50
iptables -I INPUT -p tcp -m multiport --dport 80,443 -m set --match-set attaquant src -j DROP
Ajouter une IP à la chain ipset :
ipset -! add attaquant $i
On peux aussi ajouter des subnets etc.

Lister les IPs dans IPset :
ipset list
Vider une chain :
ipset -F attaquant
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 : http://forum.malekal.com/hack-web-site-t22837.html


Pour aller plus loin contre les attaques DoS

Voici un programme Floodmon qui permet d'aider à bloquer les attaques Syn Flood : http://spamcleaner.org/fr/misc/floodmon.html

Si vous êtes chez OVH - Il est aussi possible de mettre un firewall matériel en amont de votre serveur dédié : https://www.malekal.com/2013/01/01/ovh- ... isco-asdm/
DoS2.png
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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
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 !
Comment protéger son PC des virus
Windows 11 : Compatibilité, Configuration minimale requise, télécharger ISO et installer Windows 11

Comment demander de l'aide sur le forum
Partagez malekal.com : n'hésitez pas à partager les articles qui vous plaisent sur la page Facebook du site.
Malekal_morte
Messages : 116752
Inscription : 10 sept. 2005 13:57

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

par Malekal_morte »

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.

Dans les bonnes habitudes :
NE PAS laisser les droits en écriture aux groupes others afin d'éviter que n'importe quel utilisateur Linux ne puisse écrire dans les sites et ainsi pouvant uploader par une vulnérabilité une backdoor
Les explications du pourquoi et du comment sont sur la page des SQL Injection (SQLi) : SQL Injection (SQLi) : quelques commentaires

Bloquer l'exécution de binaire par Apache

Bloquer l'exécution de binaire par Apache (ls, wget etc), se reporter à la FAQ : Sécurité WEB : bloquer l’exécution de binaire sur Apache

mod-Security

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

modsecurity ainsi que les règles crs sont disponible sur apt :

Code : Tout sélectionner

malekalmorte@MaK-tux:/tmp$ aptitude search modsecurity
p   libapache2-modsecurity                                                                            - Tighten web applications security for Apache                                                               
p   modsecurity-crs  
Site officiel des règles crs : https://github.com/SpiderLabs/owasp-modsecurity-crs

Sur Debian, les règles sont placées dans le dossier : /usr/share/modsecurity-crs/base_rules/
Le log modsecurity se situe dans le fichier : /var/log/apache2/modsec_audit.log

Pour ma part, je n'ai pas installé les crc de Debian, mais pris directement les règles sur le site.

Au moment où ces lignes sont écrites, les règles sont pour la version 2.7 de modsecurity.
Sur apt, la version de modsecurity est la 2.6
Si vous désirez utiliser les dernières règles avec la version 2.6, vous devez utiliser l'utilitaire suivant : https://github.com/SpiderLabs/owasp-mod ... actions.pl
qui permet de les convertir de la manière suivante : remove-2.7-actions.pl -t 2.6 -f regle.conf

Notez qu'il existe des projets qui permettent de récupérer les logs modsecurity et de les afficher sur des consoles WEB.
Exemple modsecurity-console ou WAF-FLE, plus d'informations : http://www.modsecurity.org/projects/

La directive SecRuleEngine à DetectionOnlypermet de passer modsecurity en détection afin de visualiser les potentielles faux positif et créer des règles d'exception.
Pour cela, vous pouvez créer un fichier whitelist.conf, par exemple, dans : /usr/share/modsecurity-crs/base_rules/

Exemple pour désactiver la règle 981245 sur la page inscription.php

Code : Tout sélectionner

<LocationMatch "/inscription.php">
SecRuleRemoveById 981245
</LocationMatch>
Une fois que vous pensez que les règles sont bien adaptées, vous pouvez passer SecRuleEngine sur On

mods-security et DoS

SpiderLabs fournit des règles expérimentales contre les attaques DoS : https://github.com/SpiderLabs/owasp-mod ... base_rules

Téléchargez ces règles et placez les dans le dossier : /usr/share/modsecurity-crs/base_rules/
Téléchargez le fichier :https://github.com/SpiderLabs/owasp-mod ... nf.example
et renommer le en .conf
Relance la configuration d'Apache : /etc/init.d/apache2 reload

Le programme Slowloris : http://ckers.org/slowloris/
ou slowhttptest http://code.google.com/p/slowhttptest/
permet de tester.

Attention, si les règles ne fonctionnent pas, vous pouvez faire planter Apache (il convient de relancer ce dernier)

Hop en test :
Image

On constate le bourrinage dans les logs Apache.
Image

Après un certain nombre de requête, modsecurity détecte l'attaque.
Dans les logs de modsecurity, on voir le bloquage :
Image


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

Pas mal de tutorial sur Spamcleaner pour sécuriser son serveur Apache : http://spamcleaner.org/fr/misc/modsec2ipt.html

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
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 !
Comment protéger son PC des virus
Windows 11 : Compatibilité, Configuration minimale requise, télécharger ISO et installer Windows 11

Comment demander de l'aide sur le forum
Partagez malekal.com : n'hésitez pas à partager les articles qui vous plaisent sur la page Facebook du site.
Malekal_morte
Messages : 116752
Inscription : 10 sept. 2005 13:57

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

par Malekal_morte »

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.


NE PAS connecter vos sites à vos base de données avec l'utilisateur root - créer un utilisateur pour chaque site avec un mot de passe fort
Les explications du pourquoi et du comment sont sur la page des SQL Injection (SQLi) : https://www.malekal.com/2012/10/08/sql- ... mentaires/

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 !
Comment protéger son PC des virus
Windows 11 : Compatibilité, Configuration minimale requise, télécharger ISO et installer Windows 11

Comment demander de l'aide sur le forum
Partagez malekal.com : n'hésitez pas à partager les articles qui vous plaisent sur la page Facebook du site.
Malekal_morte
Messages : 116752
Inscription : 10 sept. 2005 13:57

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

par Malekal_morte »

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

Si version PHP < 5.4.0
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/

Un mot sur les Backdoor PHP

Je vous invite à lire cet article, au moins connaître leur existance : Détecter les Backdoor PHP

D'autre part, dans l'article, un script est fourni qui permet de détecter les ajouts de pages 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 !
Comment protéger son PC des virus
Windows 11 : Compatibilité, Configuration minimale requise, télécharger ISO et installer Windows 11

Comment demander de l'aide sur le forum
Partagez malekal.com : n'hésitez pas à partager les articles qui vous plaisent sur la page Facebook du site.
Malekal_morte
Messages : 116752
Inscription : 10 sept. 2005 13:57

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

par Malekal_morte »

Pour aller plus loin...

Divers autres tutorials de sécurité WEB, notamment lié à Apache sont disponibles sur ce site.
Voici l'index les regroupant : Apache : sécuriser son site WEB

Si vous utilisez WordPress, vous pouvez vous rendre sur la page : Sécuriser WordPress.

Monitorer son serveur Apache

Il peux être interressant de monitorer son serveur Apache, parfois cela permet de détecter des attaques (cf par exemple ou à défaut les dysfonctionnements) - Exemple : Attaque WEB les plus communes.

Munin peux s'avérer utile - il existe pas mal de tutorials sur le net.

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/

SQLInjection : https://www.malekal.com/2012/10/08/sql- ... mentaires/
SQL injection (en anglais) : https://www.owasp.org/index.php/SQL_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 :
https://www.debian.org/doc/manuals/secu ... ex.fr.html
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

Monitorer le système et connexions réseaux :
Monitorer les connexions réseaux et load avec mrtg : https://www.malekal.com/mrtg.php
Monitorer les connexions réseaux et load avec cacti :
http://openmaniak.com/fr/cacti_tutorial.php
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 !
Comment protéger son PC des virus
Windows 11 : Compatibilité, Configuration minimale requise, télécharger ISO et installer Windows 11

Comment demander de l'aide sur le forum
Partagez malekal.com : n'hésitez pas à partager les articles qui vous plaisent sur la page Facebook du site.
Malekal_morte
Messages : 116752
Inscription : 10 sept. 2005 13:57

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

par Malekal_morte »

Une page concernant les SQL Injection (SQLi) : https://www.malekal.com/2012/10/08/sql- ... mentaires/
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 !
Comment protéger son PC des virus
Windows 11 : Compatibilité, Configuration minimale requise, télécharger ISO et installer Windows 11

Comment demander de l'aide sur le forum
Partagez malekal.com : n'hésitez pas à partager les articles qui vous plaisent sur la page Facebook du site.
Malekal_morte
Messages : 116752
Inscription : 10 sept. 2005 13:57

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

par Malekal_morte »

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 !
Comment protéger son PC des virus
Windows 11 : Compatibilité, Configuration minimale requise, télécharger ISO et installer Windows 11

Comment demander de l'aide sur le forum
Partagez malekal.com : n'hésitez pas à partager les articles qui vous plaisent sur la page Facebook du site.
  • Sujets similaires
    Réponses
    Vues
    Dernier message

Revenir à « Tutoriels et annonces »