为“apache”用户生成 SSH 密钥

Posted

技术标签:

【中文标题】为“apache”用户生成 SSH 密钥【英文标题】:Generating SSH keys for 'apache' user 【发布时间】:2011-11-10 13:00:57 【问题描述】:

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

背景

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

<?php `git pull origin master`;  

但是我得到以下输出:

sh: git: Permission denied

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

因此密钥不对应,拒绝拉取权限。

由于我无法从终端切换用户以将密钥生成为“apache”,因此我不太确定该怎么做。任何人都可以提出解决方案吗?

【问题讨论】:

【参考方案1】:

您可能需要将根生成的密钥复制到您的 apache 用户的 .ssh 目录中。

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

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

无需复制公钥。

注意:默认使用的密钥是 id_rsaid_dsa。您可以更改复制的密钥的名称以匹配此。

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

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

【讨论】:

我不确定,但这样做不是很安全吗? 它只会告诉 apache 用户将能够使用 ssh-key。安全性不是在用户级别(生成密钥的地方)而是在服务器级别(密钥用于身份验证的地方)完成。尽管如此,您必须将密钥分配给 apache 用户...(将更新帖子) @Vincent。谢谢。我已将私钥复制到/var/www/.ssh/id_rsa,但是仍然收到权限被拒绝错误。 @Vincent。我也尝试过生成新的密钥,更新 github 和 /var/www/.ssh/id_rsa 但仍然没有运气。有什么想法吗? 正如我在help.github.com/linux-set-up-git 上看到的,您必须在 github 上以 git 用户身份进行身份验证(而不是 apache 或 root ...)。您可以进行更多调查......尝试'su - apache'然后'ssh -T git@github.com'。如果密钥配置正确,您可能会收到一条欢迎消息...如果不正确,仍然有问题。【参考方案2】:

你是root,可以试试sudo -u apache ssh-keygen -t rsa

【讨论】:

嗨。 su -apache 输出 This account is currently not available.。有什么想法吗? 你确定用户是apache,有时它可以是httpdwww-data 是的,我用echo shell_exec('whoami');测试过输出是apache This account is currently not available.its 因为你的 apache 用户没有 shell。 我终于解决了。我使用sudo -u apache ssh-keygen -t rsa 为“apache”生成密钥。谢谢。【参考方案3】:

在 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 目录,也可以。

【讨论】:

【参考方案4】:

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

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

所以这是一个将密钥放在其他地方的答案,默认情况下它不由 apache 提供。甚至不需要像其他人一样成为www-data 用户。

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

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

$ 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 用户会知道如何操作。

【讨论】:

【参考方案5】:

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

就我而言,我需要改变

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

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

【讨论】:

这可能是一个很大的安全漏洞。有关可能风险的信息,请参阅this serverfault question。 是的,我不久前放弃了这项技术,并选择使用与 apache 用户无关的特定用户。【参考方案6】:

要添加到@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/

【讨论】:

【参考方案7】:

我不知道这是否适用于 redhat(我假设这是您正在运行的)但是,我可以通过执行以下操作来 su 到 www-data(debian 的 apache 用户):

sudo su www-data

它确实有效耸耸肩去看看

【讨论】:

以上是关于为“apache”用户生成 SSH 密钥的主要内容,如果未能解决你的问题,请参考以下文章

git ssh 密钥生成以及配置

如何为另一个用户生成 ssh 密钥?

Git - 生成 SSH 公钥

Linux采用非用户密码登录服务器

Git 生成 SSH 公钥

git使用ssh密钥