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

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

ค่าใช้จ่าย
คุณต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่เสียค่าใช้จ่ายมากนัก หรืออาจไม่เสียค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี $300 USD Free Trial program
ทรัพยากรที่จะทำให้เกิดค่าใช้จ่ายมีเพียงอินสแตนซ์ VM และออบเจ็กต์ Cloud Storage คุณดูค่าใช้จ่ายโดยประมาณของอินสแตนซ์ VM ได้ใน เครื่องคำนวณราคา ส่วนค่าใช้จ่ายโดยประมาณของ Cloud Storage จะอยู่ใน รายการราคา นี้
3. สร้าง Bucket และออบเจ็กต์ของพื้นที่เก็บข้อมูล
ดังที่กล่าวไว้ก่อนหน้านี้ เราจะนำทรัพยากรที่สร้างขึ้นใน บทแนะนำก่อนหน้ากลับมาใช้ซ้ำ ดังนั้นเราจะสร้าง Bucket ของ Cloud Storage ต่อ สำหรับบทแนะนำนี้ เราจะเริ่มใช้ gcloud CLI แทน Cloud Console
- ใน Google Console ให้เลือก ProjectX ในโปรเจ็กต์นี้ เราจะ สร้าง Bucket ของพื้นที่เก็บข้อมูล และออบเจ็กต์
- ตรวจสอบว่าคุณได้ตั้งค่า Cloud Shell ให้ใช้ ProjectX โดยเรียกใช้คำสั่งต่อไปนี้
gcloud config set project PROJECT_ID
- เรียกใช้คำสั่งต่อไปนี้ในสภาพแวดล้อมในการพัฒนาซอฟต์แวร์
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
- สร้างออบเจ็กต์พื้นที่เก็บข้อมูลเพื่อให้เราอ่านได้จากอินสแตนซ์ VM ที่อยู่ใน ProjectZ เราจะสร้างไฟล์ .txt
nano hello.txt
เพิ่มสิ่งที่คุณต้องการลงในไฟล์ข้อความ
- อัปโหลดออบเจ็กต์ลงใน Bucket
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
- ตรวจสอบว่าได้อัปโหลดออบเจ็กต์ลงใน Bucket แล้วโดย แสดงรายการ ออบเจ็กต์
gcloud storage ls gs://BUCKET_NAME
คุณต้องเห็นไฟล์ hello.txt แสดงอยู่ในคอนโซล
4. ปกป้อง Cloud Storage API
ใน Codelab ก่อนหน้านี้ เราได้สร้างขอบเขตและปกป้อง Compute Engine API ใน Codelab นี้ เราจะแก้ไขขอบเขตโหมดทดสอบและเพิ่ม Cloud Storage ซึ่งจะช่วยให้เรากำหนดผลกระทบของการปกป้องขอบเขตได้โดยแสดงการละเมิดการควบคุมบริการ VPC ในบันทึกการตรวจสอบ แต่ทรัพยากรจะยังคงเข้าถึงได้จนกว่าเราจะบังคับใช้ขอบเขต
- ใน Google Console ให้เลือกองค์กร แล้วเข้าถึงการควบคุมบริการ VPC ตรวจสอบว่าคุณอยู่ในขอบเขตองค์กร
- เปิด Cloud Shell และอัปเดตขอบเขตทดลองเรียกใช้ "SuperProtection" ที่สร้างขึ้นในแล็บก่อนหน้า
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
- ตรวจสอบว่าได้อัปเดต Cloud Storage API แล้วโดยอธิบายขอบเขต
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY
ในเอาต์พุต คุณจะเห็นว่า Cloud Storage API แสดงอยู่ใต้บริการที่จำกัด
พร้อมกับ Compute Engine API แต่มีป้ายกำกับ "-vpcAccessibleServices: {}"

5. ตรวจสอบว่าได้ปกป้อง Cloud Storage API แล้ว
ในโหมดทดลองเรียกใช้ ให้ตรวจสอบว่าขอบเขต "SuperProtection" แสดงการปฏิเสธโดยแสดงรายการออบเจ็กต์จากอินสแตนซ์ VM ที่สร้างขึ้นใน ProjectZ ไปยัง ProjectX ซึ่งโฮสต์ Bucket ของพื้นที่เก็บข้อมูล
- ใน Cloud Console ให้ไปที่ตัวเลือกโปรเจ็กต์แล้วเลือก ProjectZ จากนั้นไปที่ Compute Engine > อินสแตนซ์ VM
- คลิกปุ่ม SSH เพื่อเชื่อมต่อกับอินสแตนซ์ VM และเข้าถึงบรรทัดคำสั่ง

- แสดงรายการไฟล์ hello.txt ที่เราอัปโหลดไว้ก่อนหน้านี้
gcloud storage ls gs://BUCKET_NAME
เนื่องจาก Cloud Storage API ได้รับการปกป้องในโหมดทดสอบ คุณจึงควรแสดงรายการทรัพยากรได้ แต่ต้องมีข้อความแสดงข้อผิดพลาดในบันทึกการตรวจสอบของ ProjectZ
- ไปที่ 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 ตัวอย่างต่อไปนี้แสดงลักษณะของบันทึก และเราสามารถตรวจสอบได้ว่าการละเมิดเป็นการละเมิดขาออกเมื่อพยายามแสดงรายการเนื้อหาใน Bucket ที่อยู่ใน 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"
- เนื่องจากเราได้ตรวจสอบแล้วว่าการเรียก API ไปยัง Cloud Storage ทำให้เกิดการละเมิดการควบคุมบริการ VPC เราจึงจะบังคับใช้ขอบเขตด้วยการกำหนดค่าใหม่ เปิด Cloud Shell และบังคับใช้ขอบเขตโหมดทดสอบโดยใช้คำสั่งต่อไปนี้
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
- เชื่อมต่อกับอินสแตนซ์ VM โดยใช้ SSH และแสดงรายการ Bucket ของพื้นที่เก็บข้อมูลอีกครั้งเพื่อตรวจสอบว่าได้บังคับใช้ขอบเขตทดลองเรียกใช้อย่างถูกต้อง
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 กัน
- ไปที่ตัวเลือกโปรเจ็กต์แล้วเลือก ProjectZ
- ค้นหารหัสที่ไม่ซ้ำกันของการควบคุมบริการ 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"
- คลิกส่วนหัวการควบคุมบริการ 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 เข้าถึง Bucket ของพื้นที่เก็บข้อมูลจาก ProjectZ ไปยัง ProjectX ได้ นอกจากนี้ เรายังเห็นว่าเครือข่ายไม่ได้อยู่ในขอบเขตเดียวกัน ดังนั้นเราจึงต้องอนุญาตการสื่อสาร VPC กับบริการและแชร์ข้อมูลในขอบเขตบริการ
- เปิดใช้งาน 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
- อัปเดตนโยบายขาเข้า ที่ปกป้อง ProjectZ
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY
ตอนนี้เราลองเข้าถึง Bucket จากอินสแตนซ์ VM อีกครั้งได้แล้ว
- ใน Cloud Console ให้ไปที่ตัวเลือกโปรเจ็กต์แล้วเลือก ProjectZ จากนั้นไปที่ Compute Engine > อินสแตนซ์ VM
- คลิกปุ่ม SSH เพื่อเชื่อมต่อกับอินสแตนซ์ VM และเข้าถึงบรรทัดคำสั่ง
- เมื่ออยู่ใน VM CLI แล้ว ให้ลองแสดงรายการออบเจ็กต์ใน 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).
- เราต้องให้สิทธิ์ผู้อ่านออบเจ็กต์แก่บัญชีบริการ Compute Engine เพื่อให้แสดงรายการออบเจ็กต์ใน Bucket ของพื้นที่เก็บข้อมูลได้
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
- ลองแสดงรายการไฟล์ 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 เพื่อหลีกเลี่ยงค่าใช้จ่ายได้ด้วย การลบโปรเจ็กต์ที่อยู่ในระบบคลาวด์จะหยุดการเรียกเก็บเงินสำหรับทรัพยากรทั้งหมดที่ใช้ภายในโปรเจ็กต์นั้น
- หากต้องการลบอินสแตนซ์ VM ให้เลือกช่องทำเครื่องหมายทางด้านซ้ายของชื่ออินสแตนซ์ VM แล้วคลิกลบ

- หากต้องการลบขอบเขต ให้ทำตามขั้นตอนต่อไปนี้
- ในคอนโซล Google Cloud ให้คลิกความปลอดภัย แล้วคลิกการควบคุมบริการ VPC ในขอบเขตองค์กร
- ในหน้าการควบคุมบริการ VPC ให้คลิก "ไอคอนลบ" ในแถวตารางที่ตรงกับขอบเขตที่ต้องการลบ
- หากต้องการลบระดับการเข้าถึง ให้ทำตามขั้นตอนต่อไปนี้
- ในคอนโซล Google Cloud ให้เปิดหน้า เครื่องมือจัดการสิทธิ์เข้าถึงตามบริบท ในขอบเขตโฟลเดอร์
- ในตาราง ให้คลิก "ไอคอนลบ" ในแถวของระดับการเข้าถึงที่ต้องการลบ แล้วคลิกลบ
- หากต้องการลบออบเจ็กต์และ Bucket ของพื้นที่เก็บข้อมูล ให้ทำตามขั้นตอนต่อไปนี้
- ในคอนโซล Google Cloud ให้เปิด หน้า Bucket ของ Cloud Storage
- เลือกช่องทำเครื่องหมายข้าง Bucket ที่คุณสร้างขึ้น
- คลิกลบ
- ในหน้าต่างที่เปิดขึ้น ให้ยืนยันว่าคุณต้องการลบ Bucket
- คลิกลบ
- หากต้องการปิดโปรเจ็กต์ ให้ทำตามขั้นตอนต่อไปนี้
- ในคอนโซล Google Cloud ให้ไปที่หน้า การตั้งค่า IAM และผู้ดูแลระบบ ของโปรเจ็กต์ที่ต้องการลบ
- ในหน้าการตั้งค่า IAM และผู้ดูแลระบบ ให้คลิกปิด
- ป้อนรหัสโปรเจ็กต์ แล้วคลิกปิดต่อไป
8. ยินดีด้วย
ใน Codelab นี้ คุณได้อัปเดตขอบเขตโหมดทดสอบของการควบคุมบริการ VPC บังคับใช้ขอบเขต และแก้ปัญหาขอบเขต
ดูข้อมูลเพิ่มเติม
- ดูเอกสารประกอบเกี่ยวกับการควบคุมบริการ VPC
- ดูเอกสารประกอบเกี่ยวกับเครื่องมือจัดการสิทธิ์เข้าถึงตามบริบท
- ดูเอกสารประกอบเกี่ยวกับเครื่องมือแก้ปัญหา VPC-SC
- ดูเอกสารประกอบเกี่ยวกับกฎขาเข้าและขาออก
- ดูเอกสารประกอบเกี่ยวกับโหมดทดสอบ
- ดูเอกสารประกอบเกี่ยวกับ Cloud Storage
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้ Creative Commons Attribution 2.0 Generic License