סנכרון של מערכות זהות שונות

ב-Google Cloud Search, בקרת הגישה מבוססת על חשבון Google של המשתמש. כשמבצעים אינדוקס של תוכן, כל רשימות ה-ACL של הפריטים חייבות להפנות למזהי משתמשים או קבוצות תקינים של Google (כתובות אימייל).

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

מקורות הזהויות שנוצרים באמצעות מסוף Admin מגשרים על הפער בין מערכות הזהויות באמצעות:

כדאי להשתמש במקורות זהות במקרים הבאים:

  • מאגר המידע לא מכיר את כתובת האימייל הראשית של המשתמש בספרייה של Google Workspace או Google Cloud.
  • המאגר מגדיר קבוצות של בקרת גישה שלא תואמות לקבוצות שמבוססות על כתובות אימייל ב-Google Workspace.

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

פריסה לדוגמה

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

דוגמה לפריסה בארגון עם סוגים שונים של זהויות
איור 1. דוגמה לפריסה בארגון עם סוגים שונים של זהויות.

מאגר 1 מזהה משתמשים לפי כתובת אימייל באמצעות SAML. מכיוון שהיא יודעת את כתובת האימייל הראשית ב-Google Workspace או בספריית Cloud, היא לא צריכה מקור זהויות.

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

יצירת מקור זהות

אם אתם צריכים מקור זהויות, כדאי לעיין במאמר בנושא מיפוי זהויות משתמשים ב-Cloud Search.

צריך ליצור את מקור הזהויות לפני שיוצרים מחבר תוכן. צריך את המזהה שלו כדי ליצור רשימות ACL ולבצע אינדוקס של נתונים. יצירה של מקור זהויות יוצרת גם מאפיין משתמש מותאם אישית בספריית Cloud כדי לאחסן מזהים חיצוניים. שם המאפיין משתמש במוסכמה IDENTITY_SOURCE_ID_identity.

בטבלה הזו מוצגים שני מקורות זהויות: אחד לשמות חשבונות SAM ואחד למזהי משתמשים (uid).

מקור זהויות מאפיין משתמש מזהה חיצוני
id1 id1_identity sAMAccountName
id2 id2_identity uid

יוצרים מקור זהויות לכל סוג של מזהה חיצוני שמשמש בארגון.

בטבלה הזו אפשר לראות איך משתמש עם חשבון Google ושני מזהים חיצוניים מופיע בספריית Cloud:

משתמש אימייל id1_identity id2_identity
רות ann@example.com example\ann 1001

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

כתיבה של רשימות ACL של משתמשים

משתמשים ב-getUserPrincipal() או ב-getGroupPrincipal() כדי ליצור ישויות ראשיות באמצעות מזהים חיצוניים.

בדוגמה הזו מאחזרים את ההרשאות לקובץ, כולל משתמשים עם גישה:

FilePermissionSample.java
/**
 * Sample for mapping permissions from a source repository to Cloud Search
 * ACLs. In this example, POSIX file permissions are used a the source
 * permissions.
 *
 * @return Acl
 * @throws IOException if unable to read file permissions
 */
static Acl mapPosixFilePermissionToCloudSearchAcl(Path pathToFile) throws IOException {
  // Id of the identity source for external user/group IDs. Shown here,
  // but may be omitted in the SDK as it is automatically applied
  // based on the `api.identitySourceId` configuration parameter.
  String identitySourceId = "abcdef12345";

  // Retrieve the file system permissions for the item being indexed.
  PosixFileAttributeView attributeView = Files.getFileAttributeView(
      pathToFile,
      PosixFileAttributeView.class,
      LinkOption.NOFOLLOW_LINKS);

  if (attributeView == null) {
    // Can't read, return empty ACl
    return new Acl.Builder().build();
  }

  PosixFileAttributes attrs = attributeView.readAttributes();
  // ...
}

קטע הקוד הזה יוצר ישויות ראשיות לבעלים באמצעות המאפיין externalUserName:

FilePermissionSample.java
// Owner, for search quality.
// Note that for principals the name is not the primary
// email address in Cloud Directory, but the local ID defined
// by the OS. Users and groups must be referred to by their
// external ID and mapped via an identity source.
List<Principal> owners = Collections.singletonList(
    Acl.getUserPrincipal(attrs.owner().getName(), identitySourceId)
);

קטע הקוד הזה יוצר ישויות ראשיות לקוראים:

FilePermissionSample.java
// List of users to grant access to
List<Principal> readers = new ArrayList<>();

// Add owner, group, others to readers list if permissions
// exist. For this example, other is mapped to everyone
// in the organization.
Set<PosixFilePermission> permissions = attrs.permissions();
if (permissions.contains(PosixFilePermission.OWNER_READ)) {
  readers.add(Acl.getUserPrincipal(attrs.owner().getName(), identitySourceId));
}
if (permissions.contains(PosixFilePermission.GROUP_READ)) {
  String externalGroupName = attrs.group().getName();
  Principal group = Acl.getGroupPrincipal(externalGroupName, identitySourceId);
  readers.add(group);
}
if (permissions.contains(PosixFilePermission.OTHERS_READ)) {
  Principal everyone = Acl.getCustomerPrincipal();
  readers.add(everyone);
}

אחרי שמוסיפים קוראים ובעלים, יוצרים את רשימת ה-ACL:

FilePermissionSample.java
// Build the Cloud Search ACL. Note that inheritance of permissions
// from parents is omitted. See `setInheritFrom()` and `setInheritanceType()`
// methods on the builder if required by your implementation.
Acl acl = new Acl.Builder()
    .setReaders(readers)
    .setOwners(owners)
    .build();

ב-API ל-REST נעשה שימוש בתבנית identitysources/IDENTITY_SOURCE_ID/users/EXTERNAL_ID. הכתובת id1_identity של אן מפוענחת ל-identitysources/id1_identity/users/example/ann. זהו המזהה הזמני של המשתמש.

מידע נוסף על יצירת מודלים של רשימות ACL במאגר

מיפוי קבוצות

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

משתמשים ב-Cloud Identity Groups API כדי ליצור קבוצות ולנהל את החברות בהן. משייכים את הקבוצה למקור זהויות באמצעות השם של מקור הזהויות כמרחב שמות.

קטע הקוד הבא יוצר קבוצה:

CreateGroupCommand.java
String namespace = "identitysources/" + idSource;
Group group = new Group()
    .setGroupKey(new EntityKey().setNamespace(namespace).setId(groupId))
    .setDescription("Demo group")
    .setDisplayName(groupName)
    .setLabels(Collections.singletonMap("system/groups/external", ""))
    .setParent(namespace);
try {
  CloudIdentity service = Utils.buildCloudIdentityService();
  Operation createOperation = service.groups().create(group).execute();

  if (createOperation.getDone()) {
    // Note: The response contains the data for a Group object, but as
    // individual fields. To convert to a Group instance, either populate
    // the fields individually or serialize & deserialize to/from JSON.
    //
    // Example:
    // String json = service.getJsonFactory().toString(response);
    // Group createdGroup =  service.getObjectParser()
    //     .parseAndClose(new StringReader(json), Group.class);
    System.out.printf("Group: %s\n",
        createOperation.getResponse().toString());
  } else {
    // Handle case where operation not yet complete, poll for
    // completion. API is currently synchronous and all operations return
    // as completed.
    // ...
  }
} catch (Exception e) {
  System.err.printf("Unable to create group: %s", e.getMessage());
  e.printStackTrace(System.err);
}

יצירת ACL של קבוצה

משתמשים ב-getGroupPrincipal() כדי ליצור ישות קבוצתית עם מזהה חיצוני, ואז יוצרים את ה-ACL:

FilePermissionSample.java
if (permissions.contains(PosixFilePermission.GROUP_READ)) {
  String externalGroupName = attrs.group().getName();
  Principal group = Acl.getGroupPrincipal(externalGroupName, identitySourceId);
  readers.add(group);
}

מחברי זהויות

משתמשים לא יכולים לראות פריטים בתוצאות החיפוש עד שהמזהים החיצוניים שלהם מזוהים כמזהי Google בספריית Cloud. יש שלוש דרכים לוודא זאת:

מחברי זהויות ממפים מזהים חיצוניים מזהויות ארגוניות לזהויות פנימיות ב-Google. אם יוצרים מקור זהויות, צריך ליצור גם מחבר זהויות.

Google Cloud Directory Sync (GCDS) היא דוגמה למחבר זהויות. הכלי ממפה את פרטי המשתמשים והקבוצות מ-Active Directory למאגר Google Cloud.

סנכרון זהויות באמצעות API ל-REST

משתמשים בשיטה update כדי לסנכרן זהויות.

מיפוי מחדש של זהויות

אחרי מיפוי מחדש של זהות, צריך ליצור מחדש את האינדקס של הפריטים כדי שהשינוי ייכנס לתוקף.

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