Настройка доступа к репозиториям gitea по ssh

Преимуществом подключения по ssh к репозиторию является то что не надо проходить авторизацию по паролю или использовать в адреса в явном виде токен доступа что обеспечивает дополнительную безопасность.

Настройка gitea

Подробная актуальная документация доступна на сайте: Gitea Documentation

  1. Создать отдельного пользователя git без установки пароля
sudo useradd -m -s /bin/bash git
sudo mkdir -p /home/git/.ssh
sudo touch /home/git/.ssh/authorized_keys
sudo chmod 700 /home/git/.ssh
sudo chmod 600 /home/git/.ssh/authorized_keys
sudo chown -R git:git /home/deniom/.ssh
  1. Внести изменения в docker compose
ports:  
# [...]  
	- "127.0.0.1:2222:22"

environment:  
	- USER_UID=1001  
	- USER_GID=1001

Где USER_UID и USER_GID определить командой

id git
  1. Если раньше уже запускался gitea и есть репозитории то передать права на папку с данными на нового пользователя командой ниже, вся дальнейшая работа с репозиториями гит будет идти от данного пользователя
sudo chown -R git:git /home/deniom/docker/gitea/data
  1. Создаем ключ для связи с gitea, и передаем его новому пользователю
sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"
sudo -u git cat /home/git/.ssh/id_rsa.pub | sudo -u git tee -a /home/git/.ssh/authorized_keys  
sudo -u git chmod 600 /home/git/.ssh/authorized_keys
  1. Создаем скрипт для подмены команды SSH
cat <<"EOF" | sudo tee /usr/local/bin/gitea
#!/bin/sh
ssh -p 2222 -o StrictHostKeyChecking=no [email protected] "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
EOF
sudo chmod +x /usr/local/bin/gitea

При помощи данного скрипта будет выполнятся переадресация в контейнер gitea но при этом доступ к самому серверу так же останется по 22 порту. Подробнее в документации gitea.
6. Перезапустить docker контейнер gitea с новыми настройками
7. Добавим новый ключ в интерфейсе gitea. Для этого идем в Профиль -> Ключи SSH -> Добавить ключ
8. Проверим работу (пока только по ip)

git clone [email protected]:Deniom\testrepa.git

Настройка проксирования

Для обращения к gitea по ssh с использованием домена необходимо выполнить проектирование tcp трафика по 22 порту. Для этого будет использован traefik.

Примечание

Принципе можно проксировать на любой другой порт но тогда ссылки будет иметь вид отличный от стандартного и выглядить так ssh://[email protected]:2222/Deniom/Test.git

  1. Перенести подключение по ssh на сервере с traefik с 22 порта (см. Изменение порта доступа по SSH)
  2. Внести изменения в Traefik открыв 22 порт
    ports:
      - 22:22
  1. В статическую конфигурацию traefik.yml добавить точку входа ssh
entryPoints:
  ssh:
    address: ":22"
  1. Изменить динамическую конфигурацию для gitea добавив секцию проксирования tcp
tcp:
  routers:
    gitea-ssh:
      entryPoints:
        - ssh
      rule: "HostSNI(`*`)"
      service: gitea-ssh
  
  services:
    gitea-ssh:
      loadBalancer:
        servers:
          - address: 192.168.0.132:22
Важно

Секция tcp должна быть отдельно представлена а не встроена в уже существующий http, можно разместить в конце файла.

  1. Проверка работы по домену
git clone [email protected]:Deniom\testrepa.git
Attention

Для доступа из вне необходимо обязательно прокидывать 22 порт на traefik иначе работать нечего не будет, не забываем изменить настройки роутера.

Bug

В случае ошибки ssh про атаку в середине как на скрине ниже необходимо очистить файлы в /home/git/.ssh/ и выполнить пункт 4 повторно.

Настройка доступа к репозиториям gitea по ssh.png