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?
Comme vous êtes root, vous pouvez l'essayer Sudo -u Apache ssh-keygen -t rsa
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
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.
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.
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
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
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/