为'apache'用户生成SSH密钥

时间:2011-09-05 10:52:04

标签: php apache git github ssh-keys

如何在Linux中为'apache'用户添加SSH密钥?

背景

我正在尝试向github添加服务挂钩,以便在我推送到我的仓库后通知URL。我有以下php页面设置:

<?php `git pull origin master`;  

但是我得到以下输出:

sh: git: Permission denied

这是因为我为github访问生成的密钥是由我的'root'用户生成的。但是当我从php中执行命令时,运行它的是'apache'用户。

因此,密钥不对应,拒绝许可。

由于我无法从终端切换用户生成密钥为'apache',我不太清楚该做什么。有人可以提出解决方案吗?

7 个答案:

答案 0 :(得分:41)

您可能必须在apache用户的.ssh目录中复制根生成的密钥。

假设apache的homedir是 / var / www (检查/ etc / passwd),并且命名密钥是 id_rsa-git

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

无需复制公钥。

注意:默认情况下,使用的密钥为 id_rsa id_dsa 。您可以更改复制密钥的名称以与此匹配。

您还可以更改 id_rsa 键和 .ssh 目录的所有权:

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

答案 1 :(得分:24)

因为你是root用户,你可以试试sudo -u apache ssh-keygen -t rsa

答案 2 :(得分:14)

根据yvan的回答发布@KitCarrau的评论,这对我有用

sudo -u apache ssh-keygen -t rsa

对于debian

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

在此之后单击Enter两次,以跳过密码

另外,它建议在/var/www/.ssh目录中创建公钥/私钥,即使我在/home/my_user/www中有我的www direcotry,也没关系。

答案 3 :(得分:4)

现有答案不完整或不安全。如果将.ssh目录放入apache用户(/var/www)的主目录中,那么这很可能也会提供该目录的内容,从而将您的ssh私钥暴露给公共Web。为了防止这种情况,您必须配置apache 而不是来提供.ssh目录,但现有的答案都没有解释如何执行此操作。

我还认为让您的.ssh目录成为公开服务的www-root的子目录仍然很危险,因为即使您在apache配置中添加规则,升级服务器或执行不相关的其他配置可能会覆盖此规则,而无需您注意。

所以这里有一个答案,将密钥放在别处,默认情况下不由apache提供。甚至没有必要成为www-data用户,因为其他人正在努力。

首先,找出我们的apache用户的主目录,例如查看/etc/passwd并查找www-data用户,或者调用您的发行版的apache用户。主目录可能是/var/www

然后运行(用你设置的apache用户的主目录替换/var/www):

$ 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

现在,您的www-data用户将使用$HOME/www-data.ssh/id_rsa中的ssh密钥进行所有ssh连接,并且由于您的$HOME可能与/var/www不同,因此该目录不会提供服务。因此,即使没有向apache添加任何自定义规则,用户也可以看到您的.ssh/config,但他们将无法访问它指向的私钥。不过,您的www-data用户将知道如何操作。

答案 4 :(得分:1)

我遇到了类似的问题,还有一个额外的问题。为了使用apache用户进行ssh,您还需要编辑/etc/passwd文件,以便apache的指令定义了一个shell。

就我而言,我需要改变

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

apache:x:48:48:Apache:/var/www:/bin/bash

答案 5 :(得分:1)

要添加到@Vincent,如果启用了SELinux,则必须为新的.ssh文件夹设置上下文。

在RHEL上,将以下内容添加到此文件中:/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

然后运行命令

# restorcon -Rv /var/www/

答案 6 :(得分:1)

我不知道这是否适用于redhat(我认为这就是你正在运行的)然而,我能够通过执行以下操作来su-www-data(apache用户为debian):

sudo su www-data

它确实有效 shrugs go figure