데이터베이스에서 SSH 키를 인가된 상태로 빠르게 검색하기

Tier: Free, Premium, Ultimate Offering: Self-Managed
note
이 문서는 authorized_keys 파일의 드랍-인 대체품에 관해 설명합니다. 표준(배포 키가 아닌) 사용자의 경우 SSH 인증서를 고려해보세요. 더 빠르지만 드랍-인 대체품은 아닙니다.

일반적인 SSH 작업은 사용자 수가 증가함에 따라 느려지게 됩니다. 왜냐하면 OpenSSH는 사용자를 인가하기 위해 키를 선형 검색하는데 시간이 많이 소요됩니다. 최악의 경우, 사용자가 GitLab에 액세스할 수 없을 때 OpenSSH는 키를 검색하기 위해 전체 파일을 스캔합니다. 이는 상당한 시간과 디스크 I/O를 필요로 하며, 이로 인해 사용자가 저장소로 push 또는 pull을 시도하는 것이 지연될 수 있습니다. 더욱 나쁜 점은 사용자가 자주 키를 추가하거나 제거하는 경우 운영 체제가 authorized_keys 파일을 캐시할 수 없을 수 있으며, 이로 인해 디스크가 반복적으로 액세스될 수 있습니다.

GitLab Shell은 GitLab 데이터베이스에서 빠른 색인 검색을 통해 SSH 사용자를 인가하는 방법을 제공하여 이를 해결합니다. 본 페이지에서는 인가된 SSH 키의 빠른 검색을 활성화하는 방법을 설명합니다.

빠른 검색은 Geo에서 필요합니다

Tier: Premium, Ultimate Offering: GitLab.com, Self-Managed, GitLab Dedicated

Cloud Native GitLab와 달리, Linux 패키지 설치는 기본적으로 git 사용자의 홈 디렉토리에 있는 authorized_keys 파일을 관리합니다. 대부분의 설치에서 이 파일은 /var/opt/gitlab/.ssh/authorized_keys 아래에 있지만, 시스템에서 다음 명령을 사용하여 authorized_keys를 찾을 수 있습니다.

getent passwd git | cut -d: -f6 | awk '{print $1"/.ssh/authorized_keys"}'

authorized_keys 파일에는 GitLab에 액세스할 수 있는 사용자의 모든 공개 SSH 키가 포함되어 있습니다. 그러나 Geo에서는 단일한 진실의 원천을 유지하기 위해 데이터베이스 검색을 통해 SSH 지문을 찾도록 구성해야 합니다.

Geo 설정의 일환으로 기본 및 보조 노드 모두에 대해 아래 순서에 따라 실행해야 하지만, 데이터베이스 복제가 작동 중일 때에만 1차 노드에 대해서만 “authorized keys” 파일에 쓰기를 해제해야 합니다.

빠른 검색 설정

GitLab Shell은 GitLab 데이터베이스에서 빠른 색인 검색을 통해 SSH 사용자를 인가하는 방법을 제공합니다. GitLab Shell은 SSH 키의 지문을 사용하여 사용자가 GitLab에 액세스할 수 있는지 확인합니다.

빠른 검색은 다음 SSH 서버에서 활성화할 수 있습니다:

각 서비스에 대해 별도의 포트를 사용하여 두 서비스를 동시에 실행할 수 있습니다.

gitlab-sshd 사용

gitlab-sshd를 설정하려면 gitlab-sshd 설명서를 참조하세요. gitlab-sshd를 활성화한 후 GitLab Shell과 gitlab-sshd가 자동으로 빠른 검색을 사용하도록 구성됩니다.

OpenSSH 사용

경고: AuthorizedKeysCommand가 지문을 허용할 수 있어야 하므로 OpenSSH 버전 6.9+가 필요합니다. 서버의 OpenSSH 버전을 sshd -V 명령으로 확인하세요.

다음 내용을 sshd_config 파일에 추가하세요. 보통 이 파일은 /etc/ssh/sshd_config에 위치하지만, 리눅스 패키지 설치에서 Docker를 사용하는 경우 /assets/sshd_config에 위치합니다:

Match User git    # 'git' 사용자에게 AuthorizedKeysCommands를 적용합니다
  AuthorizedKeysCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-keys-check git %u %k
  AuthorizedKeysCommandUser git
Match all    # 매칭 종료, 설정은 다시 모든 사용자에게 적용됩니다

OpenSSH를 리로드하세요:

# Debian 또는 Ubuntu 설치
sudo service ssh reload

# CentOS 설치
sudo service sshd reload

사용자의 키를 authorized_keys 파일에서 주석 처리하여 SSH가 올바르게 작동하는지 확인하고 로컬 기계에서 repository를 pull하거나 다음 명령을 실행하여 SSH가 작동하는지 확인하세요:

ssh -T git@gitlab.example.com

성공적인 pull 또는 환영 메시지는 GitLab이 데이터베이스에서 키를 찾을 수 있었음을 의미하며, 이는 파일에 존재하지 않았기 때문입니다.

note
소스에서 설치한 경우 소스 설치 지침을 따랐다면 명령어는 /home/git/gitlab-shell/bin/gitlab-shell-authorized-keys-check에 위치할 것입니다. 필요에 따라 고유 스크립트를 만들거나 소유권을 임시적으로 변경해야 할 수도 있습니다. 또는 이 명령의 소유권을 필요에 따라 변경할 수도 있지만, 이는 gitlab-shell 업그레이드 중에 일시적인 소유권 변경이 필요할 수 있습니다.

경고: SSH가 완벽하게 작동하는지 확인하기 전까지 쓰기를 비활성화하지 마세요. 그렇지 않으면 파일이 빠르게 오래되어 사용이 불가능해집니다.

찾기 실패의 경우 (이는 일반적입니다), authorized_keys 파일은 여전히 스캔됩니다. 따라서 큰 파일이 존재하는 한 많은 사용자의 경우 Git SSH 성능이 여전히 느릴 것입니다.

authorized_keys 파일에 쓰기를 비활성화하려면:

  1. 왼쪽 사이드바에서 가장 아래에서 관리 영역을 선택합니다.
  2. 설정 > 네트워크를 선택합니다.
  3. 성능 최적화를 확장합니다.
  4. SSH 키 인증을 위한 authorized_keys 파일 사용 확인란을 선택 취소합니다.
  5. 변경 사항 저장을 선택합니다.

다시 한 번 UI에서 사용자의 SSH 키를 제거하고 새로 추가한 후 저장소를 pull할 수 있는지 확인하세요.

그런 후 최상의 성능을 위해 authorized_keys 파일을 백업하고 삭제할 수 있습니다. 현재 사용자의 키는 이미 데이터베이스에 있으므로 마이그레이션이 필요하지 않으며 사용자는 키를 다시 추가할 필요가 없습니다.

authorized_keys 파일 사용 방법으로 되돌아가는 방법

이 개요는 간략합니다. 더 많은 컨텍스트는 위의 지침을 참조하십시오.

  1. authorized_keys 파일 다시 빌드.
  2. authorized_keys 파일에 쓰기를 활성화합니다.
    1. 왼쪽 사이드바에서 맨 아래에서 관리 영역을 선택합니다.
    2. 왼쪽 사이드바에서 설정 > 네트워크를 선택합니다.
    3. 성능 최적화를 확장합니다.
    4. SSH 키를 인증하기 위해 authorized_keys 파일 사용 확인란을 선택합니다.
  3. /etc/ssh/sshd_config 또는 Linux 패키지 설치의 경우 /assets/sshd_config에서 AuthorizedKeysCommand 라인을 제거합니다.
  4. sshd를 다시로드합니다: sudo service sshd reload.

SELinux 지원 및 제한 사항

GitLab은 SELinux를 사용하여 authorized_keys 데이터베이스 조회를 지원합니다.

SELinux 정책이 정적이기 때문에, GitLab은 현재 내부 웹 서버 포트를 변경하는 기능을 지원하지 않습니다. 관리자는 환경을 위한 특별한 .te 파일을 동적으로 생성되지 않으므로 만들어야 합니다.

추가 문서

gitlab-sshd의 추가 기술 문서는 GitLab Shell 문서에서 찾을 수 있습니다.

문제 해결

SSH 트래픽이 느리거나 CPU 부하가 높음

만약 SSH 트래픽이 느린 또는 높은 CPU 부하를 유발한다면, /var/log/btmp의 크기를 확인하고 특정 크기에 도달한 후 정기적으로 회전되도록 합니다. 이 파일이 매우 크다면, GitLab SSH 빠른 조회는 병목 현상이 더 자주 발생하며 이로 인해 성능이 더욱 저하될 수 있습니다. 가능하다면, /sshd_config에서 UsePAM을 비활성화하여 /var/log/btmp를 읽지 않도록 고려할 수 있습니다.

실행 중인 sshd: git 프로세스에 대해 stracelsof를 실행하면 디버깅 정보가 반환됩니다. IP x.x.x.x로 SSH를 통한 Git 연결에 대한 strace를 얻으려면 다음을 실행하세요:

sudo strace -s 10000 -p $(sudo netstat -tp | grep x.x.x.x | egrep 'ssh.*: git' | sed -e 's/.*ESTABLISHED *//' -e 's#/.*##')

또는 실행 중인 Git over SSH 프로세스에 대한 lsof를 얻을 수 있습니다:

sudo lsof -p $(sudo netstat -tp | egrep 'ssh.*: git' | head -1 | sed -e 's/.*ESTABLISHED *//' -e 's#/.*##')