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

ב-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 Directory:

משתמש אימייל 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 Directory. יש שלוש דרכים לוודא זאת:

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

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

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

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

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

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

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