Генерация ключей SSH для пользователя apache - PullRequest
39 голосов
/ 05 сентября 2011

Как добавить ключи SSH для пользователя 'apache' в Linux?

ПРЕДПОСЫЛКА

Я пытаюсь добавить служебный хук в github, чтобы уведомлять URL-адрес, как только я нажимаю на репо.У меня настроена следующая страница php:

<?php `git pull origin master`;  

Однако я получаю следующий вывод:

sh: git: Permission denied

Это потому, что ключи, которые я сгенерировал для доступа к github, были сгенерированы моим root'ом'пользователь.Однако, когда я выполняю команду из php, это запускает ее пользователь 'apache'.

Поэтому ключи не соответствуют, и в праве отказано в получении.

Поскольку я не могу переключить пользователя изтерминал для генерации ключей как «apache», я не слишком уверен, что делать.Кто-нибудь может предложить решение?

Ответы [ 7 ]

41 голосов
/ 05 сентября 2011

Возможно, вам придется скопировать корневые сгенерированные ключи в каталог .ssh вашего пользователя apache.

Предполагается, что homedir для apache равен / 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
24 голосов
/ 05 сентября 2011

Поскольку вы являетесь пользователем root, вы можете попробовать его sudo -u apache ssh-keygen -t rsa

14 голосов
/ 03 января 2015

Просто опубликовать комментарий @KitCarrau под ответом Ивана, который работал для меня

sudo -u apache ssh-keygen -t rsa

для debian

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

после этого дважды нажмите Enter, чтобы пропустить фразу-пароль

, также предлагается создать открытый / закрытый ключи в каталоге /var/www/.ssh, даже если у меня была директива www в /home/my_user/www, это нормально.

4 голосов
/ 09 марта 2018

Существующие ответы либо неполные, либо небезопасные.Если вы поместите свой каталог .ssh в домашний каталог пользователя apache (/var/www), то это также, скорее всего, будет обслуживать содержимое этого каталога и, таким образом, предоставлять ваш закрытый ключ ssh общедоступной сети.Чтобы предотвратить это, вы должны настроить apache , а не для обслуживания каталога .ssh, но ни один из существующих ответов не объясняет, как это сделать.

Я бы также сказал, что этовсе еще опасно, чтобы ваш каталог .ssh был подкаталогом вашего общедоступного www-root, потому что даже если вы добавите правило в вашу конфигурацию apache, обновление сервера или другие несвязанные конфигурации могут переопределить это правило без вашего ведома.

Итак, вот ответ, который помещает ключ в другое место, где он по умолчанию не обслуживается apache.Нет даже необходимости становиться пользователем www-data, с которым борются другие.

Во-первых, найдите домашний каталог нашего пользователя apache, например, заглянув в /etc/passwd и ищаwww-data user или как называется 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 пользовательбудет использовать ключ ssh в $HOME/www-data.ssh/id_rsa для всех своих соединений ssh, и, поскольку ваш $HOME, вероятно, отличается от /var/www, этот каталог не будет обслуживаться.Поэтому, даже не добавляя никаких пользовательских правил в apache, пользователи смогут видеть ваш .ssh/config, но не смогут получить доступ к закрытому ключу, на который он указывает.Тем не менее, ваш www-data пользователь будет знать, как это сделать.

1 голос
/ 18 сентября 2013

Я не знаю, будет ли это работать на Redhat (я полагаю, это то, что вы работаете), однако, я смог выполнить su для www-data (пользователь apache для debian), выполнив следующее:

sudo su www-data

это действительно сработало пожимает плечами иди фиг

1 голос
/ 14 мая 2013

Чтобы добавить в @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/
1 голос
/ 27 апреля 2012

Я столкнулся с подобной проблемой, и есть одна дополнительная ошибка. Чтобы использовать SSH для пользователя Apache, вам также необходимо отредактировать файл /etc/passwd, чтобы в директиве для Apache была определена оболочка.

В моем случае мне нужно было изменить

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

до

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