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

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

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

단일 노드 GitLab 인스턴스를 설치하고 안전하게 구성하려면:

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

시작하기 전에

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

서버 보안 설정

GitLab을 설치하기 전에 서버를 좀 더 안전하게 구성하는 것부터 시작해 보겠습니다.

방화벽 구성

SSH(포트 22), HTTP(포트 80), 그리고 HTTPS(포트 443)를 열어야 합니다. 이 작업은 클라우드 제공업체 콘솔이나 서버 수준에서 수행할 수 있습니다.

이 예에서는 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
    
    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를 공개 키 인증을 수락하도록 구성하고 잠재적인 보안 위협 요소인 일부 기능을 비활성화해야 합니다.

  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 액세스에 권한이 있는 사용자만 사용하도록 보장

다음으로, 사용자가 GitLab 계정을 통해 SSH를 이용하여 프로젝트를 가져올 수 없도록 보증하세요.

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
    # 일반적인 사용 후 메모리 해제 악용을 방지합니다
    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 패키지를 설치하세요. EXTERNAL_URL을 사용자의 URL로 바꿔주고 GITLAB_ROOT_PASSWORD에 강력한 암호를 제공하세요. URL에 https를 포함하여 Let’s Encrypt 인증서가 발급되도록 해야 합니다.

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

    Let’s Encrypt 인증서에 대해 자세히 알아보거나, 사용자 고유의 것을 사용하려면 TLS로 GitLab 구성하는 방법을 읽어보세요.

    설정한 암호가 적용되지 않은 경우, root 계정 암호 재설정에 대해 자세히 알아보세요.

  5. 잠시 후 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를 구성하세요:

  1. SMTP 서버의 자격 증명이 포함된 YAML 파일(예: smtp.yaml)을 만듭니다.

    귀하의 SMTP 암호는 Ruby나 YAML에서 사용되는 문자 구분 기호(예: ')를 포함해서는 안 되며, 구성 설정 처리 중 예기치 않은 동작을 피하기 위해 이를 주의해야 합니다.

    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. 활성화되었는지 확인합니다 (true를 반환해야 함):

    Feature.enabled?(:require_email_verification)
    

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

S/MIME로 이메일 서명 활성화

GitLab에서 보내는 알림 이메일은 S/MIME로 서명할 수 있어 더 우수한 보안을 제공합니다.

키와 인증서 파일 한 쌍을 제공해야 합니다: - 두 파일 모두 PEM 인코딩되어야 합니다. - 키 파일은 사용자 개입 없이 GitLab이 읽을 수 있도록 암호화되어서는 안 됩니다. - RSA 키만 지원됩니다. - 선택 사항. 각 서명에 포함할 인증 기관 (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 기능을 활용하기 위해 나만의 러너를 구성하거나 인스턴스를 적절하게 백업하는 것과 같이 많은 다른 구성을 할 수 있습니다.

설치 후 수행할 단계에 대해 더 읽어볼 수 있습니다.