안녕하세요. 인포그랩에서 Solution Architect(SA)이자 DevOps 엔지니어로 일하는 Steve입니다. 저는 인포그랩에 입사하기 전 GitLab에서 4년 동안 SA로 일했는데요. 그때 가장 많이 들었던 질문이 “GitLab과 GitHub은 뭐가 다른가요?”, “GitHub 데이터를 GitLab으로 마이그레이션 하는 절차나 이슈는 뭐가 있을까요?” 였습니다.
GitLab과 GitHub은 보안, 클라우드 전략, 도입 편의성 등 여러 측면에서 차이점이 많은데요. 그중에서도 핵심 차이점은 보안 기능의 지원 범위와 다양성입니다. GitLab은 플랫폼 전체에 보안이 통합됐고, 다채로운 보안 기능을 기본으로 제공하죠. GitHub도 좋은 보안 기능을 지원하지만 주요 보안 검사 기능이 GitLab만큼 많지 않습니다. GitLab의 동적 애플리케이션 보안 테스트(DAST), 컨테이너 스캐닝, Fuzz 테스트 같은 보안 점검 기능은 GitHub에는 없죠.
GitLab은 이러한 단독 보안 기능뿐만 아니라 GitHub Advanced Security의 고급 보안 기능도 지원하는데요. GitHub에서 GitLab으로 마이그레이션 하면 이러한 기능을 두루 누릴 수 있습니다. 이 글에서는 GitLab 최고 등급 라이선스인 Ultimate에서 지원하는 GitLab 고급 보안 기능을 알아보고요. GitHub Advanced Security의 고급 보안 기능을 GitLab Ultimate에서 사용하는 방법도 소개하겠습니다.
GitLab Ultimate의 고급 보안 기능
GitLab Ultimate는 GitLab의 최고 등급 라이선스입니다. 이는 기업이 소프트웨어를 빠르고 안전하게 개발, 배포하는 데 도움이 되는 고급 보안 기능을 다수 제공하죠. 정적 애플리케이션 보안 테스트(SAST), 시크릿(Secret) 스캐닝, 의존성 스캐닝 기능이 그 예고요. 컨텍스트 기반 취약점 정보와 해결 방법도 알려줍니다. 의존성 목록과 소프트웨어 자재 명세서(SBOM), 보안 메트릭, 인사이트도 지원하고요.
위 기능은 GitHub Enterprise의 애드온 서비스인 GitHub Advanced Security에서도 지원해 GitLab만의 장점은 아닐 수 있는데요. 이와 별개로 GitLab Ultimate는 GitHub Advanced Security에서 누리기 어려운 독보적인 고급 보안 기능도 많이 지원합니다. 주요 내용은 아래와 같은데요.
- DAST, 컨테이너 스캐닝, Web API Fuzz 테스트 등 추가 코드 스캐너를 제공합니다. 이러한 스캐너는 최적화된 독점 기술과 오픈 소스 기술, 맞춤형 룰셋을 적용해 사용하죠.
- 안전하지 않은 코드가 승인 없이 merge 되지 않도록 세부 보안 가이드라인을 제공합니다.
- GitLab 보안 스캐너는 폐쇄망 또는 제한된 인 터넷 연결 환경에서도 실행할 수 있습니다.
- 조직 전체 컴플라이언스 위반 사항을 감독하는 컴플라이언스 센터가 있습니다.
GitLab Ultimate의 고급 보안 기능은 보안 스캐너, 정책, 역할·권한 설정 등으로 구분할 수 있는데요. 항목별로 자세히 살펴보겠습니다.
보안 스캐너
GitLab Ultimate는 소프트웨어 개발 라이프사이클 전반에 걸쳐 아래와 같이 보안 스캐너를 제공합니다. 아울러 서드파티 스캐너와 맞춤형 스캐너를 GitLab에 통합할 수 있는데요. 통합한 뒤, 스캐너 결과는 GitLab 파이프라인 뷰, Merge Request(MR) 위젯, 보안 대시보드 등에 자동 표시돼 쉽게 확인할 수 있습니다.
스캐너 이름 | 스캔 항목 | 스캔 대상 언어/파일 |
---|---|---|
정적 애플리케이션 보안 테스트 (SAST) | 정적 소스 코드 | C/C++, Java, Python, Go, JavaScript, C# 등 |
동적 애플리케이션 보안 테스트 (DAST) | 실행 중인 웹 애플리 케이션, 라이브 API | 언어 무관 |
코드형 인프라(IaC) 스캐닝 | IaC 파일 | Terraform, AWS CloudFormation, Ansible 등 |
컨테이너 스캐닝 | 정적, 실행 중인 컨테이너 이미지 | Dockerfile |
의존성 스캐닝, 라이선스 스캐닝 | 애플리케이션 의존성 | Requirements.txt, Yarn, Gradle, Npm 등 |
웹 API Fuzz 테스트 | 웹 API에 무작위/잘못된 데이터 전송 | OpenAPI, GraphQL, HAR, Postman Collection |
커버리지 기반 Fuzz 테스트 | 함수에 무작위/잘못된 데이터 전송 | C/C++, Go, Swift, Python, Rust, Java, JavaScript, AFL |
보안·컴플라이언스 정책
GitLab Ultimate에서는 정책으로 보안·컴플라이언스 팀이 조직 전체에 보안 관련 통제를 시행하도록 할 수 있습니다. 이로써 개발팀 파이프 라인에서 적절한 구성으로 보안 스캐너를 강제 적용할 수 있고요. 모든 스캔 작업이 변경 없이 실행되도록 할 수 있죠. 또 모든 MR에 여러 승인자를 중앙에서 강제할 수 있고요. 조직의 요구 사항 범위 안에서 프로젝트의 다양한 설정(예: MR, 리포지터리 설정 활성화 또는 잠금)이 활성화되도록 할 수 있습니다.

맞춤형 역할, 세부 권한 설정
GitLab Ultimate는 Custom Roles로 조직 필요에 맞는 권한, 권한이 있는 사용자 역할을 생성하도록 지원합니다. 예를 들면, 시스템의 보안 취약점을 보는 권한은 있지만 소스 코드를 볼 수 없고, 리포지터리 안에서 아무 변경도 할 수 없는 "보안 감사자(Security Auditor)" 역할을 생성할 수 있죠. 이렇게 권한을 세부적으로 설정하면 업무를 명확하게 분리할 수 있습니다.

컴플라이언스 센터
GitLab Ultimate에서는 컴플라이언스 센터로 그룹의 컴플라이언스 표준 준수 보고, 위반 보고, 컴플라이언스 프레임워크를 관리할 수 있습니다. 아울러 대시보드로 ‘조직 내 컴플라이언스 최적화를 위해 업무 분리가 잘 지켜지는지’ 확인할 수도 있죠. 컴플라이언스 센터에서는 구체적으로 다음 내용을 볼 수 있습니다.
- 컴플라이언스 표준 준수 대시보드: GitLab에서 설정한 표준을 지키는 프로젝트의 준수 상태
- 컴플라이언스 위반 보고서: 그룹 내 모든 프로젝트의 MR 활동
- 컴플라이언스 프레임워크 보고서: 그룹 내 모든 컴플라이언스 프레임워크
- 컴플라이언스 프로젝트 보고서: 그룹 내 프로젝트에 적용된 컴플라이언스 프레임워크
GitLab 컴플라이언스 센터 화면. 출처=GitLab
GitHub 고급 보안 기능 GitLab서 이용하는 방법
이렇듯 GitLab Ultimate는 강력하고 다양한 보안 기능을 제공합니다. 아울러 GitHub Advanced Security의 코드 스캐닝, SAST, 시크릿 스캐닝과 같은 고급 보안 기능도 마찬가지로 지원하죠. GitLab Ultimate 30일 무료 체험을 이용하면 이를 손쉽게 경험할 수 있습니다. 지금부터 GitHub Advanced Security의 고급 보안 기능을 GitLab Ultimate에서 이용하는 방법을 자세히 소개하겠습니다.
코드 스캐닝
GitHub Advanced Security는 코드 스캐닝 기능으로 정적 소스 코드의 컨텍스트 기반 취약점 정보, 코드 품질 향상을 위한 조언을 제공합니다. 구체적으로 SAST 도구인 CodeQL이나 서드파티 도구를 사용해 코드에서 잠재 보안 취약점과 코딩 오류를 검색하고요. CodeQL CLI로 소프트웨어 프로젝트에서 로컬로 CodeQL 프로세스를 실행하거나 GitHub에 업로드할 코드 스캔 결과를 생성할 수 있죠.
GitLab에서도 SAST를 활성화해 코드 스캐닝 기능을 수행할 수 있는데요. GitLab에서 이 기능을 활성화하려면, SAST 템플릿을 .gitlab-ci.yml
파일에 아래와 같이 추가하면 됩니다.
include:
- template: Jobs/SAST.gitlab-ci.yml
템플릿을 추가하면, 새로운 코드가 체크인될 때마다 SAST가 프로젝트에서 사용된 프로그래밍 언어를 자동 탐지합니다. 그다음, 소스 코드를 스캔해 알려진 취약점을 검색하죠.
SAST 결과는 feature 브랜치와 target 브랜치 간 차이를 아래 이미지와 같이 MR 위젯에 표시합니다. MR 위젯은 MR에서 수정한 코드 변경 사항 때문에 새롭게 발견된 SAST 결과와 해결책을 보여주죠.

아래 이미지를 보면 SAST로 발견한 취약점 내용을 자세히 확인할 수 있는데요. 상태, 심각도, 발견된 파일 내 위치 등 정보를 알 수 있습니다. 이러한 정보는 문제를 해결하는 데 도움이 되죠.
한편, 취약점에는 다음 조치를 취할 수 있는데요.
- 취약점 무시(Dismiss vulnerability 버튼 클릭): 개발자가 취약점을 코멘트와 함께 무시할 수 있습니다. 이는 보안 팀이 검토할 때 도움이 됩니다.
- 이슈 생성(Create issue 버튼 클릭): 보안 문제를 해결해야 하는 취약점을 추적하기 위해 이슈를 생성할 수 있습니다.
GitLab에서 SAST로 발견한 취약점 상세 내용. 출처=GitLab
SAST 설정
GitHub Advanced Security는 SAST 도구 CodeQL을 지원합니다. 사용자는 GitHub 연구자와 커뮤니티 기여자가 작성한 표준 CodeQL 쿼리를 실행할 수 있고요. 또는 이를 직접 작성해 맞춤형 분석을 수행할 수 있죠. GitLab에서는 한발 더 나아가 SAST 스캐너와 SAST 규칙 세트를 세밀하게 맞춤 설정할 수 있습니다.
SAST 스캐너 맞춤 설정
GitLab에서는 SAST 작업 정의를 재정의해 변수, 의존성 또는 규칙과 같은 속성을 변경할 수 있습니다. 이는 SAST 작업과 동일한 이름으로 작업을 선언해 재정의할 수 있고요. 그다음, 새로운 작업을 템플릿에 포함해 나중에 사용하도록 저장했다가 불러와 쓸 수 있죠.
예를 들어, 아래와 같이 SAST 스캐너를 맞춤 설정할 수 있는데요. 이는
- semgrep-sast 스캐너가 사용하는 버전을 재정의합니다.
- gosec-sast를 실행하기 전에 비공개 프로젝트에서 모듈을 가져오는 스크립트를 실행합니다.
- 모든 스캐너가 최대 깊이 10까지 호출 관계를 검색하도록 구성합니다.
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SEARCH_MAX_DEPTH: 10
semgrep-sast:
variables:
SAST_ANALYZER_IMAGE_TAG: "3.7"
gosec-sast:
before_script:
- |
cat <<EOF > ~/.netrc
machine gitlab.com
login $CI_DEPLOY_USER
password $CI_DEPLOY_PASSWORD
EOF
SAST 규칙 세트 맞춤 설정
GitLab에서는 소스 코드를 수정한 다음, 이 소스 코드의 보안 취약점을 찾기 위해 코딩 규칙 위반 여부를 점검합니다. 이러한 코딩 규칙은 SAST 스캐너가 보고하는 보안 취약점 유형을 결정하죠. SAST 스캐너의 동작은 스캔 중인 리포지터리에 코딩 규칙 세트 구성 파일을 정의해 다음과 같이 맞춤 설정할 수 있습니다.
- 사전 정의된 규칙 비활성화(모든 분석기에 사용 가능)
- 사전 정의된 규칙 재정의(모든 분석기에 사용 가능)
- 맞춤 구성을 사용해 사전 정의된 규칙 대체(패스스루 방식 사용)
인포그랩은 국내 금융 기업의 사내 보안 점검 코딩 규칙에 따라 GitLab의 코딩 규칙을 맞춤형으로 재구성, 설정해 드립니다. 이로써 GitLab의 다양한 보안 기능이 해당 기업에 잘 실행되도록 적극 지원합니다.
시크릿 스캐닝
GitHub Advanced Security는 시크릿 스캐닝 기능으로 비공개 리포지터리에 체크인된 키, 토큰과 같은 시크릿을 탐지하도록 서비스합니다. 푸시 보호가 활성화되면, GitHub은 리포지터리로 푸시될 때 시크릿을 탐지하죠. 유출된 보안키나 접근 토큰을 찾으면 차단하고 폐기할 수도 있습니다. GitLab에서도 시크릿 스캐닝 기능을 사용해 동일한 작업을 수행할 수 있습니다.
시크릿 탐지
GitLab에서 시크릿을 탐지하려면 Secret Detection을 활성화해야 합니다. 이를 위해 다음 템플릿을 .gitlab-ci.yml
파일에 추가합니다.
include:
- template: Security/Secret-Detection.gitlab-ci.yml
템플릿이 추가되면, 새로운 코드가 체크인되거나 파이프라인이 실행될 때마다 시크릿 스캐너가 소스 코드를 스캔, 알려진 시크릿을 검색합니다. 파이프라인 Secret Detection은 상황에 따라 코드의 다양한 측면을 스캔하죠. 기본 브랜치를 제외한 모든 방법에서는 전체 소스가 아닌 커밋을 스캔합니다.
MR을 생성할 때, Secret Detection은 소스 브랜치에서 수행된 모든 커밋을 스캔합니다. SAST와 마찬가지로, 취약점을 탐지하면 아래 이미지와 같이 상태, 심각도 등 상세 정보를 제공하고요. 또 이와 관련해 MR에서 취약점 무시나 이슈 생성 조치를 취하도록 지원하죠.