۱. مقدمه
از نظر تاریخی، کلیدهای API گوگل برای دسترسی به APIهای گوگل زمانی که روشهای دیگر در دسترس نبودند یا نامناسب تلقی میشدند، استفاده میشدند. موارد استفاده رایج، دسترسی به API نقشههای گوگل و APIهای گوگل که توسط Firebase ارائه میشدند، بود. با معرفی مدلهای هوش مصنوعی، عاملهای هوش مصنوعی مانند Gemini و AI Studio و چارچوبهای توسعه عامل مانند Agent Development Kit، کلیدهای API به یک روش اصلی برای دسترسی به مدلهای زبان بزرگ گوگل تبدیل شدهاند.
کلیدهای API سطح پایینی از حفاظت را ارائه میدهند. اگرچه Google Cloud روشهای مختلفی برای جلوگیری از سوءاستفاده از کلیدها ارائه میدهد، اما داشتن یک کلید API فعال امکان دسترسی به APIهای Google را بدون هیچگونه اعتبارسنجی اضافی برای احراز هویت یا مجوزدهی فراهم میکند. روشهای محدود کردن استفاده از کلیدهای API در مستندات شرح داده شده است. پست «ایمنسازی کلیدهای Gemini و Google API شما» در وبلاگ Cloud، توصیههای بیشتری در مورد نگهداری کلید API ارائه میدهد. در این Codelab، این توصیهها را به کار خواهید گرفت.
کاری که انجام خواهید داد
- محدودیتهای اعمالشده هنگام ایجاد کلیدهای API جدید در Google Cloud را بررسی کنید.
- تمام کلیدهای API خود را فهرست کنید و کلیدهایی را که هیچ گونه محافظت امنیتی ندارند پیدا کنید
- اعمال محدودیت بر روی کلیدهای API موجود بر اساس میزان استفاده از آنها
- تعریف اتوماسیونی که در صورت استفاده غیرعادی، کلید را حذف کند
آنچه نیاز دارید
- یک مرورگر وب مدرن (مانند کروم).
- یک حساب گوگل
۲. راهاندازی
دستورالعملهای این Codelab فرض میکنند که شما دستورات را در Cloud Shell در کنسول Google Cloud اجرا میکنید. اگر gcloud CLI را در محیط محلی خود دارید، میتوانید دستورات را در آنجا اجرا کنید.
اگرچه عملیات در مراحل را میتوان با استفاده از رابط کاربری کنسول ابری انجام داد، اما روشها متفاوت هستند. این Codelab از رابط خط فرمان برای سادهسازی تعاملات و امکان ادغام آسانتر با عوامل هوش مصنوعی مدرن (مانند Antigravity CLI) استفاده میکند.
یک ترمینال Cloud Shell راهاندازی کنید
- کنسول گوگل کلود را با استفاده از https://console.cloud.google.com/ در یک پنجره مرورگر جدید باز کنید. برای بهترین تجربه کاربری، توصیه میشود از کروم استفاده کنید.
- وارد حساب گوگل خود در گوگل کلود شوید.
- روی فعال کردن پوسته ابری کلیک کنید
در بالای کنسول گوگل کلود.
اگر نمایش داده شد، روی پنجرههای زیر کلیک کنید:- از طریق پنجره اطلاعات Cloud Shell ادامه دهید.
- به Cloud Shell اجازه دهید تا از اعتبارنامههای شما برای برقراری تماسهای Google Cloud API استفاده کند.
یک پروژه Google Cloud انتخاب کنید
بعد از باز کردن کنسول Cloud، احراز هویت میشوید و معمولاً یک پروژه برای کار شما انتخاب میشود. شناسه پروژه یک توالی ۶ تا ۳۰ کاراکتری از حروف کوچک، اعداد و نمادهای خط تیره است، به عنوان مثال qwiklabs-gcp-04-3075fc9fd77f . ترمینال Cloud Shell رابط خط فرمان gcloud را با پروژه انتخاب شده پیکربندی میکند. خروجی مشابه زیر را مشاهده خواهید کرد:
Your Cloud Platform project in this session is set to qwiklabs-gcp-04-3075fc9fd77f
این یعنی دستورات بعدی شما به gcloud از شناسه پروژه qwiklabs-gcp-04-3075fc9fd77f استفاده خواهند کرد.
شناسه پروژه را به عنوان یک متغیر محیطی PROJECT_ID تنظیم کنید. میتوانید لیست تمام پروژههای خود را با استفاده از دستور زیر مشاهده کنید:
gcloud projects list
- اگر میخواهید از شناسه پروژهای متفاوت از شناسه پیکربندیشده در
gcloudاستفاده کنید،your-project-idرا جایگزین کرده و دستور را اجرا کنید. برای مثال:export PROJECT_ID="your-project-id"export PROJECT_ID="qwiklabs-gcp-04-3075fc9fd77f" - اگر میخواهید از شناسه پروژه انتخاب شده استفاده کنید، دستور زیر را اجرا کنید:
export PROJECT_ID=$(gcloud config get project)
۳. محدود کردن یک کلید API جدید
در گذشته، کاربران میتوانستند کلیدهای API کاملاً نامحدود ایجاد کنند. کلیدهای نامحدود میتوانستند برای فراخوانی هر API گوگل فعال در پروژهای که کلید در آن ایجاد شده بود، استفاده شوند. در حالی که کنسول Google Cloud از ایجاد کلیدهای نامحدود توسط کاربران جلوگیری میکند، اما همچنان با استفاده از gcloud CLI یا فراخوانیهای مستقیم API امکانپذیر است.
مراحل زیر نحوه ایجاد یک کلید API محدود را نشان میدهد که استفاده از آن را به API خاص و توسط وبسایت مشخصشده محدود میکند.
- برای ایجاد یک کلید API جدید که محدود به استفاده با API موقعیت جغرافیایی Google Map باشد، فقط دستور زیر را در ترمینال shell اجرا کنید:
این دستور یک کلید API جدید ایجاد میکند که فقط میتواند برای فراخوانی سرویس موقعیت مکانی گوگل مپ استفاده شود.gcloud services api-keys create --key-id=restricted-api-key \ --display-name="restricted api key" \ --api-target=service=geolocation.googleapis.com \ --project=${PROJECT_ID} - با اضافه کردن یک محدودیت برنامه، امنیت کلید را افزایش دهید. استفاده از کلید را فقط به تمام مسیرهای درون وبسایت
example.comمحدود کنید. دستور زیر را برای اضافه کردن محدودیت برنامه به کلید اجرا کنید: به جای اجازه دادن به استفاده از کلید برای وبسایت(های) خاص، میتوانیدgcloud services api-keys update restricted-api-key \ --location=global \ --allowed-referrers="example.com/*" \ --project=${PROJECT_ID}--allowed-applicationبرای تعریف برنامه اندروید مجاز یاallowed-ips برای تعریف آدرسهای IP مجاز استفاده کنید. برای اطلاع از همه گزینهها، به مستندات کامل مراجعه کنید.
تمیز کردن
کلید API که ایجاد کردهاید را حذف کنید، مگر اینکه قصد استفاده از آن را داشته باشید:
gcloud services api-keys delete --key-id=restricted-api-key \
--project=${PROJECT_ID}
۴. کلیدهای API خود را فهرست کنید
در این مرحله شما از رابط خط فرمان gcloud برای دریافت فهرستی از کلیدهای API خود استفاده خواهید کرد. لیست حاصل، تمام کلیدهای API فعال (حذف نشده) که به آنها دسترسی دارید را نشان میدهد.
- برای مشاهدهی نام کلیدها، شناسهها و تاریخ ایجاد آنها، دستور زیر را اجرا کنید:
خروجی، نام خوانای کلید، شناسه کلید و تاریخ ایجاد آن را نشان میدهد. خروجی مشابه زیر خواهد بود: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
- یکی از شناسههای کلید را انتخاب کنید و دستور زیر را برای بررسی اینکه آیا کلید محدودیتی دارد یا خیر، در آن قرار دهید. به جای
your-key-id، مقدار شناسه کلید انتخاب شده را قرار دهید:gcloud services api-keys describe "your-key-id" --project=${PROJECT_ID}
خروجی (به زبان YAML) شامل فهرستی از محدودیتها در 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'
توجه داشته باشید که اگر کلید هرگز بهروزرسانی نشده باشد، فیلدهای createTime و updateTime دارای مهر زمانی یکسانی خواهند بود.
- اسکریپتی را دانلود و اجرا کنید که تمام پروژههای شما را بررسی کرده و تمام کلیدهای API بدون محدودیت را چاپ میکند:
پس از اجرای اسکریپت، خروجی به شکل زیر مشاهده خواهید کرد: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 میتوانید تمام اسکریپتهای استفاده شده در این CodeLab را در پوشه Security در مخزن devrel-demos در 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
۵. کاربرد کلید API را کشف کنید
در این مرحله، شما معیارهای Google Cloud را جستجو خواهید کرد که به شما کمک میکند تا با استفاده از کلید API خود، APIهایی را که فراخوانی شدهاند، پیدا کنید. با استفاده از این اطلاعات، میتوانید استفاده فعلی از کلیدها را بررسی کرده و محدودیتهای API را بر اساس اطلاعات واقعی به جای حدس زدن، بر روی کلید اعمال کنید.
- از همان شناسه کلید که در مرحله قبل استفاده کردید استفاده کنید یا شناسه کلید دیگری را انتخاب کنید. در دستور زیر،
your-key-idجایگزین کنید:export KEY_UID=$( gcloud services api-keys describe "your-key-id" \ --format='value(uid)' \ --project=${PROJECT_ID}) - جستجو را طوری تنظیم کنید که سابقه استفاده یک سال گذشته را جستجو کند. اگر میخواهید مدت زمان طولانیتر یا کوتاهتری را جستجو کنید، عدد
365(تعداد روزها) را با یک عدد مثبت دیگر جایگزین کنید.export DAYS=365 - برای فعال کردن تماس مستقیم با Cloud Monitoring API، اعتبارنامههای پیشفرض برنامه ( ADC ) را بهروزرسانی کنید. دستور زیر را اجرا کنید و دستورالعملها را در ترمینال دنبال کنید:
gcloud auth application-default login - دستور زیر را برای ارسال درخواست دادههای معیار استفاده از سرویس به Cloud Monitoring API اجرا کنید:
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
این دستور، معیار داخلی serviceruntime/api/request_count را برای یافتن نقاط دادهای با برچسب credential_id که با شناسه منحصر به فرد کلید API انتخاب شده مطابقت دارند، جستجو میکند. سپس مقادیر مربوط به برچسب service را بازیابی کرده و ضمن حذف تکرارها، مقادیر را چاپ میکند.
مقاومسازی کلید API
در این مرحله، از اطلاعات جمعآوریشده در مراحل قبلی برای بهروزرسانی پیکربندی محدودیت کلید API بر اساس اطلاعات استفاده استفاده خواهید کرد.
شما از همان کلید API که در مرحله قبل استفاده شد، استفاده خواهید کرد. در صورت لزوم، دستورالعملهای مراحل قبل را دوباره اجرا کنید تا مطمئن شوید متغیرهای محیطی PROJECT_ID ، KEY_UID و DAYS تنظیم شدهاند.
- دستور زیر را برای بازیابی لیست API های گوگل که با استفاده از کلید API فراخوانی شدهاند، اجرا کنید:
SERVICES=$(curl -s -G -H "مجوز: دارنده $(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
- لیست API های محدود شده را با لیست غیر خالی جایگزین کنید:
if [ ${#API_TARGET_ARGS[@]} -gt 0 ]; then gcloud services api-keys update "projects/${PROJECT_ID}/locations/global/keys/${KEY_UID}" \ ${API_TARGET_ARGS} fi
۶. تعریف تشخیص استفاده غیرعادی
مراحل قبلی نحوه بررسی و ایمنسازی کلیدهای API را نشان داد. این مرحله نحوه خودکارسازی پاسخ به اوج غیرمنتظره استفاده از کلید را با کمک مانیتورینگ هشدارها نشان میدهد.
دستورالعملهای زیر هشداری ایجاد میکنند که وقتی نرخ فراخوانیهای API که از یک کلید API استفاده میکنند در ۵ دقیقه گذشته بیش از ۱۰٪ افزایش یابد، فعال میشود. هشدار طوری پیکربندی شده است که یک اسکریپت Cloud Build را فعال کند که کلید API را حذف میکند تا از استفاده بیشتر جلوگیری شود. این کلید را میتوان در طول ۳۰ روز آینده بازیابی کرد. برای یادگیری نحوه بازیابی کلید، به مستندات مراجعه کنید.
این دستورالعملها از متغیرهای PROJECT_ID و KEY_UID که در مراحل قبلی استفاده کردید، دوباره استفاده میکنند. اگر میخواهید کلید و/یا پروژه دیگری را انتخاب کنید، مقادیر جدید را برای این متغیرها همانطور که در مراحل راهاندازی و کشف کاربرد کلید API توضیح داده شده است، تنظیم کنید.
- اسکریپت زیر را برای ایجاد یک فایل سیاست هشدار اجرا کنید:
سیاست هشدار از فیلتر PromQL زیر برای فعال کردن هشدار استفاده میکند: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 این تابع نرخ افزایش را محاسبه کرده و آن را با پنجره قبلی مقایسه میکند. و فقط در صورتی که بیش از 10٪ بیشتر باشد، هشدار را فعال میکند. برای جلوگیری از فعال شدن هشدار در زمانی که تعداد کل فراخوانیها قابل چشمپوشی است، شرط فعال شدن را وجود بیش از 50 فراخوانی API در پنجره قرار میدهد. برای جلوگیری از محاسبه(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(حذف با صفر) زمانی که نرخ 5 دقیقه قبلی 0 بوده است، اگر نرخ پنجره قبلی صفر باشد، مخرج را با 1 جایگزین میکند. میتوانید پارامترهای هشدار مانند طول پنجره (5m)، آستانه حداقل (50) یا آستانه افزایش 10٪ (1.10) را تغییر دهید. پارامترهای اضافی سیاست تعریف میکنند که پس از رسیدن به شرط، هشدار باید فعال شود (duration) و اینکه شرط باید هر 60 ثانیه بررسی شود (evaluationInterval). - دستور زیر را برای ایجاد یک تاپیک PubSub که برای ارسال اعلانهای هشدار استفاده خواهد شد، اجرا کنید:
gcloud pubsub topics create api-key-alert-notifications --project=$PROJECT_ID - دستور زیر را برای ایجاد کانالهای اعلان برای هشدارهایی که از PubSub استفاده میکنند، اجرا کنید.
شما در مرحله پاکسازی از متغیر محیطیCHANNEL_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_NAMEاستفاده خواهید کرد. - برای ایجاد یک هشدار نظارتی جدید، دستور زیر را اجرا کنید:
gcloud monitoring policies create --policy-from-file=alert_policy.json \ --project=$PROJECT_ID - دستور زیر را اجرا کنید تا به سرویس Cloud Build مجوزهای حذف کلیدهای API در پروژه را اعطا کنید.
میتوان نقش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را محدود کرد تا فقط نمونههای خاصی از کلیدهای API را دستکاری کند. برای جزئیات بیشتر به شرایط IAM مراجعه کنید. - اسکریپت زیر را اجرا کنید تا یک تریگر Cloud Build ایجاد شود که کلید 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 - برای ایجاد یک تریگر هشدار مانیتورینگ جدید، دستور زیر را اجرا کنید:
gcloud builds triggers create pubsub \ --trigger-config=trigger_config.yaml \ --project=$PROJECT_ID
اکنون میتوانید فایلهای پیکربندی alert policy و Cloud Build trigger را حذف کنید:
rm alert_policy.json trigger_config.yaml
به عنوان یک روش جایگزین، میتوانید این اتوماسیون را با استفاده از طرح Terraform راهاندازی کنید. فایلهای Terraform را از پوشهی «تشخیص استفادهی غیرعادی» در مخزن Google Cloud DevRel دانلود کنید. این طرح یک شناسهی پروژه و یک شناسهی رابط کاربری API را به عنوان پارامترهای ورودی میپذیرد و منابع و پیکربندیهایی را که در این مرحله مشاهده کردید، تنظیم میکند.
۷. تمیز کردن
برای جلوگیری از هزینههای غیرمنتظره در حساب Google Cloud خود، به یاد داشته باشید که موضوع Pub/Sub، تریگر Cloud Build و سیاستهای هشدار ایجاد شده در طول این تمرین را حذف کنید.
برای حذف تمام منابعی که ایجاد کردهاید، دستورات زیر را اجرا کنید:
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"
۸. خلاصه
در این آزمایشگاه کد، شما یک چارچوب امنیتی و اتوماسیون سرتاسری قوی برای کلیدهای Google Cloud API پیادهسازی کردید:
- پیکربندیهای پیشفرضِ تقویتشده : شما کلیدهای API را ایجاد و محدود کردهاید تا دسترسی منحصراً به APIهای ضروری و پلتفرمهای مورد اعتماد (مانند ارجاعدهندگان خاص HTTP) محدود شود.
- موجودی کلید خود را بررسی کردید : شما محیط پروژه خود را اسکن کردید تا کلیدهای نامحدودی را که خطر امنیتی فوری ایجاد میکنند، شناسایی و ایزوله کنید.
- دادههای استفادهی تحلیلشده : شما بهطور برنامهنویسیشده از دادههای معیار Cloud Monitoring برای نمایش تاریخچهی استفاده از کلیدها پرسوجو کردید که به شما امکان میدهد کلیدها را بر اساس ردپاهای استفادهی تأییدشده محدود کنید.
- کاهش خودکار تهدید : شما با اتصال یک سیاست هشدار Cloud Monitoring به یک موضوع Pub/Sub و یک تریگر Cloud Build، یک "قطعکننده مدار" واکنشی ایجاد کردید که به شما امکان میدهد کلیدهای آسیبدیده را در هنگام افزایش غیرعادی ترافیک بهطور خودکار حذف کنید.
مراحل بعدی
- اعمال محدودیت بر روی تمام کلیدهای API شما : از آنچه در این آزمایش آموختهاید برای شناسایی تمام کلیدهای API با محدودیت جزئی یا بدون محدودیت و اعمال محدودیتهای API و کلاینت استفاده کنید.
- تنظیم "قطعکننده مدار" روی کلیدهای API : با تنظیم حذف خودکار کلید در صورت افزایش ناگهانی مصرف، از کلیدهای API خود در برابر استفاده غیرمنتظره محافظت بیشتری کنید. از دستورات
gcloudیا Terraform که در آزمایشگاه نشان داده شده است استفاده کنید. با استفاده از شرایط IAM، محدودیت دسترسیها را در نظر بگیرید. - بررسی هشدارهای نظارتی : درباره تنظیم هشدارها با استفاده از سرویس نظارت ابری گوگل بیشتر بدانید.
- درباره کنترل دسترسی موجود در Google Cloud بیشتر بدانید : سیاستهای مرز دسترسی و انتشار تغییر دسترسی را مرور کنید.