Cloud Armor로 에지 캐시 보호

1. 소개

Google Cloud Armor 에지 보안 정책을 사용하면 Google Cloud CDN 및 Google Cloud Storage에서 캐시된 객체에 대한 액세스를 제한할 수 있습니다. 이렇게 하는 이유의 예로는 사용자가 제한된 지역에서 스토리지 버킷의 객체에 액세스하지 못하도록 하거나 라이선스가 있는 지역에서 미디어 배포가 필터링되도록 하는 경우를 들 수 있습니다.

이 실습에서는 GCS 버킷을 만들고, 버킷에 이미지를 업로드하고, 이를 부하 분산기에 결합한 다음 Cloud CDN 및 Edge Security 정책을 사용 설정합니다.

학습할 내용

  • 캐시 가능한 콘텐츠로 Cloud Storage 버킷을 설정하는 방법
  • 콘텐츠를 보호하기 위해 에지 보안 정책을 만드는 방법
  • 에지 보안 정책이 예상대로 작동하는지 확인하는 방법

필요한 항목

  • 기본 네트워킹 및 HTTP 지식
  • 기본 Unix/Linux 명령줄 지식

2. 설정 및 요구사항

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud Console은 고유한 문자열을 자동으로 생성합니다. 일반적으로 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID를 참조해야 하며(일반적으로 PROJECT_ID로 식별됨), 마음에 들지 않는 경우 임의로 다시 생성하거나 직접 지정해서 사용할 수 있는지 확인하세요. 프로젝트가 생성되면 프로젝트 ID가 '고정'됩니다.
  • 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참조하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼을 마친 후 비용이 결제되지 않도록 리소스를 종료하려면 Codelab의 끝에 있는 '삭제' 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

GCP 콘솔에서 오른쪽 상단 툴바의 Cloud Shell 아이콘을 클릭합니다.

bce75f34b2c53987.png

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

f6ef2b5f13479f3a.png

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉토리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 실습의 모든 작업은 브라우저만으로 수행할 수 있습니다.

시작하기 전에

Cloud Shell 내에서 프로젝트 ID가 설정되어 있는지 확인합니다.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
echo $PROJECT_ID

API 사용 설정

필요한 모든 서비스 사용 설정

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable monitoring.googleapis.com

3. Cloud Storage 버킷 만들기

Cloud Console에서 탐색 메뉴 > Cloud Storage > 브라우저로 이동합니다. 버킷 만들기를 클릭합니다.

baf3d3c74282ecba.png

버킷 이름 지정 규칙:

  • 버킷 네임스페이스는 전역적이며 전체 공개로 표시되기 때문에 버킷 이름에 민감한 정보를 포함해서는 안 됩니다.
  • 버킷 이름에는 소문자, 숫자, 대시(-), 밑줄(_), 점(.)만 포함해야 합니다. 점이 포함된 이름은 확인이 필요합니다.
  • 버킷 이름은 숫자 또는 문자로 시작하고 끝나야 합니다.
  • 버킷 이름은 3자~63자까지 포함할 수 있습니다. 점을 포함하는 이름은 최대 222자를 포함할 수 있으나, 점으로 구분된 각 부분은 63자 이하여야 합니다.
  • 버킷 이름은 마침표로 구분된 십진수 표기 형식의 IP 주소로 표시할 수 없습니다(예: 192.168.5.4).
  • 버킷 이름은 'goog' 접두사로 시작될 수 없습니다.
  • 버킷 이름은 'google' 또는 'google'의 철자를 약간 변경한 문자열을 포함할 수 없습니다.
  • 또한 DNS 규정 준수와 향후 호환성을 위해 밑줄(_)을 사용하지 말아야 하며 마침표를 다른 마침표 혹은 대시와 연달아 사용해서는 안 됩니다. 예를 들어 '..'이나 '-.' 또는 '.-'는 DNS 이름으로 유효하지 않습니다.

계속을 클릭합니다.

위치 유형: 리전

위치: 사용자와 멀리 떨어진 지역을 선택합니다.

계속을 클릭합니다.

기본 스토리지 클래스: 표준

계속을 클릭합니다.

공개 액세스 방지에서 이 버킷에 공개 액세스 방지 적용 체크박스를 선택 해제합니다.

액세스 제어에서 세분화된 액세스 제어를 선택합니다.

계속을 클릭합니다.

버킷을 구성했으면 만들기를 클릭합니다.

이상으로 Cloud Storage 버킷 만들기가 완료되었습니다.

4. 버킷에 객체 업로드

이제 버킷에 객체를 업로드합니다.

먼저 이 이미지를 Cloud Shell의 임시 인스턴스로 다운로드합니다. 아래 예에서는 Google 홈페이지의 Google 이미지가 사용됩니다.

Cloud Shell 사용

wget --output-document google.png https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

gsutil cp 명령어를 사용하여 이미지를 저장한 위치의 이미지를 생성된 버킷에 업로드합니다.

Cloud Shell 사용

gsutil cp google.png gs://YOUR-BUCKET-NAME

이제 다운로드한 이미지를 삭제합니다.

Cloud Shell 사용

rm google.png

개체를 찾아 오른쪽에 있는 점 3개를 클릭하고 권한을 공개로 수정합니다.

821aad82d8633922.png

30a975d3ad22d33d.png

5. 부하 분산기 만들기

다음으로 HTTP 부하 분산기를 만듭니다.

네트워킹 >>으로 이동합니다. 네트워크 서비스 >> 부하 분산 >> 부하 분산기 만들기 >> HTTP 부하 분산기 >> 인터넷과 VM 연결 >> 기본 HTTP(S) 부하 분산기

먼저 만들 부하 분산기의 이름을 만듭니다.

백엔드 버킷 만들기

방금 만든 버킷인 새 백엔드 버킷을 만들고 '사용 설정된 CDN' 및 정적 콘텐츠 캐시를 선택합니다. '만들기'를 클릭합니다.

ed392a56538d499e.png

호스트 및 경로 규칙 만들기

왼쪽에 있는 호스트 및 경로 규칙으로 이동합니다. 간단한 호스트/경로 규칙을 사용하고 모든 요청을 버킷으로 전송합니다.

7c1a664e0d1f15b0.png

프런트엔드 구성 만들기

프런트엔드 구성을 선택합니다. 프런트엔드 구성에는 HTTP (인증서가 있으면 HTTPS도 가능)와 임시 IP 주소를 사용하며 프리미엄 등급 네트워크를 선택했는지 확인합니다.

2597a5e63d618622.png

'만들기' 클릭

부하 분산기 IP 가져오기

프로젝트의 부하 분산기 목록에서 부하 분산기 이름을 클릭하여 콘솔에서 부하 분산기 IP를 가져옵니다.

9b757362d806e835.png

부하 분산기 쿼리

몇 분 후에 업로드한 객체에 대해 부하 분산기를 쿼리해 봅니다. 부하 분산기 IP 주소와 이미지 이름이 필요합니다. 명령어는 다음과 같은 구조입니다.

터미널에서 출발

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

출력

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtoILI76KVsvBvdVGvSfzaxys1m3zYqCepBrmJxAI48ni24cWCRIdNu-53PX3DS6iycxp6xwFbMpwtcHHZQUQmEBxAgng
< Expires: Mon, 13 Dec 2021 22:58:26 GMT
< Date: Mon, 13 Dec 2021 21:58:26 GMT
< Cache-Control: public, max-age=3600
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer

CDN 또는 부하 분산 모니터링을 통해 CDN에서 콘텐츠가 제공되고 있는지 확인합니다. 100% 적중률에 근접할 수 있습니다. 몇 가지 쿼리를 실행해야 하는 경우 다음을 수행할 수 있습니다.

터미널에서 출발

#for i in `seq 1 50`; do curl http://%loadbalncer-IP%/google.png; done

Cloud CDN에서 제공하는 콘텐츠 확인

네트워크 서비스 >> CDN

a52d0ba4c084aa05.png

6. GCS에서 객체 삭제

캐시가 채워졌으므로 이제 버킷에서 객체를 삭제하여 백엔드가 아닌 캐시에 정책을 적용합니다.

Cloud Storage >> %bucket name% >> 객체

이미지를 선택하고 삭제합니다.

a1cc1bb9a0ff41df.png

7. CDN 캐시의 에지 보안 정책 만들기

Network Security(네트워크 보안) >> Cloud Armor를 클릭하고 '정책 만들기'를 클릭합니다.

다음 중 하나를 선택하세요.

정책 유형: 에지 보안 정책

기본 작업: 거부

7a12374be33026fd.png

b7c4efc091272358.png

77ddbcddd07b65d2.png

백엔드 버킷에 정책을 적용합니다.

8. 에지 보안 정책 검증

이제 백엔드 버킷 앞에 에지 보안 정책을 만들었으므로 예상대로 작동하는지 확인합니다.

보안 정책 확인하기

몇 분이 지나면 Cloud Armor 정책이 실행 중인지 확인할 수 있습니다. 명령줄에서 다음 명령어를 실행하면 403이 표시됩니다.

터미널에서 출발

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

출력

curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< X-GUploader-UploadID: ADPycdtS6FtJOGIsiWYDrAAE8VFeQuNutcvbGoQe2t8EZxsuspVtmCjyiTv_P3CNktroHMOGFXkTCfG-Jj-rUO60ZGPpEbpqcw
< Content-Type: application/xml; charset=UTF-8
< Content-Length: 111
< Date: Mon, 13 Dec 2021 23:09:35 GMT
< Expires: Mon, 13 Dec 2021 23:09:35 GMT
< Cache-Control: private, max-age=0
< Server: UploadServer
<

로그 조사

그런 다음 로그를 확인하여 적용된 에지 보안 정책을 확인할 수 있습니다. 작업 >>으로 이동합니다. 기록 >> 로그 탐색기

쿼리에 아래 스니펫을 입력하고 실행을 클릭합니다.

14972af5ae6c182a.png

resource.type:(http_load_balancer) AND jsonPayload.enforcedEdgeSecurityPolicy.name:(%SECURITY_POLICY_NAME%)

403 응답과 적용된 보안 정책을 확인합니다.

cddc48ca93ad79ca.png

보안 정책 삭제하기

보안 정책을 삭제하고 캐시에서 객체를 쿼리하세요.

Network Security(네트워크 보안) >> Cloud Armor >> %정책 이름% >> 대상으로 이동하고 대상 버킷을 삭제합니다.

350655729a89eb33.png

정책 삭제 확인

몇 분이 지나면 스토리지 버킷의 리소스로 다른 curl을 전송합니다. 이번에는 200개의 응답을 받게 됩니다.

터미널에서 출발

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

출력

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png

*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtI7f49P3MSuZSZ8vl6RwfwmnIDJ59EeSKp7UPvLPawdaiRHXiNWLtseQTxUxceWOvSLvpYmT3pWVkV4qeIP7M
< Date: Mon, 13 Dec 2021 23:06:46 GMT
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer
< Age: 1621
< Cache-Control: public,max-age=3600
<
{ [775 bytes data]
* Connection #0 to host 34.98.81.123 left intact
* Closing connection 0

축하합니다. Cloud Armor Edge 보안 정책에 대한 실습을 완료했습니다.

©2020 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.

9. 실습 정리

Network Security(네트워크 보안) >> Cloud Armor >> %POLICY NAME%을(를) 클릭하고 삭제를 선택합니다.

21eefb5f375e8fee.png

Cloud Storage로 이동하여 만든 버킷을 선택하고 삭제를 클릭합니다.

ef2fa8d45c1d3452.png

네트워킹 >>으로 이동합니다. 네트워크 서비스 >> 부하 분산. 생성된 부하 분산기를 선택하고 삭제를 클릭합니다.

ee2e78c10f4104eb.png

10. 축하합니다.

Cloud Armor로 에지 캐시 보호 Codelab을 완료했습니다.

학습한 내용

  • Cloud Storage 버킷 및 연결된 Cloud 부하 분산기를 설정하는 방법
  • Cloud Armor 에지 보안 정책을 만드는 방법
  • 에지 보안 정책이 의도한 대로 작동하는지 확인하는 방법

다음 단계

  • Compute Engine 리소스에서 캐시 적중으로 에지 보안 정책을 설정해 보세요.