Статьи

Настройте Git-сервер с HTTPS для чтения / записи в Debian

Три месяца назад мы решили перенести наши проекты в Git. Я предполагаю, что вы уже знаете преимущества Git по сравнению с Subversion, так как по этому вопросу слишком много дискуссий. Я опишу здесь быструю и минимальную конфигурацию того, как превратить коробку Debian GNU / Linux в сервер Git, который поддерживает действия чтения и записи через HTTP (S).

Git поддерживает 4 сетевых протокола для передачи данных: SSH, Local, Git и HTTP (S). Многие люди находятся за брандмауэром, который в большинстве случаев разрешает доступ только к HTTP (S). До недавнего времени Git HTTP (S) работал только для операций чтения (только клонирование, выборка, извлечение , …). Почти 2 года назад появился Smart HTTP Transport . Используя эти умные сценарии cgi, которые теперь являются частью стабильного Git, мы можем легко настроить сервер Git, который поддерживает чтение / запись через HTTP (S).

Шаги настройки

1) Установите все необходимые пакеты в Debian:

1
2
$> su -
$> apt-get install git apache2 apache2-utils openssl

2) Поскольку нам нужно много репозиториев Git, мы создаем базовый каталог, в который будут включены все репозитории.

1
$> mkdir -p /opt/allgit/repos

3) Создайте пустой Git-репозиторий, где разработчики могут извлекать и загружать код.

1
2
3
4
$> cd /opt/allgit/repos
$> mkdir repo1.git
$> cd repo1.git
$> git init --bare

4) Мы будем использовать HTTP-сервер Apache 2 для поддержки HTTP (S) для Git. В Debian, когда вы устанавливаете пакет apache2 , пользователь создает www-данные и является пользователем Apache. Поскольку нам нужен Apache для выполнения действий Git, то у пользователя www-data должны быть права на чтение и запись для каждого репозитория Git.

1
$> chown -R www-data:www-data repo1.git/

5) Пользователь www-data используется только Apache, а не разработчиками, поэтому нам нужно определить наших пользователей Git где-нибудь еще. Мы можем использовать HTTP-аутентификацию, предоставляемую Apache. Мы можем использовать htpasswd , который является инструментом Apache, который создает зашифрованный пароль из простого текстового пароля для пользователя. Эти пользователи не имеют отношения к пользователям ОС Unix. Таким образом, используя эту стратегию, мы можем определить столько пользователей Git, сколько нам нужно, без создания пользователей Unix. Создайте специальный каталог и файл с ограниченными правами для пользователя www-data, чтобы сохранить пользователей git и пароли.

1
2
3
4
$> mkdir /etc/gitdata
$> cd /etc/gitdata
$> htpasswd -c gitusers.passwd gituser1
$> htpasswd gitusers.passwd gituser2

6) Я решил использовать безопасный HTTP для связи с Git. Итак, я создал самозаверяющий сертификат SSL с использованием openssl . В этом же каталоге создайте сертификат и пару секретных ключей. Заполните все поля, которые вам нравятся, что требует следующая команда.

1
$> openssl req -x509 -nodes -days 999 -newkey rsa:2048 -keyout mygit_ssl.key -out mygit_ssl.crt

7) Кроме того, нам нужно включить несколько модулей на Apache, поэтому убедитесь, что включены mod_ssl , mod_cgi , mod_alias и mod_env . Это легко сделать в Debian с помощью команды a2enmod , где он создает символические ссылки в следующем каталоге.

1
2
$> a2enmod <apache_module>
$> ls /etc/apache2/mods-enabled/

8) Теперь вам нужно только настроить сайт Apache, и вы готовы. Предположим, у вас уже есть доменное имя ( например, mygitdomain.com ), чтобы использовать его для вашего сервера. Быстрый способ настройки вашего сайта Apache (и немедленного тестирования) — скопировать существующую конфигурацию Apache и внести необходимые изменения в конфигурацию.

1
2
$> cd /etc/apache2/sites-available
$> cp default-ssl mygitdomain.com

9) Добавьте (или измените ) существующую конфигурацию файла mygitdomain.com , который вы только что создали, на основе следующей конфигурации.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ServerName mygitdomain.com
ServerAdmin webmaster@localhost
ErrorLog /var/log/apache2/git_apache_error.log
  
SetEnv GIT_PROJECT_ROOT /opt/allgit
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAlias /allgit/ /usr/lib/git-core/git-http-backend/
  
<Directory "/usr/lib/git-core/">
  AllowOverride None
  Options +ExecCGI -Includes
  Order allow,deny
  Allow from all
  
<LocationMatch "^/allgit/repos/.*$">
  AuthType Basic
  AuthName "My Git Repositories"
  AuthUserFile /etc/gitdata/gitusers.passwd
  Require valid-user
  
SSLEngine on
  
SSLCertificateFile    /etc/gitdata/mygit_ssl.crt
SSLCertificateKeyFile /etc/gitdata/mygit_ssl.key

Протестируйте свой Git-сервер

1) Конфигурация завершена. Включите этот сайт на вашем сервере Apache, а затем перезапустите Apache.

1
2
$> a2ensite mygitdomain.com
$> /etc/init.d/apache2 restart

2) Попробуйте клонировать ваш пустой репозиторий git.

1
$> git clone <a href="https://mygitdomain.com/allgit/repos/repo1.git">https://mygitdomain.com/allgit/repos/repo1.git</a> repo1

Ошибка проверки сертификата

1
2
error: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none while accessing https://mygitdomain.com/allgit/repos/repo1.git/info/refs
fatal: HTTP request failed

У вас есть 3 варианта, чтобы решить эту проблему:

1. Установите эту переменную в текущей оболочке (будет включено для всех следующих команд).
$> export GIT_SSL_NO_VERIFY = false
2. Установите перед каждой командой git ту же переменную, что и раньше.
$> env GIT_SSL_NO_VERIFY = true
3. Чтобы рассматривать ваш сертификат как доверенный, даже если он является самозаверяющим сертификатом, вы можете получить сертификат сервера и установить его в один из следующих каталогов:
/ И т.д. / SSL / сертификаты /
/ USR / доли / CA-сертификаты /

Заметки
Это просто быстрая конфигурация, которую я сделал 3 месяца назад, чтобы оценить Git. Есть много моментов, которые вы можете улучшить (усиление безопасности), чтобы улучшить конфигурацию.
Все настройки выполняются пользователем root .

Справка: Настройка сервера Git с HTTPS для чтения / записи в Debian от нашего партнера по JCG