Генерация ключей SSH для пользователя apache

36

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

ПРЕДПОСЫЛКИ

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

<?php `git pull origin master`;  

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

sh: git: Permission denied

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

Таким образом, ключи не соответствуют, и разрешение отклоняется.

Поскольку я не могу переключить пользователя с терминала, чтобы генерировать ключи как "apache", я не слишком уверен, что делать. Может ли кто-нибудь предложить решение?

Теги:
github
ssh-keys

8 ответов

22
Лучший ответ

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

  • 0
    Привет. su -apache This account is currently not available. , Есть идеи?
  • 1
    Вы уверены, что пользователь apache, иногда это может быть httpd или www-data .
Показать ещё 6 комментариев
42

Возможно, вам придется скопировать корневые ключи в каталоге .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
  • 6
    Я не уверен, но это не очень безопасно, или это так?
  • 0
    Это только скажет, что пользователь apache сможет использовать ssh-ключ. Защита осуществляется не на уровне пользователя (где генерируются ключи), а на уровне сервера (где ключи используются для аутентификации). Тем не менее, вы должны заколоть ключи пользователю apache ... (обновлю пост)
Показать ещё 4 комментария
14

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

sudo -u apache ssh-keygen -t rsa

для debian

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

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

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

3

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

1

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

sudo su www-data

на самом деле он работал, пожимает плечами, иди цифрой

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/
1

Я столкнулся с подобной проблемой, и есть одна дополнительная загвоздка. Для использования ssh с помощью пользователя apache вам также необходимо отредактировать файл /etc/passwd, чтобы директива для apache имела оболочку.

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

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

to

apache:x:48:48:Apache:/var/www:/bin/bash
  • 5
    Это потенциально большая дыра в безопасности. См. Этот вопрос о сбое сервера для получения информации о возможных рисках.
  • 1
    Да, я отказался от этой техники некоторое время назад и решил использовать конкретного пользователя, не связанного с пользователем apache.
0

К сожалению только что присоединился к stackoverflow и пока не может добавить комментарий к ответу @josch. Мне любопытно, почему/var/www/является небезопасным местом для папки .ssh и закрытого ключа пользователя www-data/apache. Если я помню, в прошлом некоторые distos использовали /var/www/в качестве корня документа, но теперь каждый дистрибутив, с которым я работаю, использует/var/www/html/для корня документа. Если это так, каким образом будет открыт открытый ключ, если он находится в /var/www/.ssh/?

Большое спасибо за сообщения здесь!

В Ubuntu 18.04 эта команда очень хорошо работает для создания пары ключей для пользователя www-data. sudo -u www-data ssh-keygen -t rsa

Ещё вопросы

Сообщество Overcoder
Наверх
Меню