Назад | Перейти на главную страницу

Какой чистый и безопасный способ позволить пользователю Apache выполнять клонирование SSH с той же машины?

У меня есть сервер Apache, на котором будут размещены несколько сайтов и частный веб-интерфейс, который призван автоматизировать развертывание сайта с помощью git SSH URL. Эти репозитории git находятся на одном компьютере, удерживаются локальным экземпляром Gitlab и принадлежат пользователю root, поэтому необходим SSH (или мне что-то не хватает).

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

Виртуальные хосты управляются с помощью mod_vhost_alias если это важно. Я также знаю о cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys.

Но создание ssh-ключей для www-данных не кажется хорошей идеей.

Если я создам для этого специального «веб-пользователя» и сгенерирую для него ключи ssh, то www-data не сможет клонировать в этом каталоге. Я могу использовать ACL для папки, но он по-прежнему не получает доступа по ssh.

Или, может быть, я должен su web сначала с PHP? В этом случае файлы не будут принадлежать www-data, что может привести к тому, что сайты не будут работать.

Это доходит до того, что я теряю из виду, что хорошо, а что безопасно. В конце концов я смогу найти рабочее решение, но оно не будет чистым и, вероятно, небезопасным.

Дополнительная информация :

Не смешивайте разработку и производство. В идеале рабочий сервер НЕ содержит VCS - или каких-либо других следов инструментальной цепочки разработки. Поскольку теперь вы прилагаете усилия к автоматизации развертывания, увеличивайте разделение, пока вы занимаетесь этим.

Кроме того: отдельные разрешения для отдельных задач. Интерфейс администратора запрашивает развертывание. Веб-сервер обслуживает в основном неизменяемые файлы. Сценарий развертывания записывает файлы.

  1. Пользователь, обслуживающий файлы, не должен иметь возможность писать в (почти любой из) свои файлы.
  2. Пользователь, развертывающий сайты для apache, должен настроить такие разрешения и избегать обслуживания файлов в середине развертывания (разработчик, возможно, не думал о побочных эффектах доступа apache к чему-либо, пока приложения не полностью копируются)
  3. Пользователь, развертывающий файлы, должен иметь разрешения только для чтения для git и развертывать только зафиксированные и помеченные версии (и оформлять заказ аналогично тому, как это уже делают разработчики)
  4. веб-интерфейс php никогда не должен иметь дело с какой-либо сатанинской магией оболочки. пометить сайт как «требует развертывания» любыми способами (создание папки и т. д.) и покончить с этим (НЕ развертывайте синхронно в веб-интерфейсе)
  5. сценарий развертывания не должен зависеть от развертываемого приложения за пределами некоторых общих стандартов («файлы для apache находятся в папке X», «папка tmp должна находиться под именем Y»)

Как я это сделал в явно похожей настройке: скрипт, принадлежащий пользователю и выполняемый cron deploy (часть группы www-data). Пользователь deploy имеет ключ ssh для учетной записи только для чтения на сервере git (в вашем случае, управляемом через gitlab). Сценарий выбирает помеченные имена репозиториев и развертывает их следующим образом:

  1. проверьте, было ли последнее развертывание чистым
  2. проверьте, нужно ли развертывать какие-либо сайты
  3. разорвать (запретить веб-серверу обслуживать наполовину скопированные сайты)
  4. при необходимости получите клон (в вашем случае пользователь только для чтения в git)
  5. проверить новую версию (для здравомыслия: последняя помеченная версия, которая соответствует некоторому разумному регулярному выражению)
  6. установка (копирование файлов в webroot, в текущем, нецелесообразно case, это локальная папка, привязанная к www-данным)
  7. снять отметку "необходимо развернуть" для этого сайта
  8. отметить развертывание как успешное