InfoGrab DocsInfoGrab Docs

분석기 활성화

요약

다음 중 하나를 사용하여 스캔할 API를 지정할 수 있습니다: OpenAPI Specification(이전 명칭: Swagger Specification)은 REST API를 위한 API 설명 형식입니다. API 보안 테스팅은 OpenAPI 문서를 사용하여 요청 본문을 생성합니다.

다음 중 하나를 사용하여 스캔할 API를 지정할 수 있습니다:

OpenAPI Specification#

OpenAPI Specification(이전 명칭: Swagger Specification)은 REST API를 위한 API 설명 형식입니다. 이 섹션에서는 OpenAPI Specification을 사용하여 테스트 대상 API에 대한 정보를 제공하고 API 보안 테스팅 스캔을 구성하는 방법을 설명합니다. OpenAPI Specification은 파일 시스템 리소스 또는 URL로 제공됩니다. JSON과 YAML OpenAPI 형식을 모두 지원합니다.

API 보안 테스팅은 OpenAPI 문서를 사용하여 요청 본문을 생성합니다. 요청 본문이 필요한 경우, 본문 생성은 다음 본문 유형으로 제한됩니다:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • application/json
  • application/xml

OpenAPI와 미디어 타입#

미디어 타입(이전 명칭: MIME 타입)은 전송되는 파일 형식과 형식 콘텐츠에 대한 식별자입니다. OpenAPI 문서를 사용하면 특정 작업이 서로 다른 미디어 타입을 허용하도록 지정할 수 있으며, 따라서 하나의 요청이 서로 다른 파일 콘텐츠로 데이터를 전송할 수 있습니다. 예를 들어 사용자 데이터를 업데이트하는 PUT /user 작업은 XML(미디어 타입 application/xml) 또는 JSON(미디어 타입 application/json) 형식으로 데이터를 허용할 수 있습니다. OpenAPI 2.x에서는 허용되는 미디어 타입을 전역 또는 작업 단위로 지정할 수 있으며, OpenAPI 3.x에서는 작업 단위로만 지정할 수 있습니다. API 보안 테스팅은 나열된 미디어 타입을 확인하고, 지원되는 각 미디어 타입에 대한 샘플 데이터를 생성하려고 시도합니다.

  • 기본 동작은 사용할 지원 미디어 타입 중 하나를 선택하는 것입니다. 목록에서 첫 번째로 지원되는 미디어 타입이 선택됩니다. 이 동작은 구성할 수 있습니다.

동일한 작업(예: POST /user)을 서로 다른 미디어 타입(예: application/json과 application/xml)으로 테스트하는 것이 항상 바람직하지는 않습니다. 예를 들어 대상 애플리케이션이 요청 콘텐츠 유형과 관계없이 동일한 코드를 실행하는 경우, 테스트 세션을 완료하는 데 시간이 더 오래 걸리고, 대상 앱에 따라 요청 본문과 관련된 취약점이 중복으로 보고될 수 있습니다.

환경 변수 APISEC_OPENAPI_ALL_MEDIA_TYPES를 사용하면 특정 작업에 대한 요청을 생성할 때 하나 대신 지원되는 모든 미디어 타입을 사용할지 지정할 수 있습니다. 환경 변수 APISEC_OPENAPI_ALL_MEDIA_TYPES가 어떤 값으로든 설정되면, API 보안 테스팅은 특정 작업에서 하나 대신 지원되는 모든 미디어 타입에 대한 요청을 생성하려고 시도합니다. 제공된 각 미디어 타입에 대해 테스트가 반복되므로 테스트 시간이 더 오래 걸립니다.

또는 변수 APISEC_OPENAPI_MEDIA_TYPES를 사용하여 각각 테스트할 미디어 타입 목록을 제공할 수 있습니다. 미디어 타입을 둘 이상 제공하면 선택한 각 미디어 타입에 대해 테스트가 수행되므로 테스트 시간이 더 오래 걸립니다. 환경 변수 APISEC_OPENAPI_MEDIA_TYPES가 미디어 타입 목록으로 설정되면, 요청을 생성할 때 나열된 미디어 타입만 포함됩니다.

APISEC_OPENAPI_MEDIA_TYPES에서 여러 미디어 타입은 콜론(:)으로 구분합니다. 예를 들어 요청 생성을 미디어 타입 application/x-www-form-urlencoded와 multipart/form-data로 제한하려면, 환경 변수 APISEC_OPENAPI_MEDIA_TYPES를 application/x-www-form-urlencoded:multipart/form-data로 설정합니다. 이 목록에서 지원되는 미디어 타입만 요청 생성에 포함되며, 지원되지 않는 미디어 타입은 항상 건너뜁니다. 미디어 타입 텍스트는 여러 부분으로 구성될 수 있습니다. 예를 들어 application/vnd.api+json; charset=UTF-8은 type "/" [tree "."] subtype ["+" suffix]* [";" parameter]의 조합입니다. 요청 생성 시 미디어 타입을 필터링할 때 파라미터는 고려하지 않습니다.

환경 변수 APISEC_OPENAPI_ALL_MEDIA_TYPES와 APISEC_OPENAPI_MEDIA_TYPES를 사용하면 미디어 타입 처리 방식을 결정할 수 있습니다. 이 두 설정은 상호 배타적입니다. 둘 다 활성화하면 API 보안 테스팅이 오류를 보고합니다.

OpenAPI Specification으로 API 보안 테스팅 구성#

OpenAPI Specification으로 API 보안 테스팅 스캔을 구성하려면 다음과 같이 합니다:

  1. .gitlab-ci.yml 파일에 API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. 구성 파일에는 서로 다른 Check가 활성화된 여러 테스트 프로파일이 정의되어 있습니다. Quick 프로파일부터 시작합니다. 이 프로파일로 테스트하면 더 빠르게 완료되어 구성을 검증하기 쉬워집니다. .gitlab-ci.yml 파일에 APISEC_PROFILE CI/CD 변수를 추가하여 프로파일을 지정합니다.

  3. OpenAPI Specification의 위치를 파일 또는 URL로 제공합니다. APISEC_OPENAPI 변수를 추가하여 위치를 지정합니다.

  4. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. GitLab CI/CD 파이프라인 중에 동적으로 생성된 앱을 대상으로 API 보안 테스팅을 실행하려면, 앱이 자신의 URL을 environment_url.txt 파일에 저장하도록 합니다. API 보안 테스팅은 그 파일을 자동으로 파싱하여 스캔 대상을 찾습니다. 이 예시는 GitLab Auto DevOps CI YAML에서 확인할 수 있습니다.

OpenAPI Specification을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_OPENAPI: test-api-specification.json
  APISEC_TARGET_URL: http://test-deployment/

이는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

HTTP Archive(HAR)#

HTTP Archive 형식(HAR)은 HTTP 트랜잭션을 기록하기 위한 아카이브 파일 형식입니다. GitLab API 보안 테스팅 스캐너와 함께 사용할 경우, HAR 파일에는 테스트할 웹 API를 호출한 기록이 포함되어야 합니다. API 보안 테스팅 스캐너는 모든 요청을 추출하여 테스트를 수행하는 데 사용합니다.

HAR 파일을 생성하는 데는 다양한 도구를 사용할 수 있습니다:

Warning

HAR 파일에는 인증 토큰, API 키, 세션 쿠키 같은 민감한 정보가 포함될 수 있습니다. 리포지터리에 추가하기 전에 HAR 파일의 내용을 검토합니다.

HAR 파일로 API 보안 테스팅 스캔#

테스트 대상 API에 대한 정보를 제공하는 HAR 파일을 사용하도록 API 보안 테스팅을 구성하려면 다음과 같이 합니다:

  1. .gitlab-ci.yml 파일에 API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. 구성 파일에는 서로 다른 Check가 활성화된 여러 테스트 프로파일이 정의되어 있습니다. Quick 프로파일부터 시작합니다. 이 프로파일로 테스트하면 더 빠르게 완료되어 구성을 검증하기 쉬워집니다.

    .gitlab-ci.yml 파일에 APISEC_PROFILE CI/CD 변수를 추가하여 프로파일을 지정합니다.

  3. HAR 파일의 위치를 제공합니다. 위치는 파일 경로 또는 URL로 제공할 수 있습니다. APISEC_HAR 변수를 추가하여 위치를 지정합니다.

  4. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. GitLab CI/CD 파이프라인 중에 동적으로 생성된 앱을 대상으로 API 보안 테스팅을 실행하려면, 앱이 자신의 URL을 environment_url.txt 파일에 저장하도록 합니다. API 보안 테스팅은 그 파일을 자동으로 파싱하여 스캔 대상을 찾습니다. 이 예시는 GitLab Auto DevOps CI YAML에서 확인할 수 있습니다.

HAR 파일을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_HAR: test-api-recording.har
  APISEC_TARGET_URL: http://test-deployment/

이 예시는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

GraphQL Schema#

GraphQL은 API를 위한 쿼리 언어이며 REST API의 대안입니다. API 보안 테스팅은 여러 방법으로 GraphQL 엔드포인트 테스트를 지원합니다:

  • GraphQL Schema를 사용하여 테스트합니다.
  • GraphQL 쿼리 기록(HAR)을 사용하여 테스트합니다.
  • GraphQL 쿼리가 포함된 Postman Collection을 사용하여 테스트합니다.

이 섹션에서는 GraphQL 스키마를 사용하여 테스트하는 방법을 설명합니다. API 보안 테스팅의 GraphQL 스키마 지원 기능은 인트로스펙션(introspection)을 지원하는 엔드포인트에서 스키마를 쿼리할 수 있습니다. 인트로스펙션은 GraphiQL 같은 도구가 동작하도록 기본적으로 활성화되어 있습니다. 인트로스펙션을 활성화하는 방법은 사용 중인 GraphQL 프레임워크의 문서를 참고합니다.

GraphQL 엔드포인트 URL로 API 보안 테스팅 스캔#

API 보안 테스팅의 GraphQL 지원 기능은 GraphQL 엔드포인트에 스키마를 쿼리할 수 있습니다.

Note

이 방법이 올바르게 동작하려면 GraphQL 엔드포인트가 인트로스펙션 쿼리를 지원해야 합니다.

테스트 대상 API에 대한 정보를 제공하는 GraphQL 엔드포인트 URL을 사용하도록 API 보안 테스팅을 구성하려면 다음과 같이 합니다:

  1. .gitlab-ci.yml 파일에 API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. GraphQL 엔드포인트의 경로(예: /api/graphql)를 제공합니다. APISEC_GRAPHQL 변수를 추가하여 위치를 지정합니다.

  3. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. 자세한 내용은 동적 환경 솔루션을 참고합니다.

GraphQL 엔드포인트 경로를 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

api_security:
  variables:
    APISEC_GRAPHQL: /api/graphql
    APISEC_TARGET_URL: http://test-deployment/

이 예시는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

GraphQL Schema 파일로 API 보안 테스팅 스캔#

API 보안 테스팅은 GraphQL 스키마 파일을 사용하여 인트로스펙션이 비활성화된 GraphQL 엔드포인트를 파악하고 테스트할 수 있습니다. GraphQL 스키마 파일을 사용하려면 인트로스펙션 JSON 형식이어야 합니다. GraphQL 스키마는 온라인 서드파티 도구 https://transform.tools/graphql-to-introspection-json을 사용하여 인트로스펙션 JSON 형식으로 변환할 수 있습니다.

테스트 대상 API에 대한 정보를 제공하는 GraphQL 스키마 파일을 사용하도록 API 보안 테스팅을 구성하려면 다음과 같이 합니다:

  1. .gitlab-ci.yml 파일에 API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. GraphQL 엔드포인트 경로(예: /api/graphql)를 제공합니다. APISEC_GRAPHQL 변수를 추가하여 경로를 지정합니다.

  3. GraphQL 스키마 파일의 위치를 제공합니다. 위치는 파일 경로 또는 URL로 제공할 수 있습니다. APISEC_GRAPHQL_SCHEMA 변수를 추가하여 위치를 지정합니다.

  4. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. 자세한 내용은 동적 환경 솔루션을 참고합니다.

GraphQL 스키마 파일을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

api_security:
  variables:
    APISEC_GRAPHQL: /api/graphql
    APISEC_GRAPHQL_SCHEMA: test-api-graphql.schema
    APISEC_TARGET_URL: http://test-deployment/

GraphQL 스키마 파일 URL을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

api_security:
  variables:
    APISEC_GRAPHQL: /api/graphql
    APISEC_GRAPHQL_SCHEMA: http://file-store/files/test-api-graphql.schema
    APISEC_TARGET_URL: http://test-deployment/

이 예시는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

Postman Collection#

Postman API Client는 개발자와 테스터가 다양한 유형의 API를 호출하는 데 널리 사용하는 도구입니다. API 정의는 API 보안 테스팅과 함께 사용하기 위해 Postman Collection 파일로 내보낼 수 있습니다. 내보낼 때는 지원되는 Postman Collection 버전인 v2.0 또는 v2.1을 선택합니다.

GitLab API 보안 테스팅 스캐너와 함께 사용할 경우, Postman Collection에는 유효한 데이터로 테스트할 웹 API의 정의가 포함되어야 합니다. API 보안 테스팅 스캐너는 모든 API 정의를 추출하여 테스트를 수행하는 데 사용합니다.

Warning

Postman Collection 파일에는 인증 토큰, API 키, 세션 쿠키 같은 민감한 정보가 포함될 수 있습니다. 리포지터리에 추가하기 전에 Postman Collection 파일의 내용을 검토합니다.

Postman Collection 파일로 API 보안 테스팅 스캔#

테스트 대상 API에 대한 정보를 제공하는 Postman Collection 파일을 사용하도록 API 보안 테스팅을 구성하려면 다음과 같이 합니다:

  1. API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. 구성 파일에는 서로 다른 Check가 활성화된 여러 테스트 프로파일이 정의되어 있습니다. Quick 프로파일부터 시작합니다. 이 프로파일로 테스트하면 더 빠르게 완료되어 구성을 검증하기 쉬워집니다.

    .gitlab-ci.yml 파일에 APISEC_PROFILE CI/CD 변수를 추가하여 프로파일을 지정합니다.

  3. Postman Collection 파일의 위치를 파일 또는 URL로 제공합니다. APISEC_POSTMAN_COLLECTION 변수를 추가하여 위치를 지정합니다.

  4. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. GitLab CI/CD 파이프라인 중에 동적으로 생성된 앱을 대상으로 API 보안 테스팅을 실행하려면, 앱이 자신의 URL을 environment_url.txt 파일에 저장하도록 합니다. API 보안 테스팅은 그 파일을 자동으로 파싱하여 스캔 대상을 찾습니다. 이 예시는 GitLab Auto DevOps CI YAML에서 확인할 수 있습니다.

Postman Collection을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection_serviceA.json
  APISEC_TARGET_URL: http://test-deployment/

이는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

Postman 변수#

Postman Client의 변수#

Postman을 사용하면 개발자가 요청의 여러 부분에서 사용할 수 있는 자리표시자를 정의할 수 있습니다. 이러한 자리표시자를 변수라고 하며, 변수 사용하기에서 자세히 설명합니다. 변수를 사용하면 요청과 스크립트에서 값을 저장하고 재사용할 수 있습니다. 예를 들어 컬렉션을 편집하여 문서에 변수를 추가할 수 있습니다:

컬렉션 변수 탭 편집 화면

또는 환경에서 변수를 추가할 수도 있습니다:

환경 변수 편집 화면

그런 다음 URL, 헤더 등의 항목에서 변수를 사용할 수 있습니다:

변수를 사용한 요청 편집 화면

Postman은 우수한 UX를 갖춘 기본적인 클라이언트 도구에서, 스크립트로 API를 테스트하고 2차 요청을 트리거하는 복잡한 컬렉션을 만들고 그 과정에서 변수를 설정할 수 있는 더 복잡한 생태계로 성장했습니다. Postman 생태계의 모든 기능이 지원되는 것은 아닙니다. 예를 들어 스크립트는 지원하지 않습니다. Postman 지원의 주요 목적은 Postman Client가 사용하는 Postman Collection 정의와, 워크스페이스·환경·컬렉션 자체에 정의된 관련 변수를 가져오는 것입니다.

Postman에서는 여러 스코프에 변수를 만들 수 있습니다. 각 스코프는 Postman 도구 안에서 서로 다른 수준의 가시성을 가집니다. 예를 들어 모든 작업 정의와 워크스페이스에서 보이는 글로벌 환경 스코프에 변수를 만들 수 있습니다. 또한 특정 환경 스코프에 변수를 만들 수도 있는데, 이 변수는 해당 환경이 사용하도록 선택된 경우에만 보이고 사용됩니다. 일부 스코프는 항상 사용할 수 있는 것은 아닙니다. 예를 들어 Postman 생태계에서는 Postman Client에서 요청을 만들 수 있는데, 이런 요청에는 로컬 스코프가 없지만 테스트 스크립트에는 있습니다.

Postman의 변수 스코프는 어렵게 느껴질 수 있는 주제이고, 누구나 익숙한 것은 아닙니다. 계속 진행하기 전에 Postman 문서의 변수 스코프를 읽어봅니다.

앞서 언급했듯이 변수 스코프는 여러 가지이며, 각 스코프는 고유한 목적이 있고 Postman 문서에 더 큰 유연성을 제공하는 데 사용할 수 있습니다. Postman 문서에 따르면 변수 값이 계산되는 방식에는 중요한 참고 사항이 있습니다:

Note

같은 이름의 변수가 서로 다른 두 스코프에 선언되어 있으면, 가장 좁은 스코프의 변수에 저장된 값이 사용됩니다. 예를 들어 username이라는 글로벌 변수와 username이라는 로컬 변수가 있다면, 요청을 실행할 때 로컬 값이 사용됩니다.

다음은 Postman Client와 API 보안 테스팅이 지원하는 변수 스코프를 정리한 것입니다:

  • 글로벌 환경(Global) 스코프는 워크스페이스 전체에서 사용할 수 있는 특별한 사전 정의 환경입니다. 글로벌 환경 스코프는 글로벌 스코프라고도 부릅니다. Postman Client에서는 글로벌 환경을 JSON 파일로 내보낼 수 있으며, 이 파일은 API 보안 테스팅과 함께 사용할 수 있습니다.
  • 환경 스코프는 Postman Client에서 사용자가 만든, 이름이 있는 변수 그룹입니다. Postman Client는 글로벌 환경과 함께 활성 환경을 하나만 지원합니다. 사용자가 만든 활성 환경에 정의된 변수는 글로벌 환경에 정의된 변수보다 우선합니다. Postman Client에서는 환경을 JSON 파일로 내보낼 수 있으며, 이 파일은 API 보안 테스팅과 함께 사용할 수 있습니다.
  • 컬렉션 스코프는 특정 컬렉션에 선언된 변수 그룹입니다. 컬렉션 변수는 선언된 컬렉션과 그 하위 요청 또는 컬렉션에서 사용할 수 있습니다. 컬렉션 스코프에 정의된 변수는 글로벌 환경 스코프와 환경 스코프보다 우선합니다. Postman Client는 하나 이상의 컬렉션을 JSON 파일로 내보낼 수 있으며, 이 JSON 파일에는 선택한 컬렉션, 요청, 컬렉션 변수가 포함됩니다.
  • API 보안 테스팅 스코프는 사용자가 추가 변수를 제공하거나 다른 지원 스코프에 정의된 변수를 재정의할 수 있도록 API 보안 테스팅이 추가한 새 스코프입니다. 이 스코프는 Postman에서는 지원하지 않습니다. API 보안 테스팅 스코프 변수는 사용자 정의 JSON 파일 형식을 사용하여 제공합니다.
    • 환경 또는 컬렉션에 정의된 값 재정의
    • 스크립트에서 변수 정의
    • 지원하지 않는 _데이터 스코프_에서 데이터 한 행 정의
  • 데이터 스코프는 이름과 값이 JSON 또는 CSV 파일에서 오는 변수 그룹입니다. Newman이나 Postman Collection Runner 같은 Postman 컬렉션 러너는 JSON 또는 CSV 파일에 있는 항목 수만큼 컬렉션의 요청을 실행합니다. 이러한 변수는 Postman에서 스크립트로 테스트를 자동화하는 데 유용하게 쓸 수 있습니다. API 보안 테스팅은 CSV나 JSON 파일에서 데이터를 읽는 것을 지원하지 않습니다.
  • 로컬 스코프는 Postman 스크립트에 정의된 변수입니다. API 보안 테스팅은 Postman 스크립트를 지원하지 않으므로 스크립트에 정의된 변수도 지원하지 않습니다. 지원되는 스코프 중 하나 또는 사용자 정의 JSON 형식으로 정의하면 스크립트에서 정의한 변수의 값을 그대로 제공할 수 있습니다.

API 보안 테스팅은 모든 스코프를 지원하지 않으며, 스크립트에 정의된 변수도 지원하지 않습니다. 다음 표는 가장 넓은 스코프부터 가장 좁은 스코프 순으로 정렬되어 있습니다.

스코프 Postman API 보안 테스팅 설명
글로벌 환경 예 예 특별한 사전 정의 환경
환경 예 예 이름이 있는 환경
컬렉션 예 예 Postman 컬렉션에 정의됨
API 보안 테스팅 스코프 아니요 예 API 보안 테스팅이 추가한 사용자 정의 스코프
데이터 예 아니요 CSV 또는 JSON 형식의 외부 파일
로컬 예 아니요 스크립트에 정의된 변수

여러 스코프에서 변수를 정의하고 내보내는 방법에 대한 자세한 내용은 다음을 참고합니다:

Postman Client에서 내보내기#

Postman Client에서는 다양한 파일 형식으로 내보낼 수 있습니다. 예를 들어 Postman 컬렉션이나 Postman 환경을 내보낼 수 있습니다. 내보낸 환경은 (항상 사용할 수 있는) 글로벌 환경이거나, 이전에 만들어 둔 사용자 정의 환경일 수 있습니다. Postman Collection을 내보내면 컬렉션 및 로컬 스코프 변수의 선언만 포함될 수 있으며, 환경 스코프 변수는 포함되지 않습니다.

환경 스코프 변수의 선언을 얻으려면 해당 시점에 특정 환경을 내보내야 합니다. 내보낸 각 파일에는 선택한 환경의 변수만 포함됩니다.

지원되는 여러 스코프에서 변수를 내보내는 방법에 대한 자세한 내용은 다음을 참고합니다:

API 보안 테스팅 스코프, 사용자 정의 JSON 파일 형식#

사용자 정의 JSON 파일 형식은 각 객체 속성이 변수 이름을 나타내고 속성 값이 변수 값을 나타내는 JSON 객체입니다. 이 파일은 원하는 텍스트 편집기로 만들 수도 있고, 파이프라인의 앞선 job에서 생성할 수도 있습니다.

이 예시는 API 보안 테스팅 스코프에서 base_url과 token 두 변수를 정의합니다:

{
  "base_url": "http://127.0.0.1/",
  "token": "Token 84816165151"
}

API 보안 테스팅에서 스코프 사용#

글로벌, 환경, 컬렉션, GitLab API 보안 테스팅 스코프를 지원합니다.

다음 표는 스코프 파일/URL을 API 보안 테스팅 구성 변수에 매핑하는 빠른 참조표입니다:

스코프 제공 방법
글로벌 환경 APISEC_POSTMAN_COLLECTION_VARIABLES
환경 APISEC_POSTMAN_COLLECTION_VARIABLES
컬렉션 APISEC_POSTMAN_COLLECTION
API 보안 테스팅 스코프 APISEC_POSTMAN_COLLECTION_VARIABLES
데이터 지원하지 않음
로컬 지원하지 않음

Postman Collection 문서에는 컬렉션 스코프 변수가 자동으로 포함됩니다. Postman Collection은 구성 변수 APISEC_POSTMAN_COLLECTION으로 제공합니다. 이 변수는 내보낸 Postman 컬렉션 하나로 설정할 수 있습니다.

다른 스코프의 변수는 APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 제공합니다. 이 구성 변수는 쉼표(,)로 구분한 파일 목록을 지원합니다. 각 파일이 필요한 스코프 정보를 담고 있으므로 제공하는 파일의 순서는 중요하지 않습니다.

구성 변수 APISEC_POSTMAN_COLLECTION_VARIABLES는 다음으로 설정할 수 있습니다:

정의되지 않은 Postman 변수#

API 보안 테스팅 엔진이 Postman 컬렉션 파일에서 사용하는 모든 변수 참조를 찾지 못할 수 있습니다. 다음과 같은 경우가 있을 수 있습니다:

  • 데이터 또는 로컬 스코프 변수를 사용하고 있고, 앞서 설명했듯이 이 스코프들은 API 보안 테스팅에서 지원하지 않습니다. 따라서 API 보안 테스팅 스코프로 이 변수들의 값을 제공하지 않았다면, 데이터 및 로컬 스코프 변수의 값은 정의되지 않은 상태입니다.
  • 변수 이름을 잘못 입력하여 정의된 변수의 이름과 일치하지 않습니다.
  • Postman Client가 API 보안 테스팅에서 지원하지 않는 새 동적 변수를 지원합니다.

가능한 경우, API 보안 테스팅은 정의되지 않은 변수를 처리할 때 Postman Client와 동일하게 동작합니다. 변수 참조 텍스트는 그대로 유지되며 텍스트 치환은 일어나지 않습니다. 지원하지 않는 동적 변수에도 동일한 동작이 적용됩니다.

예를 들어 Postman Collection의 요청 정의가 변수 {{full_url}}을 참조하는데 그 변수를 찾을 수 없으면, 값은 {{full_url}} 그대로 남습니다.

동적 Postman 변수#

사용자가 여러 스코프 수준에서 정의할 수 있는 변수 외에도, Postman에는 동적 변수라는 사전 정의된 변수 집합이 있습니다. 동적 변수는 이미 정의되어 있으며, 이름 앞에 달러 기호($)가 붙습니다(예: $guid). 동적 변수는 다른 변수와 마찬가지로 사용할 수 있으며, Postman Client에서는 요청/컬렉션을 실행할 때마다 임의의 값을 생성합니다.

API 보안 테스팅과 Postman의 중요한 차이점은, API 보안 테스팅은 같은 동적 변수를 사용할 때마다 같은 값을 반환한다는 점입니다. 이는 같은 동적 변수를 사용할 때마다 임의의 값을 반환하는 Postman Client의 동작과 다릅니다. 즉 API 보안 테스팅은 동적 변수에 정적 값을 사용하고, Postman은 임의의 값을 사용합니다.

스캔 과정에서 지원되는 동적 변수는 다음과 같습니다:

변수 값
$guid 611c2e81-2ccb-42d8-9ddc-2d0bfa65c1b4
$isoTimestamp 2020-06-09T21:10:36.177Z
$randomAbbreviation PCI
$randomAbstractImage http://no-a-valid-host/640/480/abstract
$randomAdjective auxiliary
$randomAlphaNumeric a
$randomAnimalsImage http://no-a-valid-host/640/480/animals
$randomAvatarImage https://no-a-valid-host/path/to/some/image.jpg
$randomBankAccount 09454073
$randomBankAccountBic EZIAUGJ1
$randomBankAccountIban MU20ZPUN3039684000618086155TKZ
$randomBankAccountName Home Loan Account
$randomBitcoin 3VB8JGT7Y4Z63U68KGGKDXMLLH5
$randomBoolean true
$randomBs killer leverage schemas
$randomBsAdjective viral
$randomBsBuzz repurpose
$randomBsNoun markets
$randomBusinessImage http://no-a-valid-host/640/480/business
$randomCatchPhrase Future-proofed heuristic open architecture
$randomCatchPhraseAdjective Business-focused
$randomCatchPhraseDescriptor bandwidth-monitored
$randomCatchPhraseNoun superstructure
$randomCatsImage http://no-a-valid-host/640/480/cats
$randomCity Spinkahaven
$randomCityImage http://no-a-valid-host/640/480/city
$randomColor fuchsia
$randomCommonFileExt wav
$randomCommonFileName well_modulated.mpg4
$randomCommonFileType audio
$randomCompanyName Grady LLC
$randomCompanySuffix Inc
$randomCountry Kazakhstan
$randomCountryCode MD
$randomCreditCardMask 3622
$randomCurrencyCode ZMK
$randomCurrencyName Pound Sterling
$randomCurrencySymbol £
$randomDatabaseCollation utf8_general_ci
$randomDatabaseColumn updatedAt
$randomDatabaseEngine Memory
$randomDatabaseType text
$randomDateFuture Tue Mar 17 2020 13:11:50 GMT+0530 (India Standard Time)
$randomDatePast Sat Mar 02 2019 09:09:26 GMT+0530 (India Standard Time)
$randomDateRecent Tue Jul 09 2019 23:12:37 GMT+0530 (India Standard Time)
$randomDepartment Electronics
$randomDirectoryPath /usr/local/bin
$randomDomainName trevor.info
$randomDomainSuffix org
$randomDomainWord jaden
$randomEmail Iva.Kovacek61@no-a-valid-host.com
$randomExampleEmail non-a-valid-user@example.net
$randomFashionImage http://no-a-valid-host/640/480/fashion
$randomFileExt war
$randomFileName neural_sri_lanka_rupee_gloves.gdoc
$randomFilePath /home/programming_chicken.cpio
$randomFileType application
$randomFirstName Chandler
$randomFoodImage http://no-a-valid-host/640/480/food
$randomFullName Connie Runolfsdottir
$randomHexColor #47594a
$randomImageDataUri data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20baseProfile%3D%22full%22%20width%3D%22undefined%22%20height%3D%22undefined%22%3E%20%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22grey%22%2F%3E%20%20%3Ctext%20x%3D%220%22%20y%3D%2220%22%20font-size%3D%2220%22%20text-anchor%3D%22start%22%20fill%3D%22white%22%3Eundefinedxundefined%3C%2Ftext%3E%20%3C%2Fsvg%3E
$randomImageUrl http://no-a-valid-host/640/480
$randomIngverb navigating
$randomInt 494
$randomIP 241.102.234.100
$randomIPV6 dbe2:7ae6:119b:c161:1560:6dda:3a9b:90a9
$randomJobArea Mobility
$randomJobDescriptor Senior
$randomJobTitle International Creative Liaison
$randomJobType Supervisor
$randomLastName Schneider
$randomLatitude 55.2099
$randomLocale ny
$randomLongitude 40.6609
$randomLoremLines Ducimus in ut mollitia.\nA itaque non.\nHarum temporibus nihil voluptas.\nIste in sed et nesciunt in quaerat sed.
$randomLoremParagraph Ab aliquid odio iste quo voluptas voluptatem dignissimos velit. Recusandae facilis qui commodi ea magnam enim nostrum quia quis. Nihil est suscipit assumenda ut voluptatem sed. Esse ab voluptas odit qui molestiae. Rem est nesciunt est quis ipsam expedita consequuntur.
$randomLoremParagraphs Voluptatem rem magnam aliquam ab id aut quaerat. Placeat provident possimus voluptatibus dicta velit non aut quasi. Mollitia et aliquam expedita sunt dolores nam consequuntur. Nam dolorum delectus ipsam repudiandae et ipsam ut voluptatum totam. Nobis labore labore recusandae ipsam quo.
$randomLoremSentence Molestias consequuntur nisi non quod.
$randomLoremSentences Et sint voluptas similique iure amet perspiciatis vero sequi atque. Ut porro sit et hic. Neque aspernatur vitae fugiat ut dolore et veritatis. Ab iusto ex delectus animi. Voluptates nisi iusto. Impedit quod quae voluptate qui.
$randomLoremSlug eos-aperiam-accusamus, beatae-id-molestiae, qui-est-repellat
$randomLoremText Quisquam asperiores exercitationem ut ipsum. Aut eius nesciunt. Et reiciendis aut alias eaque. Nihil amet laboriosam pariatur eligendi. Sunt ullam ut sint natus ducimus. Voluptas harum aspernatur soluta rem nam.
$randomLoremWord est
$randomLoremWords vel repellat nobis
$randomMACAddress 33:d4:68:5f:b4:c7
$randomMimeType audio/vnd.vmx.cvsd
$randomMonth February
$randomNamePrefix Dr.
$randomNameSuffix MD
$randomNatureImage http://no-a-valid-host/640/480/nature
$randomNightlifeImage http://no-a-valid-host/640/480/nightlife
$randomNoun bus
$randomPassword t9iXe7COoDKv8k3
$randomPeopleImage http://no-a-valid-host/640/480/people
$randomPhoneNumber 700-008-5275
$randomPhoneNumberExt 27-199-983-3864
$randomPhrase You can't program the monitor without navigating the mobile XML program!
$randomPrice 531.55
$randomProduct Pizza
$randomProductAdjective Unbranded
$randomProductMaterial Steel
$randomProductName Handmade Concrete Tuna
$randomProtocol https
$randomSemver 7.0.5
$randomSportsImage http://no-a-valid-host/640/480/sports
$randomStreetAddress 5742 Harvey Streets
$randomStreetName Kuhic Island
$randomTransactionType payment
$randomTransportImage http://no-a-valid-host/640/480/transport
$randomUrl https://no-a-valid-host.net
$randomUserAgent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.9.8; rv:15.6) Gecko/20100101 Firefox/15.6.6
$randomUserName Jarrell.Gutkowski
$randomUUID 6929bb52-3ab2-448a-9796-d6480ecad36b
$randomVerb navigate
$randomWeekday Thursday
$randomWord withdrawal
$randomWords Samoa Synergistic sticky copying Grocery
$timestamp 1562757107

예시: 글로벌 스코프#

이 예시에서는 Postman Client에서 글로벌 스코프를 내보내 global-scope.json으로 저장하고, APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 API 보안 테스팅에 제공합니다.

다음은 APISEC_POSTMAN_COLLECTION_VARIABLES 사용 예시입니다:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: global-scope.json
  APISEC_TARGET_URL: http://test-deployment/

예시: 환경 스코프#

이 예시에서는 Postman Client에서 환경 스코프를 내보내 environment-scope.json으로 저장하고, APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 API 보안 테스팅에 제공합니다.

다음은 APISEC_POSTMAN_COLLECTION_VARIABLES 사용 예시입니다:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: environment-scope.json
  APISEC_TARGET_URL: http://test-deployment/

예시: 컬렉션 스코프#

컬렉션 스코프 변수는 내보낸 Postman Collection 파일에 포함되어, APISEC_POSTMAN_COLLECTION 구성 변수를 통해 제공됩니다.

다음은 APISEC_POSTMAN_COLLECTION 사용 예시입니다:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_TARGET_URL: http://test-deployment/

예시: API 보안 테스팅 스코프#

API 보안 테스팅 스코프는 두 가지 주요 목적으로 사용합니다. API 보안 테스팅에서 지원하지 않는 데이터 및 로컬 스코프 변수를 정의하는 것과, 다른 스코프에 정의된 기존 변수의 값을 변경하는 것입니다. API 보안 테스팅 스코프는 APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 제공합니다.

다음은 APISEC_POSTMAN_COLLECTION_VARIABLES 사용 예시입니다:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: dast-api-scope.json
  APISEC_TARGET_URL: http://test-deployment/

dast-api-scope.json 파일은 사용자 정의 JSON 파일 형식을 사용합니다. 이 JSON은 속성의 키-값 쌍으로 이루어진 객체입니다. 키는 변수 이름이고 값은 변수 값입니다. 예를 들면:

{
  "base_url": "http://127.0.0.1/",
  "token": "Token 84816165151"
}

예시: 여러 스코프#

이 예시에서는 글로벌 스코프, 환경 스코프, 컬렉션 스코프를 구성합니다. 첫 단계는 여러 스코프를 내보내는 것입니다.

Postman Collection은 APISEC_POSTMAN_COLLECTION 변수로 제공하고, 다른 스코프는 APISEC_POSTMAN_COLLECTION_VARIABLES로 제공합니다. API 보안 테스팅은 각 파일에 담긴 데이터를 사용하여 제공된 파일이 어느 스코프에 해당하는지 식별할 수 있습니다.

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: global-scope.json,environment-scope.json
  APISEC_TARGET_URL: http://test-deployment/

예시: 변수 값 변경#

내보낸 스코프를 사용하다 보면, API 보안 테스팅에서 사용하기 위해 변수 값을 바꿔야 하는 경우가 자주 있습니다. 예를 들어 컬렉션 스코프 변수에 값이 v2인 api_version 변수가 있는데, 테스트에는 v1 값이 필요할 수 있습니다. 내보낸 컬렉션을 수정해서 값을 바꾸는 대신, API 보안 테스팅 스코프를 사용해 값을 바꿀 수 있습니다. API 보안 테스팅 스코프가 다른 모든 스코프보다 우선하기 때문에 이 방법이 동작합니다.

컬렉션 스코프 변수는 내보낸 Postman Collection 파일에 포함되어, APISEC_POSTMAN_COLLECTION 구성 변수를 통해 제공됩니다.

API 보안 테스팅 스코프는 APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 제공하는데, 그 전에 먼저 파일을 만듭니다. dast-api-scope.json 파일은 사용자 정의 JSON 파일 형식을 사용합니다. 이 JSON은 속성의 키-값 쌍으로 이루어진 객체입니다. 키는 변수 이름이고 값은 변수 값입니다. 예를 들면:

{
  "api_version": "v1"
}

CI 정의:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: dast-api-scope.json
  APISEC_TARGET_URL: http://test-deployment/

예시: 여러 스코프로 변수 값 변경#

내보낸 스코프를 사용하다 보면, API 보안 테스팅에서 사용하기 위해 변수 값을 바꿔야 하는 경우가 자주 있습니다. 예를 들어 환경 스코프에 값이 v2인 api_version 변수가 있는데, 테스트에는 v1 값이 필요할 수 있습니다. 내보낸 파일을 수정해서 값을 바꾸는 대신 API 보안 테스팅 스코프를 사용할 수 있습니다. API 보안 테스팅 스코프가 다른 모든 스코프보다 우선하기 때문에 이 방법이 동작합니다.

이 예시에서는 글로벌 스코프, 환경 스코프, 컬렉션 스코프, API 보안 테스팅 스코프를 구성합니다. 첫 단계는 여러 스코프를 내보내고 만드는 것입니다.

API 보안 테스팅 스코프는 사용자 정의 JSON 파일 형식을 사용하여 dast-api-scope.json 파일을 만들어 사용합니다. 이 JSON은 속성의 키-값 쌍으로 이루어진 객체입니다. 키는 변수 이름이고 값은 변수 값입니다. 예를 들면:

{
  "api_version": "v1"
}

Postman Collection은 APISEC_POSTMAN_COLLECTION 변수로 제공하고, 다른 스코프는 APISEC_POSTMAN_COLLECTION_VARIABLES로 제공합니다. API 보안 테스팅은 각 파일에 담긴 데이터를 사용하여 제공된 파일이 어느 스코프에 해당하는지 식별할 수 있습니다.

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: global-scope.json,environment-scope.json,dast-api-scope.json
  APISEC_TARGET_URL: http://test-deployment/

첫 번째 스캔 실행#

올바르게 구성하면 CI/CD 파이프라인에 dast Stage와 dast_api job이 포함됩니다. 이 job은 잘못된 구성이 제공된 경우에만 실패합니다. 일반적인 상황에서는 테스트 중 취약점이 발견되더라도 이 job은 항상 성공합니다.

취약점은 스위트 이름과 함께 Security 파이프라인 탭에 표시됩니다. 리포지터리의 기본 브랜치를 대상으로 테스트하면, API 보안 테스팅 취약점이 Security and compliance의 취약점 보고서에도 표시됩니다.

보고되는 취약점 수가 지나치게 많아지지 않도록, API 보안 테스팅 스캐너는 작업당 보고하는 취약점 수를 제한합니다.

API 보안 테스팅 취약점 보기#

API 보안 테스팅 분석기는 JSON 보고서를 생성하며, 이 보고서는 수집되어 GitLab 취약점 화면에 취약점을 채우는 데 사용됩니다.

보고되는 오탐 수를 줄이기 위해 변경할 수 있는 구성에 대해서는 오탐 처리를 참고합니다.

API 보안 테스팅 취약점의 세부 정보 보기#

취약점의 세부 정보를 보려면 다음 단계를 따릅니다:

  1. 프로젝트 또는 머지 리퀘스트에서 취약점을 볼 수 있습니다:

    • 프로젝트에서는 프로젝트의 Secure > Vulnerability report 페이지로 이동합니다. 이 페이지에는 기본 브랜치의 취약점만 모두 표시됩니다.
    • 머지 리퀘스트에서는 머지 리퀘스트의 Security 섹션으로 이동하여 Expand 버튼을 선택합니다. API 보안 테스팅 취약점은 DAST detected N potential vulnerabilities라는 레이블이 붙은 섹션에서 확인할 수 있습니다. 제목을 선택하면 취약점 세부 정보가 표시됩니다.
  2. 취약점 제목을 선택하면 세부 정보가 표시됩니다. 아래 표는 이 세부 정보를 설명합니다.

    필드 설명
    Description 무엇이 변경되었는지를 포함한 취약점 설명입니다.
    Project 취약점이 발견된 네임스페이스와 프로젝트입니다.
    Method 취약점을 발견하는 데 사용된 HTTP 메서드입니다.
    URL 취약점이 발견된 URL입니다.
    Request 취약점을 유발한 HTTP 요청입니다.
    Unmodified Response 수정하지 않은 요청에 대한 응답입니다. 정상적으로 동작하는 응답은 대개 Unmodified Response와 비슷하게 보입니다.
    Actual Response 테스트 요청에 대해 받은 응답입니다.
    Evidence GitLab이 취약점 발생을 판단한 근거입니다.
    Identifiers 이 취약점을 찾는 데 사용된 API 보안 테스팅 Check입니다.
    Severity 취약점의 심각도입니다.
    Scanner Type 테스트를 수행한 스캐너입니다.

보안 대시보드#

보안 대시보드는 그룹, 프로젝트, 파이프라인의 모든 보안 취약점을 한눈에 파악할 수 있는 좋은 곳입니다. 자세한 내용은 보안 대시보드 문서를 참고합니다.

취약점 조치#

취약점이 발견되면 이를 조치할 수 있습니다. 취약점 처리 방법에서 자세한 내용을 확인합니다.

오탐 처리#

오탐은 여러 방법으로 처리할 수 있습니다:

  • 취약점을 무시합니다.
  • 일부 Check는 취약점을 식별할 때 여러 탐지 방법을 사용하는데, 이를 _Assertion_이라고 합니다. Assertion도 끄거나 구성할 수 있습니다. 예를 들어 API 보안 테스팅 스캐너는 기본적으로 HTTP 상태 코드를 사용하여 실제 문제인지 판단합니다. API가 테스트 중 500 오류를 반환하면 취약점이 생성됩니다. 일부 프레임워크는 500 오류를 자주 반환하므로 이것이 항상 바람직하지는 않습니다.
  • 오탐을 발생시키는 Check를 끕니다. 이렇게 하면 그 Check가 어떤 취약점도 생성하지 않습니다. 예를 들어 SQL Injection Check, JSON Hijacking Check가 있습니다.

Check 끄기#

Check는 특정 유형의 테스트를 수행하며, 특정 구성 프로파일에서 켜거나 끌 수 있습니다. 제공되는 구성 파일에는 사용할 수 있는 여러 프로파일이 정의되어 있습니다. 구성 파일의 프로파일 정의에는 스캔 중 활성 상태인 모든 Check가 나열됩니다. 특정 Check를 끄려면 구성 파일의 프로파일 정의에서 그 Check를 제거합니다. 프로파일은 구성 파일의 Profiles 섹션에 정의되어 있습니다.

프로파일 정의 예시:

Profiles:
  - Name: Quick
    DefaultProfile: Empty
    Routes:
      - Route: *Route0
        Checks:
          - Name: ApplicationInformationCheck
          - Name: CleartextAuthenticationCheck
          - Name: FrameworkDebugModeCheck
          - Name: HtmlInjectionCheck
          - Name: InsecureHttpMethodsCheck
          - Name: JsonHijackingCheck
          - Name: JsonInjectionCheck
          - Name: SensitiveInformationCheck
          - Name: SessionCookieCheck
          - Name: SqlInjectionCheck
          - Name: TokenCheck
          - Name: XmlInjectionCheck

JSON Hijacking Check를 끄려면 다음 줄을 제거합니다:

          - Name: JsonHijackingCheck

그 결과 다음과 같은 YAML이 됩니다:

- Name: Quick
  DefaultProfile: Empty
  Routes:
    - Route: *Route0
      Checks:
        - Name: ApplicationInformationCheck
        - Name: CleartextAuthenticationCheck
        - Name: FrameworkDebugModeCheck
        - Name: HtmlInjectionCheck
        - Name: InsecureHttpMethodsCheck
        - Name: JsonInjectionCheck
        - Name: SensitiveInformationCheck
        - Name: SessionCookieCheck
        - Name: SqlInjectionCheck
        - Name: TokenCheck
        - Name: XmlInjectionCheck

Check의 Assertion 끄기#

Assertion은 Check가 수행한 테스트에서 취약점을 탐지합니다. 많은 Check가 Log Analysis, Response Analysis, Status Code 같은 여러 Assertion을 지원합니다. 취약점이 발견되면 사용된 Assertion이 함께 제공됩니다. 기본적으로 어떤 Assertion이 켜져 있는지 확인하려면 구성 파일의 Check 기본 구성을 참고합니다. 이 섹션은 Checks라고 합니다.

이 예시는 SQL Injection Check를 보여줍니다:

- Name: SqlInjectionCheck
  Configuration:
    UserInjections: []
  Assertions:
    - Name: LogAnalysisAssertion
    - Name: ResponseAnalysisAssertion
    - Name: StatusCodeAssertion

여기서 기본적으로 세 개의 Assertion이 켜져 있는 것을 볼 수 있습니다. 오탐의 흔한 원인은 StatusCodeAssertion입니다. 이를 끄려면 Profiles 섹션에서 구성을 수정합니다. 이 예시는 나머지 두 Assertion(LogAnalysisAssertion, ResponseAnalysisAssertion)만 제공합니다. 이렇게 하면 SqlInjectionCheck가 StatusCodeAssertion을 사용하지 않게 됩니다:

Profiles:
  - Name: Quick
    DefaultProfile: Empty
    Routes:
      - Route: *Route0
        Checks:
          - Name: ApplicationInformationCheck
          - Name: CleartextAuthenticationCheck
          - Name: FrameworkDebugModeCheck
          - Name: HtmlInjectionCheck
          - Name: InsecureHttpMethodsCheck
          - Name: JsonHijackingCheck
          - Name: JsonInjectionCheck
          - Name: SensitiveInformationCheck
          - Name: SessionCookieCheck
          - Name: SqlInjectionCheck
            Assertions:
              - Name: LogAnalysisAssertion
              - Name: ResponseAnalysisAssertion
          - Name: TokenCheck
          - Name: XmlInjectionCheck

분석기 활성화

GitLab v19.5
원문 보기

요약

다음 중 하나를 사용하여 스캔할 API를 지정할 수 있습니다: OpenAPI Specification(이전 명칭: Swagger Specification)은 REST API를 위한 API 설명 형식입니다. API 보안 테스팅은 OpenAPI 문서를 사용하여 요청 본문을 생성합니다.

다음 중 하나를 사용하여 스캔할 API를 지정할 수 있습니다:

OpenAPI Specification#

OpenAPI Specification(이전 명칭: Swagger Specification)은 REST API를 위한 API 설명 형식입니다. 이 섹션에서는 OpenAPI Specification을 사용하여 테스트 대상 API에 대한 정보를 제공하고 API 보안 테스팅 스캔을 구성하는 방법을 설명합니다. OpenAPI Specification은 파일 시스템 리소스 또는 URL로 제공됩니다. JSON과 YAML OpenAPI 형식을 모두 지원합니다.

API 보안 테스팅은 OpenAPI 문서를 사용하여 요청 본문을 생성합니다. 요청 본문이 필요한 경우, 본문 생성은 다음 본문 유형으로 제한됩니다:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • application/json
  • application/xml

OpenAPI와 미디어 타입#

미디어 타입(이전 명칭: MIME 타입)은 전송되는 파일 형식과 형식 콘텐츠에 대한 식별자입니다. OpenAPI 문서를 사용하면 특정 작업이 서로 다른 미디어 타입을 허용하도록 지정할 수 있으며, 따라서 하나의 요청이 서로 다른 파일 콘텐츠로 데이터를 전송할 수 있습니다. 예를 들어 사용자 데이터를 업데이트하는 PUT /user 작업은 XML(미디어 타입 application/xml) 또는 JSON(미디어 타입 application/json) 형식으로 데이터를 허용할 수 있습니다. OpenAPI 2.x에서는 허용되는 미디어 타입을 전역 또는 작업 단위로 지정할 수 있으며, OpenAPI 3.x에서는 작업 단위로만 지정할 수 있습니다. API 보안 테스팅은 나열된 미디어 타입을 확인하고, 지원되는 각 미디어 타입에 대한 샘플 데이터를 생성하려고 시도합니다.

  • 기본 동작은 사용할 지원 미디어 타입 중 하나를 선택하는 것입니다. 목록에서 첫 번째로 지원되는 미디어 타입이 선택됩니다. 이 동작은 구성할 수 있습니다.

동일한 작업(예: POST /user)을 서로 다른 미디어 타입(예: application/json과 application/xml)으로 테스트하는 것이 항상 바람직하지는 않습니다. 예를 들어 대상 애플리케이션이 요청 콘텐츠 유형과 관계없이 동일한 코드를 실행하는 경우, 테스트 세션을 완료하는 데 시간이 더 오래 걸리고, 대상 앱에 따라 요청 본문과 관련된 취약점이 중복으로 보고될 수 있습니다.

환경 변수 APISEC_OPENAPI_ALL_MEDIA_TYPES를 사용하면 특정 작업에 대한 요청을 생성할 때 하나 대신 지원되는 모든 미디어 타입을 사용할지 지정할 수 있습니다. 환경 변수 APISEC_OPENAPI_ALL_MEDIA_TYPES가 어떤 값으로든 설정되면, API 보안 테스팅은 특정 작업에서 하나 대신 지원되는 모든 미디어 타입에 대한 요청을 생성하려고 시도합니다. 제공된 각 미디어 타입에 대해 테스트가 반복되므로 테스트 시간이 더 오래 걸립니다.

또는 변수 APISEC_OPENAPI_MEDIA_TYPES를 사용하여 각각 테스트할 미디어 타입 목록을 제공할 수 있습니다. 미디어 타입을 둘 이상 제공하면 선택한 각 미디어 타입에 대해 테스트가 수행되므로 테스트 시간이 더 오래 걸립니다. 환경 변수 APISEC_OPENAPI_MEDIA_TYPES가 미디어 타입 목록으로 설정되면, 요청을 생성할 때 나열된 미디어 타입만 포함됩니다.

APISEC_OPENAPI_MEDIA_TYPES에서 여러 미디어 타입은 콜론(:)으로 구분합니다. 예를 들어 요청 생성을 미디어 타입 application/x-www-form-urlencoded와 multipart/form-data로 제한하려면, 환경 변수 APISEC_OPENAPI_MEDIA_TYPES를 application/x-www-form-urlencoded:multipart/form-data로 설정합니다. 이 목록에서 지원되는 미디어 타입만 요청 생성에 포함되며, 지원되지 않는 미디어 타입은 항상 건너뜁니다. 미디어 타입 텍스트는 여러 부분으로 구성될 수 있습니다. 예를 들어 application/vnd.api+json; charset=UTF-8은 type "/" [tree "."] subtype ["+" suffix]* [";" parameter]의 조합입니다. 요청 생성 시 미디어 타입을 필터링할 때 파라미터는 고려하지 않습니다.

환경 변수 APISEC_OPENAPI_ALL_MEDIA_TYPES와 APISEC_OPENAPI_MEDIA_TYPES를 사용하면 미디어 타입 처리 방식을 결정할 수 있습니다. 이 두 설정은 상호 배타적입니다. 둘 다 활성화하면 API 보안 테스팅이 오류를 보고합니다.

OpenAPI Specification으로 API 보안 테스팅 구성#

OpenAPI Specification으로 API 보안 테스팅 스캔을 구성하려면 다음과 같이 합니다:

  1. .gitlab-ci.yml 파일에 API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. 구성 파일에는 서로 다른 Check가 활성화된 여러 테스트 프로파일이 정의되어 있습니다. Quick 프로파일부터 시작합니다. 이 프로파일로 테스트하면 더 빠르게 완료되어 구성을 검증하기 쉬워집니다. .gitlab-ci.yml 파일에 APISEC_PROFILE CI/CD 변수를 추가하여 프로파일을 지정합니다.

  3. OpenAPI Specification의 위치를 파일 또는 URL로 제공합니다. APISEC_OPENAPI 변수를 추가하여 위치를 지정합니다.

  4. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. GitLab CI/CD 파이프라인 중에 동적으로 생성된 앱을 대상으로 API 보안 테스팅을 실행하려면, 앱이 자신의 URL을 environment_url.txt 파일에 저장하도록 합니다. API 보안 테스팅은 그 파일을 자동으로 파싱하여 스캔 대상을 찾습니다. 이 예시는 GitLab Auto DevOps CI YAML에서 확인할 수 있습니다.

OpenAPI Specification을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_OPENAPI: test-api-specification.json
  APISEC_TARGET_URL: http://test-deployment/

이는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

HTTP Archive(HAR)#

HTTP Archive 형식(HAR)은 HTTP 트랜잭션을 기록하기 위한 아카이브 파일 형식입니다. GitLab API 보안 테스팅 스캐너와 함께 사용할 경우, HAR 파일에는 테스트할 웹 API를 호출한 기록이 포함되어야 합니다. API 보안 테스팅 스캐너는 모든 요청을 추출하여 테스트를 수행하는 데 사용합니다.

HAR 파일을 생성하는 데는 다양한 도구를 사용할 수 있습니다:

Warning

HAR 파일에는 인증 토큰, API 키, 세션 쿠키 같은 민감한 정보가 포함될 수 있습니다. 리포지터리에 추가하기 전에 HAR 파일의 내용을 검토합니다.

HAR 파일로 API 보안 테스팅 스캔#

테스트 대상 API에 대한 정보를 제공하는 HAR 파일을 사용하도록 API 보안 테스팅을 구성하려면 다음과 같이 합니다:

  1. .gitlab-ci.yml 파일에 API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. 구성 파일에는 서로 다른 Check가 활성화된 여러 테스트 프로파일이 정의되어 있습니다. Quick 프로파일부터 시작합니다. 이 프로파일로 테스트하면 더 빠르게 완료되어 구성을 검증하기 쉬워집니다.

    .gitlab-ci.yml 파일에 APISEC_PROFILE CI/CD 변수를 추가하여 프로파일을 지정합니다.

  3. HAR 파일의 위치를 제공합니다. 위치는 파일 경로 또는 URL로 제공할 수 있습니다. APISEC_HAR 변수를 추가하여 위치를 지정합니다.

  4. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. GitLab CI/CD 파이프라인 중에 동적으로 생성된 앱을 대상으로 API 보안 테스팅을 실행하려면, 앱이 자신의 URL을 environment_url.txt 파일에 저장하도록 합니다. API 보안 테스팅은 그 파일을 자동으로 파싱하여 스캔 대상을 찾습니다. 이 예시는 GitLab Auto DevOps CI YAML에서 확인할 수 있습니다.

HAR 파일을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_HAR: test-api-recording.har
  APISEC_TARGET_URL: http://test-deployment/

이 예시는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

GraphQL Schema#

GraphQL은 API를 위한 쿼리 언어이며 REST API의 대안입니다. API 보안 테스팅은 여러 방법으로 GraphQL 엔드포인트 테스트를 지원합니다:

  • GraphQL Schema를 사용하여 테스트합니다.
  • GraphQL 쿼리 기록(HAR)을 사용하여 테스트합니다.
  • GraphQL 쿼리가 포함된 Postman Collection을 사용하여 테스트합니다.

이 섹션에서는 GraphQL 스키마를 사용하여 테스트하는 방법을 설명합니다. API 보안 테스팅의 GraphQL 스키마 지원 기능은 인트로스펙션(introspection)을 지원하는 엔드포인트에서 스키마를 쿼리할 수 있습니다. 인트로스펙션은 GraphiQL 같은 도구가 동작하도록 기본적으로 활성화되어 있습니다. 인트로스펙션을 활성화하는 방법은 사용 중인 GraphQL 프레임워크의 문서를 참고합니다.

GraphQL 엔드포인트 URL로 API 보안 테스팅 스캔#

API 보안 테스팅의 GraphQL 지원 기능은 GraphQL 엔드포인트에 스키마를 쿼리할 수 있습니다.

Note

이 방법이 올바르게 동작하려면 GraphQL 엔드포인트가 인트로스펙션 쿼리를 지원해야 합니다.

테스트 대상 API에 대한 정보를 제공하는 GraphQL 엔드포인트 URL을 사용하도록 API 보안 테스팅을 구성하려면 다음과 같이 합니다:

  1. .gitlab-ci.yml 파일에 API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. GraphQL 엔드포인트의 경로(예: /api/graphql)를 제공합니다. APISEC_GRAPHQL 변수를 추가하여 위치를 지정합니다.

  3. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. 자세한 내용은 동적 환경 솔루션을 참고합니다.

GraphQL 엔드포인트 경로를 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

api_security:
  variables:
    APISEC_GRAPHQL: /api/graphql
    APISEC_TARGET_URL: http://test-deployment/

이 예시는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

GraphQL Schema 파일로 API 보안 테스팅 스캔#

API 보안 테스팅은 GraphQL 스키마 파일을 사용하여 인트로스펙션이 비활성화된 GraphQL 엔드포인트를 파악하고 테스트할 수 있습니다. GraphQL 스키마 파일을 사용하려면 인트로스펙션 JSON 형식이어야 합니다. GraphQL 스키마는 온라인 서드파티 도구 https://transform.tools/graphql-to-introspection-json을 사용하여 인트로스펙션 JSON 형식으로 변환할 수 있습니다.

테스트 대상 API에 대한 정보를 제공하는 GraphQL 스키마 파일을 사용하도록 API 보안 테스팅을 구성하려면 다음과 같이 합니다:

  1. .gitlab-ci.yml 파일에 API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. GraphQL 엔드포인트 경로(예: /api/graphql)를 제공합니다. APISEC_GRAPHQL 변수를 추가하여 경로를 지정합니다.

  3. GraphQL 스키마 파일의 위치를 제공합니다. 위치는 파일 경로 또는 URL로 제공할 수 있습니다. APISEC_GRAPHQL_SCHEMA 변수를 추가하여 위치를 지정합니다.

  4. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. 자세한 내용은 동적 환경 솔루션을 참고합니다.

GraphQL 스키마 파일을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

api_security:
  variables:
    APISEC_GRAPHQL: /api/graphql
    APISEC_GRAPHQL_SCHEMA: test-api-graphql.schema
    APISEC_TARGET_URL: http://test-deployment/

GraphQL 스키마 파일 URL을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

api_security:
  variables:
    APISEC_GRAPHQL: /api/graphql
    APISEC_GRAPHQL_SCHEMA: http://file-store/files/test-api-graphql.schema
    APISEC_TARGET_URL: http://test-deployment/

이 예시는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

Postman Collection#

Postman API Client는 개발자와 테스터가 다양한 유형의 API를 호출하는 데 널리 사용하는 도구입니다. API 정의는 API 보안 테스팅과 함께 사용하기 위해 Postman Collection 파일로 내보낼 수 있습니다. 내보낼 때는 지원되는 Postman Collection 버전인 v2.0 또는 v2.1을 선택합니다.

GitLab API 보안 테스팅 스캐너와 함께 사용할 경우, Postman Collection에는 유효한 데이터로 테스트할 웹 API의 정의가 포함되어야 합니다. API 보안 테스팅 스캐너는 모든 API 정의를 추출하여 테스트를 수행하는 데 사용합니다.

Warning

Postman Collection 파일에는 인증 토큰, API 키, 세션 쿠키 같은 민감한 정보가 포함될 수 있습니다. 리포지터리에 추가하기 전에 Postman Collection 파일의 내용을 검토합니다.

Postman Collection 파일로 API 보안 테스팅 스캔#

테스트 대상 API에 대한 정보를 제공하는 Postman Collection 파일을 사용하도록 API 보안 테스팅을 구성하려면 다음과 같이 합니다:

  1. API-Security.gitlab-ci.yml 템플릿을 포함합니다.

  2. 구성 파일에는 서로 다른 Check가 활성화된 여러 테스트 프로파일이 정의되어 있습니다. Quick 프로파일부터 시작합니다. 이 프로파일로 테스트하면 더 빠르게 완료되어 구성을 검증하기 쉬워집니다.

    .gitlab-ci.yml 파일에 APISEC_PROFILE CI/CD 변수를 추가하여 프로파일을 지정합니다.

  3. Postman Collection 파일의 위치를 파일 또는 URL로 제공합니다. APISEC_POSTMAN_COLLECTION 변수를 추가하여 위치를 지정합니다.

  4. 대상 API 인스턴스의 기본 URL도 필요합니다. APISEC_TARGET_URL 변수나 environment_url.txt 파일을 사용하여 제공합니다.

    프로젝트 루트의 environment_url.txt 파일에 URL을 추가하면 동적 환경에서 테스트하기에 좋습니다. GitLab CI/CD 파이프라인 중에 동적으로 생성된 앱을 대상으로 API 보안 테스팅을 실행하려면, 앱이 자신의 URL을 environment_url.txt 파일에 저장하도록 합니다. API 보안 테스팅은 그 파일을 자동으로 파싱하여 스캔 대상을 찾습니다. 이 예시는 GitLab Auto DevOps CI YAML에서 확인할 수 있습니다.

Postman Collection을 사용하는 전체 구성 예시:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection_serviceA.json
  APISEC_TARGET_URL: http://test-deployment/

이는 API 보안 테스팅을 위한 최소 구성입니다. 여기에서 다음을 수행할 수 있습니다:

Postman 변수#

Postman Client의 변수#

Postman을 사용하면 개발자가 요청의 여러 부분에서 사용할 수 있는 자리표시자를 정의할 수 있습니다. 이러한 자리표시자를 변수라고 하며, 변수 사용하기에서 자세히 설명합니다. 변수를 사용하면 요청과 스크립트에서 값을 저장하고 재사용할 수 있습니다. 예를 들어 컬렉션을 편집하여 문서에 변수를 추가할 수 있습니다:

컬렉션 변수 탭 편집 화면

또는 환경에서 변수를 추가할 수도 있습니다:

환경 변수 편집 화면

그런 다음 URL, 헤더 등의 항목에서 변수를 사용할 수 있습니다:

변수를 사용한 요청 편집 화면

Postman은 우수한 UX를 갖춘 기본적인 클라이언트 도구에서, 스크립트로 API를 테스트하고 2차 요청을 트리거하는 복잡한 컬렉션을 만들고 그 과정에서 변수를 설정할 수 있는 더 복잡한 생태계로 성장했습니다. Postman 생태계의 모든 기능이 지원되는 것은 아닙니다. 예를 들어 스크립트는 지원하지 않습니다. Postman 지원의 주요 목적은 Postman Client가 사용하는 Postman Collection 정의와, 워크스페이스·환경·컬렉션 자체에 정의된 관련 변수를 가져오는 것입니다.

Postman에서는 여러 스코프에 변수를 만들 수 있습니다. 각 스코프는 Postman 도구 안에서 서로 다른 수준의 가시성을 가집니다. 예를 들어 모든 작업 정의와 워크스페이스에서 보이는 글로벌 환경 스코프에 변수를 만들 수 있습니다. 또한 특정 환경 스코프에 변수를 만들 수도 있는데, 이 변수는 해당 환경이 사용하도록 선택된 경우에만 보이고 사용됩니다. 일부 스코프는 항상 사용할 수 있는 것은 아닙니다. 예를 들어 Postman 생태계에서는 Postman Client에서 요청을 만들 수 있는데, 이런 요청에는 로컬 스코프가 없지만 테스트 스크립트에는 있습니다.

Postman의 변수 스코프는 어렵게 느껴질 수 있는 주제이고, 누구나 익숙한 것은 아닙니다. 계속 진행하기 전에 Postman 문서의 변수 스코프를 읽어봅니다.

앞서 언급했듯이 변수 스코프는 여러 가지이며, 각 스코프는 고유한 목적이 있고 Postman 문서에 더 큰 유연성을 제공하는 데 사용할 수 있습니다. Postman 문서에 따르면 변수 값이 계산되는 방식에는 중요한 참고 사항이 있습니다:

Note

같은 이름의 변수가 서로 다른 두 스코프에 선언되어 있으면, 가장 좁은 스코프의 변수에 저장된 값이 사용됩니다. 예를 들어 username이라는 글로벌 변수와 username이라는 로컬 변수가 있다면, 요청을 실행할 때 로컬 값이 사용됩니다.

다음은 Postman Client와 API 보안 테스팅이 지원하는 변수 스코프를 정리한 것입니다:

  • 글로벌 환경(Global) 스코프는 워크스페이스 전체에서 사용할 수 있는 특별한 사전 정의 환경입니다. 글로벌 환경 스코프는 글로벌 스코프라고도 부릅니다. Postman Client에서는 글로벌 환경을 JSON 파일로 내보낼 수 있으며, 이 파일은 API 보안 테스팅과 함께 사용할 수 있습니다.
  • 환경 스코프는 Postman Client에서 사용자가 만든, 이름이 있는 변수 그룹입니다. Postman Client는 글로벌 환경과 함께 활성 환경을 하나만 지원합니다. 사용자가 만든 활성 환경에 정의된 변수는 글로벌 환경에 정의된 변수보다 우선합니다. Postman Client에서는 환경을 JSON 파일로 내보낼 수 있으며, 이 파일은 API 보안 테스팅과 함께 사용할 수 있습니다.
  • 컬렉션 스코프는 특정 컬렉션에 선언된 변수 그룹입니다. 컬렉션 변수는 선언된 컬렉션과 그 하위 요청 또는 컬렉션에서 사용할 수 있습니다. 컬렉션 스코프에 정의된 변수는 글로벌 환경 스코프와 환경 스코프보다 우선합니다. Postman Client는 하나 이상의 컬렉션을 JSON 파일로 내보낼 수 있으며, 이 JSON 파일에는 선택한 컬렉션, 요청, 컬렉션 변수가 포함됩니다.
  • API 보안 테스팅 스코프는 사용자가 추가 변수를 제공하거나 다른 지원 스코프에 정의된 변수를 재정의할 수 있도록 API 보안 테스팅이 추가한 새 스코프입니다. 이 스코프는 Postman에서는 지원하지 않습니다. API 보안 테스팅 스코프 변수는 사용자 정의 JSON 파일 형식을 사용하여 제공합니다.
    • 환경 또는 컬렉션에 정의된 값 재정의
    • 스크립트에서 변수 정의
    • 지원하지 않는 _데이터 스코프_에서 데이터 한 행 정의
  • 데이터 스코프는 이름과 값이 JSON 또는 CSV 파일에서 오는 변수 그룹입니다. Newman이나 Postman Collection Runner 같은 Postman 컬렉션 러너는 JSON 또는 CSV 파일에 있는 항목 수만큼 컬렉션의 요청을 실행합니다. 이러한 변수는 Postman에서 스크립트로 테스트를 자동화하는 데 유용하게 쓸 수 있습니다. API 보안 테스팅은 CSV나 JSON 파일에서 데이터를 읽는 것을 지원하지 않습니다.
  • 로컬 스코프는 Postman 스크립트에 정의된 변수입니다. API 보안 테스팅은 Postman 스크립트를 지원하지 않으므로 스크립트에 정의된 변수도 지원하지 않습니다. 지원되는 스코프 중 하나 또는 사용자 정의 JSON 형식으로 정의하면 스크립트에서 정의한 변수의 값을 그대로 제공할 수 있습니다.

API 보안 테스팅은 모든 스코프를 지원하지 않으며, 스크립트에 정의된 변수도 지원하지 않습니다. 다음 표는 가장 넓은 스코프부터 가장 좁은 스코프 순으로 정렬되어 있습니다.

스코프 Postman API 보안 테스팅 설명
글로벌 환경 예 예 특별한 사전 정의 환경
환경 예 예 이름이 있는 환경
컬렉션 예 예 Postman 컬렉션에 정의됨
API 보안 테스팅 스코프 아니요 예 API 보안 테스팅이 추가한 사용자 정의 스코프
데이터 예 아니요 CSV 또는 JSON 형식의 외부 파일
로컬 예 아니요 스크립트에 정의된 변수

여러 스코프에서 변수를 정의하고 내보내는 방법에 대한 자세한 내용은 다음을 참고합니다:

Postman Client에서 내보내기#

Postman Client에서는 다양한 파일 형식으로 내보낼 수 있습니다. 예를 들어 Postman 컬렉션이나 Postman 환경을 내보낼 수 있습니다. 내보낸 환경은 (항상 사용할 수 있는) 글로벌 환경이거나, 이전에 만들어 둔 사용자 정의 환경일 수 있습니다. Postman Collection을 내보내면 컬렉션 및 로컬 스코프 변수의 선언만 포함될 수 있으며, 환경 스코프 변수는 포함되지 않습니다.

환경 스코프 변수의 선언을 얻으려면 해당 시점에 특정 환경을 내보내야 합니다. 내보낸 각 파일에는 선택한 환경의 변수만 포함됩니다.

지원되는 여러 스코프에서 변수를 내보내는 방법에 대한 자세한 내용은 다음을 참고합니다:

API 보안 테스팅 스코프, 사용자 정의 JSON 파일 형식#

사용자 정의 JSON 파일 형식은 각 객체 속성이 변수 이름을 나타내고 속성 값이 변수 값을 나타내는 JSON 객체입니다. 이 파일은 원하는 텍스트 편집기로 만들 수도 있고, 파이프라인의 앞선 job에서 생성할 수도 있습니다.

이 예시는 API 보안 테스팅 스코프에서 base_url과 token 두 변수를 정의합니다:

{
  "base_url": "http://127.0.0.1/",
  "token": "Token 84816165151"
}

API 보안 테스팅에서 스코프 사용#

글로벌, 환경, 컬렉션, GitLab API 보안 테스팅 스코프를 지원합니다.

다음 표는 스코프 파일/URL을 API 보안 테스팅 구성 변수에 매핑하는 빠른 참조표입니다:

스코프 제공 방법
글로벌 환경 APISEC_POSTMAN_COLLECTION_VARIABLES
환경 APISEC_POSTMAN_COLLECTION_VARIABLES
컬렉션 APISEC_POSTMAN_COLLECTION
API 보안 테스팅 스코프 APISEC_POSTMAN_COLLECTION_VARIABLES
데이터 지원하지 않음
로컬 지원하지 않음

Postman Collection 문서에는 컬렉션 스코프 변수가 자동으로 포함됩니다. Postman Collection은 구성 변수 APISEC_POSTMAN_COLLECTION으로 제공합니다. 이 변수는 내보낸 Postman 컬렉션 하나로 설정할 수 있습니다.

다른 스코프의 변수는 APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 제공합니다. 이 구성 변수는 쉼표(,)로 구분한 파일 목록을 지원합니다. 각 파일이 필요한 스코프 정보를 담고 있으므로 제공하는 파일의 순서는 중요하지 않습니다.

구성 변수 APISEC_POSTMAN_COLLECTION_VARIABLES는 다음으로 설정할 수 있습니다:

정의되지 않은 Postman 변수#

API 보안 테스팅 엔진이 Postman 컬렉션 파일에서 사용하는 모든 변수 참조를 찾지 못할 수 있습니다. 다음과 같은 경우가 있을 수 있습니다:

  • 데이터 또는 로컬 스코프 변수를 사용하고 있고, 앞서 설명했듯이 이 스코프들은 API 보안 테스팅에서 지원하지 않습니다. 따라서 API 보안 테스팅 스코프로 이 변수들의 값을 제공하지 않았다면, 데이터 및 로컬 스코프 변수의 값은 정의되지 않은 상태입니다.
  • 변수 이름을 잘못 입력하여 정의된 변수의 이름과 일치하지 않습니다.
  • Postman Client가 API 보안 테스팅에서 지원하지 않는 새 동적 변수를 지원합니다.

가능한 경우, API 보안 테스팅은 정의되지 않은 변수를 처리할 때 Postman Client와 동일하게 동작합니다. 변수 참조 텍스트는 그대로 유지되며 텍스트 치환은 일어나지 않습니다. 지원하지 않는 동적 변수에도 동일한 동작이 적용됩니다.

예를 들어 Postman Collection의 요청 정의가 변수 {{full_url}}을 참조하는데 그 변수를 찾을 수 없으면, 값은 {{full_url}} 그대로 남습니다.

동적 Postman 변수#

사용자가 여러 스코프 수준에서 정의할 수 있는 변수 외에도, Postman에는 동적 변수라는 사전 정의된 변수 집합이 있습니다. 동적 변수는 이미 정의되어 있으며, 이름 앞에 달러 기호($)가 붙습니다(예: $guid). 동적 변수는 다른 변수와 마찬가지로 사용할 수 있으며, Postman Client에서는 요청/컬렉션을 실행할 때마다 임의의 값을 생성합니다.

API 보안 테스팅과 Postman의 중요한 차이점은, API 보안 테스팅은 같은 동적 변수를 사용할 때마다 같은 값을 반환한다는 점입니다. 이는 같은 동적 변수를 사용할 때마다 임의의 값을 반환하는 Postman Client의 동작과 다릅니다. 즉 API 보안 테스팅은 동적 변수에 정적 값을 사용하고, Postman은 임의의 값을 사용합니다.

스캔 과정에서 지원되는 동적 변수는 다음과 같습니다:

변수 값
$guid 611c2e81-2ccb-42d8-9ddc-2d0bfa65c1b4
$isoTimestamp 2020-06-09T21:10:36.177Z
$randomAbbreviation PCI
$randomAbstractImage http://no-a-valid-host/640/480/abstract
$randomAdjective auxiliary
$randomAlphaNumeric a
$randomAnimalsImage http://no-a-valid-host/640/480/animals
$randomAvatarImage https://no-a-valid-host/path/to/some/image.jpg
$randomBankAccount 09454073
$randomBankAccountBic EZIAUGJ1
$randomBankAccountIban MU20ZPUN3039684000618086155TKZ
$randomBankAccountName Home Loan Account
$randomBitcoin 3VB8JGT7Y4Z63U68KGGKDXMLLH5
$randomBoolean true
$randomBs killer leverage schemas
$randomBsAdjective viral
$randomBsBuzz repurpose
$randomBsNoun markets
$randomBusinessImage http://no-a-valid-host/640/480/business
$randomCatchPhrase Future-proofed heuristic open architecture
$randomCatchPhraseAdjective Business-focused
$randomCatchPhraseDescriptor bandwidth-monitored
$randomCatchPhraseNoun superstructure
$randomCatsImage http://no-a-valid-host/640/480/cats
$randomCity Spinkahaven
$randomCityImage http://no-a-valid-host/640/480/city
$randomColor fuchsia
$randomCommonFileExt wav
$randomCommonFileName well_modulated.mpg4
$randomCommonFileType audio
$randomCompanyName Grady LLC
$randomCompanySuffix Inc
$randomCountry Kazakhstan
$randomCountryCode MD
$randomCreditCardMask 3622
$randomCurrencyCode ZMK
$randomCurrencyName Pound Sterling
$randomCurrencySymbol £
$randomDatabaseCollation utf8_general_ci
$randomDatabaseColumn updatedAt
$randomDatabaseEngine Memory
$randomDatabaseType text
$randomDateFuture Tue Mar 17 2020 13:11:50 GMT+0530 (India Standard Time)
$randomDatePast Sat Mar 02 2019 09:09:26 GMT+0530 (India Standard Time)
$randomDateRecent Tue Jul 09 2019 23:12:37 GMT+0530 (India Standard Time)
$randomDepartment Electronics
$randomDirectoryPath /usr/local/bin
$randomDomainName trevor.info
$randomDomainSuffix org
$randomDomainWord jaden
$randomEmail Iva.Kovacek61@no-a-valid-host.com
$randomExampleEmail non-a-valid-user@example.net
$randomFashionImage http://no-a-valid-host/640/480/fashion
$randomFileExt war
$randomFileName neural_sri_lanka_rupee_gloves.gdoc
$randomFilePath /home/programming_chicken.cpio
$randomFileType application
$randomFirstName Chandler
$randomFoodImage http://no-a-valid-host/640/480/food
$randomFullName Connie Runolfsdottir
$randomHexColor #47594a
$randomImageDataUri data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20baseProfile%3D%22full%22%20width%3D%22undefined%22%20height%3D%22undefined%22%3E%20%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20fill%3D%22grey%22%2F%3E%20%20%3Ctext%20x%3D%220%22%20y%3D%2220%22%20font-size%3D%2220%22%20text-anchor%3D%22start%22%20fill%3D%22white%22%3Eundefinedxundefined%3C%2Ftext%3E%20%3C%2Fsvg%3E
$randomImageUrl http://no-a-valid-host/640/480
$randomIngverb navigating
$randomInt 494
$randomIP 241.102.234.100
$randomIPV6 dbe2:7ae6:119b:c161:1560:6dda:3a9b:90a9
$randomJobArea Mobility
$randomJobDescriptor Senior
$randomJobTitle International Creative Liaison
$randomJobType Supervisor
$randomLastName Schneider
$randomLatitude 55.2099
$randomLocale ny
$randomLongitude 40.6609
$randomLoremLines Ducimus in ut mollitia.\nA itaque non.\nHarum temporibus nihil voluptas.\nIste in sed et nesciunt in quaerat sed.
$randomLoremParagraph Ab aliquid odio iste quo voluptas voluptatem dignissimos velit. Recusandae facilis qui commodi ea magnam enim nostrum quia quis. Nihil est suscipit assumenda ut voluptatem sed. Esse ab voluptas odit qui molestiae. Rem est nesciunt est quis ipsam expedita consequuntur.
$randomLoremParagraphs Voluptatem rem magnam aliquam ab id aut quaerat. Placeat provident possimus voluptatibus dicta velit non aut quasi. Mollitia et aliquam expedita sunt dolores nam consequuntur. Nam dolorum delectus ipsam repudiandae et ipsam ut voluptatum totam. Nobis labore labore recusandae ipsam quo.
$randomLoremSentence Molestias consequuntur nisi non quod.
$randomLoremSentences Et sint voluptas similique iure amet perspiciatis vero sequi atque. Ut porro sit et hic. Neque aspernatur vitae fugiat ut dolore et veritatis. Ab iusto ex delectus animi. Voluptates nisi iusto. Impedit quod quae voluptate qui.
$randomLoremSlug eos-aperiam-accusamus, beatae-id-molestiae, qui-est-repellat
$randomLoremText Quisquam asperiores exercitationem ut ipsum. Aut eius nesciunt. Et reiciendis aut alias eaque. Nihil amet laboriosam pariatur eligendi. Sunt ullam ut sint natus ducimus. Voluptas harum aspernatur soluta rem nam.
$randomLoremWord est
$randomLoremWords vel repellat nobis
$randomMACAddress 33:d4:68:5f:b4:c7
$randomMimeType audio/vnd.vmx.cvsd
$randomMonth February
$randomNamePrefix Dr.
$randomNameSuffix MD
$randomNatureImage http://no-a-valid-host/640/480/nature
$randomNightlifeImage http://no-a-valid-host/640/480/nightlife
$randomNoun bus
$randomPassword t9iXe7COoDKv8k3
$randomPeopleImage http://no-a-valid-host/640/480/people
$randomPhoneNumber 700-008-5275
$randomPhoneNumberExt 27-199-983-3864
$randomPhrase You can't program the monitor without navigating the mobile XML program!
$randomPrice 531.55
$randomProduct Pizza
$randomProductAdjective Unbranded
$randomProductMaterial Steel
$randomProductName Handmade Concrete Tuna
$randomProtocol https
$randomSemver 7.0.5
$randomSportsImage http://no-a-valid-host/640/480/sports
$randomStreetAddress 5742 Harvey Streets
$randomStreetName Kuhic Island
$randomTransactionType payment
$randomTransportImage http://no-a-valid-host/640/480/transport
$randomUrl https://no-a-valid-host.net
$randomUserAgent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.9.8; rv:15.6) Gecko/20100101 Firefox/15.6.6
$randomUserName Jarrell.Gutkowski
$randomUUID 6929bb52-3ab2-448a-9796-d6480ecad36b
$randomVerb navigate
$randomWeekday Thursday
$randomWord withdrawal
$randomWords Samoa Synergistic sticky copying Grocery
$timestamp 1562757107

예시: 글로벌 스코프#

이 예시에서는 Postman Client에서 글로벌 스코프를 내보내 global-scope.json으로 저장하고, APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 API 보안 테스팅에 제공합니다.

다음은 APISEC_POSTMAN_COLLECTION_VARIABLES 사용 예시입니다:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: global-scope.json
  APISEC_TARGET_URL: http://test-deployment/

예시: 환경 스코프#

이 예시에서는 Postman Client에서 환경 스코프를 내보내 environment-scope.json으로 저장하고, APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 API 보안 테스팅에 제공합니다.

다음은 APISEC_POSTMAN_COLLECTION_VARIABLES 사용 예시입니다:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: environment-scope.json
  APISEC_TARGET_URL: http://test-deployment/

예시: 컬렉션 스코프#

컬렉션 스코프 변수는 내보낸 Postman Collection 파일에 포함되어, APISEC_POSTMAN_COLLECTION 구성 변수를 통해 제공됩니다.

다음은 APISEC_POSTMAN_COLLECTION 사용 예시입니다:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_TARGET_URL: http://test-deployment/

예시: API 보안 테스팅 스코프#

API 보안 테스팅 스코프는 두 가지 주요 목적으로 사용합니다. API 보안 테스팅에서 지원하지 않는 데이터 및 로컬 스코프 변수를 정의하는 것과, 다른 스코프에 정의된 기존 변수의 값을 변경하는 것입니다. API 보안 테스팅 스코프는 APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 제공합니다.

다음은 APISEC_POSTMAN_COLLECTION_VARIABLES 사용 예시입니다:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: dast-api-scope.json
  APISEC_TARGET_URL: http://test-deployment/

dast-api-scope.json 파일은 사용자 정의 JSON 파일 형식을 사용합니다. 이 JSON은 속성의 키-값 쌍으로 이루어진 객체입니다. 키는 변수 이름이고 값은 변수 값입니다. 예를 들면:

{
  "base_url": "http://127.0.0.1/",
  "token": "Token 84816165151"
}

예시: 여러 스코프#

이 예시에서는 글로벌 스코프, 환경 스코프, 컬렉션 스코프를 구성합니다. 첫 단계는 여러 스코프를 내보내는 것입니다.

Postman Collection은 APISEC_POSTMAN_COLLECTION 변수로 제공하고, 다른 스코프는 APISEC_POSTMAN_COLLECTION_VARIABLES로 제공합니다. API 보안 테스팅은 각 파일에 담긴 데이터를 사용하여 제공된 파일이 어느 스코프에 해당하는지 식별할 수 있습니다.

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: global-scope.json,environment-scope.json
  APISEC_TARGET_URL: http://test-deployment/

예시: 변수 값 변경#

내보낸 스코프를 사용하다 보면, API 보안 테스팅에서 사용하기 위해 변수 값을 바꿔야 하는 경우가 자주 있습니다. 예를 들어 컬렉션 스코프 변수에 값이 v2인 api_version 변수가 있는데, 테스트에는 v1 값이 필요할 수 있습니다. 내보낸 컬렉션을 수정해서 값을 바꾸는 대신, API 보안 테스팅 스코프를 사용해 값을 바꿀 수 있습니다. API 보안 테스팅 스코프가 다른 모든 스코프보다 우선하기 때문에 이 방법이 동작합니다.

컬렉션 스코프 변수는 내보낸 Postman Collection 파일에 포함되어, APISEC_POSTMAN_COLLECTION 구성 변수를 통해 제공됩니다.

API 보안 테스팅 스코프는 APISEC_POSTMAN_COLLECTION_VARIABLES 구성 변수를 통해 제공하는데, 그 전에 먼저 파일을 만듭니다. dast-api-scope.json 파일은 사용자 정의 JSON 파일 형식을 사용합니다. 이 JSON은 속성의 키-값 쌍으로 이루어진 객체입니다. 키는 변수 이름이고 값은 변수 값입니다. 예를 들면:

{
  "api_version": "v1"
}

CI 정의:

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: dast-api-scope.json
  APISEC_TARGET_URL: http://test-deployment/

예시: 여러 스코프로 변수 값 변경#

내보낸 스코프를 사용하다 보면, API 보안 테스팅에서 사용하기 위해 변수 값을 바꿔야 하는 경우가 자주 있습니다. 예를 들어 환경 스코프에 값이 v2인 api_version 변수가 있는데, 테스트에는 v1 값이 필요할 수 있습니다. 내보낸 파일을 수정해서 값을 바꾸는 대신 API 보안 테스팅 스코프를 사용할 수 있습니다. API 보안 테스팅 스코프가 다른 모든 스코프보다 우선하기 때문에 이 방법이 동작합니다.

이 예시에서는 글로벌 스코프, 환경 스코프, 컬렉션 스코프, API 보안 테스팅 스코프를 구성합니다. 첫 단계는 여러 스코프를 내보내고 만드는 것입니다.

API 보안 테스팅 스코프는 사용자 정의 JSON 파일 형식을 사용하여 dast-api-scope.json 파일을 만들어 사용합니다. 이 JSON은 속성의 키-값 쌍으로 이루어진 객체입니다. 키는 변수 이름이고 값은 변수 값입니다. 예를 들면:

{
  "api_version": "v1"
}

Postman Collection은 APISEC_POSTMAN_COLLECTION 변수로 제공하고, 다른 스코프는 APISEC_POSTMAN_COLLECTION_VARIABLES로 제공합니다. API 보안 테스팅은 각 파일에 담긴 데이터를 사용하여 제공된 파일이 어느 스코프에 해당하는지 식별할 수 있습니다.

stages:
  - dast

include:
  - template: Security/API-Security.gitlab-ci.yml

variables:
  APISEC_PROFILE: Quick
  APISEC_POSTMAN_COLLECTION: postman-collection.json
  APISEC_POSTMAN_COLLECTION_VARIABLES: global-scope.json,environment-scope.json,dast-api-scope.json
  APISEC_TARGET_URL: http://test-deployment/

첫 번째 스캔 실행#

올바르게 구성하면 CI/CD 파이프라인에 dast Stage와 dast_api job이 포함됩니다. 이 job은 잘못된 구성이 제공된 경우에만 실패합니다. 일반적인 상황에서는 테스트 중 취약점이 발견되더라도 이 job은 항상 성공합니다.

취약점은 스위트 이름과 함께 Security 파이프라인 탭에 표시됩니다. 리포지터리의 기본 브랜치를 대상으로 테스트하면, API 보안 테스팅 취약점이 Security and compliance의 취약점 보고서에도 표시됩니다.

보고되는 취약점 수가 지나치게 많아지지 않도록, API 보안 테스팅 스캐너는 작업당 보고하는 취약점 수를 제한합니다.

API 보안 테스팅 취약점 보기#

API 보안 테스팅 분석기는 JSON 보고서를 생성하며, 이 보고서는 수집되어 GitLab 취약점 화면에 취약점을 채우는 데 사용됩니다.

보고되는 오탐 수를 줄이기 위해 변경할 수 있는 구성에 대해서는 오탐 처리를 참고합니다.

API 보안 테스팅 취약점의 세부 정보 보기#

취약점의 세부 정보를 보려면 다음 단계를 따릅니다:

  1. 프로젝트 또는 머지 리퀘스트에서 취약점을 볼 수 있습니다:

    • 프로젝트에서는 프로젝트의 Secure > Vulnerability report 페이지로 이동합니다. 이 페이지에는 기본 브랜치의 취약점만 모두 표시됩니다.
    • 머지 리퀘스트에서는 머지 리퀘스트의 Security 섹션으로 이동하여 Expand 버튼을 선택합니다. API 보안 테스팅 취약점은 DAST detected N potential vulnerabilities라는 레이블이 붙은 섹션에서 확인할 수 있습니다. 제목을 선택하면 취약점 세부 정보가 표시됩니다.
  2. 취약점 제목을 선택하면 세부 정보가 표시됩니다. 아래 표는 이 세부 정보를 설명합니다.

    필드 설명
    Description 무엇이 변경되었는지를 포함한 취약점 설명입니다.
    Project 취약점이 발견된 네임스페이스와 프로젝트입니다.
    Method 취약점을 발견하는 데 사용된 HTTP 메서드입니다.
    URL 취약점이 발견된 URL입니다.
    Request 취약점을 유발한 HTTP 요청입니다.
    Unmodified Response 수정하지 않은 요청에 대한 응답입니다. 정상적으로 동작하는 응답은 대개 Unmodified Response와 비슷하게 보입니다.
    Actual Response 테스트 요청에 대해 받은 응답입니다.
    Evidence GitLab이 취약점 발생을 판단한 근거입니다.
    Identifiers 이 취약점을 찾는 데 사용된 API 보안 테스팅 Check입니다.
    Severity 취약점의 심각도입니다.
    Scanner Type 테스트를 수행한 스캐너입니다.

보안 대시보드#

보안 대시보드는 그룹, 프로젝트, 파이프라인의 모든 보안 취약점을 한눈에 파악할 수 있는 좋은 곳입니다. 자세한 내용은 보안 대시보드 문서를 참고합니다.

취약점 조치#

취약점이 발견되면 이를 조치할 수 있습니다. 취약점 처리 방법에서 자세한 내용을 확인합니다.

오탐 처리#

오탐은 여러 방법으로 처리할 수 있습니다:

  • 취약점을 무시합니다.
  • 일부 Check는 취약점을 식별할 때 여러 탐지 방법을 사용하는데, 이를 _Assertion_이라고 합니다. Assertion도 끄거나 구성할 수 있습니다. 예를 들어 API 보안 테스팅 스캐너는 기본적으로 HTTP 상태 코드를 사용하여 실제 문제인지 판단합니다. API가 테스트 중 500 오류를 반환하면 취약점이 생성됩니다. 일부 프레임워크는 500 오류를 자주 반환하므로 이것이 항상 바람직하지는 않습니다.
  • 오탐을 발생시키는 Check를 끕니다. 이렇게 하면 그 Check가 어떤 취약점도 생성하지 않습니다. 예를 들어 SQL Injection Check, JSON Hijacking Check가 있습니다.

Check 끄기#

Check는 특정 유형의 테스트를 수행하며, 특정 구성 프로파일에서 켜거나 끌 수 있습니다. 제공되는 구성 파일에는 사용할 수 있는 여러 프로파일이 정의되어 있습니다. 구성 파일의 프로파일 정의에는 스캔 중 활성 상태인 모든 Check가 나열됩니다. 특정 Check를 끄려면 구성 파일의 프로파일 정의에서 그 Check를 제거합니다. 프로파일은 구성 파일의 Profiles 섹션에 정의되어 있습니다.

프로파일 정의 예시:

Profiles:
  - Name: Quick
    DefaultProfile: Empty
    Routes:
      - Route: *Route0
        Checks:
          - Name: ApplicationInformationCheck
          - Name: CleartextAuthenticationCheck
          - Name: FrameworkDebugModeCheck
          - Name: HtmlInjectionCheck
          - Name: InsecureHttpMethodsCheck
          - Name: JsonHijackingCheck
          - Name: JsonInjectionCheck
          - Name: SensitiveInformationCheck
          - Name: SessionCookieCheck
          - Name: SqlInjectionCheck
          - Name: TokenCheck
          - Name: XmlInjectionCheck

JSON Hijacking Check를 끄려면 다음 줄을 제거합니다:

          - Name: JsonHijackingCheck

그 결과 다음과 같은 YAML이 됩니다:

- Name: Quick
  DefaultProfile: Empty
  Routes:
    - Route: *Route0
      Checks:
        - Name: ApplicationInformationCheck
        - Name: CleartextAuthenticationCheck
        - Name: FrameworkDebugModeCheck
        - Name: HtmlInjectionCheck
        - Name: InsecureHttpMethodsCheck
        - Name: JsonInjectionCheck
        - Name: SensitiveInformationCheck
        - Name: SessionCookieCheck
        - Name: SqlInjectionCheck
        - Name: TokenCheck
        - Name: XmlInjectionCheck

Check의 Assertion 끄기#

Assertion은 Check가 수행한 테스트에서 취약점을 탐지합니다. 많은 Check가 Log Analysis, Response Analysis, Status Code 같은 여러 Assertion을 지원합니다. 취약점이 발견되면 사용된 Assertion이 함께 제공됩니다. 기본적으로 어떤 Assertion이 켜져 있는지 확인하려면 구성 파일의 Check 기본 구성을 참고합니다. 이 섹션은 Checks라고 합니다.

이 예시는 SQL Injection Check를 보여줍니다:

- Name: SqlInjectionCheck
  Configuration:
    UserInjections: []
  Assertions:
    - Name: LogAnalysisAssertion
    - Name: ResponseAnalysisAssertion
    - Name: StatusCodeAssertion

여기서 기본적으로 세 개의 Assertion이 켜져 있는 것을 볼 수 있습니다. 오탐의 흔한 원인은 StatusCodeAssertion입니다. 이를 끄려면 Profiles 섹션에서 구성을 수정합니다. 이 예시는 나머지 두 Assertion(LogAnalysisAssertion, ResponseAnalysisAssertion)만 제공합니다. 이렇게 하면 SqlInjectionCheck가 StatusCodeAssertion을 사용하지 않게 됩니다:

Profiles:
  - Name: Quick
    DefaultProfile: Empty
    Routes:
      - Route: *Route0
        Checks:
          - Name: ApplicationInformationCheck
          - Name: CleartextAuthenticationCheck
          - Name: FrameworkDebugModeCheck
          - Name: HtmlInjectionCheck
          - Name: InsecureHttpMethodsCheck
          - Name: JsonHijackingCheck
          - Name: JsonInjectionCheck
          - Name: SensitiveInformationCheck
          - Name: SessionCookieCheck
          - Name: SqlInjectionCheck
            Assertions:
              - Name: LogAnalysisAssertion
              - Name: ResponseAnalysisAssertion
          - Name: TokenCheck
          - Name: XmlInjectionCheck