애플리케이션 보안 문제 해결
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
애플리케이션 보안 기능을 사용할 때 다음과 같은 문제가 발생할 수 있습니다. GitLab 분석기가 출력하는 로그의 상세 수준은 SECURE_LOG_LEVEL 환경 변수로 결정됩니다. 심각도가 높은 순서부터 로깅 수준은 다음과 같습니다.
애플리케이션 보안 기능을 사용할 때 다음과 같은 문제가 발생할 수 있습니다.
로깅 수준#
GitLab 분석기가 출력하는 로그의 상세 수준은 SECURE_LOG_LEVEL 환경 변수로
결정됩니다. 이 로깅 수준 이상의 메시지가 출력됩니다.
심각도가 높은 순서부터 로깅 수준은 다음과 같습니다.
fatalerrorwarninfo(기본값)debug
디버그 수준 로깅 켜기#
디버그 로깅은 심각한 보안 위험이 될 수 있습니다. 출력에 job 이 사용할 수 있는 환경 변수의 내용과 기타 시크릿이 포함될 수 있습니다. 이 출력은 GitLab 서버에 업로드되며 job 로그에서 볼 수 있습니다.
사전 요구 사항:
- 프로젝트에 대한 Maintainer 또는 Owner 권한.
디버그 수준 로깅을 켜려면 .gitlab-ci.yml 파일에 다음을 추가합니다.
variables:
SECURE_LOG_LEVEL: "debug"
이렇게 하면 모든 GitLab 분석기가 모든 메시지를 출력합니다. 자세한 내용은 로깅 수준을 참고합니다.
종료 코드 1로 실패하는 Secure job#
Secure job 이 실패하는데 원인이 분명하지 않다면 다음 단계를 따릅니다.
- 디버그 수준 로깅을 활성화합니다.
- job을 실행합니다.
- job 출력을 확인합니다.
debug로그 수준을 제거해 기본값인info로 되돌립니다.
오래된 보안 보고서#
머지 리퀘스트에 대해 생성된 보안 보고서가 오래되면, 머지 리퀘스트의 보안 스캔 보고서에 경고 메시지가 표시되고 적절한 조치를 취하도록 안내합니다.
이 상황은 두 가지 경우에 발생합니다.
소스 브랜치가 대상 브랜치보다 뒤처진 경우#
대상 브랜치와 소스 브랜치의 가장 최근 공통 조상 커밋이 대상 브랜치의 최신 커밋이 아닐 때 보안 보고서가 오래될 수 있습니다.
이 문제를 해결하려면 리베이스하거나 병합해 대상 브랜치의 변경 사항을 반영합니다.
대상 브랜치 보안 보고서가 오래된 경우#
job 실패나 새로운 보안 권고 등 여러 원인으로 발생할 수 있습니다. 머지 리퀘스트에서 보안 보고서가 오래되었다고 표시되면 대상 브랜치에서 새 파이프라인을 실행해야 합니다. new pipeline을 선택해 새 파이프라인을 실행합니다.
… report.json: no matching files 경고 메시지 발생#
디버그 로깅은 심각한 보안 위험이 될 수 있습니다. 출력에 job 이 사용할 수 있는 환경 변수의 내용과 기타 시크릿이 포함될 수 있습니다. 이 출력은 GitLab 서버에 업로드되며 job 로그에서 볼 수 있습니다.
이 메시지 뒤에는 No files to upload 오류가 이어지는 경우가 많고,
그 앞에는 JSON 보고서가 생성되지 않은 이유를 알려 주는 다른 오류나 경고가 나타납니다.
job 로그 전체에서 이러한 메시지를 확인합니다. 해당 메시지를 찾지 못했다면
프로젝트 CI/CD 변수로 SECURE_LOG_LEVEL: "debug"를 설정한 뒤 실패한 job을 다시 실행합니다.
그러면 추가 정보를 확인해 더 자세히 조사할 수 있습니다.
sast job: config key may not be used with 'rules': only/except 오류 메시지 발생#
SAST.gitlab-ci.yml 같은
.gitlab-ci.yml 템플릿을 포함할 때,
GitLab CI/CD 구성에 따라 다음 오류가 발생할 수 있습니다.
Unable to run pipeline
jobs:sast config key may not be used with `rules`: only/except
이 오류는 포함된 job의 rules 구성이 더 이상 사용되지 않는 only 또는 except 구문으로
재정의되었을 때 나타납니다.
이 문제를 해결하려면 다음 중 하나를 수행합니다.
only/except구문을rules로 전환합니다.- (임시로) 템플릿을 더 이상 사용되지 않는 버전으로 고정합니다.
자세한 내용은 SAST job 재정의를 참고합니다.
only/except 구문을 rules로 전환#
job 실행을 제어하기 위해 템플릿을 재정의할 때, 기존의
only 또는 except는 더 이상 호환되지 않으므로
rules 구문으로 전환해야 합니다.
job 이 main 에서만 실행되도록 제한하려는 재정의라면, 기존 구문은
다음과 비슷합니다.
include:
- template: Jobs/SAST.gitlab-ci.yml
# Ensure that the scanning is only executed on main or merge requests
spotbugs-sast:
only:
refs:
- main
- merge_requests
기존 구성을 새 rules 구문으로 전환하면 재정의는
다음과 같이 작성합니다.
include:
- template: Jobs/SAST.gitlab-ci.yml
# Ensure that the scanning is only executed on main or merge requests
spotbugs-sast:
rules:
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_MERGE_REQUEST_ID
job 이 태그가 아닌 브랜치에서만 실행되도록 제한하려는 재정의라면, 다음과 비슷합니다.
include:
- template: Jobs/SAST.gitlab-ci.yml
# Ensure that the scanning is not executed on tags
spotbugs-sast:
except:
- tags
새 rules 구문으로 전환하면 재정의는 다음과 같이 다시 작성합니다.
include:
- template: Jobs/SAST.gitlab-ci.yml
# Ensure that the scanning is not executed on tags
spotbugs-sast:
rules:
- if: $CI_COMMIT_TAG == null
자세한 내용은 rules를 참고합니다.
더 이상 사용되지 않는 버전으로 템플릿 고정#
최신 지원을 받으려면 rules로 마이그레이션합니다.
CI/CD 구성을 즉시 업데이트할 수 없다면, 이전 템플릿 버전으로 고정하는 여러 우회 방법이 있습니다. 예를 들면 다음과 같습니다.
include:
remote: 'https://gitlab.com/gitlab-org/gitlab/-/raw/12-10-stable-ee/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml'
또한 버전별 레거시 템플릿이 담긴 전용 프로젝트도 제공됩니다. 오프라인 환경이나 Auto DevOps를 사용하려는 경우에 활용할 수 있습니다.
자세한 안내는 레거시 템플릿 프로젝트에서 확인할 수 있습니다.
취약점이 발견되었는데도 job 이 성공하는 경우 파이프라인을 실패시키는 방법#
이 상황에서 job 이 성공하는 것은 기본 동작입니다. job의 상태는 분석기 자체의 성공 또는 실패를 나타냅니다. 분석기 결과는 job 로그, 머지 리퀘스트 보고서, 보안 대시보드에 표시됩니다.
오류: job is used for configuration only, and its script should not be executed#
Security/Dependency-Scanning.gitlab-ci.yml과 Security/SAST.gitlab-ci.yml
템플릿을 사용하는 경우, rules 속성을 설정해 sast 나 dependency_scanning job을 활성화하면
(job) is used for configuration only, and its script should not be executed 오류와 함께 실패합니다.
sast 또는 dependency_scanning 스탠자는 variables 나 stage 변경처럼 SAST 전체 또는 의존성 스캐닝 전체에
변경을 적용할 때 사용할 수 있지만, 공유 rules를 정의하는 데는 사용할 수 없습니다.
확장성 개선을 위한 이슈가 열려 있습니다. 우선순위 결정에 도움이 되도록 이슈에 추천할 수 있으며, 기여도 환영합니다.
빈 취약점 보고서, 의존성 목록 페이지#
파이프라인에 allow_failure: false 옵션이 설정된 job 이 포함된 수동 단계가 있고 해당 job 이 완료되지 않았다면,
GitLab은 보안 보고서 데이터로 해당 페이지를 채울 수 없습니다.
이 경우 취약점 보고서와 의존성 목록
페이지가 비어 있습니다.
파이프라인의 수동 단계에서 job을 실행하면 이 보안 페이지를 채울 수 있습니다.
이 시나리오를 처리하기 위한 이슈가 열려 있습니다. 우선순위 결정에 도움이 되도록 이슈에 추천할 수 있으며, 기여도 환영합니다.