튜토리얼: 단일 노드 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
       
    상태: 활성화
       
    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를 공개 키 인증 허용으로 구성하고 잠재적인 보안 위협이 되는 일부 기능을 비활성화합니다.

  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를 통해 Git 액세스를 하도록 보장합니다:

  1. /etc/ssh/sshd_config 파일에 다음을 추가합니다:

    # 권한이 있는 사용자만 Git 사용
    AcceptEnv GIT_PROTOCOL
    
  2. 파일을 저장하고 SSH 서버를 재시작합니다:

    sudo systemctl restart ssh
    

일부 커널 조정

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

  1. 예를 들어, /etc/sysctl.d/99-gitlab-hardening.conf와 같이 /etc/sysctl.d에 새 파일을 열고 다음을 추가합니다.

    note
    파일명 및 소스 디렉터리로 인해 처리 순서가 결정되며, 이는 나중에 처리된 매개변수가 앞선 것을 덮어쓸 수 있기 때문에 중요합니다.
    ##
    ## 다음은 경계 외, 널 포인터 역참조, 힙 및
    ## 버퍼 오버플로우 버그의 활용을 어렵게 하는데 도움이 되는 설정입니다. 
    ## 이러한 설정으로 문제가 100% 해결되지는 않지만, 심각하게 방해됩니다.
    ##
    # 기본값은 65536이며, 활용에서 사용되는 메모리 문제를 어렵게 하기 위해 4096 이 도움이 됩니다
    vm.mmap_min_addr=4096
    # 기본값은 0인데, 가상 주소 공간을 무작위화하여 취약성 활용을 어렵게 합니다
    kernel.randomize_va_space=2
    # 활용 지원을 위한 커널 포인터 액세스 제한 (예: /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
    # TIME WAIT 암살 공격 방지
    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로 바꾸세요. 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 공급 업체를 사용할 것입니다.

먼저 SMTP 서버 로그인 자격 증명을 포함하는 암호화된 파일을 만들고 Linux 패키지를 구성하는 것으로 시작하세요:

  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'] = "<메일건 도메인>"
    
  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) 인증서(CA) 번들을 제공할 수 있습니다. (일반적으로 중간 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을 단순히 강화하는 것 외에도 CI/CD 기능을 활용하기 위해 자체 러너를 구성하거나 인스턴스를 올바르게 백업하는 등 다른 설정할 수있는 많은 것들이 있습니다.

설치 후 수행할 단계에 대해 자세히 읽을 수 있습니다.