J'ajoute quelques notes qui peuvent être utiles concernant la sécurité de votre site WEB.
Notamment un mot sur les permissions des dossiers qui sont très importants.
Voici rapidement le fonctionnement des permissions sur un systèmes *UNIX.
Il existe pas mal de littérature comme tout élément touchant *UNIX sur la toile, si vous souhaitez parfaire ces connaissances.
On obtient :
- 1 : Ce sont les permissions du "owner" / propriétaire du dossier/fichier
- 2 : Les permissions liés aux groupes
- 3 : Les permissions liés à "others", autres utilisateurs
Vous avez donc les permissions du propriétaire du fichier/dossier, du groupe auquel appartient le fichier/dossier et enfin autre.
Il est donc possible de ne donner les droits qu'au propriétaire, propriétaire/groupe ou à tout le monde.
Les permissions sont en :
- r : lecture
- w : écriture
- x : exécution
Dans la capture ci-dessous, le propriétaire est root, le groupe est www-data, qui est l'utilisateur du serveur WEB (dans d'autres distributions on peut avoir apache, apache2 ou httpd).
En règle générale pour un serveur WEB, on donne les droits pour l'utilisateur qui exécute Apache et éventuellement un groupe lié à l'accès FTP.
Par exemple, ce script PHP up.php veut écrire un fichier demo.txt dans test.
Cela ne fonctionnera pas, car l'utilisateur www-data n'a pas accès en écriture dans ce dossier test (il manque le w)
Ce que cette page essaye de mettre en lumière est que votre l'utilisateur Apache se comporte comme un utilisateur classique.
Si un script souhaite pouvoir écrire dans un dossier ou modifier un fichier PHP existant, l'utilisateur Apache doit avoir accès en écriture sur le dossier ou fichier.
C'est tout à fait vrai dans le cas d'un attaquant qui souhaite uploader une
PHP Backdoor.
Si vous souhaitez donc sécuriser votre site WEB, vous pouvez donc limiter l'écriture dans certains dossiers, bien sûr, pour cela, il faut connaître le fonctionnement de son site.
Souvent, ce n'est pas trop le cas avec un forum ou un CMS.
Un petit mot concernant les dossiers images, cache ou autres.
La création de fichiers par le serveur WEB est nécessaire dans ces dossiers, le site va automatiquement créé des fichiers dans ces dossiers, de ce fait, le serveur WEB doit donc avoir accès en écriture dans ce dossier et pouvoir lire les fichiers.
Bien souvent, un fichier .htaccess de filtrage est créé à la racine de ce dernier pour filtrer l'accès GET sur ces fichiers afin que les internautes ne puissent pouvoir lire les ressources.
(Pour plus d'informations sur le fichier htaccess, vous pouvez vous reporter à la page :
How-To Apache).
Ce qui donne par exemple, ici un fichier PHP demo qui permet un phpinfo.
On créé le fichier .htaccess
Lorsque l'on tente d'accéder aux fichiers PHP, on se prend un forbidden 403 :
Côté serveur, dans les logs :
[Tue Oct 07 04:50:03.657484 2014] [access_compat:error] [pid 2757] [client 192.168.1.10:43302] AH01797: client denied by server configuration: /var/www/wordpress/test/demo.php
Outre l'utilisation de fichier .htaccess
Apache permet de créer
des directives dans le fichier de configuration afin donner une règle générale à tous les dossiers portants certains noms.
On peut matcher les dossiers/fichiers avec
les directives :
<Directory>
<DirectoryMatch>
<Files>
<FilesMatch>
Plus d'informations :
http://httpd.apache.org/docs/2.4/fr/sections.html
Les directives sont donc à mettre dans les fichiers de configuration Apache (vous n'y avez pas accès sur un serveur mutualisé), le gros avantage, est qu'il évite les boulettes.
Du style, une personne tiers qui supprime/modifie par erreur un fichier .htaccess de filtrage.
Par exemple, par défaut, Apache2 empêche l'accès aux fichiers .htaccess afin de ne pouvoir être lus avec la directive suivante :
On a souvent la même chose pour les fichiers de configuration PHP, style config.php
Il est donc tout à fait possible d'empếcher l'accès à tous les dossiers test, sans fichier .htaccess, avec la directive :
Code : Tout sélectionner
<DirectoryMatch ".*/test/.*">
Order Allow,Deny
Deny from All
</DirectoryMatch>
HTTP 403 :
Vous pouvez donc protéger vos dossiers cache de cette manière.
Dans le cas des Images, il faut que l'internaute puisse lire le contenu, sinon l'image ne s'affichera pas, mais on peut empếcher par exemple l'exécution de fichier PHP en réduisant la directive suivante :
Code : Tout sélectionner
<DirectoryMatch ".*/test/.*\.php">
Order Allow,Deny
Deny from All
</DirectoryMatch>
Il est tout à fait possible de désactiver PHP dans un dossier comme ceci :
Code : Tout sélectionner
<DirectoryMatch ".*/test/.*">
php_flag engine off
</DirectoryMatch>
Dans le cas de WordPress, on peut donc empếcher l'accès à certains dossiers :
Code : Tout sélectionner
<DirectoryMatch ".*/test/.*">
php_flag engine off
</DirectoryMatch>
On peut aussi bloquer des méthodes avec la directive Limit.
Par exemple, si on souhaite empécher les POST sur tous les fichiers WordPress sauf dans wp-admin et sur wp-login.php
Code : Tout sélectionner
<DirectoryMatch "/var/www/wordpress/(?!wp-login.php|wp-admin/.*)">
<Limit POST>
Deny from all
</Limit>
</DirectoryMatch>
Il est aussi possible de définir des variables pour agir dessus, ceci se fait avec la directive
SetEnIfNoCase.
Par exemple, si on veut ouvrir les POSTS sur wp-login.php et wp-admin que sur certaines IPs clientes :
Code : Tout sélectionner
SetEnvIfNoCase Remote_Addr "^192\.168\.1\.4$" whitelist_ip
SetEnvIfNoCase Remote_Addr "^127\.0\.0\.1$" whitelist_ip
<DirectoryMatch "/var/www/wordpress/(wp-login.php|wp-admin/.*)">
<Limit POST>
Order Deny,Allow
Deny from all
Allow from env=whitelist_ip
</Limit>
</DirectoryMatch>
Autre exemple, si on souhaite définir des bots et bloquer l'accès à ces derniers :
Code : Tout sélectionner
SetEnvIfNoCase User-Agent "^Keyword Density/0.9" bad_bot
SetEnvIfNoCase User-Agent "^Kenjin Spider" bad_bot
SetEnvIfNoCase User-Agent "^Cegbfeieh" bad_bot
<Limit GET POST>
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</Limit>
Bref, comme vous pouvez le voir, on peut faire à peu près tout ce que l'on souhaite sur Apache.
Liens internes :
Plus généralement :
[réseau] Sécuriser un serveur Apache/PHP/MySQL (LAMP)
L'index des pages liés à la sécurité WEB sur Apache :
Apache : Sécuriser son site WEB