如何在Linux中为'apache'用户添加SSH密钥?
背景
我正在尝试向github添加服务挂钩,以便在我推送到我的仓库后通知URL。我有以下php页面设置:
<?php `git pull origin master`;
但是我得到以下输出:
sh: git: Permission denied
这是因为我为github访问生成的密钥是由我的'root'用户生成的。但是当我从php中执行命令时,运行它的是'apache'用户。
因此,密钥不对应,拒绝许可。
由于我无法从终端切换用户生成密钥为'apache',我不太清楚该做什么。有人可以提出解决方案吗?
答案 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