튜토리얼: 단일 노드 GitLab 인스턴스 설치 및 보호

Tier: Free, Premium, Ultimate Offering: Self-managed

이 튜토리얼에서는 최대 20 RPS 또는 1,000 사용자를 수용할 수 있는 단일 노드 GitLab 인스턴스를 설치하고 안전하게 구성하는 방법을 배우게 됩니다.

단일 노드 GitLab 인스턴스를 설치하고 안전하게 구성하려면 다음을 수행하세요:

  1. 서버 보호
  2. GitLab 설치
  3. GitLab 구성
  4. 다음 단계

시작하기 전에

  • 도메인 이름 및 올바른 DNS 설정.
  • 다음과 같은 최소 사양을 갖춘 데비안 기반 서버:
    • 8 vCPU
    • 7.2 GB 메모리
    • 모든 리포지토리에 대한 충분한 하드 드라이브 공간. 저장소 요구 사항에 대해 자세히 알아보세요.

서버 보호

GitLab을 설치하기 전에, 서버를 좀 더 안전하게 구성하는 것부터 시작하세요.

방화벽 구성

포트 22 (SSH), 80 (HTTP), 및 443 (HTTPS)를 열어야 합니다. 이를 위해 클라우드 제공 업체의 콘솔을 사용하거나 서버 수준에서 수행할 수 있습니다.

이 예제에서는 ufw를 사용하여 방화벽을 구성합니다. 모든 포트에 대한 액세스를 거부한 후 80번 및 443번 포트에 대한 액세스를 허용하고, 마지막으로 22번 포트에 대한 액세스를 제한합니다. ufw는 지난 30초 동안 6회 이상의 접속을 시도한 IP 주소로부터의 연결을 거부할 수 있습니다.

  1. ufw를 설치하세요:

    sudo apt install ufw
    
  2. ufw 서비스를 활성화 및 시작하세요:

    sudo systemctl enable --now ufw
    
  3. 필요한 포트 이외의 모든 포트에 대한 액세스를 거부하세요:

    sudo ufw default deny
    sudo ufw allow http
    sudo ufw allow https
    sudo ufw limit ssh/tcp
    
  4. 마지막으로 설정을 활성화하세요. 이 설정은 패키지를 처음 설치할 때에만 한 번 실행해야 합니다. 프롬프트에 y로 응답하세요.

    sudo ufw enable
    
  5. 규칙이 적용되었는지 확인하세요:

    $ sudo ufw status
    
    상태: active
    
    출발지       액션      To
    --           ------    ----
    80/tcp       허용      Anywhere
    443          허용      Anywhere
    22/tcp       제한      Anywhere
    80/tcp (v6)  허용      Anywhere (v6)
    443 (v6)     허용      Anywhere (v6)
    22/tcp (v6)  제한      Anywhere (v6)
    

SSH 서버 구성

서버를 보다 안전하게 하기 위해, SSH를 퍼블릭 키 인증을 허용하도록 구성하고, 잠재적 보안 위협이 되는 몇 가지 기능을 비활성화하세요.

  1. /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
    
  2. 파일을 저장하고 SSH 서비스를 다시 시작하세요:

    sudo systemctl restart ssh
    

    SSH를 다시 시작하는 데 문제가 발생하면 /etc/ssh/sshd_config 파일에 중복 항목이 없는지 확인하세요.

권한 있는 사용자만 SSH를 통해 Git 액세스 사용

이제 사용자가 SSH를 통해 프로젝트를 다운로드하는 것을 GitLab 계정으로 Git 작업을 수행할 수 있는 경우에만 허용되도록 설정하세요.

SSH를 통해 권한 있는 사용자만이 Git 액세스를 사용하도록 확인하세요:

  1. /etc/ssh/sshd_config 파일에 다음을 추가하세요:

    # 권한 있는 사용자만이 Git을 사용하도록 확인
    AcceptEnv GIT_PROTOCOL
    
  2. 파일을 저장하고 SSH 서비스를 다시 시작하세요:

    sudo systemctl restart ssh
    

커널 조정 수행

커널 조정은 공격 위협을 완전히 제거하지는 않지만, 추가적인 보안 층을 추가합니다.

  1. 새 파일을 열어 다음을 /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
    # 공통 use-after-free 악용 방지
    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
    
  2. 다음 서버 재부팅 시, 값을 자동으로 로드합니다. 즉시 로드하려면:

    sudo sysctl --system
    

훌륭한 작업입니다. 서버 보호 단계를 완료하였습니다! 이제 GitLab을 설치할 준비가 되었습니다.

GitLab 설치

이제 서버가 설정되었으므로 GitLab을 설치하세요:

  1. 필요한 종속성을 설치하고 구성합니다:

    sudo apt update
    sudo apt install -y curl openssh-server ca-certificates perl locales
    
  2. 시스템 언어를 구성하세요:

    1. /etc/locale.gen을 수정하고 en_US.UTF-8이 주석 처리되지 않았는지 확인하세요.
    2. 언어를 다시 생성하세요:

      sudo locale-gen
      
  3. GitLab 패키지 저장소를 추가하고 패키지를 설치하세요:

    curl "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh" | sudo bash
    

    스크립트의 내용을 확인하려면 https://packages.gitlab.com/gitlab/gitlab-ee/install을 방문하세요.

  4. GitLab 패키지를 설치하세요. GITLAB_ROOT_PASSWORD에 강력한 암호를 제공하고 EXTERNAL_URL을 사용자의 것으로 대체하세요. URL에 https를 포함하여 Let’s Encrypt 인증서가 발급되도록하세요.

    sudo GITLAB_ROOT_PASSWORD="강력한 암호" EXTERNAL_URL="https://gitlab.example.com" apt install gitlab-ee
    

    Let’s Encrypt 인증서에 대해 자세히 알아보거나 직접 사용하려면 TLS로 GitLab 구성을 읽어보세요.

    설정한 암호가 인식되지 않았다면 루트 계정 암호 재설정에 대해 자세히 읽어보세요.

  5. 잠시 후 GitLab이 설치됩니다. EXTERNAL_URL에 설정한 URL을 사용하여 로그인하세요. 사용자 이름은 root이고 GITLAB_ROOT_PASSWORD에 설정한 암호를 사용하세요.

이제 GitLab을 구성할 시간입니다!

GitLab 구성

GitLab에는 합리적인 기본 구성 옵션이 포함되어 있습니다. 이 섹션에서는 이러한 옵션을 변경하여 더 많은 기능을 추가하고 GitLab을 더 안전하게 만들 것입니다.

일부 옵션에 대해 관리자 영역 UI를 사용하며 일부 옵션에 대해서는 /etc/gitlab/gitlab.rb, GitLab 구성 파일을 편집할 것입니다.

NGINX 구성

NGINX는 GitLab 인스턴스에 액세스하는 데 사용되는 웹 인터페이스를 제공하는 데 사용됩니다. NGINX를 더 안전하게 구성하는 방법에 대해 자세히 알아보려면 NGINX 강화를 읽어보세요.

이메일 구성

다음으로 이메일 서비스를 설정하고 구성할 것입니다. 이메일은 새 가입자를 확인하거나 암호를 재설정하고 GitLab 활동을 알리는 데 중요합니다.

SMTP 구성

이 튜토리얼에서는 SMTP 서버를 설정하고 Mailgun SMTP 제공자를 사용할 것입니다.

먼저 로그인 자격 증명을 포함하는 암호화된 파일을 생성한 다음 Linux 패키지용 SMTP를 구성하세요:

  1. SMTP 서버의 자격 증명을 포함하는 YAML 파일(예: smtp.yaml)을 생성하세요.

    Ruby나 YAML에서 사용되는 문자열 구분 기호(예: ')를 포함해서는 안 되므로 SMTP 암호에 해당 기호가 없어야 하며 이것은 구성 설정 처리 중 예기치 않은 동작을 방지하기 위한 것입니다.

    user_name: '<SMTP 사용자>'
    password: '<SMTP 암호>'
    
  2. 파일을 암호화하세요:

    cat smtp.yaml | sudo gitlab-rake gitlab:smtp:secret:write
    

    기본적으로 암호화된 파일은 /var/opt/gitlab/gitlab-rails/shared/encrypted_configuration/smtp.yaml.enc에 저장됩니다.

  3. YAML 파일을 삭제하세요:

    rm -f smtp.yaml
    
  4. /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 도메인>"
    
  5. 파일을 저장하고 GitLab을 다시 구성하세요:

    sudo gitlab-ctl reconfigure
    

이제 이메일을 보낼 수 있어야 합니다. 구성이 작동하는지 테스트하려면:

  1. Rails 콘솔에 들어가세요:

    sudo gitlab-rails console
    
  2. 콘솔 프롬프트에서 다음 명령을 실행하여 GitLab이 테스트 이메일을 보내도록 하세요:

    Notify.test_email('<이메일 주소>', '메시지 제목', '메시지 본문').deliver_now
    

이메일을 보낼 수 없는 경우 SMTP 문제 해결 섹션을 참조하세요.

이메일 확인 사용

계정 이메일 확인은 GitLab 계정 보안에 추가적인 보안 계층을 제공합니다. 예를 들어 24시간 동안 3회 이상의 실패한 로그인 시도가 있는 경우와 같은 일부 조건이 충족되면 계정이 잠깁니다.

이 기능은 기능 플래그 뒤에 숨겨져 있습니다. 이를 활성화하려면:

  1. Rails 콘솔에 들어가세요:

    sudo gitlab-rails console
    
  2. 기능 플래그를 활성화하세요:

    Feature.enable(:require_email_verification)
    
  3. 활성화되었는지 확인하세요(참이어야 함):

    Feature.enabled?(:require_email_verification)
    

자세한 내용은 계정 이메일 확인을 읽어보세요.

S/MIME로 이메일 서명

GitLab이 보내는 알림 이메일은 S/MIME으로 서명하여 보다 안전하게 할 수 있습니다.

한 쌍의 키와 인증서 파일이 제공되어야 합니다:

  • 두 파일 모두 PEM으로 인코딩되어야 합니다.
  • 키 파일은 사용자 개입 없이 GitLab이 읽을 수 있도록 암호화되지 않아야 합니다.
  • RSA 키만 지원됩니다.
  • 옵션입니다. 각 서명에 포함할 CA(Certificate Authority) 인증서 번들(PEM으로 인코딩)을 제공할 수 있습니다. 일반적으로 중간 CA입니다.
  1. CA에서 인증서를 구매하세요.
  2. /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'
    
  3. 파일을 저장하고 GitLab을 다시 구성하세요:

    sudo gitlab-ctl reconfigure
    

자세한 내용은 S/MIME로 이메일 서명을 읽어보세요.

다음 단계

이 튜토리얼에서는 서버를 더 안전하게 설정하는 방법, GitLab 설치하는 방법, 그리고 GitLab을 일부 보안 기준을 충족시키도록 구성하는 방법을 배웠습니다. GitLab을 보다 안전하게 하는 몇 가지 다른 단계는 다음과 같습니다:

  • 가입 비활성화. 기본적으로 새로운 GitLab 인스턴스는 가입이 활성화되어 있습니다. GitLab 인스턴스를 공개적으로 사용하지 않는 경우 가입을 비활성화해야 합니다.
  • 특정 이메일 도메인을 사용하여 가입을 허용하거나 거부함.
  • 새로운 사용자의 최소 비밀번호 길이 제한 설정.
  • 모든 사용자에 대해 이중 인증을 강제로 시행함.

보안 강화 외에도 GitLab 인스턴스를 구성하는 몇 가지 다른 사항이 있습니다. 예를 들어, GitLab이 제공하는 CI/CD 기능을 활용하기 위해 자체 러너를 구성하거나 인스턴스를 적절히 백업하는 것 등이 그것입니다.

설치 후 수행할 작업에 대해 더 자세히 알아볼 수 있습니다.