LPS:IdM/midPoint
ZČU
- vývojová instance ZČU: themis3.civ.zcu.cz (testovací prostředí emulované v MySQL, bez liveSync u databází)
- vývojová instance AMI: agenor.civ.zcu.cz
testovací instance: themis.civ.zcu.cz (napojeno na stejné DB jako agenor)testovací instance (MP 3.6): themis4.civ.zcu.cz- testovací instance: eos-test.zcu.cz (napojeno na stejné DB jako agenor)
- (před)produkční instance: midpoint.zcu.cz (eos2.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í: basic midpoint
- 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
Postup
git clone https://:@ipmil.civ.zcu.cz:443/midpoint/scripts.git scripts/autodeployment.sh --wait
Tento skript automaticky:
- stáhne z Jenkins CI postavené konektory (Stag číselníky + studenti + učitelé, JIS, Kerberos, Magion RW, ...)
- stáhne z Jenkins CI postavený war soubor s midPointem a deployne
Řá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
Řádkový klient II.
Možno využít skripty na https://ipmil.civ.zcu.cz/midpoint/scripts.
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 ;-))
- přidat: NLS_LANG='CZECH_CZECH REPUBLIC.AL32UTF8' (na žádost databázistů, RT #277811)
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 a sekvenci) 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
Funguje, ale nepůjdou parametry (templaty). Raději použít midPoint Eclipse plugin.
- ú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 kromě GLOBAL TEMPORARY TABLE a pro každou sekvenci vyrobit 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>
Deleted
- pro situaci deleted nezapínat reconcile, jinak vyskakují šílené výjimky
- nastavování atributů při smazání nelze řešit na úrovni resourcu [MID-1693] ==> použít ObjectTemplate a <synchronize>true</synchronize>
Příklad Resource:
<resource ...> ... <synchronization> <objectSynchronization> ... <reaction> <name>Example resource account deleted</name> <situation>deleted</situation> <synchronize>true</synchronize> <reconcile>false</reconcile> <objectTemplateRef oid="template-example-resource-user-disable" type="c:ObjectTemplateType"> <targetName>Example-resource: User Disable Template</targetName> </objectTemplateRef> </reaction> ... </objectSynchronization> </synchronization> ... </resource>
Příklad ObjectTemplate (bacha, při jakémkoliv <source>...</source> je potřeba i strength strong - zdrojové atributy se nám vlastně smazáním na resourcu sami nemění):
<objectTemplate ... oid="template-example-resource-user-disable"> <name>Example-resource: User Disable Template</name> <description> Example Resource User Disable Template Object. </description> ... <mapping> <name>Disable status</name> <expression> <value>B1</value> </expression> <target> <c:path>$user/extension/idmStatus</c:path> </target> </mapping> ... </objectTemplate>
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|c:rightHandSidePath|q:matching|...)
- 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) - bacha, týká se prohledávání multihodnot (např. pro assigment), kdy je cílem aplikovat komplexní filter na jednu konkrétní hodnotu, "závorka"
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>
Objekty vyrobené uživatelem:
<q:ref> <q:path>metadata/creatorRef</q:path> <q:value oid="user-admin-cro"/> </q:ref>
Objekty s nalinkovaným resourcem:
<q:ref> <q:path>linkRef/@/resourceRef</q:path> <q:value oid="resource-cro"/> </q:ref>
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>
Mazání všech shadow objektů odpovídajících uživatelům ve Stagu:
- search: omezení na objectClass je povinné
- action: trik s mazáním s raw opšnou (aby to nemazalo na resourcu)
<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" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"> <s:type>ShadowType</s:type> <s:searchFilter> <q:and> <q:ref> <q:path>c:resourceRef</q:path> <q:value oid="resource-stag-students" xsi:type="c:objectReferenceType"/> </q:ref> <q:equal> <q:path>objectClass</q:path> <q:value>ri:AccountObjectClass</q:value> </q:equal> </q:and> </s:searchFilter> <s:action> <s:type>execute-script</s:type> <s:parameter> <s:name>script</s:name> <c:value> <c:code> import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.model.api.ModelExecuteOptions; log.info('deleting: {}', input.oid); midpoint.deleteObject(ShadowType.class, input.oid, ModelExecuteOptions.createRaw()) </c:code> </c:value> </s:parameter> </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"
Mazání atributů
Mazání atributů umí midPoint "od přírody" pouze v rámci mapování u resourcu (<value/> společně se strength strong a tolerant false).
Zrušit hodnotu atributu lze ručně groovy skriptem:
<mapping> <name>HR_ZAC</name> <source> <path>$user/extension/HR_ZAC</path> </source> <expression> <script> <code> import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import javax.xml.namespace.QName; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.PrismConstants; if (HR_ZAC) { //def path = UserType.F_NAME; def path = new ItemPath( new ItemPath(PrismConstants.EXTENSION_LOCAL_NAME), new QName('http://zcu.cz/xml/ns/idm', 'HR_ZAC')); def delta = DeltaBuilder.deltaFor(UserType.class, midpoint.getPrismContext()) .item(path).delete(HR_ZAC) .asObjectDelta(user.getOid()); log.info('DELETED: HR_ZAC delta: {}', delta); midpoint.modifyObject(delta, ModelExecuteOptions.createRaw()); } else { log.info('DELETED: HR_ZAC is already empty'); } </code> </script> </expression> </mapping>
Reporty
Kombinace Jasperu a midPointu.
Vizáž pomocí Jaspersoft studia:
Koncové systémy
Primární klíč:
- je tam nějaký "immutable" klíč? (např. UUID) - ideální pro __UID__
- lze i bez - uid se smí updatem "předrátovávat"
- další měnitelný klíč do __NAME__
Paralelizmus:
- zkontrolovat schopnost paralelizování (umí to? nebude vytížené?)
- pokud nelze: nastavit hodnoty 1 v connection poolu
Běžné úvahy:
- přejmenování identity
- blokace identity
- mazání identity
- discovery - potřeba koexistence s identitami "mimo systém"?
- merge - duplicitní identity a co s nimi
Diagnostika
Přidat -Dcom.sun.management.jmxremote do JAVA_OPTS (/etc/default/tomcat8).
connection pool: c3p0
Pro midPoint <= 3.7.2.
- lokálně pustit jconsole
- připojit se na org.apache.catalina
- MBeans/com.mchange.v2.c3p0/PooledDataSource/*/*/Attributes
Zajímavé atributy jsou např.:
- maxPoolSize (default 20)
- minPoolSize (default 8)
- maxStatements (default 0!)
- Oracle: zvýšen výkon rekonciliací o 30-50% + lepší chování na DB serveru
- M$ SQL: žádné zlepšení (test od AMI Praha)
- maxStatementsPerConnection (default 0) - tahle asi nic nedělá (testováno na Oracle)
Konfigurace: skrz WEB-INF/classes/c3p0-config.xml
connection pool: HikariCP
Pro midPoint >= 3.8.
TODO: ověřit
Konfigurace: -Dhikaricp.configurationFile=hikari.properties (zadaný soubor se poctivě hledá na filesystému i v jarech)
Jakákoliv property začínající dataSource. se použije jako parameter pro JDBC driver.
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]
Chyby
ORA-12899: value too large for column XXX."M_AUDIT_EVENT"."TARGETOID"
Překročena maximální povolená délka OID, kterážto je 36 znaků.
Force updaty
Atributy
Jednotlivé atributy se přepočítají krz force+reconcile na identitě.
Ale ne vždy! Propagace se provádí jen podle detekovaných změn. Pokud se jedná pouze výstupní systém (CRO-OUT, MAGION-OUT), může se hodit tam account úplně smazat.
Členství v organizacích
Pozor, tady je třeba velmi často jít přes role (PPV, STUDIUM).
Ú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í GUI přímo midPoint? 3.4 slibuje "Custom GUI forms" na wicketech
- k dispozici Web Services (vč. košatých typů)
- k dispozici REST+XML
- (šlo by mít i nějakou propojovací tabulku, ale dokumentace midPoint slibuje víc)
Registrace
Java aplikace přistupující přes Web Services midPointu.
Audit
Rádi bychom audit vybraných operací:
- vznik/zánik/změna osoby v autorizovaných agendách
- import CROID z CRO, přidělení CRO ID
- registrace konta (import loginu)
- aktivace/deaktivace identity
- důležité atributy (klíče, ...)
Dokumentace:
- auditní událost: https://wiki.evolveum.com/display/midPoint/Auditing
- konfigurace: https://wiki.evolveum.com/display/midPoint/Audit+configuration
midPoint API pro logger:
- různé události: ADD, MODIFY, DELETE, RECONCILIATION, ...
- delta pro každou změnu (a pro každý měněný resource)
- různé typy objektů (user, role)
Stav:
- PROOF-OF-CONCEPT
- repozitář midpoint-overlay, branch audit
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
TRUNCATE TABLE IDM_MRTVOLY; TRUNCATE TABLE IDM_OSOBY; TRUNCATE TABLE IDM_POZICE;
- 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.
Reporty
- zauvažovat o reportování změn RČ v Magionu [RT #274023]
- další věcy: viz "Co hlídat" v dokumentaci jednotlivých resourců
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
Infrastruktura
Repozitáře:
Continuous integration:
Testovací prostředí
Malé lokální prostředí - emulace a testovací data v lokálních databázích, vlastní Stag WS, instalační postupy, ...
https://ipmil.civ.zcu.cz/midpoint/test-environment
Testsuite
Automatizované testy.
https://gitlab.meta.zcu.cz/midpoint/testsuite
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
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.
Import do git repozitáře
- Před importem objektu do repozitáře dobré XML promazat. U konektorů generované schema a native cap.
- U konektorů: parametry resourcu přesunout do properties
- U konektorů: lze 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>
Tolerance atributu - tag tolerant
Default je true (tedy non-intrusive). Ale u single-valued hodnot doporučeno použít vždy <tolerant>false</tolerant>, protože tolerant true by rušenou hodnotu nesmazala.
Aktuální stav
Resourcy
Atributy evidovány tady:
https://docs.google.com/spreadsheets/d/1BDuMNR9ztIugXJ4-Spqzo6hLhHBTPg1hMhk3ZFMgwA8
Kerberos
Existuje nativní connector pro Kerberos:
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
TODO: používat OP_ALLOW_PARTIAL_ATTRIBUTE_VALUES podle http://connid.tirasa.net/apidocs/1.4/org/identityconnectors/framework/common/objects/OperationOptions.html#OP_ALLOW_PARTIAL_ATTRIBUTE_VALUES
Magion
Stag číselníky
Pracoviště a číselníky.
LPS:IdM/midPoint/Stag#Stag číselníky
Co hlídat:
- stub pracoviště
- pracoviště bez rodiče
Stag učitelé
LPS:IdM/midPoint/Stag#Stag učitelé
- UCIT_IDNO - stejný identifikátor pro externisty i zaměstnance
- STAT_IDNO_OBCANSTVI - CRO čerpá z V_PE_ZCU_ZAM.PRISLUSNOST, "???" nahrazovat za "CZ"; ale nahrazovat podle Stag číselníku :-(
Stag studenti
LPS:IdM/midPoint/Stag#Stag studenti
- studia: role vázaná na osobu
- předměty: role vázaná na roli studia
Co hlídat:
- STAG_STAV_STUDENTA: N=bez studijních rolí, S=má studijní role
Grouper
- skupiny: mng stem z grouperu (vyjma mng:sprava) + členství
- administrace: mng:sprava - bez členství (jen na experimenty)
CRO-OUT
Sun IdM
Role
Typy rolí:
- login-role
- auth-role - role pro autorizace (monitoring)
- pm - pracovní místo z Magionu ("funkce na osobě/úvazku")
- system (Approver, End User, Reviewer, Superuser)
- (null) (Delegator)
Rekonciliace
Aktuální časy viz object/tasks/*Recon.xml z repozitáře xml-objects.
čas | task |
---|---|
0 0 1 * * ? | HR: Org.Str. Recon |
0 0 2 * * ? | HR: PM-Recon |
0 0 3 * * ? | STAG: Pracoviste-Recon |
0 0 3 * * ? | CRO-OUT: User-Recon |
0 0 4 * * ? | CRO-OUT: PPV-Recon |
0 0 4 * * ? | HR: PPV-Recon |
0 20 4 * * ? | CRO-OUT: Studium-Recon |
0 40 4 * * ? | CRO-OUT: Doktorand-Recon |
0 40 4 * * * ? | HR: User-Recon |
0 0 5 * * ? | STAG: Studiums-Recon |
0 0 6 * * ? | CRO: User-Recon |
0 0 6 * * ? | SunIdm: Users-Recon |
0 0 6 * * ? | STAG: Students-Recon |
0 0 7 * * ? | STAG: Predmety-Recon |
0 0 8 ? * SAT | MAGION-OUT: Person-Recon |
0 15 8 * * ? | STAG: Ucitel-Recon |
0 30 8 ? * SAT | MAGION-OUT: User-Recon |
0 0 22 * * ? | HR: Global Staff Recon |
0 5 22 * * ? | HR: Global DPP-DPČ Recon |
0 10 22 * * ? | STAG: Global Doktorand Recon |
0 15 22 * * ? | STAG: Global Subject Recon |
0 20 22 * * ? | HR: Global Manager Dpt Recon |
0 20 22 * * ? | STAG: Global Student Recon |
0 25 22 * * ? | HR: Global Secretariat Recon |
0 25 22 * * ? | STAG: Global Typ Studia Recon |
0 30 22 * * ? | HR: Global Secretary Dpt Recon |
0 30 22 * * ? | STAG: Global Forma Studia Recon |
Upstream
Základní věci:
- obecná chyba na resourcu ==> rekonciliace se kousne
- connection broken během synchronizace ==> identita je poškozená a vyžaduje ruční zásah
- listování uživatelů: nepoužitelně trvá, error 500
Bugs:
- https://jira.evolveum.com/browse/MID-4694 Reconciliation - multiple "Oid must not null or empty" after finish
- https://jira.evolveum.com/browse/MID-4664 Reconciliation sometimes generates NPE
- https://jira.evolveum.com/browse/MID-4515 Cannot create users with the same normalized names
- https://jira.evolveum.com/browse/MID-4502 Random password generator sometimes generates passwords that do not meet policies
- https://jira.evolveum.com/browse/MID-4088 ConcurrentModificationException when displaying a task
- https://jira.evolveum.com/browse/MID-3950 Investigate the HHH000010 hiernate messages
Features:
- https://jira.evolveum.com/browse/MID-3934 Synchronization with Kind/Intent settings and multiple intents
- https://jira.evolveum.com/browse/MID-1693 Add an option to update (midPoint user) attribute value when account is deleted
TODO
(k implementaci nebo otestování)
- RT #188152
Uživatelské jméno se smazalo, i když pracovní poměr měl další den pokračování. Předávám ještě požadavek dál s návrhem, zda v podobných případech, kdy orion konto nekončí, aby uživatelské jméno ve Stagu zůstalo.
- pohledy do CRO: vylepšit filtrování duplicit mezi aktivními a neaktivními identitami
- ověřit možnost registrace 20 dní před aktivací v Magionu (aktuálně člověk nateče, ale jako naktivní)
Use-casy
... konkrétní současné problémy z produkce.
- problém: při změně RČ v Magionu se změní "globální" RČ v CRO a tím pádem zmizí propojení v tabulce učitelů ve Stagu
- midPoint: link je přes jiný identifikátor s učiteli (zatím croId, ale asi bychom chtěli ucitidni), RČ jen jako korelace
[[1]] ISKaM
- přenášet i národnost