Apache réglage des droits

Bonjour tout le monde,
Alors voilà j’ai debian squeeze, i686. J’ai installé un apache2, php5 et plein d’autre en suivant un tutoriel. Puis j’ai installer mySQL et phpmyadmin. Le it work était bien là, mais quand je l’ai supprimer pour le remplacer par mes fichiers plus rien ne s’afficher. PhpMyAdmin n’a jamais marcher, je pense que le problème est le même.
En surfant sur le net j’ai vue qu’il était peut-être question de droit, alors ni une ni deux j’ai fait un chmod 777 sur phpinfo.php ou j’avais placé la fonction phpinfo() pour tester. Avant cette page ne s’affichait et maintenant oui.
J’aimerai savoir quelle permission faut-il accorder au fichier présent dans var/www/ ? Ou est-ce qu’il suffit de paramétrer apache correctement ?

Merci d’avance!

Apache est paramétré correctement.
Ce qu’il faut c’est effectivement donner les bons droits sur tes fichiers.

Il faut savoir qu’Apache (et donc PHP) tournent avec les droits de l’utilisateur « www-data ».

Perso ce que je fais (mais je suis un peu paranoïaque) c’est :

# chown -R root:www-data /var/www
# find /var/www -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw,g+r
# find /var/www -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx,g+rx

En pratique ça veut dire que seul le propriétaire (root) peut modifier les fichiers ou écrire dans /var/www, et le groupe (www-data) peut uniquement les lire. Les utilisateurs qui n’appartiennent pas au groupe www-data ne peuvent même pas y accéder (ce qui est pas mal car souvent il y a des mots de passe dans des fichiers de config, on veut pas que n’importe qui puisse les lire !).

Si jamais comme ça arrive souvent tu as une appli web qui a besoin d’écrire dans un fichier ou dossier spécifique (genre dossier temporaire ou de cache, générateur de fichier de config pendant la phase d’installation, … en principe c’est indiqué dans le document d’installation de l’appli en question), il faut en plus donner les droits d’écriture au groupe www-data pour ce fichier ou dossier particulier :

# chmod g+w /var/www/chemin/vers/fichier
# chmod -R g+w /var/www/chemin/vers/dossier

Note le -R (récursif) dans le cas d’un dossier, car si l’appli web a besoin d’écrire dans le dossier elle a aussi besoin de pouvoir écrire dans les sous-dossiers et les fichiers.


Sinon tu peux aussi autoriser www-data à tout modifier, c’est plus simple à gérer même si c’est moins sécurisé (c’est ce que je fais sur mes postes de développement, la méthode ci-dessus c’est plus pour de la prod) :

# chown -R www-data:www-data /var/www
# find /var/www -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw
# find /var/www -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx

Super! Merci beaucoup ça marche parfaitement. Du coup je dois donner ces même droits à mon dossier contenant phpmyadmin? Et le sécuriser en créant un compte sur celui-ci ? Ou même envisager un .htacces ?

Ca tombe bien je le suis aussi! :stuck_out_tongue:

PhpMyAdmin tu l’as installé comment ? Via les paquets Debian ? En téléchargeant les sources ? Dans ce deuxième cas tu l’as extrait dans un sous-répertoire de /var/www ou bien carrément ailleurs ?

Si tu as téléchargé les sources et que tu les as extraites dans un sous-répertoire de /var/www alors les commandes que je t’ai données ont réglé la question (find est récursif).
Si tu as téléchargé les sources et que tu les as extraites ailleurs que dans /var/www (avec un Alias dans ton VirtualHost Apache je suppose) alors effectivement il faut faire la même opération sur le dossier où tu as extrait PhpMyAdmin.

Si tu l’as installé via apt(itude) normalement t’as rien à faire.

Pour sécuriser PhpMyAdmin, ça dépend beaucoup de ton environnement, y’a plein de manières de faire… Perso je fais un VirtualHost sur un port séparé (genre 18080) qui va me servir pour toutes mes applis d’administration. Ce port n’est pas accessible depuis l’extérieur (bloqué dans iptables) et j’y accède via un tunnel SSH qui lui-même utilise une paire de clés asymétriques pour autoriser la connexion.

Je l’ai effectivement installé grâce à apt mais quand je tape dans mon navigateur:
http://pred/phpmyadmin, ma page charge pendant environ 10 secondes pour finalement me sortir un not found. Je vais essayer de le remove puis de le réinstaller.

Merci beaucoup pour tes réponses très complètes!

Ce qu’il faut c’est effectivement donner les bons droits sur tes fichiers.

Il faut savoir qu’Apache (et donc PHP) tournent avec les droits de l’utilisateur « www-data ».

Perso ce que je fais (mais je suis un peu paranoïaque) c’est :

# chown -R root:www-data /var/www
# find /var/www -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw,g+r
# find /var/www -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx,g+rx

En pratique ça veut dire que seul le propriétaire ( root ) peut modifier les fichiers ou écrire dans /var/www , et le groupe ( www-data ) peut uniquement les lire. Les utilisateurs qui n’appartiennent pas au groupe www-data ne peuvent même pas y accéder (ce qui est pas mal car souvent il y a des mots de passe dans des fichiers de config, on veut pas que n’importe qui puisse les lire !).

Si jamais comme ça arrive souvent tu as une appli web qui a besoin d’écrire dans un fichier ou dossier spécifique (genre dossier temporaire ou de cache, générateur de fichier de config pendant la phase d’installation, … en principe c’est indiqué dans le document d’installation de l’appli en question), il faut en plus donner les droits d’écriture au groupe www-data pour ce fichier ou dossier particulier :

# chmod g+w /var/www/chemin/vers/fichier
# chmod -R g+w /var/www/chemin/vers/dossier

Note le -R (récursif) dans le cas d’un dossier, car si l’appli web a besoin d’écrire dans le dossier elle a aussi besoin de pouvoir écrire dans les sous-dossiers et les fichiers.

Sinon tu peux aussi autoriser www-data à tout modifier, c’est plus simple à gérer même si c’est moins sécurisé (c’est ce que je fais sur mes postes de développement, la méthode ci-dessus c’est plus pour de la prod) :

# chown -R www-data:www-data /var/www
# find /var/www -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw
# find /var/www -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx

Une question syam : avec ces droits :
1/ les visiteurs du site web ne sont pas gênés pour la lecture de toutes les pages, y-compris les pages privées avec MDP ?
2/ la gestion avec FileZilla reste possible ?

Y’a pas de raison puisque dans tous les cas c’est le serveur web (www-data) qui y accède.

Alors là, tu soulèves une très bonne question… :mrgreen:
Le peu de serveurs sur lesquels j’ai la main j’y accède toujours via SSH et SSHFS. Je débloque les droits juste avant dans un shell (chown -R user:www-data), je fais mes mises à jour, et je rebloque les droits aussitôt après.
Donc effectivement, en passant uniquement par FileZilla (sans accès shell pour changer le propriétaire préalablement) ça risque d’être très gênant !

Je t’accorde que c’est loin d’être le plus pratique (je préfère que ça soit plus sécurisé pour de la prod), et vu que j’ai l’habitude de faire comme ça j’avais même pas pensé à ce problème. :blush:

Faut dire aussi que ça me gêne pas d’écrire des scripts dans tous les sens pour automatiser ce genre de choses, du coup mes Debian sont un peu… euh… personnalisées… (c’est fait pour que moi je m’y retrouve et j’ai tendance à avoir une organisation assez particulière :blush: :blush: :blush:)

Merci, je tenterai ton système dans qq temps.
Une question quand même :
pourquoi modifier les droits pour intervenir ?
Je me réponds moi-même car je comprends : en ssh, tu interviens en tant qu’user (normal)
et non en tant que root … c’est ça ?
Je ferai ptet avec l’user dans le groupe qui va bien ???

Oui, je sais bien que je suis un barbare mais j’essaye quand même de garder un minimum de séparation des privilèges… :wink:

En fait en ce qui me concerne, mes umask sont systématiquement en 077 (parano quand tu nous tiens… :eusa-whistle:) donc quoi que je fasse après un upload les droits sont incorrects, il faut que je les corrige. Du coup ça change pas grand chose pour moi de basculer les droits avant l’upload vu qu’il faut de toutes façons que je le fasse après.

Cela dit y’a sûrement moyen d’attribuer un umask 027 à un utilisateur spécifique (dont la seule fonction serait d’uploader sur (S)FTP, et dont le groupe primaire serait www-data). Mais d’une part j’ai pas envie de chercher comment ajuster le umask pour un utilisateur donné (je crois me souvenir qu’en fonction de la méthode de login, les réglages viennent de différents fichiers de config :confused:), et d’autre part c’est trop “ouvert” pour moi : si cet utilisateur se fait cracker, il a forcément le contrôle sur le contenu du serveur web. Alors que root je suis relativement tranquille : pas d’accès extérieur direct et un mot de passe long comme le bras d’un orang-outan.

En fait, je me range à ta sagesse.
Mon pass root fait 26 caractères et je suis assez tranquille de ce côté :smiley:
Je vais me faire aussi un ptit script pour les rares fois où je dois modifier quelque chose sur mon site. Il reste souvent en sommeil.
Peux-tu me traduire mot à mot ces lignes car je ne pige pas bien tout :

# chown -R root:www-data /var/www
# find /var/www -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw,g+r
# find /var/www -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx,g+rx
# chown -R root:www-data /var/www

Changer le propriétaire (root) et le groupe (www-data) pour /var/www et l’ensemble de son contenu (-R).

# find /var/www -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw,g+r

Chercher tous les fichiers (-type f) dans /var/www et ses sous-répertoires,
les passer en argument (xarg) à chmod
qui efface d’abord complètement les droits pour tout le monde (-t,a-rwxs)
puis autorise le propriétaire (root) à lire/écrire (u+rw)
et le groupe (www-data) uniquement à lire (g+r).
Les arguments -print0 / -0 de find et xargs sont là pour s’assurer que les noms de fichiers contenant des espaces ou autres caractères “bizarres” seront bien traités.

# find /var/www -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx,g+rx

Même chose que précédemment sauf qu’on cherche des dossiers (-type d) au lieu de fichiers,
et comme il s’agit de dossiers on rajoute l’autorisation exécuter (x)
aussi bien au propriétaire qu’au groupe
pour que ceux-ci puissent parcourir les répertoires et lister leur contenu
(sinon ça va pas bien marcher).

Merci, les quelques zones d’ombres sont éclairées.

1/ Étant donné que je suis sûr de ne pas avoir ni fichier, ni dossier avec espace et et/ou caractères spéciaux, je peux faire l’impasse sur les ’-print0 / -0', je pense ?

2/ Je ne comprends pas l’utilité de devoir supprimer tous les droits avant de modifier ?
J’ai toujours modifié directement, sans passer par cette ‘case’ :017 . Tes raisons pour ce faire ?

Dis-moi si ce qui suit te semble correct, compte tenu de ce qui précède :

Dans un premier temps, l’user étant dans le groupe www-data, taper ces 3 lignes

# chown -R root:www-data /var/www
# chmod -R 640 -type f /var/www
# chmod -R 750 -type d /var/www

Pour intervenir en ssh un script :

#!/bin/bash
# chmod -R 660 -type f /var/www
# chmod -R 770 -type d /var/www

Une fois l’intervention effectuée, retourner aux droits sécurisés un second script :

#!/bin/bash
# chmod -R 640 -type f /var/www
# chmod -R 750 -type d /var/www

Attention, je viens de modifier ci-dessus

Jusqu’au jour où… Et là tu te demanderas d’où vient le problème. :wink: Petite habitude de programmeur : toujours essayer de prévoir le pire, ça évite les mauvaises surprises… (on sait jamais de quoi l’avenir sera fait)
Autant l’utiliser, vu que de toutes façons l’alternative serait
find /var/www -type f | xargs chmod 640
(c’est uniquement les options -print0 et -0 qui gèrent les caractères spéciaux,
le find... | xargs en lui-même c’est pour pouvoir distinguer fichiers/dossiers),
ça fait pas grande différence et c’est beaucoup plus sûr comme ça.

En fait toi tu utilises la syntaxe avec les valeurs numériques, que je trouve peu claire et moins souple. Ta manière de faire remplace toujours tous les droits.
La syntaxe que j’utilise permet d’ajuster un seul droit sans toucher aux autres, et comme j’aime pas varier mes habitudes je l’utilise systématiquement quitte à alourdir un peu la commande (mais j’ai moins à réfléchir comme ça). :wink:
En d’autres termes, avec ta syntaxe tu indiques les nouveaux droits que devront avoir tous les fichiers, alors qu’avec la mienne j’indique des actions (ajout/suppression d’un droit précis) à appliquer sur chaque fichier. Par exemple pour enlever le droit de lecture à l’utilisateur et le rajouter au groupe sans toucher aux autres droits (cf. les droits w et x qui ne bougent pas) :

$ ll
total 0
-rw------- 1 syam syam 0 2012-03-21 02:02 essai1
-r-x------ 1 syam syam 0 2012-03-21 02:02 essai2
$ chmod u-r,g+r essai*
$ ll
total 0
--w-r----- 1 syam syam 0 2012-03-21 02:02 essai1
---xr----- 1 syam syam 0 2012-03-21 02:02 essai2

Ça tu peux pas le faire avec ta syntaxe. :teasing-neener:

Au final c’est juste une question d’habitude : je trouve ma syntaxe plus lisible, plus souple, pas besoin de se rappeler les valeurs numériques (je mélange souvent les valeurs d’écriture et d’exécution) il y a juste à lire ce que ça fait dans l’ordre où c’est écrit. Mais comme on dit, chacun voit midi à sa porte. :slightly_smiling:
Quand je disais que j’ai une organisation très personnelle, y’a pas que l’organisation hein, c’est tout le cerveau qui marche de travers. :mrgreen:

chmod n’a pas d’option -type, c’est une option de find
chmod tout seul ne peut pas distinguer entre les fichiers et les dossiers.
D’où l’utilité du find... | xargs qui fait grosso modo le même travail que le -R de chmod, mais en filtrant fichier/dossier en plus.
La bonne syntaxe serait (en gardant le -print0 / -0 pour sécuriser l’avenir, comme expliqué ci-avant) :

# chown -R root:www-data /var/www
# find /var/www -type f -print0 | xargs -0 chmod 640
# find /var/www -type d -print0 | xargs -0 chmod 750

Pour débloquer les droits tu peux te contenter ça :

# find /var/www -type f -print0 | xargs -0 chmod 660
# find /var/www -type d -print0 | xargs -0 chmod 770

Mais pour rebloquer à nouveau les droits après l’upload je te conseille de réutiliser la version qui contient le chown (sinon que deviennent les nouveaux fichiers qui n’étaient pas là avant car tu viens de les uploader ?).

Tes explications sont parfaites et je suis convaincu.
Je ferai le test ce soir et surtout les possibilité avec FilleZilla et les modifs dans ma galerie photos, que je fais avec pLoader.
Je te tiendrai au courant des résultats.
:006

Ben presque tout se passe bien.
La seule chose qui coince, c’est l’utilisation de pLoader pour transférer des photos dans ma galerie Piwigo :
“Les droits associés à votre compte ne permettent pas le transfert de photos.”
Je devrais pouvoir arranger ça mais ce n’est pas pressé car je peux quand même pratiquer avec sftp, c’est un peu plus long, c’est tout.

pLoader est root:root, si je le met root-www-data, penses-tu que ça résolve le problème ?

Une dernière question avant que je ne me fasse deux mini scripts :
Est-il indispensable de rafraichir apache2 avec init.d ?

EDIT : je suis nul, je m’étais trompé de MDP avec pLoader :unamused:
de plus, ça n’avais rien à voir puisque l’utilisation de pLoader se fait à partir de ma machine et non du serveur.
plus de problème de ce côté, je peux transférer mas photos par ce bais qui est pratique et plus rapide.

Je sais pas, normalement root peut écrire partout (ça ne tient pas compte des droits) donc c’est bizarre. Mais je ne connais pas du tout pLoader, ça se présente comment ?
De ce que j’en comprends c’est un logiciel que tu installes sur ta machine pas sur le serveur, et il appelle une certaine URL sur ton serveur pour faire les uploads.
Dans ce cas là il faut savoir où Piwigo essaye d’écrire pour autoriser ce dossier spécifique en chmod g+w(à rajouter au script de verrouillage des droits, celui avec le chown).

Un bon test pour savoir si c’est bien ce que je soupçonne : donner les droits d’écriture au groupe (www-data) chmod -R g+r /var/www et réessayer… Si ça marche c’est qu’il y a bien un dossier quelque part dont il faut ajuster les droits, faut probablement regarder dans le document d’installation de Piwigo (en principe ils disent quels dossiers doivent absolument être accessibles en écriture). Une fois que tu sais quel dossier exact est concerné,
rajoute chmod -R g+w /var/www/piwigo/dossier/upload dans le script de verrouillage (-R car comme j’expliquais dans un post précédent, s’il a besoin d’écrire dans le dossier il a aussi besoin de pouvoir modifier les fichiers contenus dedans et les éventuels sous-dossiers).

Absolument pas.

Merci, tout est donc parfait.
J’avais écrit en EDIT sur le précédent msg où je confessais ma connerie : pLoader fonctionne parfaitement et je viens de le tester là : http://rictux.fr/piwigo/picture.php?/121/category/6
En deux clics, l’affaire est bâclée.
Me reste plus qu’à faire les scripts ce soir.
Merci pour cette combine qui mérite une petite page sur le wiki ptet ? Tu m’autorises, avec citation bien sûr ?

Oh ok j’avais pas vu l’edit…

Je t’en prie fais toi plaisir, l’info est là pour être partagée. :wink:
J’avoue que je fais mon fainéant avec le wiki, c’est pas trop mon truc en ce moment de rédiger des tutos complets. :blush: :blush: Avec un peu de chance mon côté cyclothymique va encore frapper et ça rechangera un de ces jours mais là j’ai ni la patience ni l’envie pour m’en occuper.