Menyinkronkan berbagai sistem identitas

Kontrol akses di Google Cloud Search didasarkan pada Akun Google pengguna. Saat mengindeks konten, semua ACL item harus menghasilkan ID pengguna atau grup Google (alamat email) yang valid.

Dalam banyak kasus, repositori tidak memiliki pengetahuan langsung tentang Akun Google. Sebagai gantinya, akun lokal mewakili pengguna, atau pengguna menggunakan login gabungan dengan penyedia identitas. Identifikasi ini, selain alamat email, disebut ID eksternal.

Dibuat menggunakan konsol Admin, sumber identitas menjembatani kesenjangan antara sistem identitas dengan:

Gunakan sumber identitas saat:

  • Repositori tidak mengetahui alamat email utama pengguna di Google Workspace atau Google Cloud Directory.
  • Repositori menentukan grup kontrol akses yang tidak sesuai dengan grup berbasis email di Google Workspace.

Sumber identitas meningkatkan efisiensi dengan memisahkan pengindeksan dari pemetaan identitas. Dengan demikian, Anda dapat menunda pencarian pengguna saat membuat ACL dan mengindeks item.

Contoh penerapan

Gambar 1 menunjukkan perusahaan yang menggunakan repositori lokal dan cloud. Setiap repositori menggunakan jenis ID eksternal yang berbeda.

Contoh penerapan perusahaan dengan berbagai jenis identitas
Gambar 1. Contoh penerapan perusahaan dengan berbagai jenis identitas.

Repositori 1 mengidentifikasi pengguna berdasarkan alamat email menggunakan SAML. Karena mengetahui alamat email utama di Google Workspace atau Cloud Directory, alat ini tidak memerlukan sumber identitas.

Repositori 2 terintegrasi dengan direktori lokal dan mengidentifikasi pengguna berdasarkan sAMAccountName. Karena menggunakan atribut ini sebagai ID eksternal, sumber identitas diperlukan.

Membuat sumber identitas

Jika Anda memerlukan sumber identitas, lihat Memetakan identitas pengguna di Cloud Search.

Buat sumber identitas sebelum membuat konektor konten; Anda memerlukan ID-nya untuk membuat ACL dan mengindeks data. Membuat sumber identitas juga akan membuat properti pengguna khusus di Cloud Directory untuk menyimpan ID eksternal. Nama properti menggunakan konvensi IDENTITY_SOURCE_ID_identity.

Tabel ini menunjukkan dua sumber identitas: satu untuk nama akun SAM dan satu untuk ID pengguna (uid).

Sumber identitas Properti pengguna ID Eksternal
id1 id1_identity sAMAccountName
id2 id2_identity uid

Buat sumber identitas untuk setiap jenis ID eksternal yang digunakan di perusahaan Anda.

Tabel ini menunjukkan bagaimana pengguna dengan Akun Google dan dua ID eksternal muncul di Cloud Directory:

Pengguna Email id1_identity id2_identity
Ann ann@example.com example\ann 1001

Anda dapat mereferensikan pengguna yang sama menggunakan salah satu ID ini saat membentuk ACL untuk pengindeksan.

Menulis pengguna ACL

Gunakan getUserPrincipal() atau getGroupPrincipal() untuk membuat entity utama menggunakan ID eksternal.

Contoh ini mengambil izin file, termasuk pengguna dengan akses:

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();
  // ...
}

Cuplikan ini membuat prinsipal untuk pemilik menggunakan atribut 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)
);

Cuplikan ini membuat akun utama untuk pembaca:

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);
}

Setelah Anda memiliki pembaca dan pemilik, buat 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();

REST API menggunakan pola identitysources/IDENTITY_SOURCE_ID/users/EXTERNAL_ID. id1_identity Ani diselesaikan menjadi identitysources/id1_identity/users/example/ann. Ini adalah ID perantara pengguna.

Untuk mengetahui informasi selengkapnya tentang pemodelan ACL repositori, lihat ACL.

Grup peta

Sumber identitas juga berfungsi sebagai namespace untuk grup ACL. Gunakan ini untuk membuat dan memetakan grup yang hanya digunakan untuk keamanan atau bersifat lokal untuk repositori.

Gunakan Cloud Identity Groups API untuk membuat grup dan mengelola keanggotaan. Kaitkan grup dengan sumber identitas menggunakan nama sumber identitas sebagai namespace.

Cuplikan ini membuat grup:

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);
}

Membuat ACL grup

Gunakan getGroupPrincipal() untuk membuat entity utama grup dengan ID eksternal, lalu buat ACL:

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

Konektor identitas

Pengguna tidak dapat melihat item dalam hasil penelusuran sampai ID eksternal mereka menghasilkan ID Google di Cloud Directory. Anda dapat memastikannya dengan tiga cara:

Konektor identitas memetakan ID eksternal dari identitas perusahaan ke identitas Google internal. Jika Anda membuat sumber identitas, Anda juga harus membuat konektor identitas.

Google Cloud Directory Sync (GCDS) adalah contoh konektor identitas. Alat ini memetakan informasi pengguna dan grup dari Active Directory ke Cloud Directory.

Sinkronkan identitas menggunakan REST API

Gunakan metode update untuk menyinkronkan identitas.

Memetakan ulang identitas

Setelah memetakan ulang identitas, Anda harus mengindeks ulang item agar perubahan diterapkan.

  • Jika Anda menghapus atau mengubah pemetaan pengguna, pemetaan asli akan tetap ada hingga pengindeksan ulang.
  • Jika Anda menghapus grup yang dipetakan dan membuat grup baru dengan groupKey yang sama, grup tersebut tidak akan memberikan akses hingga Anda mengindeks ulang.