У меня есть сервер разработки git, который развертывается на активном сервере, когда live
ветка помещается в. У каждого пользователя свой логин, поэтому post-receive
hook, который выполняет динамическое развертывание, запускается под их собственным пользователем.
Поскольку я не хочу поддерживать открытые ключи пользователей в качестве авторизованных ключей на удаленном реальном сервере, я создал набор ключей, которые `` принадлежат системе git '', чтобы добавить их к удаленным рабочим серверам (в post-receive
крючок, который я использую $GIT_SSH
установить закрытый ключ с -i
вариант).
Моя проблема в том, что из-за того, что все пользователи могут захотеть развернуть систему в реальном времени, закрытый ключ системы git должен быть, по крайней мере, доступен для чтения группам, а SSH это действительно не нравится.
Вот образец ошибки:
XXXX@XXXX /srv/git/identity % ssh -i id_rsa XXXXX@XXXXX
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0640 for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: id_rsa
Я огляделся, ожидая найти что-то, что заставит ssh просто пройти через соединение, но я не нашел ничего, кроме людей, слепо говорящих, что вы просто не должны разрешать доступ никому, кроме одного пользователя.
Вы ЖЕСТЯНАЯ БАНКА используйте групповые читаемые файлы идентификации, ЕСЛИ вы не являетесь владельцем ключа. Итак, просто установите файл идентификации, который должен принадлежать, например, пользователю root, а затем все пользователи вашего репозитория git будут готовы к работе.
Приятным преимуществом этого является то, что вам не нужен sudo - решение будет более простым.
Обратите внимание, что это снова приведет к исходной проблеме, если вы используете root для нажатия на репозиторий git.
Вот хороший простой и безопасный способ.
Создайте нового пользователя для передачи ssh, я назову его git-sync. Создайте аналогичного пользователя на сервере с членством в группе для репозитория git. Добавьте открытый ключ для sync-user в этот файл users authorized_keys2. Я предполагаю, что все пользователи git являются членами gitgroup. Убедитесь, что пользователь git-sync также является членом этой группы.
Теперь отредактируйте файл / etc / sudoers, включив в него строку вроде:
%gitgroup ALL=(git-sync) NOPASSWD: /usr/bin/git
Это позволит любому члену группы gitgroup запускать команду / usr / bin / bit как git-sync без пароля.
Теперь поместите что-то вроде этого в свой хук post-receive:
sudo -u git-sync /usr/bin/git push origin
Permissions 0640 for 'id_rsa' are too open.
Закрытый ключ должен оставаться закрытым. Вы не должны позволять никому его читать.
Поскольку я не хочу поддерживать открытые ключи пользователей в качестве авторизованных ключей на удаленном реальном сервере, я создал набор ключей, которые `` принадлежат системе git '', чтобы добавить их к удаленным рабочим серверам (в
post-receive
крючок, который я использую$GIT_SSH
установить закрытый ключ с-i
вариант).
в post-receive
скрипт перехвата попробуйте что-то вроде этого:
if [ "live" == "$branch" ]; then
ssh -t user@prod "git --work-tree=... --git-dir=... checkout -f"
fi