Ứ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 phòng thí nghiệm này, bạn sẽ triển khai cổng thông tin cho nhân viên để cho phép nhân viên xem, cập nhật và xoá đơn đặt hàng khỏi ứng dụng Cymbal Eats. Bạn sẽ sử dụng Proxy nhận dạng nhận dạng (IAP) để bảo mật truy cập cổng mà không cần sử dụng Mạng riêng ảo (VPN). IAP giúp đơn giản hoá việc triển khai mô hình truy cập theo nguyên tắc không tin tưởng bất cứ điều gì (zero-trust) và mất ít thời gian hơn so với VPN dành cho nhân viên làm việc từ xa cả tại cơ sở hạ tầng riêng và môi trường đám mây thông qua một điểm kiểm soát duy nhất để quản lý quyền truy cập vào ứng dụng.

94b06525c85408ad.png.

Proxy nhận dạng là gì?

Proxy nhận biết danh tính (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 Dịch vụ nhận dạng của Google và chỉ cho phép các yêu cầu đó nếu yêu cầu đến từ người dùng được ủy quyền truy cập vào ứng dụng. Ngoài ra, chương trình này có thể sửa đổi tiêu đề của yêu cầu để bao gồ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 thiết bị đầu cuối mạng không 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. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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ự 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 trong 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 bạn không quan tâm đến sản phẩm đó là gì. 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 (mã này thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số 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 này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạ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 các 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ụ Trình quản lý tài nguyên trên đám mây và IAP
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. Sao chép 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 cách sử dụng tập lệnh thiết lập. Hãy đợi 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 dịch vụ

86416f68c0b8152a.pngS

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

Bạn sẽ tạo một Nhóm thiết bị đầu cuối mạng không máy chủ( Serverless NEG) cho dịch vụ UI Cloud Run của nhân viên. Các NEG không máy chủ cho phép bạn sử dụng các ứng dụng Google Cloud không máy chủ bằng Cân bằng tải HTTP(S) bên ngoài.

2abe669e53c27186.pngS

  1. Tạo một nhóm thiết bị đầu 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

Kết quả ví dụ

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 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 trình cân bằng tải.

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

Kết quả ví dụ

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

Kết quả ví dụ

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. Tạo một bản đồ URL để định tuyến các yêu cầu đến đế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 trình cân bằng tải

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

335f4674737a6514.pngs

Dành riêng một địa chỉ IP tĩnh

  1. Đặt trước một đị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

Kết quả ví dụ

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

Kết quả ví dụ

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 của bạn
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
    --ssl-certificates employee-ui-iap-cert \
    --url-map employee-ui-iap-url-map

Kết quả ví dụ

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 đế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ế lưu lượng 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 thông qua 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 dịch vụ

8505fde7e0784bf1.png.

Giờ đây, quyền truy cập vào URL dịch vụ Cloud Run sẽ 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 qua 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. Chỉ người dùng nội bộ hoặc người dùng công khai mới có thể sử dụng thương hiệu. Thương hiệu nội bộ cho phép thành viên thuộc cùng tổ chức Google Workspace với dự án truy cập vào quy trình OAuth. Thương hiệu công khai giúp bất kỳ ai có quyền truy cập Internet đều có thể truy cập vào quy trình OAuth.

  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

Kết quả ví dụ

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

Tạo ứng dụng OAuth của IAP

  1. Tạo một khách hà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

Kết quả ví dụ

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ã và mã 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 chọn dự án thả xuống
  2. Chuyển đến màn hình xin phép bằng OAuth trong Cloud Console

bcb460f3ab5241f4.png

  1. Nhấp vào TẠO BÊN NGOÀI trong phần User Type (Loại người dùng)
  2. Chọn trạng thái Xuất bản là Kiểm thử

27fd7de6e7b7ef21.pngS

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

6. Hạn chế quyền truy cập với IAP

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

  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 IAP

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

Kết quả ví dụ

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

352b600209c3fb33.pngS

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

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 của nhân viên

  1. Thêm một liên kết chính sách IAM cho vai trò của 'roles/iap.httpsResourceAccessor' đối với người dùng đã 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 cho nhân viên

  1. Nhận URL dịch vụ
echo https://$DOMAIN

Kết quả ví dụ

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

86416f68c0b8152a.pngS

Bây giờ, bạn sẽ có quyền truy cập vào cổng thông tin 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 thành 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 làm phát sinh chi phí cho các tài nguyên được sử dụng trong hướng dẫn này trong tài khoản Google Cloud của bạn, 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 riêng lẻ.

Xoá dự án

Cách dễ nhất để loại bỏ việc thanh toán là xoá dự án bạn đã tạo cho phần hướng dẫn.