אימות עומסי עבודה לממשקי Cloud de Confiance by S3NS API באמצעות חשבונות שירות

בדף הזה מוסבר איך להשתמש בחשבונות שירות כדי לאפשר לאפליקציות שפועלות במכונות וירטואליות (VM) לבצע אימות ל-API Cloud de Confiance by S3NS ולקבל הרשאת גישה למשאבים.

כדי להשתמש בחשבונות שירות לאימות, קודם צריך לוודא שהמכונה הווירטואלית מוגדרת לשימוש בחשבון שירות. כדי לעשות זאת, מבצעים אחת מהפעולות הבאות:

לפני שמתחילים

סקירה כללית

אחרי שמגדירים מכונה וירטואלית להפעלה באמצעות חשבון שירות, אפליקציה שפועלת במכונה הווירטואלית יכולה להשתמש באחת מהשיטות הבאות לאימות:

אימות אפליקציות באמצעות פרטי כניסה של חשבון שירות

אחרי שמגדירים מכונה להפעלה כחשבון שירות, אפשר להשתמש בפרטי הכניסה של חשבון השירות כדי לאמת אפליקציות שפועלות במכונה.

אימות אפליקציות באמצעות ספריית לקוח

בספריות הלקוח אפשר להשתמש ב-Application Default Credentials כדי לעבור אימות מול Google APIs ולשלוח בקשות לאותם ממשקי API. בעזרת Application Default Credentials, אפליקציות יכולות לקבל באופן אוטומטי פרטי כניסה ממקורות שונים. כך אפשר לבדוק את האפליקציה באופן מקומי ואז לפרוס אותה במופע של Compute Engine בלי לשנות את קוד האפליקציה.

במאמר איך מספקים פרטי כניסה ל-Application Default Credentials מוסבר איך להגדיר את Application Default Credentials.

בדוגמה הזו נעשה שימוש בספריית הלקוח של Python כדי לבצע אימות ולשלוח בקשה ל-Cloud Storage API כדי להציג רשימה של הקטגוריות בפרויקט. בדוגמה הזו השתמשנו בתהליך הבא:

  1. מקבלים את פרטי האימות הנדרשים ל-Cloud Storage API ומפעילים את שירות Cloud Storage באמצעות השיטה build() ופרטי הכניסה.
  2. הצגת רשימה של קטגוריות ב-Cloud Storage.

אפשר להריץ את הדוגמה הזו במופע שיש לו גישה לניהול קטגוריות ב-Cloud Storage.

import argparse
from typing import List

from google.cloud import storage


def create_client() -> storage.Client:
    """
    Construct a client object for the Storage API using the
    application default credentials.

    Returns:
        Storage API client object.
    """
    # Construct the service object for interacting with the Cloud Storage API -
    # the 'storage' service, at version 'v1'.
    # Authentication is provided by application default credentials.
    # When running locally, these are available after running
    # `gcloud auth application-default login`. When running on Compute
    # Engine, these are available from the environment.
    return storage.Client()


def list_buckets(client: storage.Client, project_id: str) -> List[storage.Bucket]:
    """
    Retrieve bucket list of a project using provided client object.


    Args:
        client: Storage API client object.
        project_id: name of the project to list buckets from.

    Returns:
        List of Buckets found in the project.
    """
    buckets = client.list_buckets()
    return list(buckets)


def main(project_id: str) -> None:
    client = create_client()
    buckets = list_buckets(client, project_id)
    print(buckets)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud Project ID.")

    args = parser.parse_args()

    main(args.project_id)

אימות אפליקציות ישירות באמצעות אסימוני גישה

ברוב האפליקציות, אפשר לבצע אימות באמצעות Application Default Credentials, שמוצאים את פרטי הכניסה ומנהלים את האסימונים בשבילכם. עם זאת, אם האפליקציה דורשת לספק אסימון גישה של OAuth2, ‏ Compute Engine מאפשר לכם לקבל אסימון גישה משרת המטא-נתונים שלו לשימוש באפליקציה. כברירת מחדל, שרת המטא-נתונים מחזיר אסימון גישה עם כל ההיקפים שצוינו עבור חשבון השירות של המופע. אם האפליקציה שלכם דורשת הרשאות מוגבלות, אתם יכולים לבקש טוקנים עם היקף הרשאות מצומצם או טוקנים מוגבלים. מידע נוסף זמין במאמר קבלת אסימוני גישה ספציפיים מסוג OAuth2.

יש כמה דרכים להשיג את טוקני הגישה האלה ולהשתמש בהם כדי לאמת את האפליקציות שלכם. לדוגמה, אפשר להשתמש ב-curl כדי ליצור בקשה פשוטה, או להשתמש בשפת תכנות כמו Python כדי לקבל גמישות רבה יותר.

cURL

כדי להשתמש ב-curl כדי לבקש אסימון גישה ולשלוח בקשה ל-API:

  1. במכונה שבה האפליקציה פועלת, מריצים את הפקודה הבאה כדי לשלוח שאילתה לשרת המטא-נתונים ולקבל אסימון גישה:

    $ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google"

    בתגובה לבקשה מוחזרת תשובה שדומה לדוגמה הבאה:

    {
          "access_token":"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_QtAS08i85nHq39HE3C2LTrCARA",
          "expires_in":3599,
          "token_type":"Bearer"
     }

    בבקשות API צריך לכלול את הערך access_token, ולא את התגובה כולה. אם התקנתם את מעבד ה-JSON של שורת הפקודה jq, אתם יכולים להשתמש בפקודה הבאה כדי לחלץ את הערך של אסימון הגישה מהתגובה:

    $ ACCESS_TOKEN=`curl \
    "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google" | jq -r '.access_token'`
    
  2. מעתיקים את הערך של המאפיין access_token מהתגובה ומשתמשים בו כדי לשלוח בקשות ל-API. לדוגמה, הבקשה הבאה מדפיסה רשימה של מכונות וירטואליות בפרויקט מאזור מסוים:

    $ curl https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances \
    -H "Authorization":"Bearer ACCESS_TOKEN"
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט של הבקשה.
    • ZONE: האזור שממנו יוצגו מכונות ה-VM.
    • ACCESS_TOKEN: ערך אסימון הגישה שקיבלתם בשלב הקודם.

    מידע על הפרמטרים שאפשר להגדיר בבקשה מופיע במאמר בנושא פרמטרים של המערכת.

Python

בדוגמה הזו מוסבר איך לבקש אסימון לגישה ל-Cloud Storage API באפליקציית Python. בדוגמה הבאה משתמשים בהליך הבא:

  1. שולחים בקשה לאסימון גישה משרת המטא-נתונים.
  2. מחפשים את אסימון הגישה בתגובה מהשרת.
  3. משתמשים באסימון הגישה כדי לשלוח בקשה ל-Cloud Storage.
  4. אם הבקשה מצליחה, הסקריפט מדפיס את התגובה.

import argparse

import requests


METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/"
METADATA_HEADERS = {"Metadata-Flavor": "Google"}
SERVICE_ACCOUNT = "default"


def get_access_token() -> str:
    """
    Retrieves access token from the metadata server.

    Returns:
        The access token.
    """
    url = f"{METADATA_URL}instance/service-accounts/{SERVICE_ACCOUNT}/token"

    # Request an access token from the metadata server.
    r = requests.get(url, headers=METADATA_HEADERS)
    r.raise_for_status()

    # Extract the access token from the response.
    access_token = r.json()["access_token"]

    return access_token


def list_buckets(project_id: str, access_token: str) -> dict:
    """
    Calls Storage API to retrieve a list of buckets.

    Args:
        project_id: name of the project to list buckets from.
        access_token: access token to authenticate with.

    Returns:
        Response from the API.
    """
    url = "https://www.googleapis.com/storage/v1/b"
    params = {"project": project_id}
    headers = {"Authorization": f"Bearer {access_token}"}

    r = requests.get(url, params=params, headers=headers)
    r.raise_for_status()

    return r.json()


def main(project_id: str) -> None:
    """
    Retrieves access token from metadata server and uses it to list
    buckets in a project.

    Args:
        project_id: name of the project to list buckets from.
    """
    access_token = get_access_token()
    buckets = list_buckets(project_id, access_token)
    print(buckets)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud project ID.")

    args = parser.parse_args()

    main(args.project_id)

תוקף אסימוני הגישה פג אחרי פרק זמן קצר. שרת המטא-נתונים שומר במטמון את אסימוני הגישה עד שנותרות להם 5 דקות לפני שהם יפוגו. אם אי אפשר לשמור טוקנים במטמון, יכול להיות שקצב הבקשות יוגבל אם תשלחו יותר מ-50 שאילתות בשנייה. כדי שהקריאות ל-API של האפליקציות שלכם יצליחו, צריך להיות להן אסימון גישה תקין.

אימות כלים במופע באמצעות חשבון שירות

יכול להיות שחלק מהאפליקציות משתמשות בפקודות מ-ה-CLI של gcloud, שכלול כברירת מחדל ברוב התמונות של Compute Engine. ה-CLI של gcloud מזהה באופן אוטומטי את חשבון השירות של מופע ואת ההרשאות הרלוונטיות שניתנו לחשבון השירות. במילים אחרות, אם תקצו את התפקידים הנכונים לחשבון השירות, תוכלו להשתמש ב-CLI של gcloud מהמכונות שלכם בלי להשתמש ב-gcloud auth login.

הזיהוי של חשבון השירות מתבצע באופן אוטומטי, והוא חל רק על ה-CLI של gcloud שכלול במופע. אם יוצרים כלים חדשים או מוסיפים כלים בהתאמה אישית, צריך לתת הרשאה לאפליקציה באמצעות ספריית לקוח או באמצעות אסימוני גישה ישירות באפליקציה.

כדי ליהנות מזיהוי אוטומטי של חשבון שירות, צריך לתת את התפקידים המתאימים ב-IAM לחשבון השירות ולצרף את חשבון השירות למופע. לדוגמה, אם נותנים לחשבון שירות את התפקיד roles/storage.objectAdmin, ה-CLI של gcloud יכול לנהל ולגשת לאובייקטים של Cloud Storage באופן אוטומטי.

באופן דומה, אם מפעילים את roles/compute.instanceAdmin.v1 עבור חשבון השירות, הכלי gcloud compute יכול לנהל באופן אוטומטי את המופעים.

המאמרים הבאים