Development Tools/git

GitLab에 HTTPS 보안 적용하기: 안전한 개발 환경 구축 가이드

ai-one 2025. 5. 3. 14:10
반응형

GitLab에 HTTPS 보안 적용하기: 안전한 개발 환경 구축 가이드

소스 코드는 기업의 핵심 자산입니다. GitLab을 자체 호스팅하여 사용하는 경우, HTTPS를 적용하는 것은 코드의 보안을 강화하고 데이터 전송 과정에서 발생할 수 있는 중간자 공격(Man-in-the-Middle Attack)을 방지하기 위해 필수적입니다. 이 글에서는 GitLab에 HTTPS를 적용하는 방법을 자세히 알아보겠습니다.

HTTPS란 무엇인가?

HTTPS(Hypertext Transfer Protocol Secure)는 웹 브라우저와 웹 서버 간의 통신을 암호화하여 데이터의 기밀성과 무결성을 보장하는 프로토콜입니다. SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security) 인증서를 사용하여 통신을 암호화합니다.

GitLab에 HTTPS를 적용하면 다음과 같은 이점이 있습니다:

  • 클라이언트와 서버 간 데이터 전송 시 암호화를 통한 보안 강화
  • 중간자 공격으로부터 보호
  • 사용자 인증 정보 보호
  • 웹 브라우저에서의 보안 경고 제거
  • 최신 웹 기술(HTTP/2, PWA 등) 사용 가능

GitLab에 HTTPS 적용 방법

GitLab에 HTTPS를 적용하는 방법은 크게 두 가지가 있습니다:

  1. Let's Encrypt를 이용한 무료 SSL 인증서 적용
  2. 상용 SSL 인증서 구매 후 수동 설정

각 방법의 장단점과 적용 절차를 자세히 살펴보겠습니다.

1. Let's Encrypt를 이용한 무료 SSL 인증서 적용

Let's Encrypt는 무료로 SSL 인증서를 발급해주는 인증 기관으로, 자동화된 방식으로 인증서를 발급하고 갱신할 수 있습니다.

장점:

  • 무료로 인증서 발급 가능
  • 자동 갱신 가능 (90일마다)
  • 설정이 비교적 간단함

단점:

  • 와일드카드 인증서 발급이 제한적
  • 도메인 소유권 인증 필요

적용 절차:

  1. 사전 준비:
    • 도메인 이름이 필요합니다 (IP 주소로는 Let's Encrypt 인증서를 발급받을 수 없음)
    • GitLab 서버에 SSH 접속 권한
    • 루트 권한 또는 sudo 권한
  2. Certbot 설치:
  3. # Ubuntu/Debian 기반 sudo apt-get update sudo apt-get install certbot # CentOS/RHEL 기반 sudo yum install certbot
  4. 인증서 발급:이 명령은 도메인의 소유권을 확인하기 위해 임시로 웹 서버를 실행합니다. GitLab이 이미 실행 중이라면 잠시 중지해야 할 수 있습니다.
  5. sudo certbot certonly --standalone -d gitlab.yourdomain.com
  6. GitLab 설정 파일 수정:
    external_url 'https://gitlab.yourdomain.com'
    
    # SSL 인증서 경로 설정
    nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/fullchain.pem"
    nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/privkey.pem"
    
  7. /etc/gitlab/gitlab.rb 파일을 열고 다음 내용을 수정합니다:
  8. GitLab 재구성:
  9. sudo gitlab-ctl reconfigure
  10. 자동 갱신 설정:
    sudo crontab -e
    
    다음 내용을 추가합니다:이 설정은 2개월마다 1일 자정에 인증서 갱신을 시도하고, 갱신 후 GitLab의 nginx를 재시작합니다.
  11. 0 0 1 */2 * certbot renew --quiet && gitlab-ctl restart nginx
  12. 인증서는 90일마다 갱신해야 합니다. crontab을 설정하여 자동 갱신되도록 합니다:

2. 상용 SSL 인증서 수동 설정

이미 발급받은 상용 SSL 인증서가 있거나, 보다 긴 유효기간 또는 고급 기능이 필요한 경우에는 상용 인증서를 사용할 수 있습니다.

장점:

  • 더 긴 유효 기간 (1년~3년)
  • 와일드카드 인증서 지원
  • 더 높은 보증 수준 (EV 인증서 등)

단점:

  • 비용 발생
  • 수동 갱신 필요

적용 절차:

  1. 인증서 파일 준비: 상용 SSL 인증서는 일반적으로 다음 파일들로 구성됩니다:
    • 인증서 파일 (*.crt 또는 *.pem)
    • 개인 키 파일 (*.key)
    • 중간 인증서 파일 (chain.crt 또는 ca-bundle.crt)
  2. 인증서 파일 복사:
    sudo mkdir -p /etc/gitlab/ssl
    sudo cp yourdomain.crt /etc/gitlab/ssl/
    sudo cp yourdomain.key /etc/gitlab/ssl/
    sudo cp chain.crt /etc/gitlab/ssl/
    
  3. 인증서 파일을 적절한 위치에 복사합니다:
  4. 권한 설정:
  5. sudo chmod 600 /etc/gitlab/ssl/* sudo chown root:root /etc/gitlab/ssl/*
  6. GitLab 설정 파일 수정:
    external_url 'https://gitlab.yourdomain.com'
    
    # SSL 인증서 경로 설정
    nginx['ssl_certificate'] = "/etc/gitlab/ssl/yourdomain.crt"
    nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/yourdomain.key"
    nginx['ssl_trusted_certificate'] = "/etc/gitlab/ssl/chain.crt"
    
  7. /etc/gitlab/gitlab.rb 파일을 열고 다음 내용을 수정합니다:
  8. GitLab 재구성:
  9. sudo gitlab-ctl reconfigure

HTTPS 추가 설정 및 보안 강화

GitLab에 HTTPS를 적용한 후에도 추가적인 보안 설정을 통해 더 안전한 환경을 구축할 수 있습니다.

HSTS(HTTP Strict Transport Security) 설정

HSTS는 웹 사이트가 HTTPS로만 접속되도록 강제하는 보안 기능입니다.

# /etc/gitlab/gitlab.rb 파일에 추가
nginx['hsts_max_age'] = 63072000
nginx['hsts_include_subdomains'] = true

강력한 암호화 프로토콜 사용

오래된 TLS 버전을 비활성화하고 강력한 암호화 프로토콜만 사용하도록 설정합니다.

# /etc/gitlab/gitlab.rb 파일에 추가
nginx['ssl_protocols'] = "TLSv1.2 TLSv1.3"
nginx['ssl_ciphers'] = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
nginx['ssl_prefer_server_ciphers'] = "on"

HTTP에서 HTTPS로 자동 리다이렉션 설정

HTTP로 접속한 사용자를 자동으로 HTTPS로 리다이렉션하도록 설정합니다.

# /etc/gitlab/gitlab.rb 파일에 추가
nginx['redirect_http_to_https'] = true
nginx['redirect_http_to_https_port'] = 80

이 설정을 적용한 후 sudo gitlab-ctl reconfigure 명령으로 GitLab을 재구성해야 합니다.

설정 확인 및 테스트

HTTPS 설정이 제대로 적용되었는지 확인하는 방법은 다음과 같습니다:

  1. 브라우저에서 접속 확인: https://gitlab.yourdomain.com으로 접속해 잠금 아이콘이 표시되는지 확인합니다.
  2. SSL 인증서 정보 확인: 브라우저의 잠금 아이콘을 클릭하여 인증서 정보를 확인합니다.
  3. SSL Labs 테스트: SSL Labs에서 도메인을 테스트하여 보안 등급을 확인합니다.
  4. Git 명령으로 접속 테스트:
  5. git clone https://gitlab.yourdomain.com/some-group/some-project.git

자주 발생하는 문제 해결

1. 인증서 경로 문제

nginx: [emerg] PEM_read_bio_X509_AUX() failed

이 오류는 인증서 파일 경로가 잘못되었거나 파일 형식이 올바르지 않을 때 발생합니다.

해결책:

  • 인증서 파일 경로가 정확한지 확인
  • 파일 형식이 PEM 형식인지 확인
  • 필요한 경우 인증서 파일 변환:
    openssl x509 -in certificate.crt -out certificate.pem -outform PEM
    

2. 권한 문제

nginx: [emerg] cannot load certificate "/path/to/cert.pem"

해결책:

  • 파일 권한 확인 및 수정:
    sudo chmod 600 /path/to/cert.pemsudo chown root:root /path/to/cert.pem
    

3. Let's Encrypt 인증서 갱신 실패

해결책:

  • 수동으로 갱신 시도:
    sudo certbot renew --dry-run
    
  • 오류 로그 확인:
    cat /var/log/letsencrypt/letsencrypt.log
    

GitLab Container Registry HTTPS 설정

GitLab 컨테이너 레지스트리를 사용하는 경우, 이 서비스에도 HTTPS를 적용해야 합니다.

# /etc/gitlab/gitlab.rb 파일에 추가
registry_external_url 'https://registry.yourdomain.com'
registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/registry.yourdomain.com.crt"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/registry.yourdomain.com.key"

Docker를 이용한 GitLab 환경에서 HTTPS 설정

Docker로 GitLab을 실행하는 경우, 다음과 같이 설정할 수 있습니다:

docker run --detach \
  --hostname gitlab.yourdomain.com \
  --publish 443:443 --publish 80:80 \
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  --volume /path/to/certs:/etc/gitlab/ssl \
  gitlab/gitlab-ce:latest

그런 다음 /srv/gitlab/config/gitlab.rb 파일을 수정하여 SSL 설정을 추가합니다.

결론

GitLab에 HTTPS를 적용하는 것은 코드 보안과 데이터 무결성을 보장하는 중요한 단계입니다. Let's Encrypt를 이용하면 무료로 인증서를 발급받고 자동 갱신할 수 있어 관리가 용이합니다. 상용 인증서는 더 긴 유효기간과 추가 기능을 제공하지만 비용이 발생합니다.

이 가이드를 따라 GitLab에 HTTPS를 성공적으로 적용하고, 추가 보안 설정을 통해 더욱 안전한 개발 환경을 구축하시기 바랍니다. 개발 과정에서의 코드 보안은 전체 시스템 보안의 중요한 부분임을 기억하세요.

반응형