web-dev-qa-db-fra.com

Génération de clés SSH pour l'utilisateur 'Apache'

Comment ajouter des clés SSH pour l'utilisateur 'Apache' sous Linux?

FOND

J'essaie d'ajouter un hook de service à github pour notifier une URL une fois que j'ai poussé vers mon référentiel. J'ai la page php suivante configurée:

<?php `git pull Origin master`;  

Cependant, j'obtiens la sortie suivante:

sh: git: Permission denied

C'est parce que les clés que j'ai générées pour l'accès au github ont été générées par mon utilisateur "root". Cependant, lorsque j'exécute une commande depuis php, c'est l'utilisateur 'Apache' qui l'exécute.

Les clés ne correspondent donc pas et l'autorisation de tirer est refusée.

Comme je ne peux pas changer d'utilisateur à partir du terminal pour générer des clés comme "Apache", je ne sais pas trop quoi faire. Quelqu'un peut-il proposer une solution?

39
Kit

Comme vous êtes root, vous pouvez l'essayer Sudo -u Apache ssh-keygen -t rsa

24
yvan

Vous devrez peut-être copier les clés générées par la racine dans le répertoire .ssh de votre utilisateur Apache.

En supposant que le homedir d'Apache est / var/www (vérifiez/etc/passwd) et la clé nommée est id_rsa-git:

mkdir -p /var/www/.ssh/
cp /root/.ssh/id_rsa-git /var/www/.ssh/id_rsa

Pas besoin de copier la clé publique.

Remarque: par défaut, la clé utilisée est id_rsa ou id_dsa. Vous pouvez modifier le nom de la clé copiée pour correspondre à cela.

Vous pouvez également changer la propriété de la clé id_rsa et du répertoire . Ssh:

chown -R Apache:apache /var/www/.ssh
chmod 0700 /var/www/.ssh
chmod 0600 /var/www/.ssh/id_rsa
42
Vincent

Je viens de poster le commentaire de @KitCarrau, sous la réponse d'Yvan, qui a fonctionné pour moi

Sudo -u Apache ssh-keygen -t rsa

pour debian

Sudo -u www-data ssh-keygen -t rsa

après cela, cliquez deux fois sur Entrée pour ignorer la phrase secrète

il suggère également de créer les clés publiques/privées dans /var/www/.ssh répertoire, même si j'avais mon direcotry www dans /home/my_user/www, c'est bon.

14
dav

Les réponses existantes sont soit incomplètes soit incertaines. Si vous mettez votre .ssh dans le répertoire personnel de l'utilisateur Apache (/var/www), cela servira également très probablement le contenu de ce répertoire et exposera ainsi votre clé privée ssh au Web public. Pour éviter cela, vous devez configurer Apache pas pour servir le .ssh répertoire mais aucune des réponses existantes n'explique comment procéder.

Je dirais également qu'il est toujours dangereux d'avoir votre .ssh Le répertoire est un sous-répertoire de votre racine www servie publiquement, car même si vous ajoutez une règle à votre configuration Apache, la mise à niveau du serveur ou l'exécution d'autres configurations non liées peut remplacer cette règle sans que vous le remarquiez.

Voici donc une réponse qui met la clé ailleurs, où elle n'est pas servie par Apache par défaut. Il n'est même pas nécessaire de devenir le www-data l'utilisateur alors que d'autres ont du mal.

Tout d'abord, découvrez le répertoire personnel de notre utilisateur Apache, par exemple en consultant /etc/passwd et à la recherche du www-data utilisateur ou quel que soit l'utilisateur Apache de votre distribution. Le répertoire personnel est probablement /var/www.

Exécutez ensuite (en remplaçant /var/www avec le répertoire personnel de l'utilisateur Apache dans votre configuration):

$ mkdir "$HOME/www-data.ssh"
$ ssh-keygen -q -t rsa -f "$HOME/www-data.ssh/id_rsa" -N ""
$ chown -R www-data:www-data "$HOME/www-data.ssh"
$ mkdir /var/www/.ssh
$ cat << END > /var/www/.ssh/config
> Host *
>     IdentityFile $HOME/www-data.ssh/id_rsa
> END
$ chown -R www-data:www-data /var/www/.ssh

Maintenant votre www-data l'utilisateur utilisera la clé ssh dans $HOME/www-data.ssh/id_rsa pour toutes ses connexions ssh et depuis votre $HOME est probablement différent de /var/www, ce répertoire ne sera pas servi. Ainsi, même sans ajouter de règles personnalisées à Apache, les utilisateurs pourront voir votre .ssh/config mais ils ne pourront pas accéder à la clé privée vers laquelle il pointe. Néanmoins, votre www-data l'utilisateur saura le faire.

4
josch

J'ai rencontré un problème similaire et il y a un problème supplémentaire. Pour utiliser ssh avec l'utilisateur Apache, vous devez également modifier le /etc/passwd fichier afin que la directive pour Apache ait un Shell défini.

Dans mon cas, je devais changer

Apache:x:48:48:Apache:/var/www:/sbin/nologin

à

Apache:x:48:48:Apache:/var/www:/bin/bash
1
dkinzer

Je ne sais pas si cela fonctionnera sur redhat (je suppose que c'est ce que vous exécutez) cependant, j'ai réussi à utiliser www-data (l'utilisateur Apache pour debian) en exécutant ce qui suit:

Sudo su www-data

cela a réellement fonctionné hausse les épaules allez comprendre

1
Thomas Wright

Pour ajouter à @Vincent, si SELinux est activé, vous devrez définir le contexte du nouveau dossier .ssh.

Sur RHEL, ajoutez ce qui suit à ce fichier: /etc/selinux/targeted/contexts/files/file_contexts.homedirs

/var/www/[^/]*/.+       system_u:object_r:user_home_t:s0
/var/www/[^/]*/\.ssh(/.*)?      system_u:object_r:ssh_home_t:s0

Et puis exécutez la commande

# restorcon -Rv /var/www/
1
Jim Howard