Le module web_security pour apache2 peut être assimilé à un firewall pour apache2, alors toutes les requetes web en direction de votre serveur seront d'abord traité par ce module.

A l'heure ou les pirates ou les robots font mumusent en essayant de se connecter un peu partout en espérant trouver d'éventuels failles il s'avérent évident qu'un peu de sécurité ne tue pas.

Nous verrons ici comment mettre tout ceci en place.
On change rien au bonne habitude. Attention ce packages n'est pas disponible en version stable mais en backports. Pour savoir comment configurer votre source.list en conséquence voir ici.

  1. /*
  2. libapache-mod-security
  3. */

Passons maintenant à la configuration. Editons notre apache2.conf, puis ajoutons les lignes suivantes :

  1. /*
  2. <IfModule mod_security2.c>
  3.  
  4. # Turn ModSecurity On
  5. SecRuleEngine On
  6. SecRequestBodyAccess On
  7.  
  8. # Only record the interesting stuff
  9. #SecAuditEngine RelevantOnly
  10. SecAuditEngine Off
  11. SecAuditLogStorageDir /var/log/apache2
  12. SecAuditLog /var/log/apache2/audit_log.log
  13. SecAuditLogParts ABCFHZ
  14.  
  15. # You normally won't need debug logging
  16. SecDebugLog /var/log/apache2/modsec_debug_log.log
  17. # Les logs ont une échelle de 1 à 9, 9 étant le niveau le plus bavard et quand je dis bavard c'est pire que la radio à utiliser uniquement pour le debug.
  18. SecDebugLogLevel 1
  19.  
  20. # Require Content-Length to be provided with
  21. # every POST request
  22. #Si vous utilisez ce paramétres toutes les connexions vont être analysées en fonctions de toutes ces régles le traitement peut être très long d'ou une augmentation de la charge CPU mais aussi un affichage des pages beaucoup plus long.
  23. #Include modsecurity/*.conf
  24. # Les rules utilisées
  25. Include modsecurity/modsecurity_crs_40_generic_attacks.conf
  26. Include modsecurity/modsecurity_crs_41_sql_injection_attacks.conf
  27. Include modsecurity/modsecurity_crs_35_bad_robots.conf
  28. </IfModule>
  29. */

- SecRuleEngine : Permet d'activer ou de désactiver le module

- SecRequestBodyAccess : Permet de traiter le contenu de la requête

La liste des directives est disponible ici.

Dans le fichier apache2.conf, nous avons définit des rules mais qui n'existent pas encore. Pour ceux qui ne sont pas très doués en sécurité le site owasp mets à disposition une liste de régle (attention très restrictif). Nous allons les récupérer et les mettre en place.
Récupérer les tar.gz ici

  1. /*
  2. cd /etc/apache2/
  3. mkdir modsecurity
  4. cd modsecurity
  5. tar xzf modsecurity-crs_xxx.tar.gz
  6. mv modsecurity-crs_xxx/base_rules/* .
  7. */

On peut maintenant redémarrer apache et voir comment celui ci se comporte. Vous pouvez également augmenter le niveau des logs afin de voir les traitements éffectués.

Comme dit un peu plus haut l'activation de toutes les régles ralenti considérablement, l'affichage des pages. On peut le constater en utilisant apache benchmach.

Stats sans de toutes les régles.

  1. /*
  2. Server Software: Apache/2.2.9
  3. Server Hostname: 192.168.10.52
  4. Server Port: 80
  5.  
  6. Document Path: /client1/phpinfo.php
  7. Document Length: 43471 bytes
  8.  
  9. Concurrency Level: 5
  10. Time taken for tests: 4.481 seconds
  11. Complete requests: 1000
  12. Failed requests: 0
  13. Write errors: 0
  14. Total transferred: 43740697 bytes
  15. HTML transferred: 43514471 bytes
  16. Requests per second: 223.16 [#/sec] (mean)
  17. Time per request: 22.405 [ms] (mean)
  18. Time per request: 4.481 [ms] (mean, across all concurrent requests)
  19. Transfer rate: 9532.53 [Kbytes/sec] received
  20.  
  21. Connection Times (ms)
  22. min mean[+/-sd] median max
  23. Connect: 0 7 4.7 7 80
  24. Processing: 4 14 12.0 13 307
  25. Waiting: 0 8 9.9 7 237
  26. Total: 15 22 12.4 21 329
  27.  
  28. Percentage of the requests served within a certain time (ms)
  29. 50% 21
  30. 66% 21
  31. 75% 22
  32. 80% 22
  33. 90% 23
  34. 95% 24
  35. 98% 33
  36. 99% 85
  37. 100% 329 (longest request)
  38. */

Stats avec l'activation de toutes les régles.

  1. /*
  2. Server Software: Apache/2.2.9
  3. Server Hostname: 192.168.10.52
  4. Server Port: 80
  5.  
  6. Document Path: /client1/phpinfo.php
  7. Document Length: 43466 bytes
  8.  
  9. Concurrency Level: 5
  10. Time taken for tests: 823.405 seconds
  11. Complete requests: 1000
  12. Failed requests: 988
  13. (Connect: 0, Receive: 0, Length: 988, Exceptions: 0)
  14. Write errors: 0
  15. Total transferred: 43696940 bytes
  16. HTML transferred: 43470940 bytes
  17. Requests per second: 1.21 [#/sec] (mean)
  18. Time per request: 4117.026 [ms] (mean)
  19. Time per request: 823.405 [ms] (mean, across all concurrent requests)
  20. Transfer rate: 51.82 [Kbytes/sec] received
  21.  
  22. Connection Times (ms)
  23. min mean[+/-sd] median max
  24. Connect: 0 1 5.8 0 117
  25. Processing: 2447 4114 756.3 3793 8151
  26. Waiting: 2428 4002 737.2 3689 7472
  27. Total: 2448 4115 756.4 3794 8151
  28.  
  29. Percentage of the requests served within a certain time (ms)
  30. 50% 3794
  31. 66% 3963
  32. 75% 4133
  33. 80% 4337
  34. 90% 5332
  35. 95% 5809
  36. 98% 6623
  37. 99% 6881
  38. 100% 8151 (longest request)
  39. */

Les tests parlent d'eux mêmes donc soyez vigilant en activant toutes les régles déjà pour des raisons de perf et aussi très restrictives.

PS : Les tests ont été fait sur une VM à 256Mo de RAM.