1. Giới thiệu
Trước đây, khoá API của Google được dùng để truy cập vào các API của Google khi không có phương thức nào khác hoặc khi các phương thức khác được coi là không thuận tiện. Các trường hợp sử dụng phổ biến là truy cập vào API Google Maps và các API của Google do Firebase cung cấp. Với việc ra mắt các mô hình AI, tác nhân AI như Gemini, AI Studio và các khung phát triển tác nhân AI như Bộ công cụ phát triển tác nhân, khoá API đã trở thành phương thức chính để truy cập vào Mô hình ngôn ngữ lớn của Google.
Khoá API cung cấp mức độ bảo vệ thấp. Mặc dù Google Cloud cung cấp một số phương thức để ngăn chặn việc sử dụng sai mục đích các khoá này, nhưng việc sở hữu một khoá API đang hoạt động sẽ cho phép truy cập vào các API của Google mà không cần xác thực hoặc xác minh quyền bổ sung. Các phương thức hạn chế việc sử dụng khoá API được mô tả trong tài liệu. Bài đăng Bảo mật khoá API của Gemini và Google trên Blog Cloud cung cấp thêm đề xuất về việc duy trì khoá API. Trong Lớp học lập trình này, bạn sẽ thực hành các đề xuất này.
Bạn sẽ thực hiện
- Xem các quy tắc hạn chế được thực thi khi tạo khoá API mới trên Google Cloud
- Lập danh mục tất cả khoá API của bạn và tìm các khoá không có biện pháp bảo mật
- Thực thi các quy tắc hạn chế đối với khoá API hiện có dựa trên cách sử dụng khoá đó
- Xác định quy trình tự động xoá khoá trong trường hợp sử dụng bất thường
Bạn cần có
- Trình duyệt web hiện đại (chẳng hạn như Chrome).
- Tài khoản Google
2. Thiết lập
Các hướng dẫn trong Lớp học lập trình này giả định rằng bạn chạy các lệnh trong Cloud Shell trong bảng điều khiển Cloud. Nếu có gcloud CLI trong môi trường cục bộ, bạn có thể chạy các lệnh ở đó.
Mặc dù bạn có thể thực hiện các thao tác trong các bước bằng giao diện người dùng của bảng điều khiển Cloud, nhưng các phương thức sẽ khác nhau. Lớp học lập trình này sử dụng giao diện dòng lệnh để đơn giản hoá các tương tác và giúp bạn dễ dàng tích hợp hơn với các tác nhân AI hiện đại (như Antigravity CLI).
Khởi động thiết bị đầu cuối Cloud Shell
- Mở bảng điều khiển Cloud của Google bằng cách truy cập vào https://console.cloud.google.com/ trong một cửa sổ trình duyệt mới. Bạn nên sử dụng Chrome để có trải nghiệm người dùng tốt nhất.
- Đăng nhập vào Tài khoản Google của bạn trong Google Cloud.
- Nhấp vào Kích hoạt Cloud Shell
ở đầu bảng điều khiển Google Cloud.
Nếu được yêu cầu, hãy nhấp qua các cửa sổ sau:- Tiếp tục qua cửa sổ thông tin Cloud Shell.
- Cho phép Cloud Shell sử dụng thông tin xác thực của bạn để thực hiện lệnh gọi API Google Cloud.
Chọn một dự án trong Google Cloud
Sau khi mở bảng điều khiển Cloud, bạn sẽ được xác thực và thường có một dự án để bạn chọn cho công việc của mình. Mã dự án là một chuỗi gồm 6 đến 30 ký tự gồm các chữ cái viết thường, số và dấu gạch ngang, ví dụ: qwiklabs-gcp-04-3075fc9fd77f. Thiết bị đầu cuối Cloud Shell định cấu hình gcloud CLI với dự án đã chọn. Bạn sẽ thấy một kết quả tương tự như sau:
Your Cloud Platform project in this session is set to qwiklabs-gcp-04-3075fc9fd77f
Điều này có nghĩa là các lệnh tiếp theo của bạn đối với gcloud sẽ sử dụng mã dự án qwiklabs-gcp-04-3075fc9fd77f.
Đặt mã dự án làm biến môi trường PROJECT_ID. Bạn có thể xem danh sách tất cả dự án của mình bằng lệnh sau:
gcloud projects list
- Thay thế
your-project-idvà chạy lệnh nếu bạn muốn sử dụng mã dự án khác với mã dự án được định cấu hình tronggcloud. Ví dụ:export PROJECT_ID="your-project-id"export PROJECT_ID="qwiklabs-gcp-04-3075fc9fd77f" - Chạy lệnh sau nếu bạn muốn sử dụng mã dự án đã chọn:
export PROJECT_ID=$(gcloud config get project)
3. Hạn chế khoá API mới
Trước đây, người dùng có thể tạo khoá API hoàn toàn không bị hạn chế. Các khoá không bị hạn chế có thể được dùng để gọi BẤT KỲ API nào của Google được bật trong dự án mà khoá đó được tạo. Mặc dù bảng điều khiển Google Cloud ngăn người dùng tạo các khoá không bị hạn chế, nhưng bạn vẫn có thể tạo các khoá này bằng gcloud CLI hoặc bằng cách sử dụng lệnh gọi API trực tiếp.
Các bước sau đây cho biết cách tạo khoá API bị hạn chế, chỉ cho phép sử dụng API cụ thể và trang web được chỉ định.
- Để tạo khoá API mới chỉ được dùng với API vị trí địa lý của Google Maps, hãy chạy lệnh sau trong thiết bị đầu cuối của shell:
Lệnh này tạo một khoá API mới CHỈ có thể được dùng để gọi dịch vụ vị trí địa lý của Google Maps.gcloud services api-keys create --key-id=restricted-api-key \ --display-name="restricted api key" \ --api-target=service=geolocation.googleapis.com \ --project=${PROJECT_ID} - Tăng cường bảo mật khoá bằng cách thêm quy tắc hạn chế đối với ứng dụng. Chỉ cho phép sử dụng khoá cho tất cả các đường dẫn trong trang web
example.com. Chạy lệnh sau để thêm quy tắc hạn chế đối với ứng dụng vào khoá: Thay vì cho phép sử dụng khoá cho(các) trang web cụ thể, bạn có thể sử dụnggcloud services api-keys update restricted-api-key \ --location=global \ --allowed-referrers="example.com/*" \ --project=${PROJECT_ID}--allowed-applicationđể xác định ứng dụng Android được phép hoặcallowed-ipsđể xác định địa chỉ IP được phép.
Dọn dẹp
Xoá khoá API bạn đã tạo, trừ phi bạn dự định sử dụng khoá đó:
gcloud services api-keys delete --key-id=restricted-api-key \
--project=${PROJECT_ID}
4. Lập danh mục khoá API
Trong bước này, bạn sẽ sử dụng gcloud CLI để lấy danh sách khoá API. Danh sách kết quả cho thấy tất cả khoá API đang hoạt động (không bị xoá) mà bạn có quyền truy cập.
- Chạy lệnh sau để xem tất cả tên khoá, mã nhận dạng và ngày tạo:
Kết quả sẽ cho thấy tên khoá mà con người có thể đọc được, mã nhận dạng khoá và ngày tạo khoá. Kết quả sẽ tương tự như sau:gcloud services api-keys list --project=${PROJECT_ID} \ --format='value(displayName,name.basename(),createTime.date())'api key 1 api-key-1 2024-05-10T07:53:24 api key 2 api-key-2 2025-06-12T14:47:57
- Chọn một trong các mã nhận dạng khoá rồi dán lệnh sau để kiểm tra xem khoá có quy tắc hạn chế nào không. Thay thế
your-key-idbằng giá trị của mã nhận dạng khoá đã chọn:gcloud services api-keys describe "your-key-id" --project=${PROJECT_ID}
Kết quả (ở định dạng YAML) sẽ chứa danh sách các quy tắc hạn chế trong restrictions.
createTime: '2024-05-10T07:53:24.986528Z'
displayName: api key 1
etag: W/"u1WuY41K2tPKUZd7cfLoKg=="
name: projects/123456789012/locations/global/keys/api-key-1
restrictions:
apiTargets:
- service: geolocation.googleapis.com
browserKeyRestrictions:
allowedReferrers:
- https://example.com/*
uid: 1a2b3c4d-1234-abcd-1234-a1b2c3d4e5f6
updateTime: '2024-05-10T07:53:24.071228Z'
Xin lưu ý rằng nếu khoá chưa bao giờ được cập nhật, thì các trường createTime và updateTime sẽ có cùng dấu thời gian.
- Tải xuống và chạy tập lệnh duyệt qua tất cả dự án của bạn và in tất cả khoá API KHÔNG có quy tắc hạn chế:
Sau khi chạy tập lệnh, bạn sẽ thấy kết quả ở dạng:curl -fsSL -o unrestricted_api_keys.sh \ "https://github.com/GoogleCloudPlatform/devrel-demos/blob/main/security/api-key-audit/unrestricted_api_keys.sh" chmod +x unrestricted_api_keys.sh ./unrestricted_api_keys.sh Bạn có thể tìm thấy tất cả tập lệnh được dùng trong Lớp học lập trình này tại thư mục Bảo mật trong kho lưu trữ devrel-demos trên GitHub.DISPLAY NAME KEY ID PROJECT ID CREATION DATE Key 1 1a2b3c4d-1234-abcd-1234-a1b2c3d4e5f6 my-project-1 2024-05-10T07:53:24.071228Z
5. Khám phá cách sử dụng khoá API
Trong bước này, bạn sẽ truy vấn các chỉ số của Google Cloud giúp bạn tìm thấy những API nào đã được gọi bằng khoá API của bạn. Khi sử dụng thông tin này, bạn có thể xem xét cách sử dụng hiện tại của các khoá và áp dụng các quy tắc hạn chế đối với API cho khoá dựa trên thông tin thực tế thay vì đoán.
- Sử dụng cùng một mã nhận dạng khoá mà bạn đã dùng trong bước trước hoặc chọn một mã nhận dạng khoá khác. Thay thế
your-key-idbằng mã nhận dạng khoá đã chọn trong lệnh sau:export KEY_UID=$( gcloud services api-keys describe "your-key-id" \ --format='value(uid)' \ --project=${PROJECT_ID}) - Đặt phạm vi tìm kiếm là một năm trước. Nếu bạn muốn tìm kiếm trong khoảng thời gian dài hơn hoặc ngắn hơn, hãy thay thế
365(số ngày) bằng một số dương khác.export DAYS=365 - Làm mới Thông tin xác thực mặc định của ứng dụng (ADC) để cho phép gọi trực tiếp đến API Cloud Monitoring. Chạy lệnh sau và làm theo hướng dẫn trong thiết bị đầu cuối:
gcloud auth application-default login - Chạy lệnh sau để gửi yêu cầu về dữ liệu chỉ số sử dụng dịch vụ đến API Cloud Monitoring:
curl -s -G -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
--data-urlencode "filter=metric.type=\"serviceruntime.googleapis.com/api/request_count\" AND resource.labels.credential_id=\"apikey:${KEY_UID}\"" \
--data-urlencode "interval.startTime=$(date -u -d "${DAYS} days ago" +%Y-%m-%dT%H:%M:%SZ)" \
--data-urlencode "interval.endTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
"https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/timeSeries" \
| jq -r '.timeSeries[]?.resource.labels.service' | sort -u
Lệnh này truy vấn chỉ số tích hợp serviceruntime/api/request_count cho các điểm dữ liệu có nhãn credential_id khớp với mã nhận dạng duy nhất của khoá API đã chọn. Sau đó, lệnh này truy xuất các giá trị cho nhãn service và in các giá trị trong khi loại bỏ các giá trị trùng lặp.
Tăng cường bảo mật khoá API
Trong bước này, bạn sẽ sử dụng thông tin thu thập được trong các bước trước để cập nhật cấu hình hạn chế của khoá API dựa trên thông tin sử dụng.
Bạn sẽ sử dụng cùng một khoá API đã được dùng trong bước trước. Nếu cần, hãy chạy lại các hướng dẫn trong các bước trước để đảm bảo rằng các biến môi trường PROJECT_ID, KEY_UID và DAYS được đặt.
- Chạy lệnh sau để truy xuất danh sách các API của Google được gọi bằng khoá API:
SERVICES=$(curl -s -G -H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
–data-urlencode "filter=metric.type="serviceruntime.googleapis.com/api/request_count" AND resource.labels.credential_id="apikey:${KEY_UID}""
–data-urlencode "interval.startTime=$(date -u -d "${DAYS} days ago" +%Y-%m-%dT%H:%M:%SZ)"
–data-urlencode "interval.endTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)"
"https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/timeSeries"
| jq -r ‘.timeSeries[]?.resource.labels.service' | sort -u)
1. Build the list of arguments to restrict the API usage for the API key based
on the retrieved list.
```shell
API_TARGET_ARGS=()
for SERVICE in $SERVICES; do
API_TARGET_ARGS+=("--api-target=service=${SERVICE}")
done
- Thay thế danh sách các API bị hạn chế cho danh sách không trống:
if [ ${#API_TARGET_ARGS[@]} -gt 0 ]; then gcloud services api-keys update "projects/${PROJECT_ID}/locations/global/keys/${KEY_UID}" \ ${API_TARGET_ARGS} fi
6. Xác định tính năng phát hiện mức sử dụng bất thường
Các bước trước đã cho thấy cách khám phá và tăng cường bảo mật khoá API. Bước này cho biết cách tự động hoá phản hồi đối với mức sử dụng khoá tăng đột biến không mong muốn bằng Cảnh báo giám sát.
Các hướng dẫn sau đây tạo một cảnh báo được kích hoạt khi tốc độ gọi API sử dụng khoá API tăng hơn 10% trong 5 phút qua. Cảnh báo được định cấu hình để kích hoạt tập lệnh Cloud Build, tập lệnh này sẽ xoá khoá API để ngăn chặn việc sử dụng thêm. Bạn có thể khôi phục khoá trong 30 ngày tiếp theo. Xem tài liệu để tìm hiểu cách khôi phục khoá.
Các hướng dẫn này sử dụng lại các biến PROJECT_ID và KEY_UID mà bạn đã dùng trong các bước trước. Nếu bạn muốn chọn một khoá và/hoặc dự án khác, hãy đặt các giá trị mới cho các biến này như mô tả trong các bước Thiết lập và Khám phá cách sử dụng khoá API.
- Chạy tập lệnh sau để tạo tệp chính sách cảnh báo:
Chính sách cảnh báo sử dụng bộ lọc PromQL sau để kích hoạt cảnh báo:cat <<EOF > alert_policy.json { "displayName": "Credential API Request Count Increase Alert (Project: ${PROJECT_ID})", "combiner": "OR", "conditions": [ { "displayName": "API Request Count Increase > 10% in 5m with Min Volume", "conditionPrometheusQueryLanguage": { "query": "(sum(increase(serviceruntime_googleapis_com:api_request_count{metric_label_credential_id=\\"apikey:${KEY_UID}\\"}[5m])) / (sum(increase(serviceruntime_googleapis_com:api_request_count{metric_label_credential_id=\\"apikey:${KEY_UID}\\"}[5m] offset 5m)) or on() vector(1)) > 1.10) and (sum(increase(serviceruntime_googleapis_com:api_request_count{metric_label_credential_id=\\"apikey:${KEY_UID}\\"}[5m])) > 50)", "duration": "0s", "evaluationInterval": "60s" } } ], "enabled": true } EOF Chính sách này tính toán tốc độ tăng và so sánh với một khoảng thời gian trước đó. Và chỉ kích hoạt cảnh báo nếu tốc độ tăng lớn hơn 10%. Để tránh kích hoạt cảnh báo khi tổng số lệnh gọi không đáng kể, chính sách này sẽ kích hoạt cảnh báo nếu có hơn 50 lệnh gọi API trong khoảng thời gian đó. Để tránh tính toán(sum( increase( serviceruntime_googleapis_com:api_request_count{metric_label_credential_id="API_KEY_UID"}[5m]) ) / (sum( increase( serviceruntime_googleapis_com:api_request_count{metric_label_credential_id="API_KEY_UID"}[5m] offset 5m) ) or on() vector(1)) > 1.10) and (sum( increase( serviceruntime_googleapis_com:api_request_count{metric_label_credential_id=\"YOUR_CREDENTIAL_ID_HERE\"}[5m])) > 50)NaN(xoá theo số không) khi tốc độ 5 phút trước đó là 0, chính sách này sẽ thay thế mẫu số bằng 1 nếu tốc độ trong khoảng thời gian trước đó là 0.Bạn có thể thay đổi các tham số cảnh báo như độ dài khoảng thời gian (5m), ngưỡng tối thiểu (50) hoặc ngưỡng tăng 10% (1.10).Các tham số chính sách bổ sung xác định rằng khi đạt đến điều kiện, cảnh báo sẽ được kích hoạt (duration) và điều kiện đó sẽ được thăm dò sau mỗi 60 giây (evaluationInterval). - Chạy lệnh sau để tạo một chủ đề PubSub sẽ được dùng để đăng thông báo cảnh báo:
gcloud pubsub topics create api-key-alert-notifications --project=$PROJECT_ID - Chạy lệnh sau để tạo kênh thông báo cho các cảnh báo sử dụng PubSub.
Bạn sẽ sử dụng biến môi trườngCHANNEL_NAME=$(gcloud beta monitoring channels create \ --display-name="Pub/Sub Alert Channel" \ --type="pubsub" \ --channel-labels="topic=projects/$PROJECT_ID/topics/api-key-alert-notifications" \ --format='value(name)' \ --project=$PROJECT_ID)CHANNEL_NAMEtrong bước Dọn dẹp. - Chạy lệnh sau để tạo cảnh báo giám sát mới:
gcloud monitoring policies create --policy-from-file=alert_policy.json \ --project=$PROJECT_ID - Chạy lệnh sau để cấp quyền cho dịch vụ Cloud Build xoá các khoá API trong dự án.
Bạn có thể giới hạn vai tròPROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)") gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \ --role="roles/apikeys.admin"apikeys.adminđể chỉ thao tác với thực thể cụ thể của khoá API. Xem điều kiện IAM để biết thêm chi tiết. - Chạy tập lệnh sau để tạo trình kích hoạt Cloud Build xoá khoá API.
cat <<EOF > trigger_config.yaml name: "delete-compromised-api-key" description: "Triggered by Pub/Sub alert to automatically delete the leaking API Key" pubsubConfig: topic: "projects/${PROJECT_ID}/topics/api-key-alert-notifications" build: steps: - name: "gcr.io/google.com/cloudsdktool/cloud-sdk:slim" args: - "gcloud" - "services" - "api-keys" - "delete" - "${KEY_UID}" - "--quiet" EOF - Chạy lệnh sau để tạo trình kích hoạt Cảnh báo giám sát mới:
gcloud builds triggers create pubsub \ --trigger-config=trigger_config.yaml \ --project=$PROJECT_ID
Giờ đây, bạn có thể xoá tệp chính sách cảnh báo và tệp cấu hình trình kích hoạt Cloud Build:
rm alert_policy.json trigger_config.yaml
Ngoài ra, bạn có thể thiết lập quy trình tự động hoá này bằng gói Terraform. Tải tệp Terraform xuống từ thư mục abnormal-usage-detection trong kho lưu trữ Google Cloud DevRel. Gói này chấp nhận mã dự án và UID khoá API làm tham số đầu vào, đồng thời thiết lập các tài nguyên và cấu hình mà bạn đã thấy trong bước này.
7. Dọn dẹp
Để tránh phát sinh các khoản phí không mong muốn trong tài khoản Google Cloud, hãy nhớ xoá chủ đề Pub/Sub, trình kích hoạt Cloud Build và các chính sách cảnh báo được tạo trong bài tập này.
Chạy các lệnh sau để xoá tất cả tài nguyên bạn đã tạo:
gcloud builds triggers delete delete-compromised-api-key \
--project=$PROJECT_ID
gcloud beta monitoring channels delete $CHANNEL_NAME \
--project=$PROJECT_ID \
--quiet
gcloud pubsub topics delete api-key-alert-notifications \
--project=$PROJECT_ID
gcloud projects remove-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/apikeys.admin"
8. Tóm tắt
Trong lớp học lập trình này, bạn đã triển khai một khung tự động hoá và bảo mật toàn diện, mạnh mẽ cho các khoá API của Google Cloud:
- Cấu hình mặc định được tăng cường bảo mật: Bạn đã tạo và hạn chế các khoá API để chỉ cho phép truy cập vào các API cần thiết và các nền tảng đáng tin cậy (chẳng hạn như các trình giới thiệu HTTP cụ thể).
- Kiểm tra danh sách khoá: Bạn đã quét môi trường dự án để phát hiện và cô lập các khoá không bị hạn chế, gây ra rủi ro bảo mật ngay lập tức.
- Phân tích dữ liệu sử dụng: Bạn đã truy vấn dữ liệu chỉ số Cloud Monitoring theo phương thức lập trình để lập hồ sơ về việc sử dụng khoá trong quá khứ, cho phép bạn hạn chế các khoá dựa trên dấu vết sử dụng đã được xác minh.
- Tự động giảm thiểu mối đe doạ: Bạn đã thiết lập "bộ ngắt mạch" phản ứng bằng cách kết nối chính sách cảnh báo Cloud Monitoring với chủ đề Pub/Sub và trình kích hoạt Cloud Build, cho phép bạn tự động xoá các khoá bị xâm phạm trong các đợt tăng đột biến lưu lượng truy cập bất thường.
Các bước tiếp theo
- Áp dụng các quy tắc hạn chế cho tất cả khoá API của bạn: Sử dụng những gì bạn đã học được trong lớp học lập trình này để phát hiện tất cả khoá API bị hạn chế một phần hoặc không bị hạn chế và áp dụng các quy tắc hạn chế đối với API và ứng dụng khách,
- Thiết lập "cầu dao" trên khoá API: Tăng cường bảo vệ khoá API của bạn khỏi việc sử dụng không mong muốn bằng cách thiết lập tính năng tự động xoá khoá trong trường hợp mức tiêu thụ tăng đột ngột. Sử dụng các lệnh
gcloudhoặc Terraform được trình bày trong lớp học lập trình. Cân nhắc thắt chặt quyền bằng cách sử dụng các điều kiện IAM - Khám phá tính năng Cảnh báo giám sát: Tìm hiểu thêm về cách thiết lập cảnh báo bằng dịch vụ Giám sát của Google Cloud.
- Tìm hiểu thêm về tính năng kiểm soát quyền truy cập có trên Google Cloud: Xem lại Chính sách về ranh giới truy cập và quá trình truyền bá thay đổi về quyền truy cập.