Bảo mật lưu lượng truy cập vào Cloud Run

1. Tổng quan

Phòng thí nghiệm này hướng dẫn bạn cách hạn chế quyền truy cập vào một dịch vụ Cloud Run và chỉ cho phép các yêu cầu từ một khối lượng công việc đang chạy tại chỗ hoặc trong VPC của dự án. Bạn có thể sử dụng 2 lớp kiểm soát quyền truy cập: chế độ cài đặt chuyển dữ liệu vào và chính sách Quản lý danh tính và quyền truy cập (IAM).

5aed47d10595c878.png

Cài đặt cổng vào

Chế độ cài đặt Ingress cho phép bạn lọc các yêu cầu dựa trên nguồn gốc mạng (nội bộ hoặc bên ngoài). Theo mặc định, tất cả các yêu cầu đều được phép truyền qua, kể cả các yêu cầu từ Internet công cộng.

Chính sách IAM

Các chính sách IAM cho phép bạn lọc yêu cầu dựa trên danh tính của người gửi và thường được dùng để xác thực các yêu cầu từ dịch vụ đến dịch vụ.

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách và thời điểm sử dụng chế độ cài đặt cổng vào.

Các máy chủ lưu trữ tại chỗ kết nối thông qua VPC

Trong lớp học lập trình này, chúng ta sẽ mô phỏng một khối lượng công việc tại chỗ. Để kết nối một máy chủ lưu trữ tại chỗ với Cloud Run, bạn sẽ định cấu hình Quyền truy cập riêng tư của Google cho máy chủ lưu trữ tại chỗ. Việc này bao gồm thiết lập một cổng Cloud VPN trong mạng VPC, như minh hoạ dưới đây.

31611f6a2f12fd0c.png

Mô phỏng khối lượng công việc tại chỗ bằng cách sử dụng máy chủ chuyển tiếp trong VPC

Trong bài thực hành này, bạn sẽ mô phỏng việc gửi yêu cầu từ một máy chủ lưu trữ tại cơ sở bằng cách gửi yêu cầu từ một máy ảo Compute Engine trong VPC, như minh hoạ ở đây.

aebf22740c7a84f0.png

Máy ảo Compute Engine mà bạn sẽ dùng làm máy chủ chuyển tiếp có cùng nguồn mạng với Cổng VPN trên đám mây. Đó là lý do bạn có thể dùng máy ảo này để mô phỏng việc gửi yêu cầu từ một tải công việc tại chỗ.

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

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án.
  • Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, 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 các tài nguyên nhằm tránh phát sinh 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á toàn bộ 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.

Thiết lập môi trường

  1. Đặt một biến môi trường thành mã dự án để dùng trong các lệnh sau:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. Bật các API cần thiết để thực hiện bài thực hành này.
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. Nhân bản kho lưu trữ ứng dụng mẫu và chuyển đến thư mục
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. Đặt khu vực và vùng mặc định cho Compute Engine và Cloud Run
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. Triển khai dịch vụ

Trước tiên, bạn sẽ triển khai dịch vụ và để dịch vụ đó có thể truy cập công khai. Sau khi bạn xác minh rằng bạn có thể gửi yêu cầu từ trình duyệt của mình, chúng tôi sẽ khoá dịch vụ và chỉ cho phép các yêu cầu từ các nguồn mạng nội bộ.

Khi chạy lệnh sau, hãy làm theo các hướng dẫn sau:

  • Vị trí mã nguồn (...): Xác minh rằng bạn đang ở trong thư mục partner-registration-service và nhấn Enter để chấp nhận giá trị mặc định
  • Tên dịch vụ (partner-registration-service): Nhấn phím Enter để chấp nhận giá trị mặc định
  • Cho phép các lệnh gọi chưa xác thực đến [partner-registration-service] (y/N)? Đã phê duyệt
gcloud run deploy 

Khi lệnh này hoàn tất, lệnh sẽ liệt kê URL của dịch vụ Cloud Run. Kết quả sẽ có dạng tương tự như danh sách sau:

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

Mở URL dịch vụ trong trình duyệt. Bạn sẽ thấy kết quả sau:

Partner registration service: RUNNING

Đặt dịch vụ để chỉ cho phép các yêu cầu nội bộ

Giờ đây, bạn sẽ sử dụng chế độ cài đặt lưu lượng truy cập vào của dịch vụ Cloud Run để chỉ cho phép các yêu cầu từ các nguồn nội bộ. Các nguồn nội bộ bao gồm những tài nguyên trong mạng VPC thuộc cùng một dự án (hoặc phạm vi VPC Service Controls) với dịch vụ Cloud Run. Điều này khiến các nguồn nội bộ trở nên phù hợp với trường hợp sử dụng của chúng ta.

Ngoài ra, các yêu cầu từ những sản phẩm khác của Google Cloud được coi là yêu cầu nội bộ, ngay cả khi các yêu cầu đó không thuộc VPC. Ví dụ: những sản phẩm đó bao gồm Pub/Sub và Workflows.

Các yêu cầu từ những nguồn này vẫn nằm trong mạng lưới của Google, ngay cả khi chúng truy cập vào dịch vụ của bạn tại URL run.app và không được phép truy cập công khai.

Cập nhật dịch vụ để chỉ cho phép các yêu cầu nội bộ:

gcloud run services update partner-registration-service --ingress=internal

Nếu bạn mở lại URL dịch vụ, thì URL đó sẽ có nội dung "Error: Forbidden - Access is forbidden" (Lỗi: Bị cấm – Bạn không có quyền truy cập)

Vì trình duyệt của bạn gửi yêu cầu từ một nguồn mạng bên ngoài, chứ không phải từ một nguồn nội bộ đến dự án trên đám mây của Google, nên đây chính xác là điều bạn mong đợi. Dịch vụ của bạn hiện đã an toàn hơn.

4. Tạo một máy ảo Compute Engine làm máy chủ chuyển tiếp

Bước tiếp theo là mô phỏng các yêu cầu từ một máy chủ tại chỗ thông qua một cổng Cloud VPN, bằng cách tạo một phiên bản Compute Engine trong VPC để dùng làm máy chủ chuyển tiếp:

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

Kết quả của lệnh này sẽ tương tự như sau:

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

Gửi yêu cầu từ phiên bản Compute Engine đến dịch vụ

Bây giờ, bạn sẽ mở một cửa sổ dòng lệnh trên máy ảo và gửi yêu cầu trực tiếp từ máy trong mạng VPC.

Nếu lệnh sau nhắc bạn thiết lập SSH trong Cloud Shell, hãy làm theo hướng dẫn:

gcloud compute ssh jump-server

Lấy URL của dịch vụ Cloud Run bằng lệnh sau:

gcloud run services describe partner-registration-service --region us-central1

Một vài dòng đầu tiên của đầu ra sẽ có dạng như sau:

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

Bây giờ, hãy sao chép URL và gửi yêu cầu từ phiên bản Compute Engine bằng cách sử dụng curl. Yêu cầu này sẽ thành công vì phiên bản VM chạy trong mạng VPC của dự án – đây là một nguồn nội bộ.

export SERVICE_URL=https://

curl ${SERVICE_URL}

Kết quả đầu ra sẽ là:

Partner registration service: RUNNING

5. Thế còn quyền kiểm soát truy cập dựa trên IAM thì sao?

Lớp học lập trình này đã hướng dẫn bạn cách và thời điểm sử dụng chế độ cài đặt cổng vào. Cài đặt cổng vào là bước khởi đầu tốt nếu bạn đang kết nối một khối lượng công việc tại chỗ với Cloud Run.

Bạn cần nỗ lực hơn để triển khai tính năng kiểm soát quyền truy cập dựa trên IAM, đặc biệt là nếu bạn đang gọi từ một máy chủ lưu trữ tại cơ sở:

  • IAM yêu cầu bạn quản lý thông tin đăng nhập tài khoản dịch vụ có thời gian tồn tại lâu dài trên máy chủ lưu trữ
  • IAM yêu cầu bạn thay đổi mã để ký các yêu cầu bằng thông tin đăng nhập của tài khoản dịch vụ.

Google đề xuất sử dụng phương pháp kiểm soát quyền truy cập nhiều lớp. Việc sử dụng chế độ cài đặt cổng vào để hạn chế quyền truy cập chỉ cho máy chủ nội bộ là một bước khởi đầu tốt, nhưng đừng dừng lại ở đó!

6. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn tất lớp học lập trình này!

Bước tiếp theo:

Khám phá các lớp học lập trình khác của Cymbal Eats:

Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong hướng dẫn này, hãy xoá dự án chứa các tài nguyên đó hoặc giữ lại dự án rồi xoá từng tài nguyên.

Xoá dự án

Cách dễ nhất để không bị tính phí là xoá dự án mà bạn đã tạo cho hướng dẫn này.

Tài liệu tham khảo hữu ích

Sau đây là các tài nguyên bổ sung giúp bạn tìm hiểu thêm về 2 lớp kiểm soát quyền truy cập trên Cloud Run.