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

1. บทนำ

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

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

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

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

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

dbec101f41102ca2.png

แหล่งข้อมูล - การตั้งค่า

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

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

a0ceb29950db4eac.png

  • เชลล์ในเครื่อง: หากต้องการใช้สภาพแวดล้อมการพัฒนาในเครื่อง ให้ติดตั้งและเริ่มต้น gcloud CLI

ค่าใช้จ่าย

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

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

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

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

  1. เลือก ProjectX ใน Google Console ในโปรเจ็กต์นี้ เราจะสร้างที่เก็บข้อมูลและออบเจ็กต์
  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. อัปโหลดออบเจ็กต์ลงใน Bucket
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 ในโค้ดแล็บนี้ เราจะแก้ไขขอบเขตโหมดการทดสอบและเพิ่ม Cloud Storage ซึ่งจะช่วยให้เราพิจารณาผลกระทบของการป้องกันขอบเขตได้โดยแสดงการละเมิดตัวควบคุมบริการ VPC ในบันทึกการตรวจสอบ แต่จะยังคงเข้าถึงทรัพยากรได้จนกว่าเราจะบังคับใช้ขอบเขต

  1. ใน Google Console ให้เลือกองค์กร แล้ว เข้าถึงการควบคุมบริการ VPC ตรวจสอบว่าคุณอยู่ในขอบเขตขององค์กร
  2. เปิด Cloud Shell และอัปเดตขอบเขตการทดสอบ "SuperProtection" ที่สร้างไว้ใน Lab ก่อนหน้า
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 Bucket

  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 ใน CLI ของ VM แทนรายการออบเจ็กต์ Storage

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. การแก้ปัญหาการปฏิเสธรายการ

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

  1. ไปที่เครื่องมือเลือกโปรเจ็กต์แล้วเลือก ProjectZ
  2. ค้นหารหัสที่ไม่ซ้ำกันของการควบคุมบริการ VPC ในบันทึกการตรวจสอบโดยใช้การค้นหาต่อไปนี้ใน Logs 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 แล้วเลือก "แก้ปัญหาการปฏิเสธ" ซึ่งจะเปิดเครื่องมือแก้ปัญหาการควบคุมบริการ 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. อัปเดตนโยบายขาเข้าที่ปกป้อง ProjectZ
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 แล้ว ให้ลองแสดงรายการออบเจ็กต์ใน Storage Bucket
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 เพื่อให้แสดงรายการออบเจ็กต์ใน Storage Bucket ได้
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 และ/หรือโปรเจ็กต์ Cloud เพื่อหลีกเลี่ยงค่าใช้จ่ายได้ด้วย การลบโปรเจ็กต์ Cloud จะหยุดการเรียกเก็บเงินสำหรับทรัพยากรทั้งหมดที่ใช้ภายในโปรเจ็กต์นั้น

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

da0abf0894fe03cd.png

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

8. ยินดีด้วย

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

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

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป