Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Manuel Haim - Hochschulrechenzentrum
OpenIDM als „Datendrehscheibe“ –erste Erfahrungen und Konfiguration
ZKI-Arbeitskreis Verzeichnisdienste16.-17.09.2014 in OsnabrückManuel Haim, HRZ Uni Marburg
2Manuel Haim - Hochschulrechenzentrum
Erklärtes Ziel
• Einführung einer allgemeinen Software für den Datenabgleich zwischen verschiedenen IT-Systemen→ nicht nur für User- / Identitäts-Objekte (klassisches IDM), sondern für beliebige Objekte (z.B. Räume, Termine, Server, …)→ Anwendungs-Know-How unter HRZ-Mitarbeitern teilen
• Möglichst kostengünstig / Open Source→ z.B. ForgeRock OpenIDM, evolveum midPoint, Apache Syncope
• Schlagworte:→ Identity Management (IDM)→ Master Data Management (MDM)→ Enterprise Service Bus (ESB)→ Interaktive Formulare / Webinterface (UI)→ Workflows / Geschäftsprozesse (BPM) / BPMN 2.0
3Manuel Haim - Hochschulrechenzentrum
Überblick OpenIDM
4Manuel Haim - Hochschulrechenzentrum
Überblick OpenIDM 2.1 / 3.0
Gängige Schnittstellen:• REST-Schnittstelle (HTTPS / JSON)• Datenbankkonnektoren (u.a. CSV, XML, SQL / JDBC, LDAP)• Password-Sync-Plugin für Active Directory
Methoden zum Datenabgleich:• einfache Daten-Mappings mittels JSON-Konfigurationsdateien• skriptgesteuerte Verarbeitung mittels JavaScript• prozess- / workflow-orientierte Verarbeitung mittels Activiti• LiveSync (Delta-Abgleich) oder Reconciliation (Komplettabgleich)
Rudimentäres User Interface (Backbone.js-basiert)
5Manuel Haim - Hochschulrechenzentrum
Architektur OpenIDM 2.1 / 3.0
6Manuel Haim - Hochschulrechenzentrum
Vorkenntnisse:REST – Representational State Transfer
• REST ist eine Vorgehensweise zum Datenaustausch per HTTP
• Einzelne Objekte werden per Web-Adresse (URI) angesprochen, z.B. https://idm.example.org/openidm/managed/users/schmidt
• Die HTTP-Methode bestimmt, was zu tun ist, z.B.→ GET = Objekt abfragen→ POST = Unterobjekt anlegen (ohne vorgegebenen Namen)→ PUT = Objekt anlegen bzw. überschreiben→ DELETE = Objekt löschen
• Objekte werden z.B. im JSON- oder XML-Format übergeben
• Absicherung z.B. per HTTP Basic Auth oder SSL-Client-Zertifikat
7Manuel Haim - Hochschulrechenzentrum
Vorkenntnisse:JSON – JavaScript Object Notation
• JSON ist ein kompaktes textbasiertes Datenformat
• in der Regel einfacher zu lesen als XML
• Beispiel:
{ "uid" : "schmidt", "cn" : "Udo Schmidt", "email" : { "[email protected]", "[email protected]" }}
{ "uid" : "schmidt", "cn" : "Udo Schmidt", "email" : { "[email protected]", "[email protected]" }}
8Manuel Haim - Hochschulrechenzentrum
(vgl. Vortrag der FH Düsseldorf beim ZKI-Arbeitskreis Verzeichnisdienste im Herbst 2013 in Kaiserslautern)
Zu beachten: Ein Regelwerk muss man sich selbst überlegen!
9Manuel Haim - Hochschulrechenzentrum
Konfiguration
10Manuel Haim - Hochschulrechenzentrum
Zip-Archiv entpacken und los geht’s:OpenIDM Verzeichnisstruktur
openidm/ [Hauptverzeichnis]+- bin/ [OpenIDM und Apache Felix (jar-Dateien)]+- bundle/ [weitere Komponenten (jar-Dateien)]+- conf/ [projektspez. Konfigurationsdateien]+- connectors/ [OpenICF-Konnektoren (jar-Dateien)]+- db/ [SQL-Init-Skripte Repository-Datenbank]+- legal-notices/+- logs/ [Log-Dateien]+- samples/ [Beispielprojekte und Konfig.dateien]+- script/ [projektspez. Skripte]+- security/ [SSL-Keys]+- ui/ [Webinterface (Backbone.js-basiert)]+- workflow/ [Activiti workflow engine]+- shutdown.sh [OpenIDM stoppen]+- startup.sh [OpenIDM starten (interaktive Konsole!)]
openidm/ [Hauptverzeichnis]+- bin/ [OpenIDM und Apache Felix (jar-Dateien)]+- bundle/ [weitere Komponenten (jar-Dateien)]+- conf/ [projektspez. Konfigurationsdateien]+- connectors/ [OpenICF-Konnektoren (jar-Dateien)]+- db/ [SQL-Init-Skripte Repository-Datenbank]+- legal-notices/+- logs/ [Log-Dateien]+- samples/ [Beispielprojekte und Konfig.dateien]+- script/ [projektspez. Skripte]+- security/ [SSL-Keys]+- ui/ [Webinterface (Backbone.js-basiert)]+- workflow/ [Activiti workflow engine]+- shutdown.sh [OpenIDM stoppen]+- startup.sh [OpenIDM starten (interaktive Konsole!)]
11Manuel Haim - Hochschulrechenzentrum
Allgemeines zur Konfiguration von OpenIDM
• Konfigurationsdateien liegen im Unterverzeichnis conf/
• Änderungen nur bei laufendem OpenIDM vornehmen!→ OpenIDM überwacht Dateien, reagiert autom. auf Änderungen→ die tatsächliche Konfiguration liegt im Repository
• OpenIDM manipuliert Konfigurationsdateien!→ z.B. Verschlüsselung eingetragener Passwörter
• Standardmäßig OrientDB als OpenIDM-Repository (Datenbank)→ OpenIDM-zip-Archiv entpacken und direkt ausprobieren :-)→ alternatives Repository leicht einzurichten (z.B. MySQL)
• OpenIDM mit alternativem (Sample-) Projektverzeichnis starten:→ startup.sh -p <dir>
12Manuel Haim - Hochschulrechenzentrum
Die wichtigsten Konfigurationsdateien in conf/
• Lokales OpenIDM-Repository (repo.orientdb.json | repo.jdbc.json)→ Beispiele für MySQL / MS SQL / Oracle unter samples/misc/
• Lokal im Repository verwaltete Objekte (managed.json)
• Objekte in externen Systemen (provisioner.openicf-xxx.json)
• Synchronisierungs-Mappings (sync.json)
• Scheduler (scheduler.json , schedule-recon-xxx.json)
13Manuel Haim - Hochschulrechenzentrum
OpenIDM Repository
• objecttypes→ Objektklassen-Namen
• xxxobjects→ vollst. Objekte in JSON
• xxxobjectproperties→ Objekte zerlegt in key-type-value-Tupel
• links→ Relationen zus.gehörender managed- und/oder system-Objekte
+---------------------------+| Tables_in_openidm |+---------------------------+| auditaccess || auditactivity || auditrecon || clusterobjectproperties || clusterobjects || configobjectproperties || configobjects || genericobjectproperties || genericobjects || internaluser || links || managedobjectproperties || managedobjects || objecttypes || schedulerobjectproperties || schedulerobjects || security || securitykeys || uinotification |+---------------------------+
+---------------------------+| Tables_in_openidm |+---------------------------+| auditaccess || auditactivity || auditrecon || clusterobjectproperties || clusterobjects || configobjectproperties || configobjects || genericobjectproperties || genericobjects || internaluser || links || managedobjectproperties || managedobjects || objecttypes || schedulerobjectproperties || schedulerobjects || security || securitykeys || uinotification |+---------------------------+
14Manuel Haim - Hochschulrechenzentrum
OpenIDM Synchronization Situations und Actions
Situations (gekürzt):
• SOURCE_IGNORED
• MISSING
• FOUND
• AMBIGUOUS
• UNQUALIFIED
• CONFIRMED
• SOURCE_MISSING
• ABSENT
• TARGET_IGNORED
• UNASSIGNED
Actions:
• CREATE
• UPDATE
• DELETE
• LINK
• UNLINK
• EXCEPTION
• IGNORE
• REPORT
• NOREPORT
• ASYNC
15Manuel Haim - Hochschulrechenzentrum
Beispiel: Kalenderabgleich
• HRZ-Abteilungen pflegen separate Abwesenheitskalender→ Horde als Groupware (Webmail, Terminkalender, ...)→ Kalender z.B. per HTTPS als ics-Datei abrufbar
• Kalendereinträge haben die Form „X Nachname“, wobei X =→ U (Urlaub)→ G (Gleittag)→ D (Dienstreise)
• Anstehende Termine werden in Leitungssitzung besprochen→ Ziel: Überblick der anstehenden Dienstreisen→ Ziel: Sicherstellen der Aufgaben (z.B. mind. 1 Leiter anwesend)→ hierzu besteht eine Access-Anwendung (mit PostgreSQL-DB)→ Kalender werden derzeit manuell in PostgreSQL überführt
16Manuel Haim - Hochschulrechenzentrum
Schritt 1a: Kalender-Konnektor programmieren (1)
• ICF = Integrated Connector Framework→ bereits von Sun für Sun IDM genutzt→ als OpenICF von Forgerock weiterentwickelt→ vordefinierte Objektklassen __ACCOUNT__ und __GROUP__
• Eclipse als IDE→ Library „connector-framework-1.1.1.0.jar“ aus OpenIDM im Path
• FlatFileConnector aus OpenICF als Basis genutzt→ siehe http://openicf.forgerock.org
• HTTP(S)-Dateidownload und Dateicache implementiert→ Authentifizierung am Horde-Server mittels eigenem Account→ Cache sinnvoll, da sonst für jede Anfrage neuer Download
17Manuel Haim - Hochschulrechenzentrum
Schritt 1a: Kalender-Konnektor programmieren (2)
• Im Standardfall sind zwei Java-Klassen zu programmieren→ eine zum Auslesen der Konnektor-Konfiguration→ eine für den Konnektor selbst
• Verzeichnisstruktur:
.+- META-INF/| +- MANIFEST.MF+- unimr/ +- icf/ +- ics/ +- IcsCalendarConfiguration.class +- IcsCalendarConnector.class +- IcsCalendarConnector$1.class
.+- META-INF/| +- MANIFEST.MF+- unimr/ +- icf/ +- ics/ +- IcsCalendarConfiguration.class +- IcsCalendarConnector.class +- IcsCalendarConnector$1.class
18Manuel Haim - Hochschulrechenzentrum
Schritt 1a: Kalender-Konnektor programmieren (3)
• Datei MANIFEST.MF (Minimalbeispiel!):
Manifest-Version: 1.0Bnd-LastModified: 1406123400000Build-Jdk: 1.7.0_21Bundle-Description: Connector for IcsCalendarBundle-License: http://opensource.org/licenses/CDDL-1.0, http://creative commons.org/licenses/by-nc-nd/3.0/Bundle-ManifestVersion: 2Bundle-Name: IcsCalendar ConnectorBundle-SymbolicName: unimr.icf.ics.icscalendar-connectorBundle-Vendor: Uni MarburgBundle-Version: 1.0ConnectorBundle-FrameworkVersion: 1.1ConnectorBundle-Name: unimr.icf.ics.icscalendar-connectorConnectorBundle-Version: 1.0Created-By: Apache Maven Bundle PluginEmbed-Directory: libEmbed-Transitive: trueImplementation-Build: 0Implementation-Title: IcsCalendar ConnectorImplementation-Vendor: Uni MarburgImplementation-Vendor-Id: unimr.icf.icsImplementation-Version: 1.0SCM-Revision: 0Tool: Bnd-1.50.0
Manifest-Version: 1.0Bnd-LastModified: 1406123400000Build-Jdk: 1.7.0_21Bundle-Description: Connector for IcsCalendarBundle-License: http://opensource.org/licenses/CDDL-1.0, http://creative commons.org/licenses/by-nc-nd/3.0/Bundle-ManifestVersion: 2Bundle-Name: IcsCalendar ConnectorBundle-SymbolicName: unimr.icf.ics.icscalendar-connectorBundle-Vendor: Uni MarburgBundle-Version: 1.0ConnectorBundle-FrameworkVersion: 1.1ConnectorBundle-Name: unimr.icf.ics.icscalendar-connectorConnectorBundle-Version: 1.0Created-By: Apache Maven Bundle PluginEmbed-Directory: libEmbed-Transitive: trueImplementation-Build: 0Implementation-Title: IcsCalendar ConnectorImplementation-Vendor: Uni MarburgImplementation-Vendor-Id: unimr.icf.icsImplementation-Version: 1.0SCM-Revision: 0Tool: Bnd-1.50.0
19Manuel Haim - Hochschulrechenzentrum
Schritt 1a: Kalender-Konnektor programmieren (4)
• Hinweis: Unser Kalender-Konnektor kann nur lesen
• Java-Klassen gern auf Anfrage
20Manuel Haim - Hochschulrechenzentrum
Schritt 1b: Kalender-Konnektor konfigurieren (1)
• Konnektoren bieten Zugriff auf System Objects→ Konfiguration per json-Datei provisioner.openicf-xxx.json→ Achtung: In json-Dateien sind keine Kommentare möglich!!!
• Wir schreiben für jeden Abteilungskalender eine json-Datei→ nachfolgend exemplarisch für die HRZ-Abteilung Anwendungen
• Datei conf/provisioner.openicf-calhrzanwend.json:{ "name" : "calHrzAnwend", "connectorRef" : { "bundleName" : "unimr.icf.ics.icscalendar-connector", "bundleVersion" : "1.0", "connectorName" : "unimr.icf.ics.IcsCalendarConnector" }, "poolConfigOption" : { "maxObjects" : 10, "maxIdle" : 10, "maxWait" : 150000, "minEvictableIdleTimeMillis" : 120000, "minIdle" : 1 },
{ "name" : "calHrzAnwend", "connectorRef" : { "bundleName" : "unimr.icf.ics.icscalendar-connector", "bundleVersion" : "1.0", "connectorName" : "unimr.icf.ics.IcsCalendarConnector" }, "poolConfigOption" : { "maxObjects" : 10, "maxIdle" : 10, "maxWait" : 150000, "minEvictableIdleTimeMillis" : 120000, "minIdle" : 1 },
21Manuel Haim - Hochschulrechenzentrum
Schritt 1b: Kalender-Konnektor konfigurieren (2)
• Datei conf/provisioner.openicf-ics.json (Fortsetzung):
"operationTimeout" : { "CREATE" : -1, "VALIDATE" : -1, "TEST" : -1, "SCRIPT_ON_CONNECTOR" : -1, "SCHEMA" : -1, "DELETE" : -1, "UPDATE" : -1, "SYNC" : -1, "AUTHENTICATE" : -1, "GET" : -1, "SCRIPT_ON_RESOURCE" : -1, "SEARCH" : -1 }, "configurationProperties" : { "file" : "https://home.hrz.uni-marburg.de/rpc.php/kronolith/[email protected]/123f512a4c32ef52b134.ics", "encoding" : "UTF-8", "username" : "idm2cal", "password" : "password", "cacheFile" : "/tmp/cal_hrz_anwend.ics", "cacheTimeout" : 60000
},
"operationTimeout" : { "CREATE" : -1, "VALIDATE" : -1, "TEST" : -1, "SCRIPT_ON_CONNECTOR" : -1, "SCHEMA" : -1, "DELETE" : -1, "UPDATE" : -1, "SYNC" : -1, "AUTHENTICATE" : -1, "GET" : -1, "SCRIPT_ON_RESOURCE" : -1, "SEARCH" : -1 }, "configurationProperties" : { "file" : "https://home.hrz.uni-marburg.de/rpc.php/kronolith/[email protected]/123f512a4c32ef52b134.ics", "encoding" : "UTF-8", "username" : "idm2cal", "password" : "password", "cacheFile" : "/tmp/cal_hrz_anwend.ics", "cacheTimeout" : 60000
},
22Manuel Haim - Hochschulrechenzentrum
Schritt 1b: Kalender-Konnektor konfigurieren (3)
• Datei conf/provisioner.openicf-ics.json (Fortsetzung, gekürzt):
(Objektklasse __ACCOUNT__ aus Kompatibilitätsgründen nötig)
"objectTypes" : { "myObject" : { "$schema" : "http://json-schema.org/draft-03/schema", "id" : "__ACCOUNT__", "type" : "object", "nativeType" : "__ACCOUNT__", "properties" : { "key" : { "type" : "string", "required" : true, "nativeName" : "__NAME__", "nativeType" : "string" }, "summary" : { "type" : "string", "nativeName" : "SUMMARY", "nativeType" : "string" } } } }, "operationOptions" : { }}
"objectTypes" : { "myObject" : { "$schema" : "http://json-schema.org/draft-03/schema", "id" : "__ACCOUNT__", "type" : "object", "nativeType" : "__ACCOUNT__", "properties" : { "key" : { "type" : "string", "required" : true, "nativeName" : "__NAME__", "nativeType" : "string" }, "summary" : { "type" : "string", "nativeName" : "SUMMARY", "nativeType" : "string" } } } }, "operationOptions" : { }}
23Manuel Haim - Hochschulrechenzentrum
Schritt 2a: Managed Objects definieren
• Nur nötig, falls man Objekte im OpenIDM-eigenen Repository ablegen möchte
• Es wird hierbei nur der Objekttyp definiert, nicht die Properties
• Beispieldatei conf/managed.json:
{ "objects" : [ { "name" : "myCalendar" } ]}
{ "objects" : [ { "name" : "myCalendar" } ]}
24Manuel Haim - Hochschulrechenzentrum
Schritt 2b: System Objects definieren (1)
• Wir wollen die Kalendereinträge in PostgreSQL speichern
• Hierzu eignet sich der ScriptedSQLConnector (Anpassung nötig)
• Datei conf/provisioner.openicf-caldb.json:
{ "name" : "caldb", "connectorRef" : { "bundleName" : "org.forgerock.openicf.connectors.scriptedsql-connector", "bundleVersion" : "1.1.0.1", "connectorName" : "org.forgerock.openicf.connectors.scriptedsql.ScriptedSQLConnector" },
{ "name" : "caldb", "connectorRef" : { "bundleName" : "org.forgerock.openicf.connectors.scriptedsql-connector", "bundleVersion" : "1.1.0.1", "connectorName" : "org.forgerock.openicf.connectors.scriptedsql.ScriptedSQLConnector" },
25Manuel Haim - Hochschulrechenzentrum
Schritt 2b: System Objects definieren (2)
• Datei conf/provisioner.openicf-caldb.json (Fortsetzung):
"producerBufferSize" : 100, "connectorPoolingSupported" : true, "poolConfigOption" : { "maxObjects" : 10, "maxIdle" : 10, "maxWait" : 150000, "minEvictableIdleTimeMillis" : 120000, "minIdle" : 1 }, "operationTimeout" : { "CREATE" : -1, "TEST" : -1, "AUTHENTICATE" : -1, "SEARCH" : -1, "VALIDATE" : -1, "GET" : -1, "UPDATE" : -1, "DELETE" : -1, "SCRIPT_ON_CONNECTOR" : -1, "SCRIPT_ON_RESOURCE" : -1, "SYNC" : -1, "SCHEMA" : -1 },
"producerBufferSize" : 100, "connectorPoolingSupported" : true, "poolConfigOption" : { "maxObjects" : 10, "maxIdle" : 10, "maxWait" : 150000, "minEvictableIdleTimeMillis" : 120000, "minIdle" : 1 }, "operationTimeout" : { "CREATE" : -1, "TEST" : -1, "AUTHENTICATE" : -1, "SEARCH" : -1, "VALIDATE" : -1, "GET" : -1, "UPDATE" : -1, "DELETE" : -1, "SCRIPT_ON_CONNECTOR" : -1, "SCRIPT_ON_RESOURCE" : -1, "SYNC" : -1, "SCHEMA" : -1 },
26Manuel Haim - Hochschulrechenzentrum
Schritt 2b: System Objects definieren (3)
• Datei conf/provisioner.openicf-caldb.json (Fortsetzung):
"configurationProperties" : { "host" : "caldb.hrz.uni-marburg.de", "port" : "5432", "user" : "idm2cal", "password" : "password", "database" : "caldb", "autoCommit" : true, "reloadScriptOnExecution" : false, "jdbcDriver" : "org.postgresql.Driver", "jdbcConnectionUrl" : "jdbc:postgresql://caldb.hrz.uni-marburg.de:5432/idm2cal?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory", "jdbcUrlTemplate" : "jdbc:postgresql://%h:%p/%d?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory", "createScriptFileName" : "/opt/openidm/haimm/caldb/s/CreateScript.groovy", "testScriptFileName" : "/opt/openidm/haimm/caldb/s/TestScript.groovy", "searchScriptFileName" : "/opt/openidm/haimm/caldb/s/SearchScript.groovy", "deleteScriptFileName" : "/opt/openidm/haimm/caldb/s/DeleteScript.groovy", "updateScriptFileName" : "/opt/openidm/haimm/caldb/s/UpdateScript.groovy", "syncScriptFileName" : "/opt/openidm/haimm/caldb/s/SyncScript.groovy" },
"configurationProperties" : { "host" : "caldb.hrz.uni-marburg.de", "port" : "5432", "user" : "idm2cal", "password" : "password", "database" : "caldb", "autoCommit" : true, "reloadScriptOnExecution" : false, "jdbcDriver" : "org.postgresql.Driver", "jdbcConnectionUrl" : "jdbc:postgresql://caldb.hrz.uni-marburg.de:5432/idm2cal?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory", "jdbcUrlTemplate" : "jdbc:postgresql://%h:%p/%d?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory", "createScriptFileName" : "/opt/openidm/haimm/caldb/s/CreateScript.groovy", "testScriptFileName" : "/opt/openidm/haimm/caldb/s/TestScript.groovy", "searchScriptFileName" : "/opt/openidm/haimm/caldb/s/SearchScript.groovy", "deleteScriptFileName" : "/opt/openidm/haimm/caldb/s/DeleteScript.groovy", "updateScriptFileName" : "/opt/openidm/haimm/caldb/s/UpdateScript.groovy", "syncScriptFileName" : "/opt/openidm/haimm/caldb/s/SyncScript.groovy" },
27Manuel Haim - Hochschulrechenzentrum
Schritt 2b: System Objects definieren (4)
• Datei conf/provisioner.openicf-caldb.json (Fortsetzung, gekürzt):
"objectTypes" : { "vevent" : { "$schema" : "http://json-schema.org/draft-03/schema", "id" : "vevent", "type" : "object", "nativeType" : "vevent", "properties" : { "uid" : { "type" : "string", "nativeName" : "UID", "nativeType" : "string" }, "type" : { "type" : "string", "nativeName" : "AbwTyp", "nativeType" : "string" }, "description" : { "type" : "string", "nativeName" : "Veranstaltung", "nativeType" : "string" } } } }, "operationOptions" : { }}
"objectTypes" : { "vevent" : { "$schema" : "http://json-schema.org/draft-03/schema", "id" : "vevent", "type" : "object", "nativeType" : "vevent", "properties" : { "uid" : { "type" : "string", "nativeName" : "UID", "nativeType" : "string" }, "type" : { "type" : "string", "nativeName" : "AbwTyp", "nativeType" : "string" }, "description" : { "type" : "string", "nativeName" : "Veranstaltung", "nativeType" : "string" } } } }, "operationOptions" : { }}
28Manuel Haim - Hochschulrechenzentrum
Schritt 3: Reconciliation-Mappings definieren (1)
• Hilfsscript script/isSourceValid.js
// Check if ventry is less than one year old
function isValid() { var str = ""; var currentTime = new Date(); var year = currentTime.getFullYear(); var month = currentTime.getMonth(); month++; // getMonth() is 0-based var day = currentTime.getDate(); var hours = currentTime.getHours(); var minutes = currentTime.getMinutes(); var seconds = currentTime.getSeconds(); year--;
if (month < 10) { month = "0" + month; } if (day < 10) { day = "0" + day; } if (hours < 10 ) { hours = "0" + hours; } if (minutes < 10) { minutes = "0" + minutes; } if (seconds < 10) { seconds = "0" + seconds; } str += year + month + day + hours + minutes + seconds + " ";
var result = true; if (source.dtend < str) result=false; //logger.warn("HALLOWELT {} < {} , isValid()=={}", source.dtend, str, result); return result;}
isValid();
// Check if ventry is less than one year old
function isValid() { var str = ""; var currentTime = new Date(); var year = currentTime.getFullYear(); var month = currentTime.getMonth(); month++; // getMonth() is 0-based var day = currentTime.getDate(); var hours = currentTime.getHours(); var minutes = currentTime.getMinutes(); var seconds = currentTime.getSeconds(); year--;
if (month < 10) { month = "0" + month; } if (day < 10) { day = "0" + day; } if (hours < 10 ) { hours = "0" + hours; } if (minutes < 10) { minutes = "0" + minutes; } if (seconds < 10) { seconds = "0" + seconds; } str += year + month + day + hours + minutes + seconds + " ";
var result = true; if (source.dtend < str) result=false; //logger.warn("HALLOWELT {} < {} , isValid()=={}", source.dtend, str, result); return result;}
isValid();
29Manuel Haim - Hochschulrechenzentrum
Schritt 3: Reconciliation-Mappings definieren (2)
• Hilfsscript script/dtToTimestamp.js
function dtToTimestamp() { if (source==null) return ""; var str = ""; var year; var month; var day; var hours; var minutes; var seconds; if (source.length == 8) { year = source.substr(0,4); month = source.substr(4,2); day = source.substr(6,2); str += year + "-" + month + "-" + day + " 00:00:00"; } else if (source.length >= 15) { year = source.substr(0,4); month = source.substr(4,2); day = source.substr(6,2); hours = source.substr(9,2); minutes = source.substr(11,2); seconds = source.substr(13,2); str += year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; } return str;}
dtToTimestamp();
function dtToTimestamp() { if (source==null) return ""; var str = ""; var year; var month; var day; var hours; var minutes; var seconds; if (source.length == 8) { year = source.substr(0,4); month = source.substr(4,2); day = source.substr(6,2); str += year + "-" + month + "-" + day + " 00:00:00"; } else if (source.length >= 15) { year = source.substr(0,4); month = source.substr(4,2); day = source.substr(6,2); hours = source.substr(9,2); minutes = source.substr(11,2); seconds = source.substr(13,2); str += year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; } return str;}
dtToTimestamp();
30Manuel Haim - Hochschulrechenzentrum
Schritt 3: Reconciliation-Mappings definieren (3)
• Datei conf/sync.json:
{ "mappings" : [ { "name" : "systemCalHrzAnwend_systemCaldb", "source" : "system/calHrzAnwend/vevent", "target" : "system/caldb/vevent", "validSource" : { "type" : "text/javascript", "file" : "/opt/openidm/haimm/caldb/script/isSourceValid.js" }, "properties" : [ { "source" : "key", "target" : "_id" }, { "source" : "dtstart", "transform" : { "type" : "text/javascript", "file":"/opt/openidm/haimm/caldb/script/dtToTimestamp.js" }, "target" : "dtstart" },
{ "mappings" : [ { "name" : "systemCalHrzAnwend_systemCaldb", "source" : "system/calHrzAnwend/vevent", "target" : "system/caldb/vevent", "validSource" : { "type" : "text/javascript", "file" : "/opt/openidm/haimm/caldb/script/isSourceValid.js" }, "properties" : [ { "source" : "key", "target" : "_id" }, { "source" : "dtstart", "transform" : { "type" : "text/javascript", "file":"/opt/openidm/haimm/caldb/script/dtToTimestamp.js" }, "target" : "dtstart" },
31Manuel Haim - Hochschulrechenzentrum
Schritt 3: Reconciliation-Mappings definieren (4)
• Datei conf/sync.json (Fortsetzung, gekürzt):
{ "source" : "summary", "transform" : { "type" : "text/javascript", "source" : "source.substr(0,1);" }, "target" : "type" }, { "source" : "", "transform" : { "type" : "text/javascript", "source" : "source.summary.substr(2,10);" }, "target" : "person" }, { "source" : "description", "target" : "description" } ],
{ "source" : "summary", "transform" : { "type" : "text/javascript", "source" : "source.substr(0,1);" }, "target" : "type" }, { "source" : "", "transform" : { "type" : "text/javascript", "source" : "source.summary.substr(2,10);" }, "target" : "person" }, { "source" : "description", "target" : "description" } ],
32Manuel Haim - Hochschulrechenzentrum
Schritt 3: Reconciliation-Mappings definieren (5)
• Datei conf/sync.json (Fortsetzung, gekürzt):
"policies" : [{ "situation" : "CONFIRMED", "action" : "UPDATE" },{ "situation" : "FOUND", "action" : "UPDATE" },{ "situation" : "ABSENT", "action" : "CREATE" },{ "situation" : "AMBIGUOUS", "action" : "EXCEPTION" },{ "situation" : "MISSING", "action" : "UNLINK" },{ "situation" : "SOURCE_MISSING", "action" : "DELETE" },{ "situation" : "UNQUALIFIED", "action" : "DELETE" },{ "situation" : "UNASSIGNED", "action" : "IGNORE" } ] }, ]}
"policies" : [{ "situation" : "CONFIRMED", "action" : "UPDATE" },{ "situation" : "FOUND", "action" : "UPDATE" },{ "situation" : "ABSENT", "action" : "CREATE" },{ "situation" : "AMBIGUOUS", "action" : "EXCEPTION" },{ "situation" : "MISSING", "action" : "UNLINK" },{ "situation" : "SOURCE_MISSING", "action" : "DELETE" },{ "situation" : "UNQUALIFIED", "action" : "DELETE" },{ "situation" : "UNASSIGNED", "action" : "IGNORE" } ] }, ]}
33Manuel Haim - Hochschulrechenzentrum
Schritt 4: Scheduler definieren
• Datei conf/schedule-recon-cal-hrz-anwend.json:
• Bevor wir enabled=true setzen, sollten wir ausprobieren:
• Ergebnis:
{ "enabled" : false, "type" : "cron", "schedule" : "0 0/15 * * * ?", "concurrentExecution" : false, "invokeService" : "sync", "invokeContext" : { "action" : "reconcile", "mapping" : "systemCalHrzAnwend_systemCaldb" }}
{ "enabled" : false, "type" : "cron", "schedule" : "0 0/15 * * * ?", "concurrentExecution" : false, "invokeService" : "sync", "invokeContext" : { "action" : "reconcile", "mapping" : "systemCalHrzAnwend_systemCaldb" }}
$ curl --header "X-OpenIDM-Username: openidm-admin" \--header "X-OpenIDM-Password: openidm-admin" --request POST \"http://localhost:8080/openidm/recon?_action=recon&mapping=systemCalHrzAnwend_systemCaldb"
$ curl --header "X-OpenIDM-Username: openidm-admin" \--header "X-OpenIDM-Password: openidm-admin" --request POST \"http://localhost:8080/openidm/recon?_action=recon&mapping=systemCalHrzAnwend_systemCaldb"
SUCCESSSOURCE_IGNORED: 0 MISSING: 0 FOUND: 0 AMBIGUOUS: 0 UNQUALIFIED: 0 CONFIRMED: 0 SOURCE_MISSING: 0 ABSENT: 197 TARGET_IGNORED: 0 UNASSIGNED: 0
SUCCESSSOURCE_IGNORED: 0 MISSING: 0 FOUND: 0 AMBIGUOUS: 0 UNQUALIFIED: 0 CONFIRMED: 0 SOURCE_MISSING: 0 ABSENT: 197 TARGET_IGNORED: 0 UNASSIGNED: 0
34Manuel Haim - Hochschulrechenzentrum
Jetzt kommt der Clou...
• Alle Quell-Kalender werden mit derselben Zieltabelle synchronisiert→ Neue Einträge sind ABSENT, werden in Zieltabelle übernommen→ Vorhandene Einträge sind FOUND→ Existiert der Quelleintrag nicht mehr (SOURCE MISSING), so wird der Zieleintrag gelöscht→ Vorhandene Zieleinträge anderer Quellen werden hierbei als UNASSIGNED gewertet und bleiben erhalten
35Manuel Haim - Hochschulrechenzentrum
OpenIDM Tipps und Tricks (1)
• curl und jq verwenden (jq formatiert die Ausgabe)
• IDs von Systemobjekten
• Einzelnes Systemobjekt (inkl. Attribute) anhand ID
• Aufruf eines Reconciliation-Mappings
• OpenIDM-Konfiguration ermitteln
curl […] | jq '.'curl […] | jq '.'
curl […] http://localhost:8080/openidm/system/caldb/vevent/?_queryId=query-all-ids
curl […] http://localhost:8080/openidm/system/caldb/vevent/?_queryId=query-all-ids
curl […] http://localhost:8080/openidm/system/caldb/vevent/a73f94e3
curl […] http://localhost:8080/openidm/system/caldb/vevent/a73f94e3
curl […] --request POST http://localhost:8080/openidm/recon?_action=recon&mapping=systemCalHrzAnwend_systemCaldb
curl […] --request POST http://localhost:8080/openidm/recon?_action=recon&mapping=systemCalHrzAnwend_systemCaldb
curl --user openidm-admin:passw http://localhost:8080/openidm/configcurl --user openidm-admin:passw http://localhost:8080/openidm/config
36Manuel Haim - Hochschulrechenzentrum
Lizenziserung
37Manuel Haim - Hochschulrechenzentrum
Ein wenig Geschichte...
• Sun Identity Manager (ehemals Wave) fällt an Oracle→ Oracle vermarktet bereits den Oracle Identity Manager→ Sun Identity Manager wird in Oracle Wave umbenannt→ Oracle Wave wird abgekündigt, Kunden sollen umsteigen
• nLight (IDM-Berater) und Forgerock (frühere Sun-Entwickler) entwickeln OpenIDM 1.x als Open-Source-Ersatz für Sun IDM→ Hauptentwicklung nLight, klassische Technologien (XML, Spring)→ Forgerock plant nochmals Neuentwicklung, will Code verwerfen→ nLight gründet evolveum, übernimmt bisherigen Code→ OpenIDM 1.x wird zu evolveum midPoint (Apache-Lizenz)
• Forgerock entwickelt OpenIDM 2.x from scratch (CDDL-Lizenz)→ neue Technologien (JSON, OSGi, BPMN), Marketing
38Manuel Haim - Hochschulrechenzentrum
Lizenzbedingungen bis Februar 2013:OpenIDM 2.0.3 Enterprise Build für alle frei nutzbar
39Manuel Haim - Hochschulrechenzentrum
Seit Februar 2013 neue Lizenzbedingungen:OpenIDM 2.1 Enterprise Build nur für Bezahlkunden
40Manuel Haim - Hochschulrechenzentrum
...aber Custom Build gemäß CDDL erlaubt, s. FAQ:
41Manuel Haim - Hochschulrechenzentrum
OpenIDMselbst kompilieren
42Manuel Haim - Hochschulrechenzentrum
OpenIDM 2.1 Revision 3210 holen und kompilieren
• Erforderliche Tools: Java-JDK (z.B. openjdk-7-jdk), svn, maven
• Herunterladen nach /tmp:
• Kompilieren (dauert eine Weile, Maven lädt Ressourcen nach):
• Zieldatei liegt anschließend unter/tmp/2.1.0/openidm-zip/target/openidm-2.1.0.zip
$ cd /tmp$ svn co -r 3210 https://svn.forgerock.org/openidm/tags/2.1.0
$ cd /tmp$ svn co -r 3210 https://svn.forgerock.org/openidm/tags/2.1.0
$ cd /tmp/2.1.0$ mvn clean install
$ cd /tmp/2.1.0$ mvn clean install
43Manuel Haim - Hochschulrechenzentrum
… und entpacken
• z.B. wie folgt:
• Anschließend könnte man OpenIDM schon per startup.sh starten. Man arbeitet dann aber auf der mitgelieferten OrientDB-Datenbank.
# cd /tmp# unzip /path/to/openidm-2.1.0.zip# mv openidm /opt/openidm-2.1.0-rev3210# ln -s /opt/openidm-2.1.0-rev3210 /opt/openidm
# cd /tmp# unzip /path/to/openidm-2.1.0.zip# mv openidm /opt/openidm-2.1.0-rev3210# ln -s /opt/openidm-2.1.0-rev3210 /opt/openidm
44Manuel Haim - Hochschulrechenzentrum
Konfiguration PostgreSQL-Repository
45Manuel Haim - Hochschulrechenzentrum
Verwendete Software-Versionen
• Debian GNU/Linux 7.0 („Wheezy“)
• OpenJDK 7→ apt-get --no-install-recommends install openjdk-7-jdk
• OpenIDM 2.1 Revision 3210 (Mai 2014)→ aus SVN heruntergeladen, selbst kompiliert→ Anpassung für PostgreSQL erforderlich
• PostgreSQL 9.3→ in Version 9.1 „json_extract_path_text“ noch nicht vorhanden!→ postgresql.org als zusätzliche Debian-Paketquelle erforderlich
• OSGi-konformer PostgreSQL-JDBC-Treiber 9.3-1100-jdbc41→ aus Apache ServiceMix Bundles
46Manuel Haim - Hochschulrechenzentrum
OpenIDM 2.1 Revision 3210:Fehler in PostgreSQLTableHandler patchen
• Datei openidm-repo-jdbc/src/main/java/org/forgerock/openidm/repo/jdbc/impl/PostgreSQLTableHandler.java wie folgt anpassen:
• Dann neu kompilieren. Falls vorh. Installation gepatcht werden soll:Datei openidm-repo-jdbc/target/openidm-repo-jdbc-2.1.0.jar nach openidm/bundle/ kopieren und openidm/felix-cache/ leeren
protected Map<QueryDefinition, String> initializeQueryMap() {... result.put(QueryDefinition.DELETEQUERYSTR, "DELETE FROM " + mainTable + " WHERE id IN (SELECT obj.id FROM " + mainTable + " obj INNER JOIN " + typeTable + " objtype ON obj.objecttypes_id = objtype.id" + " AND objtype.objecttype = ? WHERE obj.objectid = ? AND obj.rev = ?)");...}
protected Map<QueryDefinition, String> initializeQueryMap() {... result.put(QueryDefinition.DELETEQUERYSTR, "DELETE FROM " + mainTable + " WHERE id IN (SELECT obj.id FROM " + mainTable + " obj INNER JOIN " + typeTable + " objtype ON obj.objecttypes_id = objtype.id" + " AND objtype.objecttype = ? WHERE obj.objectid = ? AND obj.rev = ?)");...}
47Manuel Haim - Hochschulrechenzentrum
OSGi-konformer PostgreSQL-JDBC-Treiber
• Der JDBC-Treiber von postgresql.org liegt nicht als OSGi-Bundle vor, läuft somit nicht unter Apache Felix (OSGi-Container).
• Lösung:Treiber aus Apache ServiceMix Bundle laden und kompilieren:
… und nach OpenIDM kopieren:
$ cd /tmp$ svn co http://svn.apache.org/repos/asf/servicemix/smx4/bundles/trunk/ postgresql-9.3-1100-jdbc41$ cd postgresql-9.3-1100-jdbc41$ mvn
$ cd /tmp$ svn co http://svn.apache.org/repos/asf/servicemix/smx4/bundles/trunk/ postgresql-9.3-1100-jdbc41$ cd postgresql-9.3-1100-jdbc41$ mvn
$ scp -p target/org.apache.servicemix.bundles.postgresql-9.3-1100-jdbc41_2- SNAPSHOT.jar root@openidm-dev:/opt/openidm/bundle/
$ scp -p target/org.apache.servicemix.bundles.postgresql-9.3-1100-jdbc41_2- SNAPSHOT.jar root@openidm-dev:/opt/openidm/bundle/
48Manuel Haim - Hochschulrechenzentrum
repo.jdbc.json – Repository-Konfiguration(hier: PostgreSQL-Repository)
• Entweder openidm/samples/repo.jdbc.json auf PostgreSQL anpassen
• Oder eine aktuelle Datei aus dem Entwicklungszweig des SVN übernehmen (z.B. Revision 3044, Stand April 2014):
• Achtung: Dateiname muss in „repo.jdbc.json“ geändert werden!
$ cd /tmp$ svn co -r 3044https://svn.forgerock.org/openidm/trunk/openidm-zip/src/main/resources/samples/misc/repo.jdbc-postgres.json
$ cd /tmp$ svn co -r 3044https://svn.forgerock.org/openidm/trunk/openidm-zip/src/main/resources/samples/misc/repo.jdbc-postgres.json
49Manuel Haim - Hochschulrechenzentrum
Links
• Forgerock:http://www.forgerock.com
• OpenIDM (Installation Guide, Integrator's Guide):http://openidm.forgerock.org
• OpenICF:http://openicf.forgerock.org
• Vergleich Open-Source-IDM-Softwarehttp://www.nlight.eu/documents/open-source-idm/
50Manuel Haim - Hochschulrechenzentrum
Danke für Ihre / Eure Aufmerksamkeit!
Noch Fragen?
→ Gern jetzt im Anschluss :-)
→ sonst per E-Mail: Manuel Haim, [email protected]