데이터베이스에서 권한이 부여된 SSH 키 빠르게 조회하기
참고:
이 문서는 authorized_keys
파일의 대체품에 대해 설명합니다. 일반 (배포 키가 아닌) 사용자의 경우 SSH certificates 사용을 고려해보세요. 이들은 훨씬 빠르지만, 대체품은 아닙니다.
일반 SSH 작업은 사용자 수가 증가함에 따라 느려집니다. 왜냐하면 OpenSSH는 사용자를 승인하기 위해 키를 선형 검색하게 됩니다. 최악의 경우, GitLab에 접근 권한이 없는 경우 OpenSSH는 키를 찾기 위해 전체 파일을 스캔합니다. 이는 상당한 시간과 디스크 I/O를 필요로 하며, 사용자가 리포지토리로 push 또는 pull을 시도하는 것을 지연시킵니다. 더 나쁜 상황은 사용자가 자주 키를 추가 또는 삭제하는 경우, 운영 체제가 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은 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 # Match 종료, 설정은 다시 모든 사용자에게 적용
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
에 위치할 것입니다. 필요에 따라 명령을 root
소유로 만든 다른 곳에 래퍼 스크립트를 만드는 것을 고려해볼 수 있습니다. 그러나 이 명령은 임시로 root
소유가 변경되어서는 안 되고, 그룹 또는 다른 사용자가 쓸 수 없어야 합니다. 사용자 키를 새로 추가한 후에 authorized_keys
파일에 빠르게 쓰는 것을 비활성화하지 않는 것이 좋습니다.
조회 실패의 경우 (흔함), authorized_keys
파일은 여전히 스캔됩니다. 그래서 큰 파일이 존재하는 한 많은 사용자의 경우 Git SSH 성능이 여전히 느릴 수 있습니다.
authorized_keys
파일에 쓰기를 비활성화하려면:
- 왼쪽 사이드바에서 맨 아래에서 Admin을 선택합니다.
- Settings > Network를 선택합니다.
- Performance optimization을 확장합니다.
- Use authorized_keys file to authenticate SSH keys 확인란을 선택 해제합니다.
- Save changes를 선택합니다.
로컬에서 사용자 SSH 키를 제거한 후 새 키를 추가하고 리포지토리를 가져와서 SSH가 제대로 작동하는지 확인하세요.
그런 다음 성능을 최적화하기 위해 사용자 authorized_keys
파일을 백업하고 삭제할 수 있습니다. 현재 사용자의 키는 이미 데이터베이스에 있으므로 마이그레이션 또는 사용자가 키를 다시 추가할 필요가 없습니다.
authorized_keys
파일 사용으로 되돌아가는 방법
이 개요는 간단합니다. 보다 자세한 내용은 위의 지침을 참조하세요.
-
authorized_keys
파일 다시 빌드하기. -
authorized_keys
파일에 쓰기를 활성화합니다.- 왼쪽 사이드바에서 맨 아래에서 Admin을 선택합니다.
- 왼쪽 사이드바에서 Settings > Network를 선택합니다.
- Performance optimization을 확장합니다.
- Use authorized_keys file to authenticate SSH 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 Shell 문서에서 찾을 수 있습니다.
문제 해결
SSH 트래픽이 느리거나 CPU 부하가 높음
만약 SSH 트래픽이 느리다거나 높은 CPU 부하를 일으킨다면, /var/log/btmp
의 크기를 확인하고 정기적으로 로테이션되거나 특정 크기에 도달한 후에 로테이션되도록 해야 합니다. 이 파일이 매우 크다면, GitLab SSH 빠른 조회가 병목 현상을 더 자주 유발하므로 성능이 더욱 감소할 수 있습니다. 가능하다면, sshd_config
에서 UsePAM
을 비활성화하여 /var/log/btmp
을 읽지 않도록 설정할 수 있습니다.
실행 중인 sshd: git
프로세스에서 strace
및 lsof
를 실행하면 디버깅 정보를 얻을 수 있습니다.
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#/.*##')