Hướng dẫn cơ bản về dịch vụ VPC Service Controls II – Khắc phục lỗi vi phạm thoát ra

1. Giới thiệu

VPC Service Controls (VPC-SC) là một biện pháp kiểm soát bảo mật ở cấp tổ chức trong Google Cloud, cho phép khách hàng doanh nghiệp giảm thiểu rủi ro đánh cắp dữ liệu. VPC Service Controls cung cấp quyền truy cập vào các dịch vụ đa khách hàng theo nguyên tắc không tin tưởng bất cứ điều gì (zero-trust) bằng cách cho phép khách hàng giới hạn quyền truy cập để chỉ cho phép những địa chỉ IP, bối cảnh của thiết bị khách và thông số thiết bị đã được cấp phép trong khi kết nối đến các dịch vụ đa khách hàng qua Internet và các dịch vụ khác nhằm giảm thiểu cả tổn thất do cố ý và vô ý. Như bạn đã thấy trong Hướng dẫn cơ bản về VPC Service Controls I, bạn có thể sử dụng VPC Service Controls để tạo các phạm vi bảo vệ tài nguyên và dữ liệu của các dịch vụ mà bạn chỉ định rõ ràng.

Mục tiêu của hướng dẫn này là:

  • Tìm hiểu những điều cơ bản về VPC Service Controls
  • Cập nhật phạm vi dịch vụ và kiểm thử phạm vi đó bằng chế độ Chạy thử
  • Bảo vệ hai dịch vụ bằng VPC Service Controls
  • Khắc phục sự cố vi phạm quy tắc lưu lượng truy cập đi của VPC Service Controls trong khi liệt kê một đối tượng từ Cloud Storage

2. Thiết lập và yêu cầu

Đối với hướng dẫn này, chúng ta cần đáp ứng các yêu cầu trước sau đây:

dbec101f41102ca2.png

Thiết lập tài nguyên

  1. Thiết lập tài nguyên như mô tả trong phần "Thiết lập tài nguyên" của Hướng dẫn cơ bản về VPC Service Controls I
  2. Xác minh rằng bạn có các quyền cần thiết để quản trị Cloud Storage.
  3. Đối với hướng dẫn này, chúng ta sẽ bắt đầu sử dụng CLI thay vì bảng điều khiển đám mây. Trong một trong các môi trường phát triển, hãy thiết lập gcloud CLI:
  • Cloud Shell: để sử dụng một cửa sổ dòng lệnh trực tuyến đã thiết lập gcloud CLI, hãy kích hoạt Cloud Shell.

Kích hoạt Cloud Shell bằng cách nhấp vào biểu tượng ở góc trên cùng bên phải của bảng điều khiển đám mây. Có thể mất vài giây để phiên hoạt động khởi chạy. Xem hướng dẫn về Cloud Shell để biết thêm thông tin chi tiết.

a0ceb29950db4eac.png

Chi phí

Bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt tài nguyên nhằm tránh phát sinh chi phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD .

Các tài nguyên duy nhất sẽ phát sinh chi phí là Thực thể máy ảo và Đối tượng Cloud Storage. Bạn có thể tìm thấy chi phí ước tính của thực thể máy ảo trong công cụ tính giá. Bạn có thể tìm thấy chi phí ước tính của Cloud Storage trong danh sách giá này.

3. Tạo bộ chứa và đối tượng lưu trữ

Như đã đề cập trước đó, chúng ta sẽ sử dụng lại các tài nguyên được tạo trong hướng dẫn trước. Vì vậy, chúng ta sẽ tiếp tục tạo bộ chứa Cloud Storage. Đối với hướng dẫn này, chúng ta sẽ bắt đầu sử dụng gcloud CLI thay vì bảng điều khiển.

  1. Trong Google Console, hãy chọn ProjectX. Trong dự án này, chúng ta sẽ tạo Bộ chứa lưu trữ và đối tượng.
  2. Đảm bảo bạn đặt Cloud Shell để sử dụng ProjectX bằng cách chạy lệnh sau:
gcloud config set project PROJECT_ID
  1. Trong môi trường phát triển, hãy chạy lệnh sau:
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
  1. Tạo một đối tượng lưu trữ để chúng ta có thể đọc đối tượng đó từ Thực thể máy ảo nằm trong ProjectZ. Chúng ta sẽ tạo một tệp .txt.
nano hello.txt 

Thêm mọi nội dung bạn muốn vào tệp văn bản.

  1. Tải đối tượng lên bộ chứa.
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
  1. Xác minh rằng đối tượng đã được tải lên bộ chứa bằng cách liệt kê đối tượng đó.
gcloud storage ls gs://BUCKET_NAME

Bạn phải thấy tệp hello.txt được liệt kê trong bảng điều khiển.

4. Bảo vệ Cloud Storage API

Trong lớp học lập trình trước, chúng ta đã tạo một phạm vi và bảo vệ Compute Engine API. Trong lớp học lập trình này, chúng ta sẽ chỉnh sửa phạm vi chế độ chạy thử nghiệm và thêm Cloud Storage. Điều này sẽ giúp chúng ta xác định tác động của việc bảo vệ phạm vi bằng cách cho chúng ta thấy các lỗi vi phạm VPC Service Controls trong nhật ký kiểm tra, nhưng các tài nguyên sẽ vẫn có thể truy cập được cho đến khi chúng ta thực thi phạm vi.

  1. Trong Google Console, hãy chọn Tổ chức của bạn; Truy cập vào VPC Service Controls. Đảm bảo bạn đang ở phạm vi Tổ chức.
  2. Mở Cloud Shell và cập nhật phạm vi Chạy thử "SuperProtection" được tạo trong phòng thí nghiệm trước:
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
  1. Xác minh rằng Cloud Storage API đã được cập nhật bằng cách mô tả phạm vi
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY 

Trong đầu ra, bạn sẽ thấy rằng Cloud Storage API được liệt kê bên dưới các dịch vụ bị hạn chế

cùng với Compute Engine API nhưng có nhãn "-vpcAccessibleServices: {}":

2025ddc01a2e9a81.png

5. Xác minh rằng Cloud Storage API đã được bảo vệ

Ở chế độ Chạy thử, hãy xác minh rằng phạm vi "SuperProtection" đang cho chúng ta thấy thông báo từ chối bằng cách liệt kê đối tượng từ phiên bản máy ảo được tạo trong ProjectZ đến ProjectX đang lưu trữ Bộ chứa lưu trữ

  1. Trong bảng điều khiển Cloud, hãy chuyển đến bộ chọn dự án và chọn ProjectZ, sau đó chuyển đến Compute Engine > Phiên bản máy ảo.
  2. Nhấp vào nút SSH để kết nối với Phiên bản máy ảo và truy cập vào dòng lệnh của phiên bản đó.

5ca02149b78c11f9.png

  1. Liệt kê tệp hello.txt mà chúng ta đã tải lên trước đó.
gcloud storage ls gs://BUCKET_NAME

Vì Cloud Storage API được bảo vệ ở chế độ chạy thử, nên bạn có thể liệt kê các tài nguyên, nhưng bạn phải có một thông báo lỗi trong nhật ký kiểm tra ProjectZ.

  1. Chuyển đến Logs Explorer API trong ProjectZ và tìm thông báo lỗi cuối cùng của VPC Service Controls. Bạn có thể sử dụng bộ lọc này để lấy nhật ký mà chúng ta đang tìm:
protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS"
"(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:UNIQUE_ID"

Bộ lọc này sẽ cho chúng ta thấy lỗi vi phạm cuối cùng ở chế độ Chạy thử thuộc về Cloud Storage. Dưới đây là ví dụ về cách nhật ký hiển thị và chúng ta có thể xác thực rằng lỗi vi phạm là lỗi vi phạm lưu lượng truy cập đi khi cố gắng liệt kê nội dung trên bộ chứa nằm trong 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. Vì chúng ta đã xác thực rằng lệnh gọi API đến Cloud Storage tạo ra lỗi vi phạm VPC Service Controls, nên chúng ta sẽ thực thi phạm vi bằng cấu hình mới. Mở Cloud Shell và thực thi phạm vi Chạy thử:
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
  1. Kết nối với phiên bản máy ảo bằng SSH và liệt kê lại bộ chứa lưu trữ để xác minh rằng phạm vi Chạy thử đã được thực thi đúng cách.
gcloud storage ls gs://BUCKET_NAME

Chúng ta sẽ gặp lỗi vi phạm VPC Service Controls trong CLI máy ảo thay vì danh sách các đối tượng lưu trữ:

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"

Chúng ta đã ngăn chặn thành công việc đánh cắp dữ liệu bằng cách sử dụng VPC Service Controls để ngăn chặn việc đọc dữ liệu từ hoặc sao chép dữ liệu vào một tài nguyên bên ngoài phạm vi.

6. Khắc phục sự cố thông báo từ chối danh sách.

Chúng ta sẽ khắc phục sự cố thông báo từ chối mà chúng ta nhận được từ CLI thực thể máy ảo. Hãy kiểm tra nhật ký kiểm tra và tìm mã nhận dạng duy nhất của VPC Service Controls.

  1. Chuyển đến bộ chọn dự án và chọn ProjectZ.
  2. Tìm Mã nhận dạng duy nhất của VPC Service Controls trong nhật ký kiểm tra bằng cách sử dụng truy vấn sau trong Logs Explorer:
resource.type="audited_resource"
protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"

Thao tác này sẽ hiển thị tất cả nhật ký kiểm tra VPC Service Controls. Chúng ta sẽ tìm nhật ký lỗi cuối cùng. Vì lệnh gọi API được thực hiện từ phiên bản máy ảo, nên thực thể chính phải là tài khoản dịch vụ Compute Engine "PROJECT_NUMBER-compute@developer.gserviceaccount.com"

Vì chúng ta đã có mã nhận dạng duy nhất của VPC Service Controls, nên chúng ta có thể sử dụng mã này để lấy trực tiếp nhật ký mong muốn bằng cách sử dụng bộ lọc này:

protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
  1. Nhấp vào tiêu đề VPC Service Controls rồi chọn "Khắc phục sự cố thông báo từ chối" để mở Trình khắc phục sự cố VPC Service Controls.

API này sẽ cho chúng ta thấy lý do vi phạm trong một giao diện người dùng thân thiện và liệu đây có phải là lỗi vi phạm lưu lượng truy cập đến hay lưu lượng truy cập đi hay không, cùng với những thông tin hữu ích khác.

Trong bài tập này, chúng ta sẽ tìm kiếm những thông tin sau:

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"

Thông tin này là đủ để chúng ta biết rằng chúng ta cần tạo một quy tắc lưu lượng truy cập đi để cho phép tài khoản dịch vụ Compute Engine truy cập vào bộ chứa lưu trữ từ ProjectZ đến ProjectX. Ngoài ra, chúng ta có thể thấy rằng mạng không nằm trong cùng một phạm vi, vì vậy, chúng ta cần cho phép giao tiếp VPC với các dịch vụ và chia sẻ dữ liệu trên các phạm vi dịch vụ.

  1. Kích hoạt Cloud Shell và tạo tệp .yaml có quy tắc lưu lượng truy cập đi bằng trình chỉnh sửa văn bản.
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. Cập nhật chính sách lưu lượng truy cập đến bảo vệ ProjectZ.
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY 

Bây giờ, chúng ta có thể thử lại để truy cập vào bộ chứa từ phiên bản máy ảo.

  1. Trong bảng điều khiển Cloud, hãy chuyển đến bộ chọn dự án và chọn ProjectZ, sau đó chuyển đến Compute Engine > Phiên bản máy ảo.
  2. Nhấp vào nút SSH để kết nối với Phiên bản máy ảo và truy cập vào dòng lệnh của phiên bản đó.
  3. Sau khi bạn ở trong CLI máy ảo, hãy thử liệt kê các đối tượng trong Bộ chứa lưu trữ.
gcloud storage ls gs://BUCKET_NAME/

Bạn sẽ nhận được thông báo lỗi sau:

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. Chúng ta cần cấp quyền đọc đối tượng cho tài khoản dịch vụ Compute Engine để có thể liệt kê các đối tượng trong Bộ chứa lưu trữ.
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
  1. Một lần nữa, hãy thử liệt kê tệp hello.txt từ CLI của phiên bản máy ảo .
gcloud storage ls gs://BUCKET_NAME/
.
.
gs://BUCKET_NAME/hello.txt

Bây giờ, chúng ta có thể liệt kê đối tượng mà không gặp lỗi vi phạm quyền VPC Service Controls, nhưng còn việc tải xuống tệp thì sao? Hãy thử xem.

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

Và chúng ta sẽ nhận được đầu ra sau

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

7. Dọn dẹp

Mặc dù không có khoản phí riêng cho việc sử dụng VPC Service Controls khi dịch vụ không được sử dụng, nhưng bạn nên dọn dẹp quá trình thiết lập được sử dụng trong phòng thí nghiệm này. Bạn cũng có thể xoá thực thể máy ảo và/hoặc các dự án trên đám mây để tránh phát sinh chi phí. Việc xoá dự án trên đám mây sẽ dừng tính phí cho tất cả các tài nguyên được sử dụng trong dự án đó.

  1. Để xoá phiên bản máy ảo, hãy chọn hộp kiểm ở bên trái tên phiên bản máy ảo, sau đó nhấp vào Xoá.

da0abf0894fe03cd.png

  1. Để xoá phạm vi, hãy hoàn tất các bước sau:
  • Trong bảng điều khiển Cloud, hãy nhấp vào Security (Bảo mật), sau đó nhấp vào VPC Service Controls (VPC Service Controls) ở phạm vi Tổ chức.
  • Trên trang VPC Service Controls (VPC Service Controls), trong hàng của bảng tương ứng với phạm vi mà bạn muốn xoá, hãy nhấp vào "Delete Icon" (Biểu tượng xoá)
  1. Để xoá Cấp truy cập, hãy hoàn tất các bước sau:
  • Trong bảng điều khiển Cloud, hãy mở trang Access Context Manager ở phạm vi Thư mục.
  • Trong lưới, ở hàng của cấp truy cập mà bạn muốn xoá, hãy nhấp vào "Delete Icon" (Biểu tượng xoá), sau đó nhấp vào Delete (Xoá).
  1. Để xoá đối tượng và Bộ chứa lưu trữ, hãy hoàn tất các bước sau:
  • Trong bảng điều khiển Cloud, hãy mở trang bộ chứa Cloud Storage .
  • Chọn hộp kiểm bên cạnh bộ chứa mà bạn đã tạo.
  • Nhấp vào Xóa.
  • Trong cửa sổ mở ra, hãy xác nhận rằng bạn muốn xoá bộ chứa.
  • Nhấp vào Xóa.
  1. Để tắt Dự án, hãy hoàn tất các bước sau:
  • Trong Google Cloud Console, hãy chuyển đến trang IAM & Admin Settings của dự án mà bạn muốn xoá.
  • Trên trang IAM &Admin Settings (Cài đặt IAM và Quản trị), hãy nhấp vào Shutdown (Tắt).
  • Nhập mã dự án rồi nhấp vào Shutdown anyway (Vẫn tắt).

8. Xin chúc mừng!

Trong lớp học lập trình này, bạn đã cập nhật phạm vi Chạy thử của VPC Service Controls, thực thi phạm vi đó và khắc phục sự cố.

Tìm hiểu thêm

Giấy phép

Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.