บทแนะนำพื้นฐานเกี่ยวกับการควบคุมบริการ VPC II - การแก้ปัญหาการละเมิดข้อมูลขาออก

1. บทนำ

การควบคุมบริการ VPC (VPC-SC) คือการควบคุมความปลอดภัยระดับองค์กรใน Google Cloud ที่ช่วยให้ลูกค้าองค์กรสามารถลดความเสี่ยงในการขโมยข้อมูล การควบคุมบริการ VPC มอบการเข้าถึงบริการแบบ Zero Trust แบบ Zero Trust โดยการเปิดโอกาสให้ไคลเอ็นต์เข้าถึง IP, บริบทของไคลเอ็นต์ และพารามิเตอร์อุปกรณ์ที่ได้รับอนุญาต รวมถึงเชื่อมต่อกับบริการแบบกลุ่มผู้ใช้จำนวนมากจากอินเทอร์เน็ตและบริการอื่นๆ เพื่อลดการสูญเสียทั้งโดยตั้งใจและไม่ได้ตั้งใจ ตามที่เห็นในบทแนะนำพื้นฐานของการควบคุมบริการ VPC 1 คุณสามารถใช้การควบคุมบริการ VPC เพื่อสร้างขอบเขตที่ปกป้องทรัพยากรและข้อมูลของบริการที่คุณระบุอย่างชัดเจน

เป้าหมายของบทแนะนำนี้คือ

  • ทำความเข้าใจพื้นฐานของการควบคุมบริการ VPC
  • อัปเดตขอบเขตบริการและทดสอบโดยใช้โหมดทดลองเรียกใช้
  • ปกป้อง 2 บริการด้วยการควบคุมบริการ VPC
  • แก้ปัญหาการละเมิดข้อมูลขาออกในการควบคุมบริการ VPC ขณะแสดงรายการออบเจ็กต์จาก Cloud Storage

2. การตั้งค่าและข้อกำหนด

สำหรับบทแนะนำนี้ เราจำเป็นต้องมีข้อกำหนดล่วงหน้าต่อไปนี้

dbec101f41102ca2.png

การตั้งค่าทรัพยากร

  1. ตั้งค่าทรัพยากรตามที่อธิบายไว้ใน "การตั้งค่าทรัพยากร" ส่วนบทแนะนำพื้นฐานของการควบคุมบริการ VPC 1
  2. ยืนยันว่าคุณมีสิทธิ์ที่จำเป็นในการดูแลระบบ Cloud Storage
  3. สำหรับบทแนะนำนี้ เราจะเริ่มใช้ CLI แทน Cloud Console ในสภาพแวดล้อมการพัฒนา ให้ตั้งค่า gcloud CLI ดังนี้
  • Cloud Shell: หากต้องการใช้เทอร์มินัลออนไลน์ที่มีการตั้งค่า gcloud CLI ไว้แล้ว ให้เปิดใช้งาน Cloud Shell

เปิดใช้งาน Cloud Shell โดยคลิกไอคอนที่มุมขวาบนของ Cloud Console เซสชันอาจใช้เวลา 2-3 วินาทีในการเริ่มต้น ดูรายละเอียดเพิ่มเติมได้ที่คำแนะนำ Cloud Shell

a0ceb29950db4eac.png

ค่าใช้จ่าย

คุณต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้จะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินที่นอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud ใหม่จะมีสิทธิ์ใช้โปรแกรมช่วงทดลองใช้ฟรีมูลค่า $300 USD

ทรัพยากรเดียวที่จะสร้างค่าใช้จ่ายคืออินสแตนซ์ VM และออบเจ็กต์ Cloud Storage คุณดูค่าใช้จ่ายโดยประมาณของอินสแตนซ์ VM ได้ในเครื่องคำนวณราคา ดูค่าใช้จ่ายโดยประมาณของ Cloud Storage ได้ในรายการราคานี้

3. สร้างที่เก็บข้อมูลและออบเจ็กต์ของพื้นที่เก็บข้อมูล

ดังที่กล่าวไว้ก่อนหน้านี้ เราจะนำแหล่งข้อมูลที่สร้างในบทแนะนำก่อนหน้ามาใช้ซ้ำ ดังนั้น เราจะดำเนินการสร้างที่เก็บข้อมูล Cloud Storage ต่อ สำหรับบทแนะนำนี้ เราจะเริ่มใช้ gcloud CLI แทนคอนโซล

  1. เลือก ProjectX ในคอนโซล Google ในโปรเจ็กต์นี้ เราจะสร้างที่เก็บข้อมูล Storage และออบเจ็กต์
  2. ตรวจสอบว่าคุณได้ตั้งค่า Cloud Shell ให้ใช้ ProjectX โดยเรียกใช้คำสั่งต่อไปนี้
gcloud config set project PROJECT_ID
  1. ในสภาพแวดล้อมการพัฒนาซอฟต์แวร์ของคุณ ให้เรียกใช้คำสั่งต่อไปนี้
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
  1. สร้างออบเจ็กต์พื้นที่เก็บข้อมูลเพื่อให้เราอ่านได้จากอินสแตนซ์ VM ที่อยู่ใน ProjectZ เราจะสร้างไฟล์ .txt
nano hello.txt 

เพิ่มอะไรก็ได้ที่ต้องการในไฟล์ข้อความ

  1. อัปโหลดออบเจ็กต์ลงในที่เก็บข้อมูล
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
  1. ตรวจสอบว่าได้อัปโหลดออบเจ็กต์ลงในที่เก็บข้อมูลแล้วโดยแสดงรายการ
gcloud storage ls gs://BUCKET_NAME

คุณต้องเห็นไฟล์ hello.txt ที่แสดงอยู่ในคอนโซล

4. ปกป้อง Cloud Storage API

ใน Codelab ก่อนหน้านี้ เราได้สร้างขอบเขตและป้องกัน Compute Engine API ใน Codelab นี้ เราจะแก้ไขขอบเขตโหมดทดลองเรียกใช้และเพิ่ม Cloud Storage การดำเนินการนี้จะช่วยให้เราระบุผลกระทบของการป้องกันขอบเขตได้โดยแสดงการละเมิดการควบคุมบริการ VPC ในบันทึกการตรวจสอบ แต่ทรัพยากรจะยังคงเข้าถึงได้จนกว่าเราจะบังคับใช้ขอบเขต

  1. เลือกองค์กรของคุณในคอนโซล Google เข้าถึงการควบคุมบริการ VPC ตรวจสอบว่าคุณอยู่ในขอบเขตองค์กร
  2. เปิด Cloud Shell และอัปเดตขอบเขตทดลองเรียกใช้ "SuperProtection" ที่สร้างในห้องทดลองก่อนหน้านี้
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
  1. ตรวจสอบว่าได้อัปเดต Cloud Storage API แล้วโดยการอธิบายขอบเขต
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY 

ในเอาต์พุต คุณจะเห็นว่า Cloud Storage API อยู่ในรายการบริการที่ถูกจำกัด

พร้อมกับ Compute Engine API แต่ติดป้ายกำกับ "-vpcAccessibleServices: {}":

2025ddc01a2e9a81.png

5. ตรวจสอบว่า Cloud Storage API ได้รับการป้องกันแล้ว

ในโหมดทดลองเรียกใช้ ให้ตรวจสอบว่า "SuperProtection" ขอบเขตแสดงการปฏิเสธแก่เราโดยแสดงรายการออบเจ็กต์จากอินสแตนซ์ VM ที่สร้างใน ProjectZ ไปยัง ProjectX ซึ่งโฮสต์ที่เก็บข้อมูล Storage

  1. ใน Cloud Console ให้ไปที่ตัวเลือกโปรเจ็กต์ แล้วเลือก ProjectZ จากนั้นไปที่ Compute Engine > อินสแตนซ์ VM
  2. คลิกปุ่ม SSH เพื่อเชื่อมต่อกับอินสแตนซ์ VM และเข้าถึงบรรทัดคำสั่ง

5ca02149b78c11f9.png

  1. ระบุไฟล์ Hello.txt ที่เราอัปโหลดไว้ก่อนหน้านี้
gcloud storage ls gs://BUCKET_NAME

เนื่องจาก Cloud Storage API ได้รับการปกป้องในโหมดทดลองเรียกใช้ คุณจึงควรแสดงรายการทรัพยากรได้ แต่ต้องมีข้อความแสดงข้อผิดพลาดในบันทึกการตรวจสอบ ProjectZ

  1. ไปที่ Logs Explorer API ใน ProjectZ และมองหาข้อความแสดงข้อผิดพลาดล่าสุดของการควบคุมบริการ VPC คุณสามารถใช้ตัวกรองนี้เพื่อรับบันทึกที่เราต้องการ
protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS"
"(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:UNIQUE_ID"

ตัวกรองนี้จะแสดงการละเมิดล่าสุดในโหมดทดลองเรียกใช้ซึ่งเป็นของ Cloud Storage นี่คือตัวอย่างลักษณะของบันทึกและเราสามารถตรวจสอบได้ว่าการละเมิดเป็นการละเมิดขาออกเมื่อพยายามแสดงเนื้อหาในที่เก็บข้อมูลที่อยู่ใน ProjectX

egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTX_ID"
sourceType: "Network"
targetResource: "projects/PROJECTZ_ID"
}
]
resourceNames: [
0: "projects//buckets/BUCKET_NAME"
]
securityPolicyInfo: {
organizationId: "ORGANIZATION_ID"
servicePerimeterName: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
vpcServiceControlsUniqueId: "UNIQUE_ID"
}
methodName: "google.storage.objects.list"
  1. เนื่องจากเราได้ตรวจสอบแล้วว่าการเรียก API ไปยัง Cloud Storage ทำให้เกิดการละเมิดการควบคุมบริการ VPC เราจึงจะบังคับใช้ขอบเขตด้วยการกำหนดค่าใหม่ เปิด Cloud Shell และบังคับใช้ขอบเขตการทดลองเรียกใช้:
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
  1. เชื่อมต่อกับอินสแตนซ์ VM โดยใช้ SSH แล้วแสดงรายการที่เก็บข้อมูลของพื้นที่เก็บข้อมูลอีกครั้งเพื่อยืนยันว่ามีการบังคับใช้ขอบเขตทดลองเรียกใช้อย่างถูกต้อง
gcloud storage ls gs://BUCKET_NAME

เราจะรับการละเมิดการควบคุมบริการ VPC ใน VM CLI แทนรายการออบเจ็กต์พื้นที่เก็บข้อมูล ดังนี้

ERROR: (gcloud.storage.ls) User [PROJECT_NUMBER-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:"UNIQUE_ID"

เราป้องกันการขโมยข้อมูลได้สำเร็จโดยใช้การควบคุมบริการ VPC เพื่อป้องกันไม่ให้มีการอ่านหรือคัดลอกข้อมูลไปยังทรัพยากรที่อยู่นอกขอบเขต

6. การแก้ปัญหาการปฏิเสธรายการ

เราจะแก้ปัญหาการปฏิเสธที่ได้รับจากอินสแตนซ์ VM CLI ลองดูบันทึกการตรวจสอบ แล้วมองหารหัสที่ไม่ซ้ำกันของการควบคุมบริการ VPC

  1. ไปที่ตัวเลือกโปรเจ็กต์ แล้วเลือก ProjectZ
  2. ค้นหารหัสที่ไม่ซ้ำกันสำหรับการควบคุมบริการ VPC ในบันทึกการตรวจสอบโดยใช้การค้นหาต่อไปนี้ใน Logging Explorer
resource.type="audited_resource"
protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"

ซึ่งจะแสดงบันทึกการตรวจสอบการควบคุมบริการ VPC ทั้งหมด เราจะมองหาบันทึกข้อผิดพลาดรายการสุดท้าย เนื่องจากการเรียก API มาจากอินสแตนซ์ VM ผู้ใช้หลักต้องเป็นบัญชีบริการ Compute Engine "PROJECT_NUMBER-compute@developer.gserviceaccount.com"

เนื่องจากมีรหัสที่ไม่ซ้ำกันสำหรับการควบคุมบริการ VPC อยู่แล้ว เราจึงใช้รหัสดังกล่าวเพื่อรับบันทึกที่ต้องการได้โดยตรงโดยใช้ตัวกรองนี้

protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
  1. คลิกส่วนหัว VPC Service Controls แล้วเลือก "แก้ปัญหาการปฏิเสธ" ซึ่งจะเปิดเครื่องมือแก้ปัญหาการควบคุมบริการ VPC

API นี้จะแสดงเหตุผลการละเมิดใน UI ที่ใช้งานง่าย และแจ้งว่าเป็นการละเมิดขาเข้าหรือขาออกหรือไม่ รวมถึงสิ่งอื่นๆ ที่มีประโยชน์

ในแบบฝึกหัดนี้ เราจะมองหาข้อมูลต่อไปนี้

authenticationInfo: {
principalEmail: "PROJECT_ID-compute@developer.gserviceaccount.com"
egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTZ_ID"
sourceType: "Network"
targetResource: "projects/PROJECTX_ID"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"

ข้อมูลนี้เพียงพอแล้วที่จะทำให้เราทราบว่าเราต้องสร้างกฎขาออกเพื่อให้บัญชีบริการ Compute Engine เข้าถึงที่เก็บข้อมูลของพื้นที่เก็บข้อมูลจาก ProjectZ ไปยัง ProjectX นอกจากนี้ เรายังเห็นว่าเครือข่ายไม่ได้อยู่ในขอบเขตเดียวกัน เราจึงต้องอนุญาตการสื่อสารกับ VPC กับบริการและแชร์ข้อมูลข้ามขอบเขตบริการ

  1. เปิดใช้งาน Cloud Shell และสร้างไฟล์ .yaml ด้วยกฎข้อมูลขาออกโดยใช้เครื่องมือแก้ไขข้อความ
nano egresstorage.yaml 
- egressTo:
    operations:
    - serviceName: storage.googleapis.com
      methodSelectors:
      - method: \"*\"
    resources:
    - projects/PROJECTX_ID
 egressFrom:
    identities:
    - serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com
  1. อัปเดตนโยบายข้อมูลขาเข้าที่ปกป้อง Project Z
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY 

ตอนนี้เราสามารถลองเข้าถึงที่เก็บข้อมูลจากอินสแตนซ์ VM อีกครั้งได้

  1. ใน Cloud Console ให้ไปที่ตัวเลือกโปรเจ็กต์ แล้วเลือก ProjectZ จากนั้นไปที่ Compute Engine > อินสแตนซ์ VM
  2. คลิกปุ่ม SSH เพื่อเชื่อมต่อกับอินสแตนซ์ VM และเข้าถึงบรรทัดคำสั่ง
  3. เมื่อคุณอยู่ใน VM CLI ให้ลองแสดงรายการออบเจ็กต์ในที่เก็บข้อมูลของพื้นที่เก็บข้อมูล
gcloud storage ls gs://BUCKET_NAME/

คุณจะได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้

ERROR: (gcloud.storage.ls) User [PROJECT_ID-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): PROJECT_ID-compute@developer.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist).
  1. เราต้องให้สิทธิ์ผู้อ่านออบเจ็กต์แก่บัญชีบริการ Compute Engine เพื่อให้แสดงรายการออบเจ็กต์ในที่เก็บข้อมูลของพื้นที่เก็บข้อมูลได้
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
  1. เรามาลองแสดงรายการไฟล์ hello.txt จาก CLI ของอินสแตนซ์ VM อีกครั้งกัน
gcloud storage ls gs://BUCKET_NAME/
.
.
gs://BUCKET_NAME/hello.txt

ตอนนี้เราแสดงรายการออบเจ็กต์ได้โดยไม่ต้องละเมิดสิทธิ์การควบคุมบริการ VPC แล้ว แต่ถ้าจะดาวน์โหลดไฟล์ล่ะ มาลองดูกัน

gcloud storage cp gs://BUCKET_NAME/hello.txt /home/${USER}

และเราจะได้รับผลลัพธ์ต่อไปนี้

Copying gs://BUCKET_NAME/hello.txt to file:///home/${USER}
 Completed files 1/1 | 54.0B/54.0B  

7. ล้างข้อมูล

แม้ว่าจะไม่มีการเรียกเก็บเงินแยกต่างหากสำหรับการใช้การควบคุมบริการ VPC เมื่อไม่ได้ใช้งานบริการ แต่แนวทางปฏิบัติแนะนำคือล้างการตั้งค่าที่ใช้ในห้องทดลองนี้ นอกจากนี้ คุณยังลบอินสแตนซ์ VM และ/หรือโปรเจ็กต์ที่อยู่ในระบบคลาวด์เพื่อหลีกเลี่ยงการเรียกเก็บเงินได้ด้วย การลบโปรเจ็กต์ที่อยู่ในระบบคลาวด์จะหยุดการเรียกเก็บเงินสำหรับทรัพยากรทั้งหมดที่ใช้ในโปรเจ็กต์นั้น

  1. หากต้องการลบอินสแตนซ์ VM ให้เลือกช่องทำเครื่องหมายทางด้านซ้ายของชื่ออินสแตนซ์ VM แล้วคลิกลบ

da0abf0894fe03cd.png

  1. หากต้องการลบขอบเขต ให้ทำตามขั้นตอนต่อไปนี้
  • ในคอนโซล Google Cloud ให้คลิกความปลอดภัย แล้วคลิกการควบคุมบริการ VPC ที่ขอบเขตขององค์กร
  • ในหน้าการควบคุมบริการ VPC ให้คลิก "ลบไอคอน" ในแถวตารางที่ตรงกับขอบเขตที่ต้องการลบ
  1. หากต้องการลบระดับการเข้าถึง ให้ทำตามขั้นตอนต่อไปนี้
  1. หากต้องการลบออบเจ็กต์พื้นที่เก็บข้อมูลและที่เก็บข้อมูล ให้ทำตามขั้นตอนต่อไปนี้
  • ในคอนโซล Google Cloud ให้เปิดหน้าที่เก็บข้อมูล Cloud Storage
  • เลือกช่องทำเครื่องหมายข้างที่เก็บข้อมูลที่คุณสร้างขึ้น
  • คลิกลบ
  • ในหน้าต่างที่เปิดขึ้นมา ให้ยืนยันว่าคุณต้องการลบที่เก็บข้อมูล
  • คลิกลบ
  1. หากต้องการปิดโปรเจ็กต์ ให้ทำตามขั้นตอนต่อไปนี้
  • ในคอนโซล Google Cloud ให้ไปที่ IAM & การตั้งค่าผู้ดูแลระบบของโปรเจ็กต์ที่ต้องการลบ
  • เกี่ยวกับ IAM และ คลิก ปิดการทำงาน ในหน้าการตั้งค่าของผู้ดูแลระบบ
  • ป้อนรหัสโปรเจ็กต์ แล้วคลิกปิดเครื่อง

8. ยินดีด้วย

ใน Codelab นี้ คุณได้อัปเดตขอบเขตการทดลองเรียกใช้การควบคุมบริการ VPC บังคับใช้ และแก้ปัญหาแล้ว

ดูข้อมูลเพิ่มเติม

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0