Как правильно настроить приватный ключ для gitlab runner
Я хотел бы сделать этот сценарий возможным (некоторые аспекты, не связанные с проблемой, были упрощены для лучшего понимания)
Представьте, что у нас есть простой репозиторий gitlab всего с двумя файлами.
-
- хранит статическую веб-страницу -
- хранит пайплайны для этого репозитория
И у нас есть сервер Debian 11 (с root-доступом, поэтому я могу делать все, что захочу)
Цель почты — создать конвейер gitlab, который будет автоматически подключаться по ssh к этому серверу и выполнять обновление (переход в нужную папку и извлечение master ) после слияния master , чтобы в него попадало каждое изменение.
Я нашел множество источников, которые приводят к созданию ssh-ключа и сохранению закрытого ключа в переменной gitlab (и доступу к нему из конвейера).
Трубопроводы всегда выглядят так:
stages:
- deploy
deploy:
image: ubuntu:latest
stage: deploy
only:
- main
before_script:
- apt-get -yq update
- apt-get -yqq install ssh
- install -m 600 -D /dev/null ~/.ssh/id_rsa
- echo "$SSH_PRIVATE_KEY" | base64 -d > ~/.ssh/id_rsa
- ssh-keyscan -H $SSH_HOST > ~/.ssh/known_hosts
script:
- ssh $SSH_USER@$SSH_HOST "cd $WORK_DIR && git checkout $MAIN_BRANCH && git pull && exit"
after_script:
- rm -rf ~/.ssh
Пример источника 1 Пример источника 2
Это подводит меня к первому вопросу: есть ли какое-нибудь лучшее решение, которое могло бы обойти работу с закрытым ключом? Мой страх связан с безопасностью. Я понимаю, что риск взлома gitlab и кражи всех частных переменных невелик, но я хочу попросить любое возможное решение, которое было бы более безопасным. Существует даже возможность выполнить это через контейнеры Docker, если это поможет (но, насколько я понимаю, на стороне сервера существует только разница между выполнением команд git и команд Docker, что не очень помогает в этом аспекте)
И если ответ на первый вопрос отрицательный , я хотел бы задать еще один вопрос: как лучше всего защитить эту пару ключей ssh? Можно ли сгенерировать ssh-ключ только для пользователя, который имеет разрешение только для одной папки (где хранится содержимое этого репозитория) и имеет разрешение только для определенных команд (например, Scanrio, где он будет автоматически перенаправлен в эту папку после входа в систему и имеет только разрешение на выполнение