데이터베이스에서 승인된 SSH 키의 빠른 조회
authorized_keys
파일에 대한 드롭인 대체물을 설명합니다. 표준(배포 키가 아닌) 사용자의 경우 SSH 인증서를 사용하는 것을 고려해보십시오. 이들은 심지어 더 빠르지만, 드롭인 대체물은 아닙니다.일반 SSH 작업은 사용자 수가 증가함에 따라 느려집니다. 왜냐하면 OpenSSH는 사용자를 승인하기 위해 키를 선형 검색으로 찾기 때문입니다. 최악의 경우, GitLab에 액세스할 수 없는 사용자의 경우 OpenSSH는 키를 찾기 위해 전체 파일을 스캔합니다. 이 작업은 상당한 시간과 디스크 I/O가 소요되어 사용자가 리포지터리로 푸시하거나 풀을 시도하는 것을 지연시킵니다. 더 나쁜 상황은 사용자가 자주 키를 추가 또는 제거하는 경우 운영 체제가 ‘authorized_keys’ 파일을 캐시할 수 없게 되어 디스크에 반복적으로 액세스해야 합니다.
GitLab Shell은 GitLab 데이터베이스에서 빠른 색인 조회를 통해 SSH 사용자를 승인하는 방법을 제공함으로써 이 문제를 해결합니다. 이 페이지에서는 승인된 SSH 키의 빠른 조회를 활성화하는 방법을 설명합니다.
Geo를 위해 빠른 조회가 필요합니다
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를 설치할 때, 주요 노드와 보조 노드 모두에 대해 아래에 개요된 단계를 따르도록 요구됩니다. 하지만 “authorized keys” 파일에 쓰기 는 데이터베이스 복제가 작동 중인 경우에만 주요 노드에서만 체크 해제되어야 하며, 그렇지 않으면 이는 자동으로 보조 노드에 반영됩니다..
빠른 조회 설정
GitLab Shell은 GitLab 데이터베이스에서 빠른, 색인화된 조회를 통해 SSH 사용자를 승인하는 방법을 제공합니다. GitLab Shell은 SSH 키의 지문을 사용하여 사용자가 GitLab에 액세스할 수 있는지 확인합니다.
빠른 조회는 다음과 같은 SSH 서버에서 활성화될 수 있습니다:
gitlab-sshd
- OpenSSH
두 서비스를 동시에 실행시킬 수 있습니다.
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
에 위치하지만, Linux 패키지 설치에서 Docker를 사용하는 경우 /assets/sshd_config
에 있습니다:
Match User git # AuthorizedKeysCommands를 git 사용자에만 적용
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가 작동하는지 확인합니다:
ssh -T git@gitlab.example.com
성공적인 풀 또는 환영 메시지는 키가 파일에 없기 때문에 GitLab이 데이터베이스에서 키를 찾을 수 있었음을 의미합니다.
/home/git/gitlab-shell/bin/gitlab-shell-authorized-keys-check
위치하게 됩니다. 루트가 소유해야 하며 그룹 또는 기타 사용자에 의해 쓰일 수 없습니다. 이 명령의 소유권 변경을 고려할 수 있지만 gitlab-shell
업그레이드 중에 일시적인 소유권 변경이 필요할 수 있습니다.authorized_keys
파일에 쓰기를 비활성화하려면:
- 왼쪽 사이드바에서 아래쪽에서 관리 영역을 선택합니다.
- 설정 > 네트워크를 선택합니다.
- 성능 최적화를 확장합니다.
-
SSH 키를 인증하기 위해
authorized_keys
파일 사용 확인란을 클리어합니다. - 변경사항 저장을 선택합니다.
다시 한 번 UI에서 사용자의 SSH 키를 제거하고 새로 추가한 후 리포지터리를 풀 수 있는지 확인합니다. 그런 다음 최상의 성능을 위해 ‘authorized_keys’ 파일을 백업하고 삭제할 수 있습니다. 현재 사용자의 키는 이미 데이터베이스에 있으므로 이동이나 사용자가 키를 다시 추가할 필요는 없습니다.
authorized_keys
파일을 사용하는 방법으로 변환하는 방법
이 문서는 간단한 개요입니다. 더 많은 내용은 위의 지침을 참조하십시오.
-
authorized_keys
파일 재구성. -
authorized_keys
파일에 쓰기를 활성화합니다.- 왼쪽 사이드바에서 아래쪽에서 관리 영역을 선택합니다.
- 왼쪽 사이드바에서 설정 > 네트워크를 선택합니다.
- 성능 최적화를 확장합니다.
-
SSH 키를 인증하기 위해
authorized_keys
파일 사용 확인란을 선택합니다.
-
/etc/ssh/sshd_config
또는 Linux 패키지 설치에서 Docker를 사용하는 경우/assets/sshd_config
에서AuthorizedKeysCommand
라인을 제거합니다. -
sshd
재로드:sudo service sshd reload
.
SELinux 지원 및 제약 사항
GitLab은 SELinux을 사용하여 authorized_keys
데이터베이스 조회를 지원합니다.
SELinux 정책이 정적이기 때문에, 현재 GitLab은 내부 웹서버 포트를 변경하는 기능을 지원하지 않습니다. 관리자는 환경을 위해 특별한 .te
파일을 동적으로 생성되지 않기 때문에 작성해야 합니다.
추가 문서
gitlab-sshd
에 대한 추가 기술 문서는 GitLab 셸 문서에서 찾을 수 있습니다.
문제 해결
SSH 트래픽이 느리거나 CPU 부하가 높음
만약 SSH 트래픽이 느리다거나 높은 CPU 부하를 일으킨다면, /var/log/btmp
의 크기를 확인하고 규칙적으로 로테이션하거나 일정 크기에 도달한 후에 로테이션되도록 해야 합니다. 만약 이 파일이 매우 크다면, GitLab SSH 빠른 조회가 병목 현상을 빈번하게 유발하여 성능을 더욱 저하시킬 수 있습니다. 가능하다면, /var/log/btmp
를 읽는 것을 완전히 피하기 위해 sshd_config
에서 UsePAM
을 비활성화하는 것을 고려해볼 수 있습니다.
실행 중인 sshd: git
프로세스에서 strace
및 lsof
를 실행하여 디버깅 정보를 얻을 수 있습니다. IP x.x.x.x
에서 진행 중인 Git over SSH 연결에 대한 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#/.*##')