앱 보안 개요

Google Cloud Platform의 높은 보안성에도 불구하고 App Engine 앱을 보호하고 취약점을 파악하기 위해서는 몇 가지 단계를 거쳐야 합니다.

다음 기능을 사용하여 App Engine 앱이 안전한지 확인합니다. Google 보안 모델 및 GCP 프로젝트 보호를 위한 단계에 대한 자세한 내용은 Google Cloud Platform 보안을 참조하세요.

HTTPS 요청

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

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

    https://[VERSION_ID]-dot-[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com

  • 팁: 간단히 각 리소스 사이의 점을 -dot-로 바꿔 HTTP URL을 HTTPS로 변환할 수 있습니다. 예를 들면 다음과 같습니다.

    http://[SERVICE_ID].[MY_PROJECT_ID].appspot.com
    https://[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com

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

커스텀 도메인

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

액세스 제어

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

App Engine 방화벽

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

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

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

보안 스캐너

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

보안 스캐너를 사용하려면 개발자가 GCP 프로젝트의 소유자여야 합니다. 역할 할당에 대한 자세한 내용은 프로젝트 액세스 권한 부여를 참조하세요.

Google Cloud Platform Console에서 보안 검사를 실행하여 App Engine 앱의 보안 취약점을 식별할 수 있습니다. 보안 스캐너 실행에 대한 자세한 내용은 Security Scanner 빠른 시작을 참조하세요.

ASP.Net Core 데이터 보호 제공업체

ASP.NET Core 데이터 보호 스택은 암호화를 사용하여 쿠키 및 CSRF 방지 토큰과 같은 웹 애플리케이션 데이터를 보호합니다.

기본 IDataProtectionProvider는 App Engine과 호환되지 않는 웹 서버를 실행 중인 머신의 로컬에 암호화 키를 저장하므로 오류 메시지가 표시됩니다.

Google.Cloud.AspNetCore.DataProtection.StorageGoogle.Cloud.AspNetCore.DataProtection.Kms를 사용하여 이 문제를 해결할 수 있습니다. 다음을 수행하여 이 라이브러리를 사용할 수 있습니다.

  1. Cloud Storage 버킷을 만듭니다.

  2. Cloud Key Management Service 키링 및 키를 만듭니다.

    gcloud kms keyrings create dataprotectionprovider --location global
    gcloud kms keys create key --location global --keyring `
        dataprotectionprovider --purpose=encryption
    
  3. 키링을 사용하도록 서비스 계정 권한을 설정합니다.

    gcloud kms keyrings add-iam-policy-binding dataprotectionprovider `
        --location 'global' `
        --member serviceAccount:my-project-id@appspot.gserviceaccount.com  `
        --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    
  4. 애플리케이션의 .csproj에 라이브러리를 추가합니다.

    dotnet add package Google.Cloud.AspNetCore.DataProtection.Kms
    dotnet add package Google.Cloud.AspNetCore.DataProtection.Storage
    
  5. 키가 저장될 버킷 및 객체 이름(파일 이름)과 KMS 키 이름을 애플리케이션의 appsettings.json 파일에 추가합니다.

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "DataProtection": {
        "Bucket": "YOUR-BUCKET",
        "Object": "DataProtectionProviderKeys.xml",
        "KmsKeyName": "projects/YOUR-PROJECT-ID/locations/global/keyRings/dataprotectionprovider/cryptoKeys/key"
      }
    }
    
  6. Startup.cs 파일에 다음을 추가하여 Google 라이브러리를 사용하도록 ASP.NET Core의 데이터 보호 스택을 구성할 수 있습니다.

    
    using Google.Cloud.AspNetCore.DataProtection.Kms;
    using Google.Cloud.AspNetCore.DataProtection.Storage;
        public class Startup
        {
            public void ConfigureServices(IServiceCollection services)
            {
                // Antiforgery tokens require data protection.
                services.AddDataProtection()
                    // Store keys in Cloud Storage so that multiple instances
                    // of the web application see the same keys.
                    .PersistKeysToGoogleCloudStorage(
                        Configuration["DataProtection:Bucket"],
                        Configuration["DataProtection:Object"])
                    // Protect the keys with Google KMS for encryption and fine-
                    // grained access control.
                    .ProtectKeysWithGoogleKms(
                        Configuration["DataProtection:KmsKeyName"]);
    

설정 스크립트가 포함된 실행 가능한 예시를 Google Cloud Platform GitHub 저장소에서 다운로드할 수 있습니다.