Ứng dụng không máy chủ bảo mật với proxy nhận biết danh tính (IAP)

1. Tổng quan

Trong lớp học lập trình này, bạn sẽ triển khai cổng thông tin nhân viên cho phép nhân viên xem, cập nhật và xoá đơn đặt hàng từ ứng dụng Cymbal Eats. Bạn sẽ sử dụng Proxy nhận dạng (IAP) để bảo mật quyền truy cập vào cổng thông tin mà không cần sử dụng Mạng riêng ảo (VPN). IAP đơn giản hoá việc triển khai mô hình truy cập không tin cậy và tốn ít thời gian hơn so với VPN cho người làm việc từ xa, cả tại chỗ và trong môi trường đám mây, với một điểm kiểm soát duy nhất để quản lý quyền truy cập vào ứng dụng của bạn.

94b06525c85408ad.png

Identity-Aware Proxy là gì?

Identity-Aware Proxy (IAP) là một dịch vụ của Google Cloud giúp chặn các yêu cầu được gửi đến ứng dụng của bạn, xác thực người dùng đưa ra yêu cầu bằng cách sử dụng Dịch vụ nhận dạng của Google và chỉ cho phép các yêu cầu đó đi qua nếu chúng đến từ một người dùng được uỷ quyền truy cập vào ứng dụng. Ngoài ra, lớp này có thể sửa đổi tiêu đề yêu cầu để thêm thông tin về người dùng đã xác thực.

Kiến thức bạn sẽ học được

  • Cách định cấu hình Nhóm điểm cuối mạng không có máy chủ (NEG)
  • Cách định cấu hình trình cân bằng tải
  • Cách bật IAP để hạn chế quyền truy cập
  • Cách hạn chế quyền truy cập bằng giao dịch mua hàng trong ứng dụng

2. Cách thiết lập và các 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ị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google 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à duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi 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ã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng tên của riêng mình để xem tên đó có được chấp nhận 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ẽ được giữ nguyên trong suốt thời gian diễn ra dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba 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 Cloud. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên để không bị tính phí sau khi hoàn tất 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í 300 USD.

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

  1. Tạo biến môi trường liên quan đến dự án và tài nguyên
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
  1. Bật API dịch vụ IAP và Trình quản lý tài nguyên trên đám mây
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.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/employee-ui
  1. Triển khai Cổng thông tin nhân viên bằng tập lệnh thiết lập. Chờ tập lệnh hoàn tất trước khi chuyển sang bước tiếp theo
./setup.sh

Kết quả ví dụ

...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. Nhấp vào đường liên kết URL của dịch vụ

86416f68c0b8152a.png

3. Định cấu hình Nhóm điểm cuối mạng không có máy chủ (NEG)

Bạn sẽ tạo một Nhóm điểm cuối mạng không có máy chủ( NEG không có máy chủ) cho dịch vụ Cloud Run giao diện người dùng của nhân viên. NEG không máy chủ cho phép bạn sử dụng các ứng dụng không máy chủ của Google Cloud với Tính năng cân bằng tải HTTP(S) bên ngoài.

2abe669e53c27186.png

  1. Tạo một nhóm điểm cuối mạng cho dịch vụ giao diện người dùng của nhân viên.
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
    --project $PROJECT_ID \
    --region=$REGION \
    --network-endpoint-type=serverless  \
    --cloud-run-service=employee-ui-service

Ví dụ về kết quả

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg].
Created network endpoint group [employee-ui-iap-neg].

Tạo dịch vụ phụ trợ và thêm NEG không máy chủ

Dịch vụ phụ trợ xác định cách Cloud Load Balancing phân phối lưu lượng truy cập. Cấu hình dịch vụ phụ trợ chứa một tập hợp các giá trị, chẳng hạn như giao thức dùng để kết nối với các phần phụ trợ, nhiều chế độ cài đặt phân phối và phiên, kiểm tra tình trạng và thời gian chờ. Các chế độ cài đặt này giúp bạn kiểm soát chi tiết cách hoạt động của bộ cân bằng tải.

  1. Tạo dịch vụ phụ trợ
gcloud compute backend-services create employee-ui-iap-backend \
        --global 

Ví dụ về kết quả

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
NAME: employee-ui-iap-backend
BACKENDS:
PROTOCOL: HTTP
  1. Thêm NEG không máy chủ làm phần phụ trợ cho dịch vụ phụ trợ
gcloud compute backend-services add-backend employee-ui-iap-backend \
    --global \
    --network-endpoint-group=employee-ui-iap-neg \
    --network-endpoint-group-region=$REGION

Ví dụ về kết quả

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. Tạo bản đồ URL để định tuyến các yêu cầu đến dịch vụ phụ trợ
gcloud compute url-maps create employee-ui-iap-url-map \
    --default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map].
NAME: employee-ui-iap-url-map
DEFAULT_SERVICE: backendServices/employee-ui-iap-backend

4. Định cấu hình các thành phần của Trình cân bằng tải

Sơ đồ sau đây cho thấy bộ cân bằng tải sử dụng phần phụ trợ NEG không máy chủ để chuyển hướng các yêu cầu đến dịch vụ Cloud Run không máy chủ.

335f4674737a6514.png

Đặt trước địa chỉ IP tĩnh

  1. Đặt trước địa chỉ IPv4 tĩnh và lưu trữ miền
gcloud compute addresses create employee-ui-iap-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

Ví dụ về kết quả

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
  1. Lưu trữ miền nip.io
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io

Tạo tài nguyên chứng chỉ SSL do Google quản lý

  1. Tạo tài nguyên chứng chỉ SSL do Google quản lý
gcloud compute ssl-certificates create employee-ui-iap-cert \
    --description=employee-ui-iap-cert \
    --domains=$DOMAIN \
    --global

Ví dụ về kết quả

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert].
NAME: employee-ui-iap-cert
TYPE: MANAGED
CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00
EXPIRE_TIME:
MANAGED_STATUS: PROVISIONING

34.102.234.98.nip.io: PROVISIONING

Tạo proxy HTTPS mục tiêu

  1. Tạo proxy HTTPS mục tiêu để định tuyến các yêu cầu đến bản đồ URL
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
    --ssl-certificates employee-ui-iap-cert \
    --url-map employee-ui-iap-url-map

Ví dụ về kết quả

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy].
NAME: employee-ui-iap-http-proxy
SSL_CERTIFICATES: employee-ui-iap-cert
URL_MAP: employee-ui-iap-url-map
CERTIFICATE_MAP:

Định cấu hình quy tắc chuyển tiếp

  1. Tạo quy tắc chuyển tiếp để định tuyến các yêu cầu đến proxy
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
    --load-balancing-scheme=EXTERNAL \
    --network-tier=PREMIUM \
    --address=employee-ui-iap-ip \
    --global \
    --ports=443 \
    --target-https-proxy employee-ui-iap-http-proxy

Kết quả ví dụ

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].

Hạn chế truy cập vào dịch vụ Cloud Run

Hạn chế lưu lượng truy cập vào để chỉ chấp nhận các yêu cầu nội bộ và yêu cầu đến qua tính năng Cân bằng tải HTTP(S).

26cb0b2a9162e7ab.png

  1. Cập nhật dịch vụ để chỉ cho phép lưu lượng truy cập vào từ các yêu cầu nội bộ và yêu cầu thông qua Trình cân bằng tải HTTP(S)
gcloud run services update employee-ui-service \
    --ingress internal-and-cloud-load-balancing \
    --region $REGION

Kết quả ví dụ

OK Deploying... Done.                            
  OK Creating Revision...
  OK Routing traffic...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. Nhấp vào đường liên kết URL của dịch vụ

8505fde7e0784bf1.png

Quyền truy cập vào URL dịch vụ Cloud Run hiện hiển thị là bị cấm.

5. Bật Cloud Identity-Aware Proxy (IAP) trên Trình cân bằng tải

IAP cho phép bạn thiết lập một lớp uỷ quyền trung tâm cho các ứng dụng được truy cập bằng HTTPS. Bạn có thể sử dụng mô hình kiểm soát quyền truy cập cấp ứng dụng thay vì tường lửa cấp mạng.

d9740402a74370a8.png

Thương hiệu là màn hình xin phép bằng OAuth chứa thông tin thương hiệu cho người dùng. Thương hiệu có thể chỉ dành cho người dùng nội bộ hoặc công khai. Một thương hiệu nội bộ cho phép thành viên của cùng một tổ chức Google Workspace với dự án truy cập vào quy trình OAuth. Giao diện đồng ý OAuth công khai cho phép bất kỳ ai có kết nối Internet đều có thể truy cập.

  1. Tạo thương hiệu
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud alpha iap oauth-brands create \
    --application_title="Cymbal Eats" \
    --support_email=$USER_EMAIL

Ví dụ về kết quả

Created [462858740426].
applicationTitle: Cymbal Eats
name: projects/462858740426/brands/462858740426
orgInternalOnly: true

Tạo ứng dụng khách OAuth cho giao dịch mua trong ứng dụng

  1. Tạo ứng dụng bằng tên thương hiệu từ bước trước
gcloud alpha iap oauth-clients create \
    projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
    --display_name=cymbal-eats-employee-ui

Ví dụ về kết quả

Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com].
displayName: cymbal-eats-employee-ui
name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com
secret: [secret-removed]
  1. Lưu trữ tên, mã nhận dạng và khoá bí mật của ứng dụng khách
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
    projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
    --filter="displayName:cymbal-eats-employee-ui")

export CLIENT_ID=${CLIENT_NAME##*/}

export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
  1. Trong Cloud Console, hãy chọn dự án trong trình đơn thả xuống để chọn dự án
  2. Chuyển đến màn hình xin phép bằng OAuth trong Cloud Console

bcb460f3ab5241f4.png

  1. Nhấp vào LÀM NÊN NGOÀI PHÁI trong phần Loại người dùng
  2. Chọn trạng thái Xuất bản là Thử nghiệm

27fd7de6e7b7ef21.png

  1. Nhấp vào XÁC NHẬN

6. Hạn chế quyền truy cập bằng giao dịch mua hàng trong ứng dụng

Hạn chế quyền truy cập vào dịch vụ phụ trợ bằng IAP, sau đó xác minh rằng không thể truy cập vào ứng dụng.

  1. Bật IAP trên dịch vụ phụ trợ
gcloud iap web enable --resource-type=backend-services \
    --oauth2-client-id=$CLIENT_ID \
    --oauth2-client-secret=$CLIENT_SECRET \
    --service=employee-ui-iap-backend

Xác minh cấu hình giao dịch mua hàng trong ứng dụng

  1. Xác minh rằng chứng chỉ SSL đang HOẠT ĐỘNG
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. Lấy URL của dịch vụ
echo https://$DOMAIN

Kết quả ví dụ

https://34.102.234.98.nip.io
  1. Nhấp vào URL của dịch vụ để mở cổng thông tin dành cho nhân viên.

352b600209c3fb33.png

  1. Đăng nhập bằng thông tin xác thực của bạn trong phòng thí nghiệm.

f7e0318388aa0739.png

  1. Đóng trình duyệt

Cấp cho người dùng quyền truy cập vào cổng thông tin nhân viên

  1. Thêm mối liên kết chính sách IAM cho vai trò 'roles/iap.httpsResourceAccessor' cho người dùng được tạo ở bước trước
gcloud iap web add-iam-policy-binding \
    --resource-type=backend-services \
    --service=employee-ui-iap-backend \
    --member=user:$USER_EMAIL \
    --role='roles/iap.httpsResourceAccessor'

Kết quả ví dụ

Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].

Kiểm thử quyền truy cập vào dịch vụ

Xác nhận đã cấp quyền truy cập vào cổng thông tin dành cho nhân viên

  1. Lấy URL của dịch vụ
echo https://$DOMAIN

Kết quả ví dụ

https://34.102.234.98.nip.io
  1. Nhấp vào URL của dịch vụ để mở cổng thông tin dành cho nhân viên.

86416f68c0b8152a.png

Giờ đây, bạn đã có quyền truy cập vào cổng thông tin dành cho nhân viên.

(Không bắt buộc) Triển khai tất cả các phần phụ thuộc, việc triển khai các dịch vụ vi mô này có thể mất khoảng 20 phút.

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

./setup.sh
./get-site-urls.sh

7. Xin chúc mừng!

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

Bước tiếp theo:

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

Dọn dẹp

Để tránh bị tính phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được sử 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 và xoá từng tài nguyên.

Xoá dự án

Cách dễ nhất để loại bỏ tính năng thanh toán là xoá dự án mà bạn đã tạo cho hướng dẫn này.