הגדרת בקרת גישה

בקרת גישה קובעת למי יש הרשאה לגשת לשירותים ולמשאבים בפרויקט Google Cloud . ב-App Engine, יש כמה תרחישי שימוש נפרדים להגדרת בקרת גישה:

  • לתת לחברי הצוות גישה לפרויקט Google Cloud כדי שיוכלו להגדיר שירותים ולפרוס אפליקציות.

  • הענקת גישה לאפליקציה לשירותי Google Cloud, כמו Cloud Storage. כל שירותי הענן דורשים אימות והרשאה לכל קריאה ל-API, כולל קריאות מהאפליקציה שלכם ב-App Engine.

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

בדף הזה מובאת סקירה כללית על הגדרת בקרת גישה בכל תרחיש לדוגמה.

בסקירה הכללית על ניהול זהויות והרשאות גישה (IAM) מוסבר איך פועלת בקרת הגישה ב-Google Cloud Platform.

הענקת גישה לחברי צוות

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

  • חשבון משתמש, שמשויך לחשבון Google ומיועד לייצג אדם ספציפי בפרויקט.

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

    • מסוףGoogle Cloud
    • Google Cloud CLI
    • סביבות פיתוח משולבות (IDE) וכלי בנייה שמשתמשים ב-CLI של gcloud כדי לבדוק ולפרוס אפליקציות App Engine
  • חשבון שירות, שמייצג אפליקציה או תהליך ולא אדם. מומלץ להשתמש בחשבונות שירות בתהליכים אוטומטיים של בנייה, בדיקה ופריסה, במיוחד אם כמה מפתחים יכולים להריץ את התהליכים האלה.

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

    • ה-CLI של gcloud
    • סביבות פיתוח משולבות (IDE) וכלי בנייה שמשתמשים בכלי ה-CLI של gcloud כדי לבדוק ולפרוס אפליקציות App Engine

יצירת חשבון משתמש

  1. פותחים את הדף IAM במסוף Google Cloud .

    כניסה לדף IAM

  2. לוחצים על Select a project, בוחרים את הפרויקט ולוחצים על Open.

  3. לוחצים על הוספה.

  4. מזינים כתובת אימייל.

  5. בוחרים תפקידים שמעניקים גישה לתכונות של App Engine.

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

  6. לוחצים על Save.

עכשיו המשתמש יכול להיכנס למסוף Google Cloud וגם לתת הרשאה ל-CLI של gcloud.

אפשר גם ליצור חשבונות משתמשים מ-gcloud, מה-API בארכיטקטורת REST או מספריות לקוח.

יצירת חשבון שירות

  1. פותחים את הדף Service Accounts במסוף Google Cloud .

    פתיחת הדף Service Accounts

  2. בוחרים את הפרויקט ולוחצים על פתיחה.

  3. לוחצים על יצירת חשבון שירות.

  4. מזינים שם לחשבון השירות. זה צריך להיות שם ידידותי למשתמש לתצוגה.

  5. לוחצים על יצירה.

  6. בוחרים תפקידים שמעניקים גישה לתכונות של App Engine.

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

  7. לוחצים על Continue.

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

  9. לוחצים על Save.

    מופיעה רשימה של חשבונות שירות קיימים.

  10. אופציונלי: אם אתם צריכים להשתמש בחשבון השירות מחוץ ל-Google Cloud, פועלים לפי ההוראות ליצירת מפתח של חשבון שירות.

השלבים הבאים

  • אם אתם משתמשים בחשבון השירות בתהליכי ה-build והפריסה האוטומטיים, אתם צריכים לתת הרשאה ל-CLI של gcloud באמצעות חשבון שירות.
  • אם אתם משתמשים בחשבון השירות עם סביבת פיתוח משולבת (IDE), אתם צריכים לפעול לפי ההוראות שסופקו על ידי סביבת הפיתוח.
  • אם אתם צריכים להשתמש בזהות ייחודית לגרסה של אפליקציית App Engine כשאתם ניגשים לשירותים אחרים או מבצעים משימות, אתם יכולים לציין חשבון שירות בניהול המשתמש ב-App Engine. Google Cloud

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

כל קריאה לשירות Cloud צריכה להיות מאומתת ומורשית, כולל קריאות מאפליקציית App Engine לשירותי Cloud אחרים כמו Cloud Storage.

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

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

    הנה דוגמה ליצירת לקוח ל-Cloud Storage:

    Go

    
    // implicit uses Application Default Credentials to authenticate.
    func implicit() {
    	ctx := context.Background()
    
    	// For API packages whose import path is starting with "cloud.google.com/go",
    	// such as cloud.google.com/go/storage in this case, if there are no credentials
    	// provided, the client library will look for credentials in the environment.
    	storageClient, err := storage.NewClient(ctx)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer storageClient.Close()
    
    	it := storageClient.Buckets(ctx, "project-id")
    	for {
    		bucketAttrs, err := it.Next()
    		if err == iterator.Done {
    			break
    		}
    		if err != nil {
    			log.Fatal(err)
    		}
    		fmt.Println(bucketAttrs.Name)
    	}
    
    	// For packages whose import path is starting with "google.golang.org/api",
    	// such as google.golang.org/api/cloudkms/v1, use NewService to create the client.
    	kmsService, err := cloudkms.NewService(ctx)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	_ = kmsService
    }
    

    Java

    static void authImplicit() {
      // If you don't specify credentials when constructing the client, the client library will
      // look for credentials via the environment variable GOOGLE_APPLICATION_CREDENTIALS.
      Storage storage = StorageOptions.getDefaultInstance().getService();
    
      System.out.println("Buckets:");
      Page<Bucket> buckets = storage.list();
      for (Bucket bucket : buckets.iterateAll()) {
        System.out.println(bucket.toString());
      }
    }

    Node.js

    // Imports the Google Cloud client library.
    const {Storage} = require('@google-cloud/storage');
    
    // Instantiates a client. If you don't specify credentials when constructing
    // the client, the client library will look for credentials in the
    // environment.
    const storage = new Storage();
    // Makes an authenticated API request.
    async function listBuckets() {
      try {
        const results = await storage.getBuckets();
    
        const [buckets] = results;
    
        console.log('Buckets:');
        buckets.forEach(bucket => {
          console.log(bucket.name);
        });
      } catch (err) {
        console.error('ERROR:', err);
      }
    }
    listBuckets();

    PHP

    // Imports the Cloud Storage client library.
    use Google\Cloud\Storage\StorageClient;
    
    /**
     * Authenticate to a cloud client library using a service account implicitly.
     *
     * @param string $projectId The Google project ID.
     */
    function auth_cloud_implicit($projectId)
    {
        $config = [
            'projectId' => $projectId,
        ];
    
        # If you don't specify credentials when constructing the client, the
        # client library will look for credentials in the environment.
        $storage = new StorageClient($config);
    
        # Make an authenticated API request (listing storage buckets)
        foreach ($storage->buckets() as $bucket) {
            printf('Bucket: %s' . PHP_EOL, $bucket->name());
        }
    }

    Python

    def implicit():
        from google.cloud import storage
    
        # If you don't specify credentials when constructing the client, the
        # client library will look for credentials in the environment.
        storage_client = storage.Client()
    
        # Make an authenticated API request
        buckets = list(storage_client.list_buckets())
        print(buckets)
    
    

    Ruby

    # project_id = "Your Google Cloud project ID"
    
    require "google/cloud/storage"
    
    # If you don't specify credentials when constructing the client, the client
    # library will look for credentials in the environment.
    storage = Google::Cloud::Storage.new project: project_id
    
    # Make an authenticated API request
    storage.buckets.each do |bucket|
      puts bucket.name
    end
  2. כברירת מחדל, הסביבה של האפליקציה מכילה פרטי כניסה מחשבון השירות שמוגדר כברירת מחדל ב-App Engine.

    חשבון השירות הזה נוצר על ידי Google כשיוצרים אפליקציית App Engine, והוא מקבל הרשאות מלאות לניהול ולשימוש בכל שירותי Cloud ב Google Cloud פרויקט.

כדי לשנות את ברירת המחדל של התהליך הזה, אפשר לבצע אחת מהפעולות הבאות:

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

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

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

  • אחסון פרטי הכניסה במיקום מאובטח כמו Firestore במצב Datastore ‏ (Datastore) ואחזור שלהם בזמן הריצה.
  • שומרים את פרטי הכניסה בקוד, אבל מצפינים אותם באמצעות מאגר מפתחות, כמו Cloud KMS.

מידע נוסף על היתרונות של כל אחת מהגישות זמין במאמר בנושא בחירת פתרון לניהול סודות.

הענקת גישה למשתמשים למשאבי Cloud

אם רוצים שהאפליקציה תקרא נתוני משתמשים משירות אחר של Google, צריך להגדיר OAuth 2.0 לאפליקציות שרת אינטרנט. לדוגמה, אם אתם רוצים לשלוף נתונים של משתמש מ-Google Drive ולהעביר אותם לאפליקציה שלכם, אתם יכולים להשתמש ב-OAuth 2.0 לאפליקציות של שרתי אינטרנט כדי לשתף נתונים ספציפיים תוך שמירה על הפרטיות של נתונים אחרים, כמו שמות משתמשים וסיסמאות.

הענקת גישה ברמת הדומיין ב-Google Workspace

אם יש לכם דומיין Google Workspace (לשעבר G Suite), אדמין של הדומיין יכול לאשר לאפליקציה לגשת לנתוני משתמשים בשם המשתמשים בדומיין Google Workspace. לדוגמה, אפליקציה שמשתמשת ב-Google Calendar API כדי להוסיף אירועים ליומנים של כל המשתמשים בדומיין Google Workspace, תשתמש בחשבון שירות כדי לגשת ל-Google Calendar API בשם המשתמשים.

הרשאת חשבון שירות לגשת לנתונים בשם משתמשים בדומיין נקראת לפעמים 'הענקת הרשאות גישה ברמת הדומיין' לחשבון שירות. השיטה הזו עדיין משתמשת ב-OAuth 2.0, ודורשת מאדמין בדומיין Google Workspace להעניק לחשבון השירות הרשאה ברמת הדומיין.

ציון חשבון שירות

ב-App Engine אפשר להשתמש בשני סוגים של חשבונות שירות:

  • חשבון שירות לכל גרסה: חשבון שירות שמוגדר כזהות של גרסה ספציפית של השירות שפרסתם. כשפורסים גרסה קיימת או גרסה חדשה, אפשר לציין חשבון שירות שישמש כזהות של הגרסה הזו. לדוגמה, אם גרסה מסוימת דורשת הרשאות ששונות מחשבון השירות שמוגדר כברירת מחדל ברמת האפליקציה, אפשר להקצות חשבון שירות שספציפי לגרסה הזו. מידע נוסף זמין במאמר הגדרת חשבונות שירות של App Engine.