Как добавить SSH-ключи для пользователя "apache" в Linux?
ПРЕДПОСЫЛКИ
Я пытаюсь добавить служебный крючок в github, чтобы уведомлять URL-адрес, как только я нажимаю на свое репо. У меня установлена следующая страница php:
<?php `git pull origin master`;
Однако я получаю следующий вывод:
sh: git: Permission denied
Это связано с тем, что ключи, сгенерированные для доступа github, были созданы моим "root" пользователем. Однако, когда я выхожу из команды php, это пользователь apache, который запускает ее.
Таким образом, ключи не соответствуют, и разрешение отклоняется.
Поскольку я не могу переключить пользователя с терминала, чтобы генерировать ключи как "apache", я не слишком уверен, что делать. Может ли кто-нибудь предложить решение?
Поскольку вы являетесь пользователем root, вы можете попробовать его sudo -u apache ssh-keygen -t rsa
Возможно, вам придется скопировать корневые ключи в каталоге .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
Просто опубликуйте комментарий @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
, это нормально.
Существующие ответы либо неполные, либо небезопасные. Если вы поместите свой .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
будет знать, как это сделать.
Я не знаю, будет ли это работать на redhat (я предполагаю, что это то, что вы используете), однако я смог su для www-data (пользователя apache для debian), выполнив следующее:
sudo su www-data
на самом деле он работал, пожимает плечами, иди цифрой
Чтобы добавить к @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/
Я столкнулся с подобной проблемой, и есть одна дополнительная загвоздка. Для использования ssh с помощью пользователя apache вам также необходимо отредактировать файл /etc/passwd
, чтобы директива для apache имела оболочку.
В моем случае мне нужно было изменить
apache:x:48:48:Apache:/var/www:/sbin/nologin
to
apache:x:48:48:Apache:/var/www:/bin/bash
К сожалению только что присоединился к 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
su -apache
This account is currently not available.
, Есть идеи?httpd
илиwww-data
.