앱 보안 개요

리전 ID

REGION_ID는 앱을 만들 때 선택한 리전을 기준으로 Google에서 할당하는 축약된 코드입니다. 일부 리전 ID는 일반적으로 사용되는 국가 및 주/도 코드와 비슷하게 표시될 수 있지만 코드는 국가 또는 주/도와 일치하지 않습니다. 2020년 2월 이후에 생성된 앱의 경우 REGION_ID.r이 App Engine URL에 포함됩니다. 이 날짜 이전에 만든 기존 앱의 경우 URL에서 리전 ID는 선택사항입니다.

리전 ID에 대해 자세히 알아보세요.

Google Cloud의 높은 보안성에도 불구하고 App Engine 앱을 보호하고 취약점을 식별하려면 몇 단계를 거쳐야 합니다.

다음 기능을 사용하여 App Engine 앱의 보안을 확인하세요. Google 보안 모델 및 Google Cloud 프로젝트를 보호하기 위해 취할 수 있는 단계에 대한 자세한 내용은 Google Cloud Platform 보안을 참조하세요.

HTTPS 요청

HTTPS 요청을 사용하여 App Engine 앱에 안전하게 액세스할 수 있습니다. 앱이 구성된 방법에 따라 다음 옵션을 사용할 수 있습니다.

appspot.com 도메인
  • https URL 프리픽스를 사용하여 Google Cloud 프로젝트의 default 서비스로 HTTPS 요청을 보냅니다. 예를 들면 다음과 같습니다.
    https://PROJECT_ID.REGION_ID.r.appspot.com
  • App Engine 앱의 특정 리소스를 타겟팅하려면 -dot- 구문을 사용하여 타겟팅할 각 리소스를 구분합니다. 예를 들면 다음과 같습니다.
    https://VERSION-dot-SERVICE-dot-PROJECT_ID.REGION_ID.r.appspot.com

  • HTTP URL을 HTTPS URL로 변환하려면 각 리소스 사이의 마침표를 -dot-로 바꿉니다. 예를 들면 다음과 같습니다.
    http://SERVICE_ID.PROJECT_ID.REGION_ID.r.appspot.com
    https://SERVICE_ID-dot-PROJECT_ID.REGION_ID.r.appspot.com

HTTPS URL 및 리소스 타겟팅에 대한 자세한 내용은 요청 라우팅 방법을 참조하세요.

커스텀 도메인

커스텀 도메인으로 HTTPS 요청을 보내려면 App Engine을 통해 프로비저닝된 관리형 SSL 인증서를 사용할 수 있습니다. 자세한 내용은 SSL로 커스텀 도메인 보호를 참조하세요.

앱 핸들러

앱 핸들러에 HTTPS를 강제 적용하려면 app.yaml에서 핸들러마다 secure: always 요소를 지정하면 됩니다. 예를 들면 다음과 같습니다.

handlers:
- url: /.*
  script: auto
  secure: always
  redirect_http_response_code: 301

secure: always를 사용하면 모든 HTTP 트래픽이 동일한 경로를 통해 HTTPS URL로 리디렉션됩니다. 자세한 내용은 app.yaml 구성 참조를 확인하세요.

액세스 제어

각 Google Cloud 프로젝트에서 액세스 제어를 설정하여 App Engine을 비롯한 프로젝트에 있는 서비스에 액세스할 수 있는 사용자를 지정합니다. 각 계정에 앱을 지원하는 데 필요한 권한만 있도록 계정마다 다른 역할을 할당할 수 있습니다. 자세한 내용은 액세스 제어 설정을 참조하세요.

App Engine 방화벽

App Engine 방화벽을 사용하면 지정된 IP 주소 범위에서 들어오는 요청을 허용하거나 거부할 수 있는 규칙을 통해 App Engine 앱에 대한 액세스를 제어할 수 있습니다. 방화벽으로 차단되는 트래픽 또는 대역폭의 경우 요금이 청구되지 않습니다. 방화벽을 만들면 다음이 가능해집니다.

특정 네트워크 내 트래픽만 허용
특정 네트워크의 특정 IP 주소 범위만 앱에 액세스할 수 있는지 확인합니다. 예를 들어 앱 테스트 단계 중에는 회사의 비공개 네트워크에 있는 IP 주소 범위만 허용하는 규칙을 만듭니다. 그런 다음 출시 프로세스를 진행하면서 방화벽 규칙을 만들고 수정하여 액세스 범위를 제어할 수 있습니다. 이렇게 하면 회사 내부 또는 외부의 특정 조직만 개발 중인 앱에 액세스할 수 있습니다.
특정 서비스의 트래픽만 허용
App Engine 앱에 대한 모든 트래픽이 최우선적으로 특정 서비스를 통해 프록시 처리되도록 합니다. 예를 들어 타사 웹 애플리케이션 방화벽(WAF)을 사용하여 앱에 대한 요청을 프록시 처리하는 경우 방화벽 규칙을 만들어 WAF에서 전달되는 요청을 제외한 모든 요청을 거부할 수 있습니다.
악의적인 IP 주소 차단
Google Cloud에는 공격을 방지하기 위한 많은 메커니즘이 마련되어 있지만 App Engine 방화벽을 사용하여 악의적인 의도를 보이는 IP 주소의 트래픽을 차단하거나, 서비스 거부 공격 및 이와 유사한 형태의 악용 사례로부터 앱을 보호할 수 있습니다. IP 주소 또는 서브네트워크를 거부 목록에 추가하여 해당 주소 및 서브네트워크에서 라우팅된 요청이 App Engine 앱에 도달하기 전에 거부되도록 할 수 있습니다.

규칙 만들기와 방화벽 구성에 대한 자세한 내용은 방화벽으로 앱 액세스 제어를 참조하세요.

인그레스 제어

이 섹션에서는 인그레스 설정을 사용하여 App Engine 앱에 대한 네트워크 액세스를 제한하는 방법을 설명합니다. 네트워크 수준에서 기본적으로 인터넷의 모든 리소스는 자체 appspot URL에서 또는 App Engine에서 설정한 커스텀 도메인에서 App Engine 앱에 연결할 수 있습니다. 예를 들어 appspot.com URL 형식은 SERVICE_ID.PROJECT_ID.REGION_ID.r.appspot.com입니다.

인그레스에 다른 설정을 지정하여 이 기본값을 변경할 수 있습니다. 기본 appspot.com URL을 포함한 모든 인그레스 경로에는 인그레스 설정이 적용됩니다. 인그레스가 서비스 수준에서 설정됩니다.

사용 가능한 인그레스 설정

사용 가능한 설정은 다음과 같습니다.

설정 설명
내부 가장 강력한 제한입니다. 다음과 같은 프로젝트의 VPC 네트워크에 연결된 리소스의 요청을 허용합니다.
이러한 소스의 요청은 appspot.com URL에서 서비스에 액세스하는 경우에도 Google 네트워크 내에서 유지됩니다. 인터넷을 포함한 다른 소스의 요청은 appspot.com URL 또는 커스텀 도메인에서 서비스에 연결할 수 없습니다. 멀티테넌시(즉, 같은 프로젝트 내 여러 트러스트 도메인)는 지원되지 않습니다.
내부 및 Cloud Load Balancing 다음 리소스의 요청을 허용합니다.
  • 보다 제한적인 내부 설정에서 허용하는 리소스
  • 외부 애플리케이션 부하 분산기
내부 및 Cloud Load Balancing 설정을 사용하여 인터넷에서 직접 요청이 아닌 외부 애플리케이션 부하 분산기의 요청을 허용합니다. appspot.com URL에 대한 요청은 외부 애플리케이션 부하 분산기를 우회하므로 이 설정은 외부 요청이 appspot.com URL에 도달하지 못하게 합니다.
전체 가장 경미한 제한입니다. 인터넷에서 appspot.com URL로 직접 보내는 요청을 포함하여 모든 요청을 허용합니다.

내부 서비스 액세스

다음 고려사항이 적용됩니다.

  • 공유 VPC의 요청에서 트래픽은 App Engine 앱이 공유 VPC 호스트 프로젝트에 배포된 경우에만 내부에 있는 것으로 간주됩니다. App Engine 앱이 공유 VPC 서비스 프로젝트에 배포된 경우 앱 자체 프로젝트가 소유한 네트워크의 트래픽만 내부에 있습니다. 다른 공유 VPC의 트래픽을 포함한 다른 모든 트래픽은 외부에 있습니다.

  • 내부 서비스에 액세스할 때 일반적으로 공개 URL(기본 appspot.com URL 또는 App Engine에서 설정된 커스텀 도메인)을 사용할 때처럼 호출합니다.

  • 같은 프로젝트의 VPC 네트워크 내에서 실행 중인 Compute Engine VM 인스턴스나 다른 리소스의 요청의 경우 추가 설정이 필요하지 않습니다.

  • 다른 App Engine 서비스의 요청 또는 같은 프로젝트의 Cloud Run 또는 Cloud Run 함수의 요청의 경우 공유 VPC 네트워크에 연결의 설명대로 서비스나 함수를 VPC 네트워크에 연결하고 커넥터를 통해 모든 이그레스를 라우팅합니다.

  • 동일한 프로젝트의 VPC 네트워크 내 리소스에서 보내는 요청은 공개 IP 주소가 포함된 리소스라고 해도 내부로 분류됩니다.

  • Cloud VPN을 통해 VPC 네트워크에 연결된 온프레미스 리소스의 요청은 internal로 간주됩니다.

인그레스 설정 보기

콘솔

  1. App Engine 서비스 페이지로 이동합니다.

    서비스 페이지로 이동

  2. 인그레스 열을 찾습니다. 각 서비스의 경우 이 열의 값은 인그레스 설정을 모두(기본값), 내부 + 부하 분산 또는 내부 중 하나로 표시합니다.

gcloud

gcloud CLI를 사용하여 서비스의 인그레스 설정을 보려면 다음 작업을 수행합니다.

gcloud app services describe SERVICE

SERVICE를 서비스 이름으로 바꿉니다.

예를 들어 기본 서비스 실행에 대한 인그레스 설정 및 기타 정보를 보려면 다음 작업을 수행합니다.

gcloud app services describe default

인그레스 설정 수정

콘솔

  1. App Engine 서비스 페이지로 이동합니다.

    서비스 페이지로 이동

  2. 수정하려는 서비스를 선택합니다.

  3. 인그레스 설정 수정을 클릭합니다.

  4. 메뉴에서 원하는 인그레스 설정을 선택하고 저장을 클릭합니다.

gcloud

gcloud CLI를 사용하여 서비스의 인그레스 설정을 업데이트하려면 다음 작업을 수행합니다.

gcloud app services update SERVICE --ingress=INGRESS

다음과 같이 바꿉니다.

  • SERVICE: 서비스 이름입니다.
  • INGRESS: 적용할 인그레스 제어입니다. all, internal-only 또는 internal-and-cloud-load-balancing 중 하나입니다.

예를 들면 다음과 같습니다.

  • 동일한 프로젝트에 있는 Cloud Load Balancing과 VPC 네트워크의 트래픽만 허용하도록 App Engine 앱의 기본 서비스를 업데이트하려면 다음 작업을 수행합니다.

    gcloud app services update default --ingress=internal-and-cloud-load-balancing
  • 동일한 프로젝트에 있는 VPC 네트워크의 트래픽만 허용하도록 'internal-requests'라는 서비스를 업데이트하려면 다음 작업을 수행합니다.

    gcloud app services update internal-requests --ingress=internal-only

이그레스 설정

서버리스 VPC 액세스를 사용하는 경우 App Engine 서비스의 이그레스 설정을 지정할 수 있습니다.

기본적으로 내부 IP 주소 및 내부 DNS 이름에 대한 요청만 서버리스 VPC 액세스 커넥터를 통해 라우팅됩니다. app.yaml 파일에서 서비스의 이그레스 설정을 지정할 수 있습니다.

이그레스 설정은 URL Fetch 서비스와 호환되지 않습니다. 아직 수행하지 않았다면 소켓을 사용하여 URL Fetch 기본값을 사용 중지하고 urlfetch 패키지의 명시적 사용을 중지합니다. urlfetch 라이브러리를 사용하면 이그레스 설정이 무시되며 요청은 서버리스 VPC 액세스 커넥터를 통해 라우팅되지 않습니다.

App Engine 서비스의 이그레스 동작을 구성하려면 다음 안내를 따르세요.

  1. 서비스 app.yaml 파일의 vpc_access_connector 필드에 egress_setting 속성을 추가합니다.

    vpc_access_connector:
      name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME
      egress_setting: EGRESS_SETTING
    

    다음과 같이 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID
    • REGION: 커넥터가 위치한 리전
    • CONNECTOR_NAME: 커넥터 이름
    • EGRESS_SETTING: 다음 중 하나로 바꿉니다.
      • private-ranges-only: 기본값. RFC 1918RFC 6598 IP 주소 범위 또는 내부 DNS 이름으로의 요청만 VPC 네트워크로 라우팅됩니다. 다른 모든 요청은 인터넷으로 직접 라우팅됩니다.
      • all-traffic: 서비스의 모든 아웃바운드 요청은 VPC 네트워크로 라우팅됩니다. 그런 다음 요청에 VPC 네트워크의 방화벽, DNS, 라우팅 규칙이 적용됩니다. 모든 아웃바운드 요청을 VPC 네트워크에 라우팅하면 서버리스 VPC 액세스 커넥터에서 처리되는 이그레스 양이 늘어나고 요금이 청구될 수 있습니다.
  2. 서비스를 배포합니다.

    gcloud app deploy
    

보안 스캐너

Google Cloud Web Security Scanner는 App Engine 앱을 크롤링하고, 시작 URL 범위 내에 있는 모든 링크를 추적하고, 가능한 많은 사용자 입력 및 이벤트 핸들러 실행을 시도하면서 취약점을 발견합니다.

보안 스캐너를 사용하려면 Google Cloud 프로젝트의 소유자여야 합니다. 역할 할당에 대한 자세한 내용은 액세스 제어 설정을 참조하세요.

Google Cloud 콘솔에서 보안 스캔을 실행하여 App Engine 앱의 보안 취약점을 식별할 수 있습니다. Security Scanner 실행에 대한 자세한 내용은 Web Security Scanner 사용을 참조하세요.