Notice
The examples and use cases described here are intended to show the different ways SURF Research Access Management can be used and connected to application. These examples and use cases are not always validated by SURF.
JumpCloud is een bedrijf dat een 'Directory' in de cloud biedt. Zie het als een LDAP as a Service (SaaS).
Een van de feature van JumpCloud is dat ze fraaie integratie bieden met bijvoorbeeld Windows desktops. Via zogenaamde 'Custom Credential Providers' is het namelijk mogelijk dat Windows gebruikers authenticeren tegen de JumpCloud Directory.
Integratie met SRAM
Met SRAM is integratie bereikt naar JumpCloud op de wijze dat de SRAM LDAP elke 5 (configureerbaar) syncrhroniseert naar JumpCloud. Ope het moment dat in SRAM een nieuwe deelnemer aan een collaboratie wordt toegevoegd verschijnt deze ook in de SRAM LDAP en zal deze ook worden toegevoegd aan de JumpCloud directory. Het toevoegen van een nieuw member triggert het JumpCloud onboarding proces: de gebruikers krijgt via e-mail een uitnodiging om zijn JumpCloud account te completeren. (Instellen wachtwoord, instellen MFA etc)
De component die interactie voert met de JumpCloud API's is gedocumenteerd JumpCloud Provisioner
Het lezen van de LDAP staat gedocumenteerd hier
De aanroep naar deze JumpCloud Provisioner kan vrij eenvoudig via Python worden bereikt via deze logica:
...
from LDAP import LDAP as ldap_connection from JumpCloud import JumpCloud as jumpcloud_connection ...
try: logger.debug("Connection to LDAP...") with ldap_connection( os.environ.get("LDAP_HOST", "localhost"), os.environ.get("LDAP_BASE", "dc=example,dc=com"), os.environ.get("LDAP_BIND", "cn=admin,dc=example,dc=com"), os.environ.get("LDAP_PASS", ""), os.environ.get("LDAP_MODE", "IP_V4_ONLY"), ) as src: logger.debug("Connection to Jumpcloud...") sync_population(src, jumpcloud_connection( os.environ.get("JUMPCLOUD_API_URL", "https://console.jumpcloud.com"), os.environ.get("JUMPCLOUD_API_KEY", "") ) ) except Exception as e: logger.error("Exception: " + str(e))
...
def sync_population(src, dst): logging.debug(src) show("Starting persons: ", dst.get_persons()) show("Starting groups:", dst.get_groups()) for uid in src.people.keys(): dst.person(uid, **{ "sn": src.people[uid]['attributes'].get('sn', [''])[0], "givenName": src.people[uid]['attributes'].get('givenName', [''])[0], "displayName": src.people[uid]['attributes'].get('displayName', [''])[0], "mail": src.people[uid]['attributes'].get('mail', [''])[0], "uniqueId": src.people[uid]['attributes'].get('eduPersonUniqueId', [''])[0], "sshPublicKey": src.people[uid]['attributes'].get('sshPublicKey',[]) } ) for group in src.groups.keys(): dst.add_members(group, src.groups[group]['attributes']['member']) logger.debug("Cleaning up...") dst.cleanup() show("Final persons:", dst.get_persons()) show("Final groups:", dst.get_groups())