Перейти к содержанию

Использование ключей SSH для работы с Gitlab

Применение ключей вместо паролей позволяет усилить защищенность сервера и автоматизировать выполнение операций. Настройка в соответствии с данной инструкцией не отменяет и не меняет возможности использования веб-интерфейса Gitlab.

Каждый пользователь Gitlab, которому необходим доступ при помощи SSH, должен владеть ключевой парой, состояющей из двух файлов: открытого и зарытого ключей. Содержимое файла открытого ключа должно быть размещено в профиле пользователя Gitlab и, кстати, может быть использовано на любых серверах и в сервисах, предоставляющих доступ при помощи SSH. Файл закрытого ключа должен быть сохранен пользователем таким образом, чтобы обеспечивалась его конфиденциальность, целостность и доступность.

Если у пользователя нет ключевой пары, ее необходимо сгенерировать. Рекомендуется при генерации использовать алгоритм ED25519 (по-умолчанию может применяться RSA). Например, при помощи утилиты командной строки в ОС Linux генерацию можно выполнить следующим образом:

ssh-keygen -t ed25519 -C "username@mail.domain" -f username_key

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

После генерации ключевой пары, в текущей директории будут созданы файлы: username_key (файл закрытого ключа) и username_key.pub (файл открытого ключа).

Чтобы разместить содержимое файла открытого ключа в профиле Gitlab, выведите его на экран:

cat username_key.pub

Скопируйте содержимое файла в буфер обмена без символа перевода строки в конце.

Добавьте содержимое файла открытого ключа в профиль пользователя Gitlab. Для этого перейдите кликните на аватар пользователя, нажмите Edit profile, затем SSH Keys, после этого Add new key. В поле key вставьте из буфера обмена содержимое ключа, введите срок действия ключа (или сбросьте его, сделав бесконечным) и нажмите Add key.

Теперь, чтобы проверить соединение с сервером, на ПК выполните команду:

ssh -T git@gitlab.domain.local -p 22 -i /home/username/username_key

Если все работает, должно появиться сообщение "Welcome to Gitlab, @username!"

Чтобы клонировать репозиторий выполните команду:

git -c core.sshCommand="ssh -i /home/username/username_key -p 22" clone git@gitlab.domain.local:dir/repo_name.git

После редактирования файлов, как обычно, добавьте их в отслеживаемые:

git add .

Зафиксируйте изменения:

git -c user.name="Full Username" -c user.email=username@mail.domain commit -m "Commit message"

Передайте репозиторий на сервер:

git -c core.sshCommand="ssh -i /home/username/username_key -p 22" push

Обратите внимание, что в некоторых командах явно указывается SSH-порт сервера (по-умолчанию 22). Это сделано специально, чтобы указать, что в этих командах требуется явное указание порта, если на вашем сервере он отличается от значения по-умолчанию.

Примечание для администратора сервера:

Чтобы описанное выше работало, конфигурация сервиса OpenSSH на сервере должна использовать для пользователей Gitlab значение параметра AuthorizedKeysFile по-умолчанию.

Пример конфигурации с некоторыми полезными комментариями:

AddressFamily inet
AllowAgentForwarding no
AllowStreamLocalForwarding no
AllowTcpForwarding no
#
#AllowUsers username@192.168.1.10 <-- Глобальная опция отключена, т.к. пользователи Gitlab могут подключаться
#                                     с динамических IP
#
AuthenticationMethods publickey
#
#AuthorizedKeysFile /etc/ssh/authorized-keys/%u <-- Глобальная опция отключена, т.к. пользователи Gitlab
#                                                   не создаются в ОС
#
Banner none
DebianBanner no
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
ClientAliveCountMax 1
ClientAliveInterval 300
DisableForwarding yes
KbdInteractiveAuthentication no
KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1
KexAlgorithms diffie-hellman-group-exchange-sha256
#
#ListenAddress 192.168.1.20 <-- Глобальная опция может быть включена, если необходимо
#
LoginGraceTime 20
LogLevel VERBOSE
MACs hmac-sha2-256,hmac-sha2-512,hmac-sha1
MaxAuthTries 3
PermitEmptyPasswords no
PermitRootLogin no
PubkeyAuthentication yes
SyslogFacility AUTHPRIV
Subsystem sftp /usr/lib/openssh/sftp-server
X11Forwarding no
X11UseLocalhost no
Compression no
MaxSessions 2
Port 2114
TCPKeepAlive no
UseDNS no
UsePAM yes
Match User administrator
#
AuthorizedKeysFile /etc/ssh/authorized-keys/%u # <-- Для пользователя administrator открытый ключ загружается
#                                                    из указанной папки
AuthenticationMethods publickey password # <-- Администратору можно использовать и ключ и пароль
#                                              (необходимо для некоторых утилит)
#
PasswordAuthentication yes
#
# <-- Указанный ниже блок о параметрах пользователя не нужен, т.к. на него распространяются значения по-умолчанию
#Match User username
#AuthenticationMethods publickey password
#AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2
#AuthorizedKeysFile /etc/ssh/authorized-keys/username
#