LPS:IdM/midPoint
ZČU
- vývojová instance ZČU: themis3.civ.zcu.cz (emulace v MySQL)
- vývojová instance AMI: agenor.civ.zcu.cz
- testovací instance (MP 3.6.1): themis.civ.zcu.cz (napojeno na stejné DB jako agenor)
testovací instance (MP 3.6): themis4.civ.zcu.cz- (před)produkční instance: eos.zcu.cz
- personální portál: eos.zcu.cz (docker, port 444 + 8444), viz LPS:IdM/midPoint/Personální_portál
- repozitáře:
/afs/.zcu.cz/project/software/git/idm/midpoint.git- počáteční testování midPointu- ssh://root@agenor.zcu.cz:/var/lib/git/midpoint-overlay.git - pro vygenerování .war k deploymentu
- ssh://root@agenor.zcu.cz:/var/lib/git/xml-objects.git - pro import pomocí eclipse pluginu
- ssh://root@agenor.zcu.cz:/var/lib/git/server-configuration.git - dokumentace dalších konfigurací v OS
- ssh://root@agenor.zcu.cz:/var/lib/git/testsuite.git - automatizovaná testsuita
- https://github.com/Tirasa/ConnIdDBBundle/ - DB connector
- (v plánu) https://github.com/CESNET/kerberos-connector - Kerberos connector
- (experimenty) /afs/zcu.cz/project/software/git/idm/afs-connector.git - AFS PTS connector
Viz také #Vývoj.
Dokumentace
midPoint:
- URL: https://evolveum.com/midpoint/
- First steps: https://wiki.evolveum.com/display/midPoint/First+Steps
- API+schemas: https://evolveum.com/downloads/midpoint/
- source code: https://github.com/Evolveum/midpoint
- examply:
- https://github.com/Evolveum/midpoint/tree/master/samples (jednotlivé resourcy)
- https://github.com/Evolveum/midpoint/tree/master/testing/story/src/test/resources (komplexnější příklady)
- demo: http://demo.evolveum.com/midpoint
- hlavní dokumentace: https://wiki.evolveum.com/display/midPoint/Documentation
- měření výkonu:
- funkce v groovy skriptech: https://wiki.evolveum.com/display/midPoint/Script+Expression+Functions
- autorizace: Authorization+Configuration - Core Auth, GUI Auth, Service Auth
- seznam groovy funkcí: [1]
- WS API: https://evolveum.com/downloads/midpoint/3.5.1/schema-3.5.1-schemadoc/
Connectors:
- OpenICF:
- URL: https://forgerock.org/openicf/
- source code: https://stash.forgerock.org/projects/OPENICF
- ConnId:
- Polygon (ConnId+OpenICF):
Triky:
- environments: https://evolveum.com/blog/storing-extended-attributes-in-system-configuration-extended-attributes/
- multi-tenant (např. role správce, ale pouze spojená s pracovištěm): https://evolveum.com/blog/working-multi-tenant-roles/
Instalace
Příprava
Deployment WAR
git clone ssh://root@agenor.zcu.cz:/var/lib/git/midpoint-overlay.git # kontroly... less README.md vim pom.xml mvn package # nakopírovat target/midpoint.war na server ~/root/midpoint.war
Connectory
git clone https://github.com/Tirasa/ConnIdDBBundle && cd ConnIdDBBundle mvn install cd .. git clone https://github.com/CESNET/kerberos-connector && cd kerberos-connector mvn install cd .. # nakopírovat jary na server... scp -p ConnIdDBBundle/*/target/*.jar kerberos-connector/target/*.jar root@...
Řádkový klient
TODO: jsou tam natvrdo cesty, tj. buildovat na serveru nebo lokálně se stejnými cestami
Potřeba postavit midPoint, pak k nalezení v ./samples/model-client-sample/target.
Je potřeba vlastní spouštěč (např. /usr/local/bin/runscript):
#!/bin/sh DIR='/opt/midpoint-model-client-3.5.1' java -cp `ls -1 ${DIR}/*.xml ${DIR}/*.jar ${DIR}/lib/*.jar | tr '\n' :` com.evolveum.midpoint.testing.model.client.sample.RunScript "$@"
Použití: https://wiki.evolveum.com/display/midPoint/runscript+command+line+tool
Na serveru
# version of midPoint v='3.5.1' e='DEVEL' apt-get install -y git less mc screen vim man net-tools # graphviz - for GUI features # (xlmstaret - scripts) # tomcat8 additional packages - to prevent warnings # libapache2-mod-jk - for apache/tomcat integration apt-get install -y apache2 bzip2 graphviz libmysql-java openjdk-8-jdk tomcat8 libservlet3.1-java libcommons-dbcp-java libcommons-pool-java wget libapache2-mod-jk #xmlstarlet git clone ssh://root@agenor.zcu.cz:/var/lib/git/server-configuration.git # tomcat8 cat << EOF >> /etc/default/tomcat8 JAVA_OPTS="\${JAVA_OPTS} -Xms256m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256m -Dmidpoint.home=/var/opt/midpoint/ -Djavax.net.ssl.trustStore=/var/opt/midpoint/keystore.jceks -Djavax.net.ssl.trustStoreType=jceks -Doracle.net.tns_admin=/usr/lib/oracle/12.1/client64/network/admin" TZ=CET LANG="en_US.UTF-8" EOF vimdiff server-configuration/${e}/etc/default/tomcat8 /etc/default/tomcat8 mkdir /var/opt/midpoint chown tomcat8:tomcat8 /var/opt/midpoint service tomcat8 stop # mc (cosmetics) mkdir -p ~/.config/mc/ || : cat <<EOF >> ~/.config/mc/hotlist ENTRY "/var/opt/midpoint" URL "/var/opt/midpoint" ENTRY "/var/lib/tomcat8/webapps/" URL "/var/lib/tomcat8/webapps/" EOF # repo-ninja wget -nv https://evolveum.com/downloads/midpoint/${v}/midpoint-${v}-dist.tar.bz2 -P ~/ tar xjf ~/midpoint-${v}-dist.tar.bz2 sed -e "s,^\(BASEDIR\).*,\1=\"/opt/midpoint-${v}\"," /opt/midpoint-${v}/bin/repo-ninja > /usr/local/bin/repo-ninja chmod +x /usr/local/bin/repo-ninja # initial launch without anything cp -vp server-configuration/${e}/etc/apache2/sites-available/midpoint.conf /etc/apache2/sites-available/ a2enmod rewrite a2enmod ssl a2enmod webauth a2enmod webauthldap a2dissite 000-default a2ensite midpoint service apache2 restart # midpoint initial deployment install -vp -o tomcat8 -g tomcat8 ~/midpoint.war /var/lib/tomcat8/webapps/ ln -s /usr/share/java/mysql-connector-java.jar /var/lib/tomcat8/lib/ ln -s /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/ service tomcat8 start while ! test -f /var/opt/midpoint/config.xml; do sleep 0.5; done chmod 0640 /var/opt/midpoint/config.xml service tomcat8 stop cp -v ~/net.tirasa.connid*.jar ~/kerberos*.jar /var/opt/midpoint/icf-connectors/ #wget -nv -P /var/opt/midpoint/icf-connectors/ http://nexus.evolveum.com/nexus/content/repositories/openicf-releases/org/forgerock/openicf/connectors/scriptedsql-connector/1.1.2.0.em3/scriptedsql-connector-1.1.2.0.em3.jar
Oracle
1) vyžaduje Oracle clienta
dpkg -i /afs/zcu.cz/project/departments/civ/oracle-install/instant_client/12.1.0.2/linux64/deb/oracle*.deb
2) JDBC ovladač pro tomcat
ln -s /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/
3) do /etc/default/tomcat8:
- přidat k JAVA_OPTS (kvuli fungování tnsnames): -Doracle.net.tns_admin=/usr/lib/oracle/12.1/client64/network/admin'
- přidat: TZ=CET (jinak hláška o časových zónách z Oraclu, a vůbec je dobré mít kvuli lokálnímu času ;-))
Switch repository
PostgreSQL
pass=`dd if=/dev/random bs=9 count=1 2>/dev/null | base64` export PATH=$PATH:/usr/lib/postgresql/9.4/bin useradd -s /bin/bash midpoint sudo -u postgres psql -U postgres postgres -c "CREATE USER midpoint password '${pass}'" sudo -u postgres createdb --owner=midpoint midpoint sudo -u midpoint psql midpoint < midpoint-${v}/config/sql/_all/postgresql-3.4.1-all.sql # also for repo-ninja apt-get install -y postgresql libpostgresql-jdbc-java ln -s /usr/share/java/postgresql.jar midpoint-${v}/lib/ service tomcat8 stop
Manually edit /var/opt/midpoint/config.xml (replace ${pass}):
<repository> <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass> <embedded>false</embedded> <driverClassName>org.postgresql.Driver</driverClassName> <jdbcUsername>midpoint</jdbcUsername> <jdbcPassword>${pass}</jdbcPassword> <jdbcUrl>jdbc:postgresql://localhost/midpoint</jdbcUrl> <hibernateDialect>com.evolveum.midpoint.repo.sql.util.MidPointPostgreSQLDialect</hibernateDialect> <hibernateHbm2ddl>validate</hibernateHbm2ddl> </repository>
MySQL
pass=`dd if=/dev/random bs=9 count=1 2>/dev/null | base64` # also for repo-ninja apt-get install -y mariadb-server libmysql-java ln -s /usr/share/java/mysql-connector-java.jar midpoint-${v}/lib/ cat > /etc/mysql/conf.d/midpoint.cnf <<EOF [global] max_allowed_packet = 256M # tuning #query_cache_type=0 #innodb_buffer_pool_size=1G #innodb_buffer_pool_instances=1 #innodb_log_file_size=400M EOF mysql -e "CREATE DATABASE midpoint CHARACTER SET utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin DEFAULT COLLATE utf8_bin" mysql -e "GRANT ALL ON midpoint.* TO 'midpoint'@'localhost' IDENTIFIED BY '${pass}'" mysql -u midpoint -p${pass} midpoint < midpoint-${v}/config/sql/_all/mysql-3.4.1-all.sql service mysql restart service tomcat8 stop
Manually edit /var/opt/midpoint/config.xml (replace ${pass}):
<repository> <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass> <embedded>false</embedded> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <jdbcUsername>midpoint</jdbcUsername> <jdbcPassword>${pass}</jdbcPassword> <jdbcUrl>jdbc:mysql://localhost/midpoint?characterEncoding=utf8</jdbcUrl> <hibernateDialect>com.evolveum.midpoint.repo.sql.util.MidPointMySQLDialect</hibernateDialect> <hibernateHbm2ddl>validate</hibernateHbm2ddl> </repository>
Oracle
Create (na ZČU máme jinak, viz #Oracle_3):
CREATE USER midpoint IDENTIFIED BY apassword; GRANT connect,resource TO midpoint;
Apply: midpoint-3.4.1/config/sql/_all/oracle-3.4.1-all.sql
Edit: /var/opt/midpoint/config.xml (replace for real values):
<repository> <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass> <database>oracle</database> <jdbcUsername>midpoint</jdbcUsername> <jdbcPassword>${pass}</jdbcPassword> <jdbcUrl>jdbc:oracle:thin:@localhost:1521/xe</jdbcUrl> </repository>
Common
Finaly:
service tomcat8 stop killall java rm -fv /var/opt/midpoint/midpoint*.db service tomcat8 start
Stronger key
su -s /bin/bash -c "keytool -genseckey -alias strong -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -storepass changeit -keyalg AES -keysize 256 -keypass midpoint" tomcat8
Manualy edit /var/opt/midpoint/config.xml:
<keystore> <keyStorePath>${midpoint.home}/keystore.jceks</keyStorePath> <keyStorePassword>changeit</keyStorePassword> <encryptionKeyAlias>strong</encryptionKeyAlias> <xmlCipher>http://www.w3.org/2001/04/xmlenc#aes256-cbc</xmlCipher> </keystore>
Admin password
Change admin password.
- initial user: administrator
- initial password: 5ecr3t
CA
Potřeba přidat CA certifikáty potřebné pro SSL spojení se všemi koncovými systémy do interního truststore midPointu. Např. (pro každý CA certifikát v řetězu):
keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -alias ca1 -file /tmp/ca1.pem keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -alias ca2 -file /tmp/ca2.pem
(koukání do trustanchor je přepnuté na vlastní soubor, viz /etc/default/tomcat* - IMHO to pak nepoužívá CA ze systému)
WebAuth
- Obecné info o SSO (příklady s CAS): https://wiki.evolveum.com/display/midPoint/MidPoint+and+SSO+HOWTO
- Majlen vyrobil třídu na chroustání proměnných prostředí: https://github.com/spring-projects/spring-security/pull/3978
- název třídy filtru změnit z EnvironmentVariableAuthenticationFilter na RequestAttributeAuthenticationFilter podle změn v pull-requestu
Kterak nakonfigurovat:
- deployment
Pro deployment použít war vygenerovaný z repozitáře midpoint-overlay.git - obsahuje zkompilovanou třídu filtru a konfiguraci nastavení přihlašování. - nakonfiguravat apache
- smazat původní konfiguraci pro midPoint bez webauthu
- základ nakonfiguruje sám cfengine
- běžná konfigurace pro webauth, např. něco jako:
... JkMount /* tomcat8_worker JkEnvVar WEBAUTH_USER "<UNSET>" ... <Location /> AuthType WebAuth Require privgroup lps ... </Location>
Také:
- povolit AJP13 v tomcatu
Také:
apt-get install -y libapache2-mod-jk adduser tomcat8 ssl-cert a2enmod headers a2enmod rewrite a2enmod ssl a2enmod webauth a2enmod webauthldap a2ensite midpoint # apache tuning a2dismod php5 # apache tuning a2dismod mpm_prefork
# apache tuning a2enmod mpm_event service apache2 restart service tomcat8 restart
- vyrobit uživatele se správnými access rolemi (End User, Super User, Approver, ...)
- vidlička mimo webauth - funguje to pouze pro API (např. Eclipse plugin)
- /etc/apache2/site-available/01midpoint.conf: mít sekci <VirtualHost localhost:8443>
- /etc/tomcat8/server.xml: žádné SSL a řádka:
<Connector port="8009" protocol="AJP/1.3" redirectPort="443" />
- na eclipse plugin pak používat tunel ssh ... -L 8443:localhost:8443
Výsledek konfigurace:
- na stránky midpointu se lze dostat pouze přes webauth s nakonfigurovanými omezeními
- pokud neexistuje přihlášený uživatel v midpointu, otevře se přihlašovací formulář midpointu
Drobnosti
- graphviz: na vizualuzace v GUI
- xmlstarlet: používá skript na import XML
- elinks
- cmake >= 2.8.12, libkrb5-dev >= 0.15; nebo balík z kerberos-connector: Kerberos resource
Monitoring
- v Nagiosu command check_midpoint.pl (MIDPOINT) - sonda v perlu, co nacucne několik XML a podívá se dovnitř
- jeden parametr s properties souborem (viz Edit static config files -> static_cfg)
Upgrade
Postupovat podle release notes a podle obecných pravidel na https://wiki.evolveum.com/display/midPoint/Upgrade+HOWTO .
Upgrade databáze
MySQL např.:
cd /opt/newMidpoint/midpoint-3.4/config/sql/_all mysql -u root -p midpoint < mysql-upgrade-3.3-3.4.sql
Oracle:
1. pod midpoint_repo_admin:
-- 1a) pustit upgrade skript z: -- https://github.com/Evolveum/midpoint/blob/master/config/sql/_all/ -- 1b) granty (pro každou novou tabulku) GRANT SELECT, INSERT, UPDATE, DELETE ON MIDPOINT_REPO_ADMIN.##### to MIDPOINT_REPO_WRITE_ROLE;
2. pod midpoint_repo:
-- 2a) synonyma (pro každou novou tabulku) CREATE OR REPLACE SYNONYM ##### FOR MIDPOINT_REPO_ADMIN.#####; -- 2b) rušené tabulky DROP SYNONYM #####;
Detaily viz #Oracle
Deployment war
...chtělo to i promazat starý adresář ve /var/lib/tomcat8/webapps/midpoint
Upgrade connectorů
Viz také: https://wiki.evolveum.com/display/midPoint/Connector+Upgrade
- překlikat resourcy na novější connectory
- smazat <schema>...</schema> a znovu schéma nacucnout
- odstranit staré reference z midPointu: Configuration - Repository Objects - Connector
- radši i restart midPointu (natáhne si případně omylem smazané objekty)
repo-ninja
- úprava cesty v /usr/local/bin/repo-ninja
- ln -s /usr/share/java/mysql-connector-java.jar /opt/midpoint.../lib
- vyzkoušet: repo-ninja --validate
Oracle
Extra zabezpečené nastavení Oracle repozitáře: dva uživatelé midpoint_repo a midpoint_repo_admin.
midpoint_repo_admin
Obsahuje vlastní tabulky - pod ním pouštět SQL script se schematem pro midPoint.
Pak nastavit dodatečná práva.
Pro každou tabulku (nahradit ##### za název tabulky):
GRANT SELECT, INSERT, UPDATE, DELETE ON MIDPOINT_REPO_ADMIN.##### to MIDPOINT_REPO_WRITE_ROLE;
midpoint_repo
Obsahuje synonyma do midpoint_repo_admin. Navíc potřebuje práva pro temporary tabulky vyráběné midPointem:
GRANT CREATE TABLE TO midpoint_repo; REVOKE UNLIMITED TABLESPACE FROM midpoint_repo;
Pro každou tabulku a sekvenci vyrábět synonyma (nahradit ##### za název tabulky):
CREATE OR REPLACE SYNONYM ##### FOR MIDPOINT_REPO_ADMIN.#####;
Pro každou zrušenou tabulku (např. při upgradu):
DROP SYNONYM #####;
Docker
Image: https://hub.docker.com/r/valtri/docker-midpoint/
Pomocné skripty: /afs/zcu.cz/projekt/software/git/idm/docker.git
Prakticky se pouští nějak takhle (data vytažená mimo container do adresáře midpoint, pomocný adresář docker pro administraci a vystavení Oracle klienta do containeru):
docker pull valtri/docker-midpoint
NAME=midpoint docker run -itd --restart=on-failure:0 \ --name $NAME \ -v `pwd`/midpoint:/var/opt/midpoint \ -v `pwd`/docker:/docker \ -v $ORACLE_HOME:$ORACLE_HOME:ro \ valtri/docker-midpoint
Dobré mít vyrobenou vlastní síť a používat statické adresy (tj. přidat parametry --network XXXXX --ip 172.18.0.XXX).
Více viz LPS:IdM/midPoint/Personální portál#Docker
Tipy
Mapování atributů
Matching rule
V mapování nezapomínat na matching rule, např.:
<matchingRule xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3">mr:stringIgnoreCase</matchingRule>
Jinak to začne duplikovat atributy (nové hodnoty se přidávají místo nahrazování).
Multiplicity
1) Max
Pokud je na koncovém systému víc hodnot jednoho atributu a midPoint by to měl napravovat (nahradit jednou), pak nastavit omezení v mapování:
<limitations> <maxOccurs>1</maxOccurs> </limitations>
Což se vlastně hodí vždy. Není třeba, pokud je omezení již na úrovni schématu z resource adaptéru.
2) Min
Byly potíže s GUI, pokud schéma z resource adaptéru vyžadovalo minimální počet výskytu 1. Lze přerazit v mapování:
<limitations> <minOccurs>0</minOccurs> </limitations>
Detaily
inbound/outbound mappings:
- authoritative (autoritativní): odebrat hodnotu při odstranění resourcu/role
- exclusive (exkluzivní): vrátit chybu, pokud přijde hodnota i z jiného zdroje
- strength (váha):
- weak (slabý): jen default (nepřepisovat)
- normal (normální): přepisovat
- pozor, pokud je v mapování uveden jakýkoliv <source></source>, nová hodnota se posílá pouze při změně daného atributu!
- dokumentace IMHO lže o NULL, při výskytu NULL má danou hodnotu také přepsat, resp. smazat (TODO: ověřit/reportovat)
- strong (silný): přepisovat, změnu pošle dále do provisioningu vždy
- source (zdroj):
- seznam atributů k dispozici pro výpočet nové hodnoty
- vyžadováno pro <expression><script><code>...</code></script></expression>, bez výrazu pouze s target není potřeba
- midPoint to nějak používá k detekcí změn a práci s multihodnotami
- příklad:
- xml: <c:path>$account/attributes/ri:MOBIL</c:path>
- GUI: $account/attributes/MISTNOST
- nepovinný tag <name>: normálně je daný atribut k dispozici ve výrazu pod svým jménem, tagem name lze změnit
- target (cíl): kam hodnotu uložit, příklad:
- xml: <c:path>$user/honorificSuffix</c:path>
- GUI: $user/honorificSuffix
- condition (podmínka)
- tolerant: true znamená nemazat ostatní hodnoty, pokud jde o multihodnotu
Synchronizace
Opatrně při modifikaci účtů při rekoncilaci (="atributová rekoncilace"), může jít o náročnější operaci.
TODO: ověřit. Náročnost se IMHO týkala údržby velké skupiny v LDAPu, což SunIdM zvládá, resp. dělá v rámci ActiveSync najednou a odděleně od účtů.
Modifikaci je možno přeskočit, ale přesto nechat dělat pro live synchronizaci:
<reaction> <name>Linked reaction</name> <situation>linked</situation> <channel>http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#liveSync</channel> <action> <name>Modify Action</name> <handlerUri>http://midpoint.evolveum.com/xml/ns/public/model/action-3#modifyUser</handlerUri> </action> </reaction>
Nebo nejlepší způsob - zapnout synchronizaci (modifikace se provede automaticky a pouze pokud je potřeba):
<reaction> <name>linked reaction</name> <situation>linked</situation> <synchronize>true</synchronize> </reaction>
Profiling
Konfigurace - Profiling
Koukání do logu jen na tasky >= 1s:
tail -f /var/log/tomcat8/idm-profile.log | egrep '[0-9]{3}\.[0-9]{3} ms$'
Filtry
Jak použít:
- GUI: <searchFilter>...</searchFilter>
- eclipse plugin query: <query><filter>...</filter></query>
- bulk action: <s:searchFilter>...</s:searchFilter>, přidat namespacy - q:org, q:path, q:orgRef
- REST API query: <q:query><q:filter>...</q:filter></q:query>
Dokumentace:
Source:
Seznam operací:
- q:equal(q:path, q:value|q:oid|c:expression|...)
- q:equal(q:path): test na neexistenci atributu
- q:greater(q:path, q:value|q:oid|c:expression|...)
- q:greaterOrEqual(q:path, q:value|q:oid|c:expression|...)
- q:less(q:path, q:value|q:oid|c:expression|...)
- q:lessOrEqual(q:path, q:value|q:oid|c:expression|...)
- q:substring(q:path, q:value|q:oid|c:expression|...[,q:anchorStart][,q:anchorEnd])
- q:ref([q:path,] q:oid)
- q:org(q:isRoot)
- q:org(q:ref[,q:maxDepth][q:scope="SUBSTREE"|"ONE_LEVEL"])
- q:inOid(q:value|..., boolean considerOwner)
- q:and(A, B)
- q:or(A, B)
- q:not(A)
- q:type(QName type, FILTER)
- q:exists(string q:path, FILTER)
Příklady operandů:
- q:path: c:intent, c:resourceRef, ...
- q:ref: <q:oid>...</q:oid>
- každá operace má nepovinný parametr q:matching (pokud má smysl/je podporovaný): norm, orig, strict, polyStringNorm
Příklady
Jméno:
<equal> <path>name</path> <value>1</value> </equal>
Podřetězec:
<substring> <path>name</path> <value>ka</value> </substring>
Někdy nutno přepnout na polystring:
<equal> <matching>polyStringNorm</matching> <path>displayName</path> <value>kps</value> </equal>
<equal> <matching>polyStringOrig</matching> <path>displayName</path> <value>ZČU</value> </equal>
Členové pracoviště:
<org> <path>parentOrgRef</path> <orgRef oid="20010718-1801-0005-0000-200000000000"/> </org>
Departmenty z Magionu:
<equal> <path>orgType</path> <value>department</value> </equal>
Objekt podle OID:
<inOid> <value>20010718-1801-0005-0000-200000000000</value> </inOid>
Konkrétní organizace k přiřazení v templatu (tady např. ZČU):
<assignmentTargetSearch> <targetType>c:OrgType</targetType> <oid>20010718-1801-0005-0000-200000000000</oid> </assignmentTargetSearch>
Nalezení organizace k přiřazení (klasický příklad):
<assignmentTargetSearch> <targetType>c:OrgType</targetType> <filter> <q:equal> <q:path>c:name</q:path> <expression> <path>$costCenter</path> </expression> </q:equal> </filter> </assignmentTargetSearch>
Bulk action
- hezká wiki: https://wiki.evolveum.com/pages/viewpage.action?pageId=13991970
- příklady: samples, integration tests
- REST interface: Bulk password generation HOWTO
TODO příklady:
- vynucený update nebo rekoncilace u seznamu identit
- přidání/odebrání role
- aktivace/deaktivace
TODO: vyzkoušet informace z mailinglistu (http://lists.evolveum.com/pipermail/midpoint/2017-May/003806.html)
Příklady
Ve formě pro Configuration -> Bulk actions.
Mazání všech uživatelů načínajících na "STAG*":
<s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3" xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3" xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"> <s:type>UserType</s:type> <s:searchFilter> <q:substring> <q:path>name</q:path> <q:value>STAG</q:value> <q:anchorStart>true</q:anchorStart> </q:substring> </s:searchFilter> <s:action> <s:type>delete</s:type> </s:action> </s:search>
Vypsání do logu všech "admin-*" uživatelů, příklad akce execute-script:
<s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3" xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3" xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"> <s:type>UserType</s:type> <s:searchFilter> <q:substring> <q:path>name</q:path> <q:value>admin-</q:value> <q:anchorStart>true</q:anchorStart> </q:substring> </s:searchFilter> <s:action> <s:type>execute-script</s:type> <s:parameter> <s:name>script</s:name> <c:value> <c:code> log.info('log: {}', input.name); </c:code> </c:value> </s:parameter> </s:action> </s:search>
Interní atributy
Oficiální dokumentace:
https://wiki.evolveum.com/display/midPoint/MidPoint+Common+Schema
Zdrojový kód (seznam interních atributů, hledat name="UserType", name="OrgType", name="RoleType" a jejich rodičovské typy):
midPoint UserType
- name (*): hlavní ID (myšleno jako jméno objektu prezentované administrátorům, podle schématu nepovinné, prakticky povinné)
- description (*): popis (pro GUI)
- familyName (*): jméno
- givenName (*): příjmení
- additionalName (0-1): prostřední jméno (nebo jiné kulturní specialitky)
- fullName (*): (mít na to vlastní pravidlo v mapping)
- honorifixPrefix (0-1): titul před
- honorifixSuffix (0-1): titul za
- title (0-1): myšlena funkce (ale pouze jedna)
- nickName (0-1): přezdívka (oficiální použití fak pro familiární přezdívku)
- prefferedLanguage (0-1): jazyk
- locale (0-1): lokalizace
- ZČU:
- extension/croId (0-1) [int]
- extension/rc (0-1)
- extension/uidNumber (0-1) [int]
midPoint OrgType
- orgType (*): typ stromu
- tenant [boolean] (0-1): top-level
- costCenter (0-1)
- locality (0-1)
- mailDomain (*): mailová doména
- displayName (*): lidský název
- identifier (*): identifikátor (číselník, apod.)
- ...
midPoint RoleType
- roleType (*): univerzální informační políčko (midPoint používá system role, ...)
- displayName (*): lidský název
- identifier (*): identifikátor
- requestable [boolean] (0-1): koncoví uživatelé mohou požádat
- ZČU:
- extension/gidNumber (0-1) [int]
Resource
- icsc:name: přejmenovatelné ID na resourcu
- icsc:uid: nepřejmenovatelné ID na resourcu (např. read-only UUID, ...), někdy totožné s icsc:name
- ri:*: atributy na koncovém resourcu
Synchronizace pracovišť
midPoint velmi dobře podporuje. Implementováno vč. hierarchie v magion.xml (JDBC resource) a department.xml (template).
Viz také orgsync story.
SSL
Self-signed certifikáty vzdálených služeb potřeba importovat do úložiště pro midPoint, např.:
keytool -import -alias hernajs -file ./hernajs.pem -keystore /var/opt/midpoint/keystore.jceks -storetype jceks
Logování
V Configuration -> Logging (v objektu SystemConfiguration, tag logging).
Scripted SQL (verze od Tirasy):
- loguje pouze od úrovně DEBUG!
- net.tirasa.connid.commons.scripted.AbstractScriptedConnector (tuhle třídu nepoužívat: net.tirasa.connid.bundles.db.scriptedsql.ScriptedSQLConnector - to je jen wrapper třída, která neloguje)
Přenesení MySQL repozitáře
Příklad: z lokální databáze midpoint na stroj eos.zcu.cz s databází midpoint_test:
- vyrobit cílovou databázi, radši včetne nahrnutí schema
- přenesení:
mysqldump -u root -p$pass1 --ignore-table=midpoint.m_audit_delta --ignore-table=midpoint.m_audit_event --ignore-table=midpoint.m_audit_item midpoint | mysql -u midpoint_test -h eos.zcu.cz -p$pass2 midpoint_test
Standardní tasky
Cleanup - promazává staré záznamy (audity, ale i dlouho nespuštěné úlohy!)
Validity scanner - kontrola nastavení od-do a spouštění potřebných enable/disable událostí
Trigger scanner - obsluha WF
Aktivace identit
- aktivace: https://wiki.evolveum.com/display/midPoint/Activation
- stav účtu z resourcu:
- v capabilities resourcu lze nastavit jméno atributu a hodnoty odpovídající aktivnímu/neaktivnímu stavu
- nebo umí resourcy nativně (stav jako takový i datumové rozsahy platnosti)
- jak na to: https://wiki.evolveum.com/display/midPoint/Resource+Schema+Handling:+Activation
Příklad přenosu stavu z resourcu do midPointu ze schemaMapping:
<activation> <administrativeStatus> <inbound> <expression> <asIs/> </expression> </inbound> </administrativeStatus> </activation>
Sosání skupin
- engine midPointu to zatím neumí tím správným způsobem krz entitlements, ale lze obejít (<focusType>c:RoleType</focusType> v ObjectSynchronization)
- funguje to a ničemu to nevadí
- viz také email thread "Sync Entitlements to Role/Org Object with CSVFileConnector"
Troubleshooting
Nejde synchronizace
Live nic nenačte
Normální chování při prvním puštění je nic nedělat (tj. čte jen změny).
==>:
- potřeba pustit import nebo rekonciliaci
- nebo: JDBC script RA lze instruovat, aby při prvním puštění syncnul vše (dát token na 0 - unixový počátek vesmíru)
Not applicable for task
Zkontrolovat svatou trojici Kind + Object Class + Intent. Všude (!):
- Resource - Schema handling
- Resource - Synchronization
- Server Task
MID-2831: jednou se možná sloučí schemaHandlin/objectType a synchronization/objectSynchronization
No sync policy
Viz výše.
Heslo administrátora
Reset hesla:
- v repozitáři najít m_object WHERE oid='00000000-0000-0000-0000-000000000002'
- ve fullObject smazat <password><value>...</value></password> a nahradit za <value><clearValue>...</clearValue></value>
- po úspěšném přihlášení pak administrátora přeuložit (interně se heslo zase zašifruje aktuálním klíčem)
Přegenerování celého účtu
- zkontrolovat/změnit default password ve WEB-INF/classes/initial-objects/050-user-administrator.xml (musí odpovídat politice)
- smazat z repozitáře objekt z m_object a m_user
- restart midPoint
Reset hesla
- v repozitáři najít m_object WHERE oid='...'
- ve fullObject smazat <password><value>...</value></password> a nahradit za <value><clearValue>...</clearValue></value>
- po úspěšném přihlášení pak objekt přeuložit (interně se heslo zase zašifruje aktuálním klíčem)
Warningy
There is no owner of account
Pozorováno ve verzi: 3.6.1
Známý interní warning, který má Evolveum už reportovaný. Na funkci MP nemá vliv.
Viz AMI #24374.
WARN (com.evolveum.midpoint.notifications.impl.AccountOperationListener): There is no owner of account c29e30e5-7496-4423-be68-4bb9779b764d (in repo nor in task).
Výjimky
java.util.ConcurrentModificationException
Pozorováno ve verzi: 3.6.1, 3.6.2-SNAPSHOT (2017-11-16 + commit 35c7b13)
Zřejmě bug v midPointu, race-condition je známa. Ale NEJEDNÁ se o bug MID-4088.
2017-11-23 11:46:19,128 [] [pool-1-thread-38] WARN (com.evolveum.midpoint.prism.PrismProperty): Adding value to property {http://midpoint.evolveum.com/xml/ns/public/common/common-3}resultStatus that already exists (overwriting), value: PPV(OperationResultStatusType:IN_PROGRESS) 2017-11-23 11:46:19,138 [] [pool-1-thread-38] ERROR (com.evolveum.midpoint.model.impl.lens.Clockwork): Couldn't record operation execution. Model context: LensContext: state=FINAL, Wave(e=2,p=3,max=0), focus, 1 projections, 2 changes, fresh=true, reqAutz=true Channel: http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#reconciliation ... java.util.ConcurrentModificationException: null at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:907) ~[na:1.8.0_151] at java.util.ArrayList$Itr.remove(ArrayList.java:871) ~[na:1.8.0_151] at com.evolveum.midpoint.prism.PrismProperty.addValue(PrismProperty.java:263) ~[prism-3.6.1.jar:na] at com.evolveum.midpoint.prism.PrismProperty.setValue(PrismProperty.java:234) ~[prism-3.6.1.jar:na] at com.evolveum.midpoint.prism.xjc.PrismForJAXBUtil.setPropertyValue(PrismForJAXBUtil.java:141) ~[prism-3.6.1.jar:na] at com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.setResultStatus(TaskType.java:390) ~[schema-3.6.1.jar:na] at com.evolveum.midpoint.task.quartzimpl.TaskQuartzImpl.getTaskPrismObject(TaskQuartzImpl.java:265) ~[task-quartz-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.lens.Clockwork.setOperationContext(Clockwork.java:914) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.lens.Clockwork.recordOperationExecution(Clockwork.java:827) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.lens.Clockwork.recordProjectionOperationExecution(Clockwork.java:801) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.lens.Clockwork.recordOperationExecution(Clockwork.java:753) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.lens.Clockwork.processFinal(Clockwork.java:735) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.lens.Clockwork.click(Clockwork.java:477) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.lens.Clockwork.run(Clockwork.java:207) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.sync.SynchronizationServiceImpl.reactToChange(SynchronizationServiceImpl.java:781) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.sync.SynchronizationServiceImpl.notifyChange(SynchronizationServiceImpl.java:311) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.provisioning.impl.ChangeNotificationDispatcherImpl.notifyChange(ChangeNotificationDispatcherImpl.java:146) [provisioning-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.sync.SynchronizeAccountResultHandler.handleObjectInternal(SynchronizeAccountResultHandler.java:204) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.sync.SynchronizeAccountResultHandler.handleObject(SynchronizeAccountResultHandler.java:126) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler.processRequest(AbstractSearchIterativeResultHandler.java:331) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler.access$200(AbstractSearchIterativeResultHandler.java:52) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.model.impl.util.AbstractSearchIterativeResultHandler$WorkerHandler.run(AbstractSearchIterativeResultHandler.java:292) [model-impl-3.6.1.jar:na] at com.evolveum.midpoint.task.quartzimpl.TaskManagerQuartzImpl$1.run(TaskManagerQuartzImpl.java:844) [task-quartz-impl-3.6.1.jar:na] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_151] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_151] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_151] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_151] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]
Úkoly
S nároky na nové IdM se bude potřeba s midPoint naučit. Příklad úkolů, které bude zřejmě potřeba umět:
Groupová aritmetika
- sčítání nám stačí, lze dělat přidáváním rolí do jiných rolí
- máme informace o členství jak "dopředné" (memberUid v LDAPu u skupin), tak "zpětné" (memberof v LDAPu u identit)
- jak na update identit po přeskupení rolí? (memberof v LDAPu): ruční update lidí v daných skupinách/rolích?
- problém s pomalými updaty:
- způsobeno přenosem velkých dat (členství)
- midpoinťáci doporučují pomocnou vrstvu na straně LDAPu
- u Sun IdM řešeno jinak: hackem přes interní atribut 'posixGroups' u LDAP adaptérů (mohlo by fungovat i s novým adaptérem u midPoint)
- možné řešení: https://wiki.evolveum.com/display/midPoint/Entitlements#Entitlements-AssociationShortcut
Korelační pravidla
- budeme potřebovat "dělat CRO": umět se vypořádat se změnami klíčů
- zkusit se napojovat podle rodných čísel a umět se vypořádat s jejich změnami:
- napojit si nějaký systém podle RČ a přenášet změny z CRO
- zkoušet dělat změny RČ
- zkoušet dělat duplicity: jaké reporty, aby šly pozat? resuscitační emaily nebo workflow?
- přejmenovávání identit
Příklad (v GUI je kód stejný - ale pouze tag q:equal včetně):
<correlation> <q:description>korelace1_1</q:description> <q:equal> <q:path xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3">c:name</q:path> <expression> <c:path xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3">declare namespace icfs='http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3'; $account/attributes/icfs:name</c:path> </expression> </q:equal> </correlation>
<correlation> <q:description>korelace_rc</q:description> <q:equal> <q:path>c:extension/rc</q:path> <expression> <c:path>declare namespace ri='http://midpoint.evolveum.com/xml/ns/public/resource/instance-3'; $account/attributes/ri:RODNE_CISLO</c:path> </expression> </q:equal> </correlation>
Košatější příklad:
Alternativní jednodušší zápis (TODO: vyzkoušet, v examplech není tak častý):
<correlation> <q:equal> <q:path>c:name</q:path> <valueExpression> <path>$shadow/attributes/icfs:name</path> </valueExpression> </q:equal> </correlation>
Poznámky:
- Pokus o nalinkování vlastníkovi již s nalinkovaným jiným účtem selže (jedná se vlastně o duplicitu klíče - korelace spolu s confirmation pravidlem musí dávat jednoznačnost)
- Hlídání duplicity jiného atributu je možné:
- vyhození vyjímky (pouze hlídání): Unique+property+value+HOWTO
- karanténí organizace (dynamický assignement): template-people-with-rc-check.xml v našem gitu
midPoint API
Určitě bude potřeba nějaké rozhraní pro uživatele (registrace kont, projekty, self-management).
- umí něco přímo midPoint? (3.4 slibuje "Custom GUI forms" na wicketech)
- jaká midPoint má API?
- (šlo by mít i nějakou propojovací tabulku, ale dokumentace midPoint slibuje víc)
Reporty
Naučit se s audity a reporty. Umět poznat, kdy se co měnilo a proč. Logování do tabulek ve formátu doporučovaném midPointem (https://wiki.evolveum.com/display/midPoint/Auditing)? Další dokumentace k auditům https://wiki.evolveum.com/display/midPoint/Audit+configuration je tam i konfigurace jak to má vypadat i když ne asi dobře popsána.
Koncové uživatelské stránky
- ?registrace kont?
- Šlo by řešit pomocí web service použitím SOAP jsem našel i docela pěkné example jak udělat danou operaci. https://wiki.evolveum.com/display/midPoint/IDM+Model+Web+Service+Interface+Examples
- kukátko na skupiny (pro alfresco)
- ?výběr primární emailové domény?
- ?projekty?
Grouper GUI
- prozkoumat možnost propojení s mailinglisty (správci mailinglistů)
- víc "typů" skupin
- jednotné GUI (=náhrada mailmana)?
- portálová aplikace (koncepčnější a pracnější) vs nativní GUI midPointu (škoda nevyužít, ale nejde čistě zandat o portálu)
Import
(náhodné poznámky)
- nejprve promazat tabulky v CRO-OUT a/nebo provézt rekonciliace CRO-OUT
- po importu zkontrolovat identity v CRO, co nejsou v midPointu (kvuli duplicitám CRO_ID!)
- TODO: historie CRO_ID...
Krátkodobé úkoly
Rozšíření pohledů MAGION
- RODNE_PRIJMENI
- STAT_IDNO_OBCA_NAME: jmenná hodnota státního občanství
- STAT_IDNO_OBCANSTVI: číselníková hodnota
Archivní CRO ID
Do midPointu nahrát i "stub" identity s informacemi:
- CRO_ID
- poslední RČ
U nás asi připravit pohled. Pak buď UNIONovat v existujícím MP resourcu CRO nebo umět jednorázový import.
Náměty na externí vývoj
Lepčí SSO
- my se můžem pochlubit pull-requestem na spring-security od Majlena a příkladem konfigurace pro WebAuth
- vývojáři slibují konfiguraci jinak než čuňácky v rozbaleném WEB-INF
Napojení na Stag
- tohle bude spíš na nás: je to o designu a jádře řešení pro ZČU
- viz #Stag
Registrace
- netušíme vnitřnosti v midPointu (mělo by to umět GUI - něco s wicked)
- alternativa je externí registrační klient přes midPoint API (přes web services)
Vývoj
Import do git repozitáře
- Před importem objektu do repozitáře nutno XML promazat.
Pro resource object lze využít skript (smaže tag schema, hesla, provozní informace, ...):
object/resources/convert.sh < RESOURCE-orig.xml > RESOURCE.xml
- Smazané heslo nahradit makrem, např.:
<icfc:configurationProperties ... ... <jdbc:password> <t:clearValue>$(magionPassword)</t:clearValue> </jdbc:password> ...
...a přidat nové makro (property) do default.properties a testing.properties.
- Smazat nebo vymyslet nové OID (třebas s univerzitním prefixem 20010718-1801-0000-XXXX-XXXXXXXXXXXX).
- U konektorů: přidat matching rules namespace: xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3"
- U konektorů: využít i "Smart References", např.:
<resource> ... <connectorRef type="ConnectorType"> <filter> <q:equal> <q:path>c:connectorType</q:path> <q:value>org.identityconnectors.ldap.LdapConnector</q:value> </q:equal> </filter> </connectorRef> ... </resource>
Repozitář: viz #ZČU
Eclipse GUI
Eclipse + midPoint plugin.
- https://wiki.evolveum.com/display/midPoint/Eclipse+plugin+installation+HOWTO
- https://wiki.evolveum.com/display/midPoint/Eclipse+plugin+HOWTO#EclipsepluginHOWTO-Server-specificproperties
Příprava repozitáře:
git clone /afs/.zcu.cz/project/software/git/idm/midpoint.git # zákaz commitu lokálních hesel git update-index --assume-unchanged default.properties # doplnění parametrů a hesel vim default.properties
Build
Continuous integration: https://emian.zcu.cz/job/midPoint/
Jenkins repositories:
- http://scientific.zcu.cz/git/?p=jenkins-ConnIdDBBundle.git;a=summary
- http://scientific.zcu.cz/git/?p=jenkins-connector-stagc.git;a=summary
- http://scientific.zcu.cz/git/?p=jenkins-connector-stags.git;a=summary
- http://scientific.zcu.cz/git/?p=jenkins-connector-stagt.git;a=summary
Aktuální stav
Kerberos resource
Existuje nativní connector pro Kerberos:
https://stash.forgerock.org/projects/OPENICF/repos/kerberos-connector/browse
Napsali jsme si nativní MIT kerneros connector:
https://github.com/CESNET/kerberos-connector
Implementace RA v Javě a používající C knihovnu (JNI), pouze MIT.
Best practices
Proměnné $user, $shadow
Stylově správné použití proměnných:
- midPoint uživatel: $user
- midPoint role, organizace: $focus
- resource cokoliv (account, entitlement): $shadow
Ivan Noris, 2016-12-09:
Personally, I usually use $user for User object, $focus for other Focal objects (Role, Org); and tend to use $shadow everywhere where I previously used $account.