Poste de développement PHP sous Fedora

24/11/2008

Linux est un système parfait pour développer. Simple d’installation, apache est prêt à l’emploi, tout comme PHP et MySQL. Du fait d’être sous Linux, vous êtes proche de la configuration de votre serveur qui a 75% de chance d’être sous Linux. Muni de Eclipse et du plugin PDT, vous allez pouvoir aisément travailler vos développements PHP. Mais là où le bas blesse, c’est que justement vous êtes proche d’une configuration serveur. De ce fait, vous allez vous confronter à quelque chose d’inexistant (ou presque) sous Windows: la configuration système. Comme Apache fait parti du système de manière plus approfondi, le paramétrage sera plus logique mais moins trivial. Autre point qui peut vous laisser dans une situation embarrassante: SELinux qui va contrôler la sécurité.

Dans la réalité, un développeur expérimenté sous Linux n’aura aucun mal à comprendre la problématique, mais si vous venez de vous lancer sur le système venu du froid vous allez vous poser pleins de questions… Je ne vais pas répondre à tout, mais vous proposer quelques méthodes rapides pout que vous ne soyez pas coincé devant votre poste.

Ce que nous voulons faire

C’est simple: avoir une configuration souple pour développer plusieurs projets PHP ou HTML simple sans avoir à nous casser la tête. Pour le moment, tout est fait pour que vous travaillez comme sur un serveur. La configuration d’apache par défaut indique que vous devriez travailler dans /var/www/html, or ce répertoire est protégé et seul root et apache (l’utilisateur système) peut écrire dedans. Changer les droits de ce répertoire n’est pas franchement sympathique, et dans tous les cas ce ne sera //pas propre//. Il va falloir configurer un peu la machine pour activer le mode “user dir” de apache. Vous verrez, ce sera rapide.

L’autre point qui peut vous mettre mal à l’aise, c’est SELinux. Grosse batterie de sécurisation mis en place par défaut dans Fedora, ce très bon système peut engendrer une alerte constante si vous demander à apache d’aller voir dans votre home. Il va donc falloir modifier la configuration de SELinux pour travailler sans se prendre la tête.

Nous allons donc faire 3 choses pour réussir à travailler sans contrainte: -facultatif mais recommandé: entrer notre utilisateur dans le groupe “apache” (je vous rappelle que nous sommes sur Fedora, les ubunteros et autre débianeux devront entrer dans www-data) -paramétrer Apache pour que notre utilisateur puisse travailler dans un répertoire personnel -débloquer les options contraignantes de SELinux si celui-ci est activé

En tout et pour tout, il faudra **2 à 3 minutes** pour ces manipulations que **nous ne ferons qu’une seule et unique fois**.

Préparation du dossier de travail

Facultatif, l’utilisateur dans le groupe apache

Afin de simplifier la gestion de droit, je préfère entrer l’utilisateur dans le groupe apache… cela n’est absolument pas obligatoire, mais je le recommande pour une raison simple: votre utilisateur devrait pouvoir modifier le groupe des fichiers générés par apache dans votre dossier de travail. De ce fait, entrer dans le groupe apache vous permettra de ne pas être restreint par les droits du groupe. Cela dit, en tant que propriétaire des fichiers vous ne devriez jamais être dans ce cas de figure.

Vous pouvez donc ne pas effectuer cette étape, mais pour ceux qui ont envie, suivez le guide:\\ On commence donc par modifier notre utilisateur. L’idée est de le placer dans le groupe “apache”. Deux solutions, soit vous utilisez le menu Système » Administration » Utilisateurs et groupes, puis vous ajouter un groupe à votre utilisateur… soit vous tapez dans un terminal:

su -lc "usermod myuser -a -G apache"

Ce qui a pour résultat le même effet.

  • - Relancer votre session** pour que ce soit pris en compte. Quitter simplement la session et revenez.

Petit rappel: su -lc “commande à lancer” revient à faire:

su -
commande à lancer
exit

C’est donc terminé, l’utilisateur fait parti du groupe apache.

Le dossier

Nous allons maintenant préparer un répertoire pour travailler avec apache. Ce répertoire devra se trouver dans votre home. Nous allons admettre que votre nom d’utilisateur est “myuser” pour la suite (si vous avez un utilisateur “myuser”, le home correspond à /home/myuser).

Assurez vous de ne pas être connecté en root, puis créez un répertoire public_html de cette manière: mkdir ~public_html ou faites le depuis le navigateur de fichiers. Cela revient au même. Reste à changer les droits:

chmod 751 $HOME
chgrp apache ~public_html
chmod 2755 ~public_html

Il est fortement recommandé de le faire dans le terminal et non dans le navigateur de fichiers. En fait, il est compliqué de trouver le droit //“traverser le répertoire”//…

Les droits assignés doivent ressembler à cela:

ll /home 
...
drwxr-x--x 52 myuser myuser 4096 nov 22 10:36 pafer
...

ll /home/myuser | grep public_html
drwxr-sr-x  6 myuser apache 4096 nov 22 10:37 public_html

Je vous demande de lire la page de manuel pour “chmod” dans un terminal avec la commande man chmod afin de comprendre les règles. Mais pour résumer le 2 me permet de garder le groupe apache et non myuser pour les fichiers et répertoire qui seront créés. C’est pourquoi vous voyez un “s” apparaître sur les droits de public_html, cela signifie que nous suivont l’ID du groupe.

Apache, PHP, MySQL

Notre poste Linux est configuré, il reste maintenant à s’occuper de Apache.

installation

Si ce n’est pas le cas, installez apache:

su -lc "yum install httpd"

Et si vous avez besoin de php ainsi que ses extensions pour mysql, pdo, gd… tapez:

su -lc "yum install php php-pdo php-gd"

En ce qui concerne MySQL:

su -lc "yum install mysql mysql-server"

On peut donc lancer apache et MySQL:

su -lc 'service httpd start; service mysqld start'

Paramétrage

Il faut maintenant laisser apache aller dans ce répertoire. Apache est muni d’un module nommé user_mod qui permet d’avoir un répertoire personnel par utilisateur. Plutôt que ne manipuler le fichier de configuration de base de Apache, nous allons en créer un spécial qui activera les dossier utilisateur. Créez simplement un fichier de cette manière:

su -lc "gedit /etc/httpd/conf.d/user_dirs.conf"

et placez-y cette configuration:

NameVirtualHost *:80
<VirtualHost *:80>
<IfModule mod_userdir.c>
    UserDir public_html
    <Directory /home/*/public_html>
        AllowOverride all
        Options MultiViews  Indexes SymLinksIfOwnerMatch IncludesNoExec
    </Directory>
</IfModule>
</VirtualHost>

Sauvez et quitter. Vérifiez que vous n’avez aucune erreur:

su -lc 'service httpd configtest'
Syntax OK

Vous pouvez relancer Apache:

service httpd restart

Si apache n’était pas activé, une erreur apparait mais vous pouvez l’ignorer… par contre vous devez absolument voir:

Démarrage de httpd :                                       [  OK  ]

Le cas échéant, vous avez mal taper quelque chose dans le fichier de configuration. Revoyez bien les lignes que vous avez modifié.

Dans l’absolu, tout fonctionne bien, vous pouvez déjà créer un fichier “test.php” dans votre répertoire /home/myuser/public_html et tenter de l’appeler dans un navigateur avec: http://127.0.0.1/~myuser/test.php. Notez le ~myuser qui spécifie justement à apache qu’il doit chercher dans un dossier utilisateur.

Si une erreur provenant de SELinux apparait dans votre bureau, alors il va falloir lire la suite de cet article. Vous aurez soit à couper SELinux (ce qui en soit n’est pas franchement important), soit vous pourrez le paramétrer pour ne pas générer d’erreurs de sécurité.

SELinux

Il se peut, et c’est même fort probable, que vous ayez SELinux activé sur votre Fedora. Ce système de contrôle de droit (en surcouche mais proche du noyau) et très utile dans le cadre d’une sécurisation de poste accessible sur le net. Or, même si vous avez accès au net, vous n’êtes pas forcément exposé à de gros risques.

Il y a donc 3 possibilités qui s’offrent à vous: -couper SELinux si vous n’avez pas de craintes d’attaques depuis l’extérieur (sans souci pour un poste de travail, mais **surtout pas pour un serveur**) -rendre SELinux permissif (moins de contraintes, mais il restera quelques points à régler) -paramètrer SELinux (contraintes fortes mais votre poste est très sécurisé)

Alors comment ça marche ? C’est simple: SELinux applique des étiquettes à tous les fichiers du système. Un étiquette prévoit un rôle et des étiquettes pour une utilisation de la cible. En ce qui nous concerne nous devons attribuer à nos fichier une étiquette de contenu “http”. L’étiquette étant **“httpd_sys_content_t”**.

Notez bien ce label, on s’en reservira.

Si vraiment cela ne vous dit rien de configurer SELinux ou que vous n’en avez vraiment pas besoin (comme 80% des développeurs et utilisateurs…) alors ne vous cassez pas la tête et coupez simplement SELinux. Sinon, passer à la solution numéro 2 ou 3.

Solution numéro un, on coupe SELinux

La solution que j’utilise moi même est de couper SELinux. Je suis derrière 1 firewall/routeur (ma Livebox à la maison, ou le routeur d’entreprise au travail) et je ne vois pas trop ce que je risque de ce coté là. Vous pouvez donc aller dans le menu Système » Administrations » SELinux Management:

Dans l’onglet “Status”, placez l’option “System enforcing mode” à “Disable”. Fermez et redémarrez votre poste pour que le noyau coupe définitivement SELinux. Pour ma part, cela me convient parfaitement.

  • - C’est l’option que je vous conseille pour un poste de travail. Mais jamais pour un serveur !**

Solution numéro 2, on limite SELinux

Nous pouvons faire un peu de zèle et avoir quelques contrôles noyau pour réduire les risques d’attaques. SELinux est fort de ce coté là mais vous ne voulez pas qu’il vous bloque. La seconde solution est donc de rendre SELinux “Permissif”. Allez dans le menu Système » Administrations » SELinux Management puis passez “Current Enforcing mode” et “System Default Enforcing Mode” à “Permissive”. Cela ne vous donnera que des alertes mais ne vous empêchera pas de travailler. Cette solution est un bon compromis, et si vous voulez couper les alertes, il suffit de suivre les indications de la section suivante.

Solution numéro 3, on force

Vous êtes paranoïaque… mais vous n’avez pas forcément tort !

Si vraiment vous souhaitez garder SELinux en mode forcé (“enforcing”), vous allez vous retrouver avec un paquet d’alertes à chaque fois que vous allez vouloir accèder à votre dossier public_html via Apache, et de plus, il va vous empêcher littéralement de travailler dans ce répertoire…

Il va donc falloir changer des valeurs dans SELinux pour permettre l’accès système de apache dans ce répertoire. Voici en quelques captures ce que vous devez changer: Entrez encore une fois dans Système » Administrations » SELinux Management, puis dans l’onglet “Boolean”

Cherchez les valeurs “Unify HTTPD handling of all content files”, “Allow HTTPD to read home directories” et enfin “Allow HTTPD to use built in scripting (usually PHP)” pour les cocher:

Cela peux aussi se faire en ligne de commande:

setsebool -P httpd_unified=1
setsebool -P httpd_enable_homdirs=1
setsebool -P httpd_builtin_scripting=1

Il faut ensuite définir quels répertoires sont prévus pour HTTP… la solution est simple:

chcon -R -h -t httpd_sys_content_t $HOME/public_html

Et SELinux continue de bloquer…

Parfois, avec SELinux, vous allez avoir quelques messages de sécurité et certainement une erreur sur votre page, cela ne durera qu’un temps, mais il faut savoir quoi faire. La plus simple des technique est simplement de lire l’annonce de sécurité envoyé par SELinux dans la fenêtre d’alerte. 99 fois sur 100 il y aura la commande à taper pour corriger le soucis de sécurité.

Par exemple, Drupal veut souvent écrire dans /tmp… mais je ne l’avais pas prévu… L’erreur dans Drupal m’indique que /tmp/.htaccess ne peut pas être modifié, SELinux m’annonce que /tmp n’est pas prévu pour httpd et que je dois taper (en root):

restorecon -R -v '/tmp'

Chose que j’ai fait… mais j’avais encore le souci… en fait, ce que demande SELinux c’est que le label spécifique à mon fichier .htaccess soit un “contenu http”. Donc, il m’a juste suffit de faire (en root):

chcon -h -t httpd_sys_content_t /tmp/.htaccess
Le script qui fait tout !

Afin d’aller vite, je me suis configuré un script qui génère la configuration complète de mon poste Fedora. Je vous propose de le télécharger et de la placer dans /usr/local/sbin.

Vous pouvez rengistrer ce script: http://www.metal3d.org/tools/homeapache, ou simplement tapez ces commandes:

su -
cd /usr/local/sbin
wget http://www.metal3d.org/tools/homeapache
chmod +x homeapache

C’est tout, le script sera facile à utiliser, il suffira de l’exécuter en root ou via su -lc de cette manière.

su -lc ''/usr/local/sbin/homeapache username'' 

où “username” est le nom de l’utilisateur dont vous voulez paramétrer le fichier public_html. Le script effectue: -création du répertoire public_html si il n’existe pas (si il existe, il ne le supprime pas, pas d’inquiétudes) -changement des droits du répertoire -ajoute si nécessaire la configuration apache dans /etc/httpd/conf.d/user_dirs.conf -change les droits SELinux -recharge Apache

Tout est automatisé, vous n’avez donc plus d’excuses :) !

Notes

Cela ne fonctionne pas pareil sous Ubuntu ou Debian. Déjà les noms de groupe apache sont différents (www-data) et la configuration se passe dans sites-available et sites-enabled… dans tous les cas je le répète, je travaille sur CentOS et Fedora… donc adaptez mon billet pour Ubuntu et Debian si vous le souhaitez.

Je vous envoi aussi vers le très bon article sur Fedora-doc:\\

Voilà personnellement je n’ai plus de contrainte de mon coté. Il n’y avait que SELinux qui me posait réellement problème mais en comprennant la configuration, ou en coupant littéralement le système SELinux je n’ai pas eut de souci.

Clairement, développer en PHP sous Linux permet de livrer des sites en production avec un moindre coût de modification de fichiers. L’encoding est bon, et Linux ne vous empêche pas de créer un fichier “.htaccess” sous pretexte que le nom commence par un point… bref, l’idéal est là.

Ça peut vous intéresser aussi


Docker Apache Mysql PHP

Ce matin un collègue me demande “comment tu ferais ...


Du troll au débat Windows vs Linux

Gros débat sur le canal IRC #copix, un de nous ...


Développer un site dans votre home

Ce week-end, un ami est passé à la maison et ...


Récupération de MySQL cassé

Je viens d’exploser, sans trop savoir pourquoi, ma base ...

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.