어플리케이션 보안 문제 해결

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

어플리케이션 보안 기능을 다룰 때 다음과 같은 문제가 발생할 수 있습니다.

로깅 레벨

GitLab 분석기에 의해 생성된 로그의 자세함은 SECURE_LOG_LEVEL 환경 변수에 의해 결정됩니다. 이 로깅 수준 이상의 메시지가 출력됩니다.

가장 높은 심각도부터 가장 낮은 심각도까지 로깅 수준은 다음과 같습니다:

  • fatal
  • error
  • warn
  • info (기본값)
  • debug

디버그 수준 로깅

경고: 디버그 로깅은 심각한 보안 리스크가 될 수 있습니다. 출력물에는 작업에서 사용 가능한 환경 변수 및 기타 보안 정보가 포함될 수 있습니다. 출력물은 GitLab 서버에 업로드되어 작업 로그에 표시됩니다.

디버그 수준 로깅을 활성화하려면 다음을 .gitlab-ci.yml 파일에 추가하세요:

variables:
  SECURE_LOG_LEVEL: "debug"

이를 통해 GitLab 분석기에게 모든 메시지를 출력하도록 지시합니다. 더 많은 세부 정보는 로그 레벨을 참조하세요.

종료 코드 1로 실패하는 보안 작업

보안 작업이 실패하고 그 이유가 분명하지 않은 경우:

  1. 디버그 수준 로깅을 활성화하세요.
  2. 작업을 실행하세요.
  3. 작업의 출력물을 확인하세요.
  4. 기본값인 info 값으로 돌아가려면 debug 로깅 수준을 제거하세요.

오래 된 보안 보고서

병합 요청에 대한 생성된 보안 보고서가 오래되면, 병합 요청은 보안 위젯에 경고 메시지가 표시되고 적절한 조치를 취하도록 요구합니다.

이는 두 가지 시나리오에서 발생할 수 있습니다:

소스 브랜치가 대상 브랜치보다 뒤쳐진 경우

대상 브랜치와 소스 브랜치 사이의 가장 최근의 공통 조상 커밋이 대상 브랜치의 가장 최근 커밋이 아닐 때 보안 보고서가 오래될 수 있습니다.

이 문제를 해결하려면 변경 사항을 통합하기 위해 리베이스하거나 병합하세요.

대상 브랜치 변경 사항 통합

대상 브랜치 보안 보고서가 오래됨

여러 이유로 이 문제가 발생할 수 있으며, 실패한 작업이나 새로운 경고 등이 있을 수 있습니다. 병합 요청에서 보안 보고서가 오래된 상황이면 대상 브랜치에서 새 파이프라인을 실행해야 합니다. 새 파이프라인을 실행하려면 새 파이프라인을 선택하세요.

새 파이프라인 실행

‘… report.json: no matching files’ 경고 메시지 받기

경고: 디버그 로깅은 심각한 보안 리스크가 될 수 있습니다. 출력물에는 작업에서 사용 가능한 환경 변수 및 기타 보안 정보가 포함될 수 있습니다. 출력물은 GitLab 서버에 업로드되어 작업 로그에 표시됩니다.

이 메시지는 종종 error No files to upload와 함께 나타나며, JSON 보고서가 생성되지 않았던 이유를 나타내는 다른 오류 또는 경고 메시지에 앞서 나타납니다. 그러한 메시지들을 확인하려면 전체 작업 로그를 확인하세요. 이러한 메시지를 찾지 못하면 커스텀 CI/CD 변수SECURE_LOG_LEVEL: "debug"를 설정한 후 실패한 작업을 다시 시도하세요. 이렇게 하면 더 많은 정보를 제공하여 추가 조사를 할 수 있습니다.

‘sast job: config key may not be used with ‘rules’: only/except’ 에러 메시지 받기

.gitlab-ci.yml 템플릿을 포함하는 경우 SAST.gitlab-ci.yml와 같은 에러가 발생할 수 있습니다. 이는 GitLab CI/CD 구성에 따라 발생합니다:

Pipeline을 생성할 수 없음

    jobs:sast config key may not be used with `rules`: only/except

이 에러는 포함된 작업의 rules 구성이 deprecated only 또는 except 구문으로 재정의되었을 때 발생합니다. 이 문제를 해결하려면:

더 많은 정보는 Overriding SAST jobs를 참조하세요.

only/except 구문을 rules로 전환

작업 실행을 제어하기 위해 템플릿을 재정의할 때, 이전의 only 또는 except 예약어는 더 이상 호환되지 않으며 새로운 rules 구문으로 전환해야 합니다.

작업을 main에서만 실행되도록 제한하려면 이전 구문은 다음과 같을 것입니다:

include:
  - template: Jobs/SAST.gitlab-ci.yml

# 스캐닝이 오직 `main`이나 병합 요청에서만 실행되도록 보장
spotbugs-sast:
  only:
    refs:
      - main
      - merge_requests

위의 구성을 새 rules 구문으로 전환하면 다음과 같이 작성할 수 있습니다:

include:
  - template: Jobs/SAST.gitlab-ci.yml

# 스캐닝이 오직 `main`이나 병합 요청에서만 실행되도록 보장
spotbugs-sast:
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
    - if: $CI_MERGE_REQUEST_ID

작업을 분기에서만 실행되도록 제한하려면 이전 구문은 다음과 같을 것입니다:

include:
  - template: Jobs/SAST.gitlab-ci.yml

# 스캐닝이 태그에서 실행되지 않도록 보장
spotbugs-sast:
  except:
    - tags

rules 구문으로 전환하려면 예약어는 다음과 같이 변경됩니다:

include:
  - template: Jobs/SAST.gitlab-ci.yml

# 스캐닝이 태그에서 실행되지 않도록 보장
spotbugs-sast:
  rules:
    - if: $CI_COMMIT_TAG == null

더 많은 정보는 rules를 참조하세요.

템플릿을 폐기된 버전에 고정시키기

최신 지원을 보장하기 위해, 우리는 rules로 이관하는 것을 강력히 권장합니다.

만약 즉시 CI 구성을 업데이트할 수 없다면, 이전 템플릿 버전에 고정시키는 여러 해결책이 있습니다. 예를 들면:

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은 구성에만 사용되며 해당 스크립트는 실행되지 않아야합니다

GitLab 13.4의 변경 사항에서 Security/Dependency-Scanning.gitlab-ci.ymlSecurity/SAST.gitlab-ci.yml 템플릿에 대한 변경 사항은 rules 속성을 설정하여 sast 또는 dependency_scanning 작업을 활성화하는 경우, (job)은 구성에만 사용되며 해당 스크립트는 실행되지 않아야합니다 오류와 함께 실패한다는 것을 의미합니다.

sast 또는 dependency_scanning 부분은 variables 또는 stage을 변경하는 등 모든 SAST 또는 Dependency Scanning에 대한 변경 사항을 만들기 위해 사용될 수 있지만, 공유된 rules을 정의하는 데 사용할 수는 없습니다.

이러한 시나리오를 개선하기 위해 개선 문제가 열려 있습니다. 우선 순위를 위해 문제에 투표하고, 기여를 환영합니다.

빈 취약점 보고서, 종속성 목록 페이지

파이프라인에 allow_failure: false 옵션을 가진 수동 단계가 있고, 이 작업이 완료되지 않은 경우, GitLab은 보안 보고서의 데이터를 사용하여 나열된 페이지를 채울 수 없습니다. 이 경우, 취약점 보고서종속성 목록 페이지가 비어 있습니다. 이러한 시나리오를 처리하기 위해 해당 문제가 열려 있습니다. 문제에 투표하여 우선 순위를 돕고, 기여를 환영합니다.