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

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

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

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

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

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

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

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

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

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

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

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

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

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

يجب إنشاء مصدر هوية قبل إنشاء موصِّل محتوى لأنك ستحتاج إلى معرّف مصدر الهويات لإنشاء قوائم ACL وفهرسة البيانات. كما ذكرنا سابقًا، يؤدي إنشاء مصدر هوية إلى إنشاء خاصيّة مستخدم مخصَّصة في "دليل السحابة الإلكترونية". استخدِم هذه السمة لتسجيل المعرّف الخارجي لكل مستخدم في مستودعك. تتم تسمية السمة باستخدام الاصطلاح 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) عند إنشاء قوائم التحكم بالوصول (ACLs) للفهرسة.

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

استخدِم طريقة 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 المُخزَّنة في "دليل السحابة الإلكترونية".

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

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

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

استخدِم 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 لإنشاء قوائم التحكم بالوصول (ACLs) وعناصر الفهرسة، لا يمكن للمستخدمين رؤية العناصر في البحث حتى يتم تحويل معرّفاتهم الخارجية إلى معرّف Google في دليل السحابة الإلكترونية. هناك ثلاث طرق للتأكد من أن "دليل السحابة الإلكترونية" يعرف كلاً من معرِّف Google والمعرِّفات الخارجية للمستخدم:

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

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

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

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

إعادة تحديد الهويات

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

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