مزامنة أنظمة هوية مختلفة

يستند التحكم في إمكانية الوصول في Google Cloud Search إلى حساب المستخدم على Google. عند فهرسة المحتوى، يجب أن يتم حل جميع قوائم التحكم بالوصول في العناصر إلى معرّفات صالحة لمستخدم Google أو مجموعات Google (عناوين البريد الإلكتروني).

وفي كثير من الحالات، لا يكون للمستودع معرفة مباشرة بحسابات Google. بدلاً من ذلك، قد يتم تمثيل المستخدمين من خلال حسابات محلية أو استخدام تسجيل الدخول الموحّد مع موفِّر هوية ورقم تعريف، بخلاف عنوان البريد الإلكتروني للمستخدم، لتحديد كل حساب. ويُعرف هذا المعرّف باسم المعرّف الخارجي.

تساعد مصادر الهوية، التي تم إنشاؤها باستخدام "وحدة تحكّم المشرف"، في سد هذه الفجوة بين أنظمة الهوية من خلال:

يمكنك استخدام مصادر الهوية في الحالات التالية:

  • ليس لدى المستودع معرفة بعنوان البريد الإلكتروني الرئيسي للمستخدم في Google Workspace أو "دليل Google Cloud".
  • يحدّد المستودع المجموعات للتحكم في الوصول التي لا تتوافق مع المجموعات المستندة إلى البريد الإلكتروني في Google Workspace.

تعمل مصادر الهوية على تحسين كفاءة الفهرسة من خلال فصل الفهرسة عن عملية تحديد الهوية. يسمح لك هذا الفصل بتأجيل البحث عن المستخدم عند إنشاء قوائم ACL وفهرسة العناصر.

مثال على النشر

يوضح الشكل 1 مثالاً لعملية نشر تستخدم فيها إحدى المؤسسات كل من المستودعات على الأجهزة داخل المؤسسة والمستودعات السحابية. يستخدم كل مستودع نوعًا مختلفًا من المعرف الخارجي للإشارة إلى المستخدمين.

مثال على النشر
الشكل 1. مثال على النشر في المؤسسة بأنواع هوية مختلفة

يحدِّد المستودع 1 المستخدم الذي يستخدم عنوان البريد الإلكتروني الذي تم تأكيده باستخدام SAML. بما أنّ المستودع 1 لديه معرفة بعنوان البريد الإلكتروني الرئيسي للمستخدم في Google Workspace أو "دليل السحابة الإلكترونية"، لن تكون هناك حاجة إلى مصدر هوية.

يتم دمج المستودع 2 مباشرةً مع دليل في المؤسسة ويحدِّد هوية المستخدم من خلال سمة sAMAccountName. يجب توفّر مصدر هوية لأنّ المستودع 2 يستخدم السمة sAMAccountName كمعرّف خارجي.

إنشاء مصدر هوية

إذا كنت بحاجة إلى مصدر هوية، يُرجى الاطّلاع على مقالة ربط هويات المستخدمين في Cloud Search.

يجب إنشاء مصدر هوية قبل إنشاء موصل محتوى لأنك ستحتاج إلى معرف مصدر الهوية لإنشاء قوائم التحكم بالوصول (ACLs) وبيانات الفهرس. كما ذكرنا سابقًا، يؤدي إنشاء مصدر هوية إلى إنشاء خاصيّة مستخدم مخصَّصة في دليل السحابة الإلكترونية أيضًا. استخدِم هذه السمة لتسجيل المعرّف الخارجي لكل مستخدم في مستودعك. وتتم تسمية الخاصية باستخدام الاصطلاح IDENTITY_SOURCE_ID_identity.

يعرض الجدول التالي مصدرَي للهوية، أحدهما للاحتفاظ بأسماء حسابات SAM (sAMAccountName) كمعرّفات خارجية والآخر للاحتفاظ بأرقام تعريف المستخدمين (uid) كمعرّفات خارجية.

مصدر الهوية خاصيّة المستخدم المعرّف الخارجي
id1 id1_identity sAMAccountName
id2 id2_identity uid

أنشئ مصدر هوية لكل معرّف خارجي محتمل يتم استخدامه للإشارة إلى مستخدم في مؤسستك.

يوضِّح الجدول التالي كيفية ظهور مستخدم لديه حساب Google ورقمَي تعريف خارجيَين (id1_identity وid2_identity) وقيمه في "دليل السحابة الإلكترونية":

المستخدم بريد إلكتروني id1_identity id2_identity
منى ann@example.com مثال\ann 1001

يمكنك الإشارة إلى المستخدم نفسه باستخدام المعرّفات الثلاثة المختلفة، (عنوان البريد الإلكتروني في Google وsAMAccountName وuid) عند إنشاء قوائم للتحكم في الوصول للفهرسة.

كتابة قوائم التحكم بالوصول للمستخدم

استخدِم طريقة getUserPrincpal() أو طريقة 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();

تستخدم واجهة برمجة تطبيقات REST الأساسية النمط identitysources/IDENTITY_SOURCE_ID/users/EXTERNAL_ID للرقم التعريفي عند إنشاء العناصر الرئيسية. بالرجوع إلى الجداول السابقة، إذا أنشأت قائمة التحكم بالوصول (ACL) باستخدام id1_identity (SAMAccountName)، فسيتم حل رقم التعريف إلى:

identitysources/id1_identity/users/example/ann

يُطلَق على هذا المعرّف بالكامل اسم المعرّف المتوسط للمستخدم لأنّه يوفّر جسرًا بين المعرّف الخارجي ومعرّفات Google المخزّنة في "دليل السحابة الإلكترونية".

لمزيد من المعلومات حول نمذجة قوائم التحكم بالوصول المستخدمة لمستودع، راجع قوائم التحكم في الوصول.

مجموعات الخرائط

تعمل مصادر الهويات أيضًا كمساحة اسم للمجموعات المستخدمة في قوائم التحكم بالوصول (ACL). يمكنك استخدام ميزة مساحة الاسم هذه لإنشاء وتخطيط مجموعات تُستخدم للأغراض الأمنية فقط أو محلية في مستودع ما.

يمكنك استخدام Cloud Identity Groups API لإنشاء مجموعة وإدارة الاشتراكات. لربط المجموعة بمصدر هوية، استخدِم اسم مورد مصدر الهويات كمساحة اسم للمجموعة.

يعرض مقتطف الرمز التالي كيفية إنشاء مجموعة باستخدام 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) للمجموعة

لإنشاء قائمة ACL لمجموعة، استخدِم طريقة getGroupPrincipal() لإنشاء عنصر رئيسي للمجموعة باستخدام معرّف خارجي تم توفيره. بعد ذلك، أنشئ قائمة التحكم بالوصول (ACL) باستخدام فئة Acl.Builder على النحو التالي:

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

موصِّلات الهوية

على الرغم من أنه يمكنك استخدام معرّفات خارجية لا تتبع Google لإنشاء قوائم التحكم في الوصول (ACL) وفهرسة العناصر، لن يتمكن المستخدمون من الاطّلاع على العناصر في البحث حتى يتم تحويل المعرّفات الخارجية إلى معرّف Google في دليل السحابة الإلكترونية. هناك ثلاث طرق لضمان معرفة دليل السحابة الإلكترونية لكل من معرّف Google والمعرِّفات الخارجية للمستخدم:

موصلات الهوية هي برامج تُستخدم لربط معرّفات خارجية من هويات المؤسسات (المستخدمون والمجموعات) بهويات Google الداخلية التي تستخدمها Google Cloud Search. إذا كان عليك إنشاء مصدر هوية، عليك إنشاء موصِّل هوية.

تُعد أداة مزامنة دليل Google Cloud (GCP) مثالاً على أداة ربط الهوية. يربط موصِّل الهوية هذا معلومات المستخدم والمجموعة من Microsoft Active Directory إلى Cloud Directory مع سمات المستخدمين التي قد تمثّل هويتهم في أنظمة أخرى.

مزامنة الهويات باستخدام واجهة برمجة التطبيقات REST

يمكنك استخدام طريقة update لمزامنة الهويات باستخدام REST API.

إعادة تخصيص الهويات

بعد إعادة تخصيص هوية عنصر ما لهوية أخرى، يجب عليك إعادة فهرسة العناصر لتصبح الهوية الجديدة سارية. على سبيل المثال:

  • إذا حاولت إزالة تعيين من مستخدم أو إعادة تعيينه إلى مستخدم آخر، سيظل التعيين الأصلي محتفظًا به إلى أن تعيد الفهرسة.
  • إذا حذفت مجموعة مرتبطة مضمّنة في قائمة التحكّم بالوصول (ACL) للعنصر، ثم أنشأت مجموعة جديدة تتضمّن groupKey نفسه، لن توفّر المجموعة الجديدة إذن الوصول إلى العنصر إلى أن تتم إعادة فهرسة العنصر.