Articles Taggés ‘apache’

Améliorer les performances d’apache avec nginx

15 avril 2011

Plop à tous …

Comme vous l’aurez surement remarqué, la quasi-totalité de mes derniers articles sont tirés d’expériences (plutôt foireuses) me poussant souvent à remettre en questions certaines notions que je pensais acquises … cet article n’y couperas pas :s.

Après avoir vénéré les serveurs apache pendant 7 ans, j’ai eu récemment à m’asseoir sur mes convictions et à installer nginx pour avoir des performances convenable …
» En lire plus:Améliorer les performances d’apache avec nginx

Configuration de processus apache au poil …

5 février 2011

salut à tous …

Aujourd’hui on va parler configuration de processus apache … J’ai eu l’occasion en 3-4 jours de connaitre des problèmes sur plusieurs serveurs différents liée à une surconsommation de mémoire due à apache et à sa gestion des processus faisant littéralement planter mon blog (ça swap mal un RPS! donc 2 crash de la machine en 24 heures … avec les nouveaux prix des serveurs dédiés de chez online.net … je risque probablement de migrer prochainement ;) ).

» En lire plus:Configuration de processus apache au poil …

Partage et ecriture de fichiers sur protocole HTTP

12 août 2009

Bijour,

Encore un truc inutile mais assez intéressant ^^. Tout le monde connait le protocole HTTP pour télécharger des pages web, voir des fichiers, mais on peut aussi écrire des fichiers sur le protocole HTTP via webDAV (supporté de base par windows … si c’est pas la classe ^^).

Bon bien sûr, il existe d’autre protocoles pour partager des fichiers (ftp, p2p, smb), mais webDAV a ses avantages :

  • Gestion de la concurrence des accès (plusieurs personnes ne pourront pas modifier le même fichier).
  • Possibilité d’utiliser des certificats SSL pour chiffrer les transferts (super utile!!).
  • Rapide et sécurisé (ça tourne sur un serveur apache) et ça permet d’éviter d’avoir d’autre ports ouvert sur sa machine (genre ftp, …).

Niveau configuration, y’a pas grand chose à faire, il suffit de mettre les lignes suivantes dans un fichier de conf d’apache :

Alias /kikoosfiles /dossier/a/partager/
  1.     <Location /kikoosfiles>
  2.             Dav On
  3.             AuthType Basic
  4.             AuthName "Restricted Files"
  5.             AuthUserFile /etc/apache2/paccess.htpasswd
  6.             Require valid-user
  7.    </Location>

Il faut juste créer le htpasswd :

  1. htpasswd -c /etc/apache2/paccess.htpasswd votreLogin

On peut ensuite tester l’accès :

Sous linux :

webdavSous windows, il suffit d’ouvrir l’url comme dossier web (Alt+O) en donnant l’url.

Bien sûr, si vous avez le modsecurity, vos logs vont se remplir de pas mal de chose, il faut donc désactiver certaines vérifications faites par le modsecurity, ce qui donne la configuration suivante :

Alias /kikoosfiles /dossier/a/partager/
  1.     <Location /kikoosfiles>
  2.             Dav On
  3.             AuthType Basic
  4.             AuthName "Restricted Files"
  5.             AuthUserFile /etc/apache2/paccess.htpasswd
  6.             Require valid-user
  7.             SecRuleRemoveByMsg "Invalid HTTP Request Line"
  8.             SecRuleRemoveByMsg "Method is not allowed by policy"
  9.             SecRuleRemoveByMsg "Request Missing an Accept Header"
  10.             SecRuleRemoveByMsg "HTTP header is restricted by policy"
  11.    </Location>

Si vous avez un certificat ssl, vous saurez facilement comment le mettre en place pour chiffrer la connexion. Et hop, une connexion chiffrée sur http :

dav-ssl

Open-Source : Réseau d’entreprise sécurisé … ou pas

27 juin 2009

Bijour …

Alors voilà, maintenant que la présentation de notre projet pour ma licence pro CDED est terminée, je peux montrer l’architecture de notre réseau sans avoir peur d’être plagié par des concurrents ^^.

Donc le but de notre réseau est d’avoir :

  • Une sécurité assez élevée sans pour autant compromettre l’utilisation du réseau par les utilisateurs (le problème de tout admin …).
  • Un coût très faible autant niveau architecture logicielle que matérielle
  • Une maintenance aisée du réseau (ajout/suppression de postes/utilisateurs)

Le contexte de notre projet :

Une petite entreprise veut revoir son réseau et ses logiciels/sites web pour plus de productivité, avec pas mal d’intéractions avec l’extérieur (Obligation d’utiliser une base de données extérieur au réseau, plusieurs site web publié avec utilisation de certificats pour le chiffrement (pour l’authentification ça aurait été un peu trop :p), …).

Ce qui a donné le réseau suivant pour notre groupe :

Network-Skipify-final-cipher

L’architecture est plus ou moins classique, on sépare les serveurs des utilisateurs, côté chiffrement :

  • Toute communication est chiffrée entre les serveurs (3DES en phase 1 et AES en phase 2) on a poussé le vice jusqu’à chiffrer les communication avec les clients Linux du réseau (bien sûr toute communication non chiffrée sur le réseau des serveurs est automatiquement rejetée).
  • Les communications vers la base de données sont chiffrés par un tunnel (ssh avec une simple redirection de ports).
  • Les communications depuis les internautes sont chiffrés par un certificat valide en AES

Coté architecture matérielle :

  • 4 serveurs sous debian 5.0 patché avec GrSecurity pour les ACL et le W^X (ma licence étant spé développement, on a pas pu pousser la chose très loin … dommage, ce patch me semble très prometteur, et devrait devenir une norme dans le domaine de l’hébergement).
  • 1 client XP ajouté au domaine NT (utilisation du remote announce de samba pour l’utilisation du PDC hors du réseau sécurisé des serveurs), ainsi qu’un client linux avec authentification direct à l’annuaire LDAP

Coté architecture logicielle :

  • Sur le reverse proxy / Firewall :
    • Apache2 avec modsecurity couplé avec l’IDS, modevasive (pour les bruteforces et DoS de faible ampleur), mod proxy pour la mise en place d’un reverse proxy pour protéger le serveur web
    • IDS Prelude couplé avec Snort
    • Utilisation d’arpwatch pour les attaques en interne (un script kidy qui réussit à pirater le wifi, la connexion d’un employé au réseau local via son IPhone ;) , ….)
    • Fail2Ban pour les bruteforces sur le service SSH
    • IPTable comme firewall
  • Sur le serveur WWW et d’appli : apache2 avec le mod rails pour les applis web en ruby (déploiement et màj des applis simplifié par capistrano …)
  • sur le PDC un serveur Samba avec OpenLDAP

Et hop … on obtient un réseau pas mal sécurisé et gratuit (faut juste payer l’informaticien ;) ).

Par contre, en discutant avec les profs après déploiement de l’architecture sur 8 machines virtuelles (vmware … le proprio saymal mais bon), on s’est rendu compte de quelques problèmes (et ouai … je suis encore un élève ;) ) :

  • Comme un noob j’avais laissé la configuration IPv6, toute la partie IPsec que j’avais déployée etait alors totalement inutile puisque centré sur l’IPv4 seulement, heureusement, j’avais fait des bind explicite sur les adresses IPv4, seul les serveurs http et dns était accessible en IPv6.
  • Sinon, le problème propre au déploiement sur machines virtuelles (comme un noob encore une fois), déploiement de toutes les machines en bridge sur le réseau de l’IUT (l’admin réseau ne m’a pas vu … mais un autre groupe s’est fait gaulé ^^). N’importe qui aurait pu se connecter sur notre réseau en connaissant nos ip. A ma décharge je dirais deux choses : je savais pas qu’en host-only c’est pas seulement l’hote et la mv, mais l’hote et toutes les mv qui peuvent discuter ensemble, ce qui ne corrige en rien le problème des connexions direct sur notre réseau depuis d’autre machines virtuelles, puisque tout les groupes ont montés leurs réseau sur la même machine

Donc voilà … un petit retour sur l’utilisation de l’open-source pour la sécurité et le déploiement d’un réseau entièrement gratuit, qui se rapproche plus d’une multi-national (bien qu’encore très très très loin) que du réseau familial … qui malheureusement est encore présent dans beaucoups d’entreprises en france (et même des grosses boites … pour qui la sécurité consiste à placer des filtres extrèmement lourd sur leurs proxy et mettre à jour des AV …).

Quelques Dénis de services Sympa ou pas

17 mai 2009

Bijour à vous en ce dimanche ensoleillé (en Alsace ^^).

Petite note : Vous seul êtes responsable de vos actes (de toutes façon, la plupart de ces commandes exécutées par une seule machine ne peuvent plus venir à bout d’un serveur (ou d’une machine quoique …) … donc n’imaginez pas pouvoir planter le serveur de votre petite copine avec les commandes fournit dans l’article … mieux vaut la corriger autrement …)

Voilà mon premier article un peu orienté attaque de l’année (après plein de truc inutile sur comment fortifier son serveur sauce juvamine), ça fait suite à l’attaque qu’a subit korben, et je suis tombé (par hasard!! ça arrive si si je vous jure) sur un vieux numéro de MISC (le numéro 19 de mai-juin 2005 qui était très intéressant … leurs articles sont toujours très intéressant d’ailleurs), qui analysait diverses méthodes de dénis de services.

Donc voici le petit résumé des commandes sympa du mag en question : (Oui dites-le, je ne suis qu’un copieur … et alors ?! J’ai aussi rajouté quelques trucs trouvés sur le net histoire de me faire pardonner ou pas)

  • SynFloods :
    • L’une des attaques les plus simpliste : on balance un paquet TCP avec un syn et on arrête là (donc pas de syn-ack a réceptionner et donc de ack a envoyer, le serveur attendra une réponse qui ne viendra jamais), ce qui peut à termes bouffer pas mal de ressource côté serveur
    • La commande en mode « normal » : hping3 –syn -M 123456 -L 0 -p 80 <ip> –flood
    • Paquets générés : syn-flood-normal On remarque que les paquets ont tous la même tronche (même adresse source et destination) sympa pour se faire choper ^^
    • La commande en random source : hping3 –syn -M 123456 -L 0 -p 80 <ip> –flood –rand-source
    • Paquets générés : syn-flood-randomOn remarque que les ips sources changent … comme c’est direct écrit dans le paquet tcp, y’a de grande chance de ne pas se faire choper … à part si le FAI le détecte ^^.
  • Syn-Ack Floods
    • Un autre type d’attaque sympa, on balance un syn-ack au serveur, le serveur n’ayant pas de ack associé va renvoyer un rst et là … owned, on peut donc par exemple, flooder un serveur en lui envoyant les syn-ack avec comme ip source un autre serveur, et c’est le premier serveur qui enverra les rst au second serveur … on attaque une machine et ce sont deux machines qui trinquent !! Par contre ici, la consommation de mémoire est moindre à cause de l’envoi du rst. A noter que sur une attaque de grande ampleur, en randomisant/incrémentant les numéros de séquence on peut (peut-être) couper des connexions existante (faut soit avoir du bol, soit avoir pas mal de machines sous la main ;) )
    • La commande : hping3 -SA -M 123456 -L 0 -p 80 –flood –rand-source
    • Paquets générés : syn-ackOn remarque le flag syn/ack, et toujours l’ip source spoofé (l’ip de destination est mon serveur … et je m’autorise à me flooder ^^)
  • Le sapin de noël TCP
    • Ici, un envoi de paquets avec un numéro de séquence nul
    • La commande : sudo hping3 -SAFRU -M 0 -L 0 -p 80 –flood
    • Paquets générés : safru-modeOn remarque les flags FIN/SYN/RST/ACK/URG qui sont set … j’ai oublié de prendre le numéro de séquence en screen, mais bon …
  • Le trou noir de niveau 2!! (ARP)
    • Ici, c’est l’attaque d’un sous-réseaux, l’attaque parfaitement inutile … on balance ettercap pour détourner les paquets en local vers sa machine … et on oubli comme un noob le forwarding des paquets … et plus d’accès au net … cela dit, faire passer sa machine pour la passerelle et rediriger le traffic pour choper des pass semble plus intelligent …
    • La commande : cf. l’un de mes articles sur ettercap en omettant le forwarding
  • Le trou noir de niveau 3 (IP)
    • Ici ba c’est pareil que le niveau 2 … aussi naze, sauf que c’est au niveau au-dessus, au lieu de rediriger vers une MAC qui bloque le traffic on envoi le traffic sur une ip inexistante ou non-configuré comme gateway
    • La commande : sing -red -S <ip gateway> -gw <ip nouveau gateway> -dest 0.0.0.0 (le net quoi) -x net <ip victime>
    • Exemple avec captures du paquet : sing -red -S 192.168.0.1 -gw 192.168.0.13 -dest 0.0.0.0 -x net 192.168.0.11
      192.168.0.1 est ma passerelle de base, 192.168.0.13 est la machine qui va servir de nouvelle passerelle qui prendra le traffic à destination de 0.0.0.0 (le net quoi) -x net 192.168.0.11 qui est ma machine « victime »
      icmp-redirectA noter qu’encore une fois … le paquet est entièrement forgé, donc si vous ne mettez pas votre ip dedans … ben elle y sera pas ^^, donc on remarque les différents champs du paquet ICMP source/destination et adresse du nouveau gateway, …
    • On peut aussi faire cette attaque sur un DHCP (genre on le descend avec maraveDHCP encore un DoS!! … un DoS pour faire un autre DoS futé :p) puis on utilise irdp de façon similaire à la commande précédente : irdp -i eth0 -S 192.168.0.13 -D 192.168.0.11 (quand même plus court que l’autre commande ^^).
  • Les attaques sur les sessions
    • Ici, le but est d’ouvrir une session sans la fermer, donc on suit le cheminement SYN/SYN-ACK/ACK et plus rien, sachant que la config par défaut des serveurs est d’avoir genre 150-200 clients simultannés au maximum, ouvrir autant de session rendra le serveur aphone ou le fera pas mal lagguer
    • La commande pour un service apache : webdevil <ip-serveur> 80 <nb session> (je l’ai fait sur localhost cette fois … j’ai pas envie de tester sur mon serveur ^^)flood-apache
      On voit les paquets syn, syn-ack et ack … et plus rien (j’ai pas pris la suite dans le screen parce que y’avait plein de dup … allez savoir pourquoi ;) )
    • A noter que webdevil est vraiment orienté bad … l’auteur a même prévu un ensemble d’outil pour lancer des attaques distribuées (suffit de remplir le fichier slaveservers.txt encore un truc de SM … de lancer le webdevild sur les machines esclaves et le devilmaster sur le maitre^^ si c’est pas méchant)
  • Flood sur le service DNS
    • Encore une attaque sympa avec un outils sympa … toujours et encore sur packetstorms … qui permet de flooder un serveur DNS … encore mieux ^^
    • La commande : dnsflood <ip serveur> (j’ai pas fait de capture … too lazy)
  • Flooder un routeur Wifi avec mdk3

Je rajouterai encore des trucs prochainement … ou pas (si j’arrive à déchiffrer le PDF plus bas :p), si ça vous a intéressé, lisez donc le numéro 19 de MISC (vous serez surement surpris de voir le nombre de truc que j’ai pas encore copié de l’article en question ;) j’ai quand même pris des screenshots :p c’est du boulot, bon je m’enfonce j’arrête là … bon apétit).

Quelques liens :

  • Une doc, (j’ai pas réussi à le lire … probleme de police sa TimeNewsRoman est planté, j’ai juste réussi à lire les titres ^^) sur les attaques DOS, moi qui pensait avoir honteusement pompé sur MISC (ce PDF parle d’autre attaque DoS en plus de ceux présenté ici … faut dire, y’a pas mal de technique possible avec d’autre logiciels et d’autre config), sinon, le site de l’auteur est sympa.
  • Sinon, y’a google qui donne toujours de très bon liens ;)

ModSecurity mise en place de restrictions sur les règles de restrictions ^^

16 mai 2009

Bonsoir …

Bé voilà, si vous avez installé la dernière version de ModSecurity (>2.5) avec les generic_attack en filtre, vous avez sûrement remarqué que phpMyAdmin ne fonctionne plus (hé oui, ça fait du SQL Injection :p), mais les blogs peuvent aussi ne plus fonctionner (XSS, voir Command/File Injection si vous tentez de poster du code sur votre blog), ce n’est que dernièrement, que j’ai remarqué ces erreurs, sans trop y faire gaffe (à part que là, ben ça remplissait les logs avec une IP que je connaissait très bien … la mienne, le méchant pirate, je vais porter plainte sur 127.0.0.1 ^^, je suis sûr que la procédure judiciaire passerait ;) ).

Donc pour remédier à ce problème, les gars qui ont dév la bête sont intelligent, ils avaient prévu le coup avec :

SecRuleRemoveById et SecRuleRemoveByMsg

Ce qui donnent donc pour PhpMyAdmin :

<Location /phpmyadmin/>
  1.      SecRuleRemoveByMsg "Blind SQL Injection Attack"
  2.      SecRuleRemoveByMsg "SQL Injection Attack"
  3. &lt;/Location&gt;

et pour WordPress (partie administration)

<Location /wp-admin/>
  1.      SecRuleRemoveByMsg "Blind SQL Injection Attack"
  2.      SecRuleRemoveByMsg "SQL Injection Attack"
  3.      SecRuleRemoveByMsg "Cross-site Scripting (XSS) Attack"
  4.      SecRuleRemoveByMsg "Remote File Access Attempt"
  5.      SecRuleRemoveByMsg "System Command Injection"
  6. &lt;/Location&gt;

Pour la partie commentaires … à voir suivant la confiance que vous avez en vos visiteurs ^^ (tentez pas de poster des commentaires sur mon blog avec des commandes systèmes … vous seriez surpris sur mon niveau de confiance ;) … y’a quand même des gars qu’ont tenter de brute-forcer mon phpmyadmin, bande de naab!!!).

A mettre dans l’un de vos fichiers de conf d’apache, et vous ne tomberez plus sur les erreurs 501 (protocole non implémenté) que cela générait.

Voilà … Bonne nuit

Analyse automatisée des logs apache

15 mai 2009

Bonjour à tous …
[la traduction du terme analyse dans le texte est GREP ^^ faut pas s'attendre à une analyse mathématique !!]

Bé voilà, comme j’adore raconter ma vie, voici un petit truc sympa :

Aujourd’hui on a eu droit à un cours … le premier depuis des mois!!! L’ennui se faisant sentir (un cours sur les tests … déjà vu en DUT), je me connecte à mon serveur et après un petit tour du proprio … comme d’hab koi ^^ Je lis les logs de mon serveur … (c’est grave docteur ??) et là horreur plein de ligne du ModSecurity m’indiquant pleins de tentatives diverses et variées (XSS, SQL Injection, …).

Un petit aperçu d’une ligne du log :

[Fri May 15 16:36:35 2009] [error] [client 74.55.32.34] ModSecurity: Access denied with code 501 (phase 2).
  1. [msg "Remote File Access Attempt"]
  2. [severity "CRITICAL"] [tag "WEB_ATTACK/FILE_INJECTION"]
  3. [hostname "blog.gaetan-grigis.eu"]
  4. [unique_id "Sg1981diuFsAADJ2ypYAAAAC"]

Le genre du truc qu’en terminal on aime pas trop lire (surtout sur l’écran du téléphone portable) … et pis y’en avais une bonne cinquantaine … et là mes venu la superbe idée (j’imagine que plein d’admins l’on déjà fait, mais bon ^^ au cas où si ça vous intéresse), j’ai crée un petit script qui analyse le log d’erreur d’apache (par grep quoi ^^) et envoi un mail avec les lignes incriminées, ce qui donne donc (il vous faudra bien sûr le mod_security d’installé … cf. mon blog ;) )

#!/bin/sh
  1. LOG_ERROR="/var/log/apache2/error.log"
  2. LOG_MODSEC=`cat $LOG_ERROR |grep ModSecurity | wc -l`
  3. if [ $LOG_MODSEC -gt 0 ]
  4. then
  5.         SEVERITY_ALERT=`cat $LOG_ERROR | grep "severity \"ALERT\"" | wc -l`
  6.         SEVERITY_CRITI=`cat $LOG_ERROR | grep "severity \"CRITICAL\"" | wc -l`
  7.         if [ $SEVERITY_ALERT -gt 0 ]
  8.         then
  9.                 cat $LOG_ERROR | grep "severity \"ALERT\"" |mail -s "[LOG]HTTP ALERT" addr@gmail.com
  10.                 echo "NB ALERT : $SEVERITY_ALERT"
  11.         fi
  12.  
  13.         if [ $SEVERITY_CRITI -gt 0 ]
  14.         then
  15.                 cat $LOG_ERROR |grep "severity \"CRITICAL\"" | mail -s "[LOG]HTTP CRITICAL" addr@mail.com
  16.                 echo "NB CRITICAL : $SEVERITY_CRITI"
  17.         fi
  18. fi

et voila passionnante ma vie ^^, en ASM ça se résumerait ainsi : (MOV al,1 XOR ebx,ebx, int 0×80), reste plus qu’à exécuter le script avant le rotatelog histoire d’avoir le résumé des attaques de la journée/semaine …
Je vais peut être en profiter pour faire des graphiques suivant les types d’attaque, leurs nombres, leurs provenances, … ou pas

Petit ajout du 17 mai … pour rajouter un script du genre celui donné plus haut, il faut aller voir dans le fichier /etc/logrotate.d/apache2 et ajouter les lignes suivantes :

prerotate
  1.                 sh /scripts/logAnalyzer.sh &gt; /dev/null
  2.         endscript

après la ligne sharedscripts et hop, on envoi les mails avant la rotation des logs, comme ça on passe pas pour le nolife-ki-li-ses-logs-apache-pendant-les-cours devant ses camarades de classe.

Voilà … bon we ;)

Syn Flooding, optimisation PHP, …

13 mai 2009

Bonsoir …

Comme j’ai pas grand chose à écrire (et que ça ne sert à rien de réinventer la roue ^^), quelques liens sympa pour ce soir :

Un très bon article sur une façon de contrer les synflooding (dont korben a fait les frais aujourdhui ^^)

Un bon moyen d’améliorer les performances de son serveur apache (utilisant PHP bien sûr) :

  • Le premier lien avec quelques tests sympa
  • Le second lien avec une astuce pour installer le panel d’admin (qui n’est pas forcément dans les paquets comme le suggère le 1er)

J’ai testé le truc, mais je suis pas sûr que ça mettent en cache quelque chose … le chargement de la page principal du blog dure encore 10 secs (faut aussi avouer que le premier accès disque d’un RPS est lent, est que la base de données prend aussi une claque avec le nombre de données affiché, mais bon), j’en ai profité pour améliorer les performances de mon serveur DNS et « sécuriser » la bête au passage.

Sinon, je twitte (faites pas gaffe au nom … c’est mon côté féminin ;) ) quelque liens, et commandes sympa, enfin côté contenu, je compte écrire un ou plusieurs articles sur l’IPSec (que je vais devoir déployer sur un réseaux), ainsi que deux trois autres astuces genre comment planter un serveur Web en 2 2 (… ça plaira à korben après le DoS ;p ).

Voilà … bonne soirée.

Administration de serveurs apache : modsecurity2

14 février 2009

Bijour

Bé voilà vé parler du modsecurity2 … pourquoi ?? Ben on trouve pas mal de tut’s sur le net, mais c’est que pour le mod_security (sans le 2 ^^), et la syntaxe à malheureusement changée depuis.

Donc voilà …

Il faut tout d’abord rajouter un dépôt (le mien ^^) au fichier /etc/apt/sources.list :

  1. deb http://ppa.launchpad.net/cipher.16/ppa/ubuntu intrepid main

et rajouter la clé associée au dépôt :

  1. sudo apt-key adv –recv-keys –keyserver keyserver.ubuntu.com DA27D37831F6D1C0BC85566CDD2A2A8817FB9A87

Ensuite faire un apt-get install modsecurity2 && a2enmode mod-security2.

Pourquoi préférer cette version à celle de inittab (proposé par la doc de modsecurity) ?? … parce que c’est la dernière version stable (2.5.7, qui permet des trucs sympa … cf. la fin de l’article ;) )

Par défaut, tous les fichiers de configuration liés au modsecurity2 sont bazardés dans le dossier /usr/share/apache/mod_security2_rules (je suis pas assez doué pour faire du post-install dans mes paquets …), vous pouvez soit les déplacer dans le dossier  /etc/apache2/conf.d/, mais il faudra un peu les retoucher (surtout le modsecurity_crs_10_config.conf en modifiant les fichiers de logs, sinon des erreurs apparaitront lors du démarrage du serveur).

Pour utiliser les fichiers de configuration fournit par le paquet :

  1. cat /usr/share/apache2/mod_security2_rules/*.conf >> /etc/apache2/conf.d/security

et modifier toutes les lignes en rapport avec les logs, pour cela, remplacez :

SecAuditLog logs/modsec_audit.log par SecAuditLog /var/log/apaches2/modsec_audit.log
SecDebugLog logs/modsec_debug.log par SecDebugLog /var/log/apache2/modsec_debug.log

Ou bien, vous pouvez faire votre propre fichier de configuration, grâce à la superbe doc.

Pour cela, allez dans le dossier /etc/apache2/conf.d/ et modifiez le fichier security.conf, ou bien en créer un nommé … du nom que vous voulez.

Dans lequel il faudra mettre (au minimum, histoire de faire propre) :

<IfModule mod_security2.c>
  1. ServerTokens Full
  2. ServerSignature On
  3. TraceEnable Off
  4.  
  5. SecRuleEngine On
  6. SecRequestBodyAccess On
  7. SecResponseBodyAccess On
  8.  
  9. SecAuditLog /var/log/apache2/mod_secure.log
  10. ## RESTE DE LA CONFIG A METTRE ICI
  11.  
  12. ## NE PAS TOUCHER PLUS LOIN
  13. </IfModule>

Et on met quoi dans cette configuration ???

Plein de choses diverses et variées (on peut aussi rajouter quelque lignes des fichiers d’exemple dans /usr/share/apache2/mod_security2_rules, qui peuvent être très intéressante pour bloquer les injections, …).
Pour induire en erreurs/bloquer certains scanners :

Changement de la signature du serveur (un peu grossié ^^ mais ça peut induire en erreur les n00b … ça fait toujours ça de moins) :

SecServerSignature « Windows 2003 IIS/6.0″
  1. SecRule REQUEST_HEADERS:User-Agent ".*perl.*" "t:none,msg:'Perl based user agent identified'"
  2. SecRule REQUEST_HEADERS:User-Agent ".*nikto.*" "t:none,msg:'Nikto Scanners Identified'"
  3. SecRule REQUEST_HEADERS:User-Agent "(?:\b(?:m(?:ozilla\/4\.0 \(compatible\)|etis)|webtrends security analyzer|pmafind)\b|n(?:-stealth|sauditor|essus|ikto)|b(?:lack ?widow|rutus|ilbo)|(?:jaascoi|paro)s|webinspect|\.nasl)" \
  4. "phase:2,t:none,t:lowercase,deny,log,auditlog,status:404,msg:'Request Indicates a Security Scanner Scanned the Site',id:'990002',tag:'AUTOMATION/SECURITY_SCANNER',severity:'2'"
  5. SecRule REQUEST_HEADERS_NAMES "\bacunetix-product\b" \
  6. "phase:2,t:none,t:lowercase,deny,log,auditlog,status:404,msg:'Request Indicates a Security Scanner Scanned the Site',id:'990901',tag:'AUTOMATION/SECURITY_SCANNER',severity:'2'"
  7. SecRule REQUEST_FILENAME "^/nessustest" \
  8. "phase:2,t:none,t:lowercase,deny,log,auditlog,status:404,msg:'Request Indicates a Security Scanner Scanned the Site',id:'990902',tag:'AUTOMATION/SECURITY_SCANNER',severity:'2'"

Bloquer les requêtes zarb :

SecRule REQUEST_LINE « !(^((?:(?:pos|ge)t|head))|http/(0\.9|1\.0|1\.1)$) » \
  1. "t:none,t:lowercase,msg:'Un imbécile qui connait pas le http'"

Bloquer les accès direct à l’ip du serveur : (cas courant de scan)

SecRule REQUEST_HEADERS:Host « ^[\d\.]+$ » \
  1. "log,deny,status:404,t:lowercase,msg:'Connexion direct a l\'ip du serveur'"

Protection contre des fuites lors  d’erreurs mysql : (qui pourrait permettre à des petits malin de connaître les tables utilisées, …)

SecRule RESPONSE_BODY « (?:\b(?:(?:s(?:elect list because it is not contained in (?:an aggregate function and there is no|either an aggregate function or the) GROUP BY clause|upplied argument is not a valid (?:(?:M(?:S |y)|Postgre)SQL|O(?:racle|DBC)))|S(?:yntax error converting the \w+ value .*? to a column of data type|QL Server does not exist or access denied)|Either BOF or EOF is True, or the current record has been deleted(?:; the operation|\. Requested)|The column prefix .{0,50}? does not match with a table name or alias name used in the query|Could not find server '\w+' in sysservers\. execute sp_addlinkedserver)\b|Un(?:closed quotation mark before the character string\b|able to connect to PostgreSQL server:)|(?:Microsoft OLE DB Provider for .{0,30} [eE]rror |error '800a01b8)'|(?:Warning: mysql_connect\(\)|PostgreSQL query failed):|You have an error in your SQL syntax(?: near '|;)|cannot take a \w+ data type as an argument\.|incorrect syntax near (?:\'|the\b|@@error\b)|microsoft jet database engine error '8|ORA-\d{5}: )|\[Microsoft\]\[ODBC ) » \
  1. "phase:4,t:none,ctl:auditLogParts=+E,deny,log,auditlog,status:500,msg:'SQL Information Leakage',id:'970003',tag:'LEAKAGE/ERRORS',severity:'4'"

Protection contre des fuites concernant des erreurs php ou un affichage de code php (source code disclosure comme on dit :p) :

SecRule RESPONSE_BODY « <b>Warning<\/b>.{0,100}?:.{0,1000}?\bon line\b » \
  1. "phase:4,t:none,ctl:auditLogParts=+E,deny,log,auditlog,status:500,msg:'PHP Information Leakage',id:'970009',tag:'LEAKAGE/ERRORS',severity:'4'"
  2. SecRule RESPONSE_BODY "(?:\b(?:f(?:tp_(?:nb_)?f?(?:ge|pu)t|get(?:s?s|c)|scanf|write|open|read)|gz(?:(?:encod|writ)e|compress|open|read)|s(?:ession_start|candir)|read(?:(?:gz)?file|dir)|move_uploaded_file|(?:proc_|bz)open)|\$_(?:(?:pos|ge)t|session))\b" \
  3. "phase:4,t:none,ctl:auditLogParts=+E,log,auditlog,msg:'PHP source code leakage',id:'970015',tag:'LEAKAGE/SOURCE_CODE',severity:'4'"
  4. SecRule RESPONSE_BODY "&lt;\?(?!xml)" \
  5. "phase:4,chain,t:none,ctl:auditLogParts=+E,log,auditlog,msg:'PHP source code leakage',id:'970902',tag:'LEAKAGE/SOURCE_CODE',severity:'4'"
  6. SecRule RESPONSE_BODY "!(?:\b(?:(?:i(?:nterplay|hdr|d3)|m(?:ovi|thd)|(?:ex|jf)if|f(?:lv|ws)|varg|cws)\b|r(?:iff\b|ar!B)|gif)|B(?:%pdf|\.ra)\b)" "t:none"

Protection contre les XSS :

SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES|REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer « @pm jscript onsubmit copyparentfolder javascript meta onmove onkeydown onchange onkeyup activexobject expression onmouseup ecmascript onmouseover vbscript: <![cdata[ http: settimeout onabort shell: .innerhtml onmousedown onkeypress asfunction: onclick .fromcharcode background-image: .cookie ondragdrop onblur x-javascript mocha: onfocus javascript: getparentfolder lowsrc onresize @import alert onselect script onmouseout onmousemove background application .execscript livescript: getspecialfolder vbscript iframe .addimport onunload createtextrange onload <input » \
  1. "phase:2,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:compressWhiteSpace,t:lowercase,pass,nolog,skip:1"
  2. SecAction phase:2,pass,nolog,skipAfter:959004
  3. SecRule REQUEST_FILENAME|ARGS|ARGS_NAMES "(?:\b(?:(?:type\b\W*?\b(?:text\b\W*?\b(?:j(?:ava)?|ecma|vb)|application\b\W*?\bx-(?:java|vb))script|c(?:opyparentfolder|reatetextrange)|get(?:special|parent)folder|iframe\b.{0,100}?\bsrc)\b|on(?:(?:mo(?:use(?:o(?:ver|ut)|down|move|up)|ve)|key(?:press|down|up)|c(?:hange|lick)|s(?:elec|ubmi)t|(?:un)?load|dragdrop|resize|focus|blur)\b\W*?=|abort\b)|(?:l(?:owsrc\b\W*?\b(?:(?:java|vb)script|shell|http)|ivescript)|(?:href|url)\b\W*?\b(?:(?:java|vb)script|shell)|background-image|mocha):|s(?:(?:tyle\b\W*=.*\bexpression\b\W*|ettimeout\b\W*?)\(|rc\b\W*?\b(?:(?:java|vb)script|shell|http):)|a(?:ctivexobject\b|lert\b\W*?\(|sfunction:))|&lt;(?:(?:body\b.*?\b(?:backgroun|onloa)d|input\b.*?\btype\b\W*?\bimage)\b| ?(?:(?:script|meta)\b|iframe)|!\[cdata\[)|(?:\.(?:(?:execscrip|addimpor)t|(?:fromcharcod|cooki)e|innerhtml)|\@import)\b)" \
  4. "phase:2,capture,t:none,t:htmlEntityDecode,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:'Cross-site Scripting (XSS) Attack',id:'950004',tag:'WEB_ATTACK/XSS',logdata:'%{TX.0}',severity:'2'"
  5. SecRule REQUEST_HEADERS|XML:/*|!REQUEST_HEADERS:Referer "(?:\b(?:(?:type\b\W*?\b(?:text\b\W*?\b(?:j(?:ava)?|ecma|vb)|application\b\W*?\bx-(?:java|vb))script|c(?:opyparentfolder|reatetextrange)|get(?:special|parent)folder|iframe\b.{0,100}?\bsrc)\b|on(?:(?:mo(?:use(?:o(?:ver|ut)|down|move|up)|ve)|key(?:press|down|up)|c(?:hange|lick)|s(?:elec|ubmi)t|(?:un)?load|dragdrop|resize|focus|blur)\b\W*?=|abort\b)|(?:l(?:owsrc\b\W*?\b(?:(?:java|vb)script|shell|http)|ivescript)|(?:href|url)\b\W*?\b(?:(?:java|vb)script|shell)|background-image|mocha):|s(?:(?:tyle\b\W*=.*\bexpression\b\W*|ettimeout\b\W*?)\(|rc\b\W*?\b(?:(?:java|vb)script|shell|http):)|a(?:ctivexobject\b|lert\b\W*?\(|sfunction:))|&lt;(?:(?:body\b.*?\b(?:backgroun|onloa)d|input\b.*?\btype\b\W*?\bimage)\b| ?(?:(?:script|meta)\b|iframe)|!\[cdata\[)|(?:\.(?:(?:execscrip|addimpor)t|(?:fromcharcod|cooki)e|innerhtml)|\@import)\b)" \
  6. "phase:2,capture,t:none,t:urlDecodeUni,t:htmlEntityDecode,t:compressWhiteSpace,t:lowercase,ctl:auditLogParts=+E,log,auditlog,msg:'Cross-site Scripting (XSS) Attack',id:'959004',tag:'WEB_ATTACK/XSS',logdata:'%{TX.0}',severity:'2'"

Et les petits trucs que nous permettent de faire la version 2.5.7 :
(protection contre les bruteforces, il faudra bien sûr changer ARGS:login en fonction de vos champs d’authentification).

SecAction initcol:ip=%{REMOTE_ADDR},nolog
  1. SecRule ARGS:login "!^$" \
  2. nolog,phase:1,setvar:ip.auth_attempt=+1,deprecatevar:ip.auth_attempt=20/120
  3. SecRule IP:AUTH_ATTEMPT "@gt 25" \
  4. log,drop,phase:1,msg:'Possible Brute Force Attack"

Une fois que vous avez terminé votre fichier de configuration, n’oubliez pas le /etc/init.d/apache2 restart
Sinon, comme dit, ce ne sont que des exemples, … la doc est très complète : http://www.modsecurity.org/documentation/

Administration de serveurs apache : virtualhost

31 janvier 2009

Bonsoir …

<pour les l33ts>
Histoire de se passer de l’article et de passer à l’essentiel :

echo "alias apctl='/etc/init.d/apache2'">> ~/.bashrc
echo 'function ap_gen_virt { cat /etc/apache2/sites-enabled/000-default | sudo sed "/^[#t].*/ d" | sed "s/<VirtualHost [a-z.*]*/<VirtualHost $1/"|sed "1a\tServerName $1ntDocumentRoot /var/www/$1" > /etc/apache2/sites-enabled/$1.conf; }"' >> ~/.bashrc
sudo ap_gen_virt monsite.fr  && apctl restart

</pour les l33ts>

Pour les autres ;) :

Les virtualhosts d’apache, à quoi ça peut servir ??? à héberger plusieurs sites sur le même ordinateur de façon « transparente ». On peut même y rajouter des options genre des Handlers différent, des règles de sécurité à part (via le mod_security, …)

Simple exemple : sur le même ordinateur on pourrait héberger le site 192.168.0.10 et monsite.fr … sans avoir à installer plusieurs serveurs … (manquerait plus que ça :p).

Configuration pour le site à l’ip 192.168.0.10 (inutile, mais juste pour l’exemple)

Pour mon premier exemple donc on choisit de « rediriger » (pas le bon mot, puisque c’est directement le DocumentRoot, donc la personne n’accedra à rien d’autre.) les requêtes faites sur l’ip vers le dossier /var/www/pirate … pourquoi pirate ?? en générale, lorsque quelqu’un accède à un serveur via une ip … soit c’est l’admin qui fait son kikoo, soit c’est un pirate qui vient de trouver votre serveur par un scan.

Donc on créer le dossier pirate dans /var/www et on y met un petit fichier html citant pas exemple les différent articles contre des intrusions ou la tentative d’intrusions sur des systèmes de traitements de données automatisées (genre Article 323-1 à 7 du code pénal … ça m’étonnerait que ça calme le pirate, mais ça fait toujours bien de citer les peines encouru ;) ).

On va créer un fichier nommé 192.168.0.10.conf dans le dossier /etc/apache2/sites-enabled

<VirtualHost 192.168.0.10:80>
ServerName 192.168.0.10
DocumentRoot /var/www/pirate
</VirtualHost>

Pour la génération de la configuration, on peut utiliser cette commande si on aime bien faire son l33t (à exécuter dans le dossier /etc/apache2/sites-enabled/ en root) :

cat 000-default | sed "/^[#t].*/ d" | sed "s/<VirtualHost [a-z.*]*/<VirtualHost 192.168.0.10/"|sed "1a\tServerName 192.168.0.10ntDocumentRoot /var/www/pirate">192_168._0_10.conf

Configuration pour l’accès monsite.fr

Ensuite, on crée la conf pour l’accès à monsite.fr (à peu près pareil), sauf que le dossier de contenu ce trouve maintenant dans /var/www/mon_site ce qui donne la config suivante à mettre dans le fichier /etc/apache2/sites-enabled/mon_site.fr :

<VirtualHost monsite.fr:80>
ServerName 192.168.0.10
DocumentRoot /var/www/mon_site
</VirtualHost>

et pis là si on a une dizaine de sites à configurer (et que l’on ne veut pas utiliser le superbe module vhostalias qui permettrait de ce passer de ce genre de configuration) … créer les fichiers un par un c’est bof même avec la commande filé plus haut d’autant plus qu’il faut la modifier à chaque fois …

La superbe fonction bash du kikoo qui veut pas se taper les configs à la main

donc une solution existe … faire une fonction bash … ça donne  :

function ap_gen_virt { cat /etc/apache2/sites-enabled/000-default | sudo sed "/^[#t].*/ d" | sed "s/<VirtualHost [a-z.*]*/<VirtualHost $1/"|sed "1a\tServerName $1ntDocumentRoot /var/www/$1" > /etc/apache2/sites-enabled/$1.conf; }

(à exécuter directement dans un terminal, le mieux étant de la rajouter au .bashrc, pour y avoir accès après chaque démarrage), il suffit alors de faire :

sudo ap_gen_virt 192.168.0.10

(pour générer le virtualhost de 192.168.0.10 dans /etc/apache2/sites-enabled/192.168.0.10.conf)

sudo ap_gen_virt monsite.fr

(pour générer le virtualhost de monsite.fr dans /etc/apache2/sites-enabled/monsite.fr.conf)

et voilà … il suffit maintenant de redémarrer le serveur apache pour profiter de ces nouvelles configs :

sudo /etc/init.d/apache2 restart

à noter que là aussi faire un sudo /etc/init.d/apache2 restart c’est pas très sexy, donc on peut exécuter la commande :

alias apctl=’/etc/init.d/apache2′

et là on peut donc redémarrer le serveur apache en tapant :

apctl restart

Voilà … terminé ;)

A noter que la convention voudrait que l’on fassent ça de façon plus propre en passant par un ServerName et/ou un ServerAlias genre :

<VirtualHost 192.168.0.10:80>
ServerName monsite.fr
ServerAlias www.monsite.fr
DocumentRoot /var/www/monsite.fr
</VirtualHost>