튜토리얼: 단일 노드 GitLab 인스턴스 설치 및 보안 설정
이 튜토리얼에서는 최대 20 RPS 또는 1,000 사용자를 수용할 수 있는 단일 노드 GitLab 인스턴스를 설치하고 보안 구성하는 방법을 배웁니다.
단일 노드 GitLab 인스턴스를 설치하고 보안하도록 설정하려면:
시작하기 전에
- 도메인 이름과 올바른 DNS 설정
- 다음과 같은 최소 사양을 갖춘 Debian 기반 서버:
- 8 vCPU
- 7.2 GB 메모리
- 모든 리포지토리를 위한 충분한 하드 드라이브 공간.
저장 요구 사항에 대해 자세히 알아보세요.
서버 보안 설정
GitLab을 설치하기 전에, 먼저 서버를 좀 더 안전하게 구성하세요.
방화벽 구성
포트 22(SSH), 80(HTTP), 443(HTTPS)를 열어야 합니다. 클라우드 공급자의 콘솔을 사용하거나 서버 수준에서 수행할 수 있습니다.
이 예제에서는 ufw
를 사용하여 방화벽을 구성합니다.
모든 포트에 대한 접근을 차단하고, 포트 80과 443을 허용하며, 마지막으로 포트 22에 대한 접근을 제한합니다.
ufw
는 지난 30초 동안 6회 이상 연결을 시도한 IP 주소에 대한 연결을 차단할 수 있습니다.
-
ufw
설치:sudo apt install ufw
-
ufw
서비스 활성화 및 시작:sudo systemctl enable --now ufw
-
필요한 포트를 제외한 모든 포트 차단:
sudo ufw default deny sudo ufw allow http sudo ufw allow https sudo ufw limit ssh/tcp
-
마지막으로, 설정을 활성화합니다. 이 패키지를 처음 설치할 때만 한 번 실행하면 됩니다.
메시지가 나타나면 예(y
)를 입력하세요:sudo ufw enable
-
규칙이 존재하는지 확인:
$ sudo ufw status Status: active To Action From -- ------ ---- 80/tcp ALLOW Anywhere 443 ALLOW Anywhere 22/tcp LIMIT Anywhere 80/tcp (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6) 22/tcp (v6) LIMIT Anywhere (v6)
SSH 서버 구성
서버를 추가로 안전하게 하기 위해 SSH를 구성하여 공개 키 인증을 수용하고, 보안 위험이 있는 일부 기능을 비활성화하세요.
-
편집기로
/etc/ssh/sshd_config
를 열고 다음 항목이 있는지 확인:PubkeyAuthentication yes PasswordAuthentication yes UsePAM yes UseDNS no AllowTcpForwarding no X11Forwarding no PrintMotd no PermitTunnel no # 클라이언트가 로케일 환경 변수를 전달할 수 있도록 허용 AcceptEnv LANG LC_* # 하위 시스템의 기본값을 재정의 Subsystem sftp /usr/lib/openssh/sftp-server # 프로토콜 조정, FIPS 또는 # FedRAMP 배포에서 필요/권장되며, 강력하고 검증된 알고리즘 선택만 사용 Protocol 2 Ciphers aes128-ctr,aes192-ctr,aes256-ctr HostKeyAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521 KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521 Macs hmac-sha2-256,hmac-sha2-512
-
파일을 저장하고 SSH 서버를 재시작:
sudo systemctl restart ssh
SSH 재시작이 실패하면
/etc/ssh/sshd_config
에 중복 항목이 없는지 확인하세요.
SSH를 사용하는 Git 액세스를 위해 승인된 사용자만 사용하도록 하세요
다음으로, 사용자가 유효한 GitLab 계정이 없이 SSH를 사용하여 프로젝트를 다운로드할 수 없도록 하세요.
SSH를 사용하는 Git 액세스를 위해 승인된 사용자만 사용하도록 하려면:
-
/etc/ssh/sshd_config
파일에 다음을 추가하세요:# 승인된 사용자만 Git을 사용하도록 하세요 AcceptEnv GIT_PROTOCOL
-
파일을 저장하고 SSH 서버를 재시작하세요:
sudo systemctl restart ssh
커널 조정 수행하기
커널 조정은 공격 위협을 완전히 제거하지는 않지만 추가적인 보안 계층을 제공합니다.
-
편집기에서
/etc/sysctl.d
아래에 새 파일을 열고, 예를 들어/etc/sysctl.d/99-gitlab-hardening.conf
에 다음을 추가하세요.참고: 파일 이름과 소스 디렉토리는 처리 순서를 결정하므로, 마지막으로 처리되는 매개변수가 이전 것들을 덮어쓸 수 있으므로 중요합니다.
## ## 다음은 경계 초과, 널 포인터 역참조, 힙 및 ## 버퍼 오버플로우 버그, 사용 후 해제 등이 악용되는 것을 완화하는 데 도움이 됩니다. 문제를 100% ## 해결하지는 않지만 악용을 심각하게 방해합니다. ## # 기본값은 65536, 4096은 악용에 사용되는 메모리 문제를 완화하는 데 도움이 됩니다. vm.mmap_min_addr=4096 # 기본값은 0, 메모리 내 가상 주소 공간을 무작위화하여 # 취약한 악용을 더 어렵게 만듭니다. kernel.randomize_va_space=2 # 커널 포인터 액세스 제한 (예: cat /proc/kallsyms) 악용 보조 kernel.kptr_restrict=2 # dmesg에서 커널 오류의 상세 출력 제한 kernel.dmesg_restrict=1 # eBPF 제한 kernel.unprivileged_bpf_disabled=1 net.core.bpf_jit_harden=2 # 일반적인 사용 후 해제 악용 방지 vm.unprivileged_userfaultfd=0 ## 네트워킹 조정 ## ## ## IP 스택 계층에서 일반적인 공격 방지 ## # SYNFLOOD 서비스 거부 공격 방지 net.ipv4.tcp_syncookies=1 # 타임대기 암살 공격 방지 net.ipv4.tcp_rfc1337=1 # IP 스푸핑/소스 라우팅 보호 net.ipv4.conf.all.rp_filter=1 net.ipv4.conf.default.rp_filter=1 net.ipv6.conf.all.accept_ra=0 net.ipv6.conf.default.accept_ra=0 net.ipv4.conf.all.accept_source_route=0 net.ipv4.conf.default.accept_source_route=0 net.ipv6.conf.all.accept_source_route=0 net.ipv6.conf.default.accept_source_route=0 # IP 리디렉션 보호 net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.default.accept_redirects=0 net.ipv4.conf.all.secure_redirects=0 net.ipv4.conf.default.secure_redirects=0 net.ipv6.conf.all.accept_redirects=0 net.ipv6.conf.default.accept_redirects=0 net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.default.send_redirects=0
-
다음 서버 재부팅 시, 값이 자동으로 로드됩니다. 즉시 로드하려면:
sudo sysctl --system
잘 하셨습니다. 서버 보안을 위한 단계를 완료했습니다! 이제 GitLab을 설치할 준비가 되었습니다.
GitLab 설치
서버가 설정되었으므로, GitLab을 설치합니다:
-
필수 의존성을 설치하고 구성합니다:
sudo apt update sudo apt install -y curl openssh-server ca-certificates perl locales
-
시스템 언어를 구성합니다:
-
/etc/locale.gen
를 편집하고en_US.UTF-8
이 주석 해제 되었는지 확인합니다. -
언어를 재생성합니다:
sudo locale-gen
-
-
GitLab 패키지 저장소를 추가하고 패키지를 설치합니다:
curl "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh" | sudo bash
스크립트의 내용을 보려면 https://packages.gitlab.com/gitlab/gitlab-ee/install를 방문하세요.
-
GitLab 패키지를 설치합니다. 강력한 비밀번호를
GITLAB_ROOT_PASSWORD
에 제공하고EXTERNAL_URL
을 귀하의 것으로 교체합니다. Let’s Encrypt 인증서가 발급될 수 있도록 URL에https
를 포함하는 것을 잊지 마세요.sudo GITLAB_ROOT_PASSWORD="강력한 비밀번호" EXTERNAL_URL="https://gitlab.example.com" apt install gitlab-ee
Let’s Encrypt 인증서에 대해 더 알아보거나 본인 인증서를 사용하려면 TLS로 GitLab 구성하기를 읽어보세요.
설정한 비밀번호가 적용되지 않았다면 루트 계정 비밀번호 재설정하기에 대해 더 읽어보세요.
-
몇 분 후에 GitLab이 설치됩니다.
EXTERNAL_URL
에 설정한 URL을 사용하여 로그인합니다. 사용자 이름으로root
를 사용하고,GITLAB_ROOT_PASSWORD
에 설정한 비밀번호를 사용하세요.
이제 GitLab을 구성할 차례입니다!
GitLab 구성
GitLab은 몇 가지 합리적인 기본 구성 옵션과 함께 제공됩니다. 이 섹션에서는 더 많은 기능을 추가하고 GitLab을 더 안전하게 만들기 위해 이들을 변경하겠습니다.
옵션 중 일부는 관리자 영역 UI를 사용하고, 다른 일부는 GitLab 구성 파일인 /etc/gitlab/gitlab.rb
를 편집합니다.
NGINX 구성
NGINX는 GitLab 인스턴스에 접근하는 데 사용되는 웹 인터페이스를 제공하는 데 사용됩니다. NGINX를 더 안전하게 구성하는 것에 대한 자세한 내용은 NGINX 보안 강화를 읽어보세요.
이메일 구성
다음으로, 이메일 서비스를 설정하고 구성합니다. 이메일은 새로운 가입을 확인하고, 비밀번호를 재설정하며, GitLab 활동을 알리는 데 중요합니다.
SMTP 구성
이번 튜토리얼에서는 SMTP 서버를 설정하고 Mailgun SMTP 공급자를 사용할 것입니다.
먼저, 로그인 자격 증명을 포함할 암호화된 파일을 생성하고, 리눅스 패키지의 SMTP를 구성합니다:
-
SMTP 서버의 자격 증명을 포함하는 YAML 파일(예:
smtp.yaml
)을 생성합니다.SMTP 비밀번호는 Ruby나 YAML에서 사용되는 문자열 구분자를 포함하지 않아야 합니다(예:
'
) 예기치 않은 동작을 피하기 위해서입니다.user_name: '<SMTP 사용자>' password: '<SMTP 비밀번호>'
-
파일을 암호화합니다:
cat smtp.yaml | sudo gitlab-rake gitlab:smtp:secret:write
기본적으로, 암호화된 파일은
/var/opt/gitlab/gitlab-rails/shared/encrypted_configuration/smtp.yaml.enc
에 저장됩니다. -
YAML 파일을 제거합니다:
rm -f smtp.yaml
-
/etc/gitlab/gitlab.rb
를 편집하고 나머지 SMTP 설정을 구성합니다. 이미 암호화된 상태로 설정했으므로gitlab_rails['smtp_user_name']
와gitlab_rails['smtp_password']
는 존재하지 않아야 합니다.gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.mailgun.org" # 또는 smtp.eu.mailgun.org gitlab_rails['smtp_port'] = 587 gitlab_rails['smtp_authentication'] = "plain" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_domain'] = "<mailgun 도메인>"
-
파일을 저장하고 GitLab을 재구성합니다:
sudo gitlab-ctl reconfigure
이제 이메일을 보낼 수 있어야 합니다. 구성이 작동했는지 테스트하려면:
-
Rails 콘솔을 엽니다:
sudo gitlab-rails console
-
콘솔 프롬프트에서 GitLab에게 테스트 이메일을 보내도록 다음 명령어를 실행합니다:
Notify.test_email('<이메일 주소>', '메시지 제목', '메시지 본문').deliver_now
이메일을 보낼 수 없는 경우 SMTP 문제 해결 섹션을 참조하세요.
이메일 인증 활성화
계정 이메일 인증은 GitLab 계정 보안에 추가 계층을 제공합니다.
특정 조건이 충족될 때, 예를 들어 24시간 이내에 3회 이상의 로그인 실패가 발생하면 계정이 잠깁니다.
이 기능은 기능 플래그 뒤에 숨어 있습니다. 활성화하려면:
-
Rails 콘솔에 입력하세요:
sudo gitlab-rails console
-
기능 플래그를 활성화하세요:
Feature.enable(:require_email_verification)
-
활성화되었는지 확인하세요 (반환 값은
true
이어야 합니다):Feature.enabled?(:require_email_verification)
자세한 내용은 계정 이메일 인증을 참조하세요.
S/MIME으로 발신 이메일 서명
GitLab에서 발송된 알림 이메일은 보안을 개선하기 위해 S/MIME으로 서명할 수 있습니다.
단일 키 및 인증서 파일 쌍을 제공해야 합니다:
- 두 파일 모두 PEM 인코딩되어야 합니다.
- 키 파일은 암호화되지 않아야 GitLab이 사용자 개입 없이 읽을 수 있습니다.
- RSA 키만 지원됩니다.
- 선택 사항입니다. 각 서명에 포함할 Certificate Authority (CA) 인증서(PEM 인코딩)의 번들을 제공할 수 있습니다. 이는 일반적으로 중간 CA입니다.
- CA에서 인증서를 구매하세요.
-
/etc/gitlab/gitlab.rb
를 편집하고 파일 경로를 수정하세요:gitlab_rails['gitlab_email_smime_enabled'] = true gitlab_rails['gitlab_email_smime_key_file'] = '/etc/gitlab/ssl/gitlab_smime.key' gitlab_rails['gitlab_email_smime_cert_file'] = '/etc/gitlab/ssl/gitlab_smime.crt'
-
파일을 저장하고 GitLab을 재구성하세요:
sudo gitlab-ctl reconfigure
자세한 내용은 S/MIME으로 발신 이메일 서명하기를 참조하세요.
다음 단계
이 튜토리얼에서는 서버를 더 안전하게 설정하는 방법, GitLab을 설치하는 방법, GitLab을 일부 보안 기준에 맞게 구성하는 방법을 배웠습니다. GitLab을 안전하게 유지하기 위해 취할 수 있는 기타 단계로는 다음과 같은 것들이 있습니다:
- 회원 가입 비활성화. 기본적으로 새로운 GitLab 인스턴스는 회원 가입이 활성화되어 있습니다. GitLab 인스턴스를 공개할 계획이 없다면 회원 가입을 비활성화해야 합니다.
- 특정 이메일 도메인을 사용하여 회원 가입 허용 또는 거부.
- 새로운 사용자를 위한 최소 비밀번호 길이 제한 설정.
- 모든 사용자에 대해 2단계 인증 강제.
GitLab 인스턴스를 강화하는 것 외에도 CI/CD 기능을 활용하기 위해 자체 러너를 구성하거나 인스턴스를 적절하게 백업하는 등의 구성할 수 있는 많은 기타 사항이 있습니다.
설치 후에 취해야 할 단계에 대해 더 읽어볼 수 있습니다.