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)
- 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.9' 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 #hikari (much worse then c3p0 anyway) cat > /etc/hikari.properties <<EOF dataSource.oracle.jdbc.implicitStatementCacheSize=800 dataSource.oracle.jdbc.explicitCachingEnabled=true dataSource.oracle.jdbc.implicitCachingEnabled=true dataSource.oracle.net.keepAlive=true registerMbeans=true maxLifetime=1440000 EOF # tomcat8 cat << EOF >> /etc/default/tomcat8 JAVA_OPTS="\${JAVA_OPTS} -Xms1024m -Xmx2048m -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 -Djava.library.path=/opt/kerberos -Dcom.sun.management.jmxremote -Dorg.apache.cxf.stax.maxChildElements=200000 -Dhikaricp.configurationFile=/etc/hikari.properties -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=ssoenv" 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 # JDBC ln -sfv /usr/share/java/mysql-connector-java.jar /var/lib/tomcat8/lib/ ln -sfv /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/ mkdir -p /usr/local/share/java 2>/dev/null || : (cd /usr/local/share/java; wget -N -nv http://central.maven.org/maven2/com/microsoft/sqlserver/mssql-jdbc/7.2.0.jre8/mssql-jdbc-7.2.0.jre8.jar) ln -sfv /usr/local/share/java/mssql-jdbc-7.2.0.jre8.jar /var/lib/tomcat8/lib/ # midpoint initial deployment install -vp -o tomcat8 -g tomcat8 ~/midpoint.war /var/lib/tomcat8/webapps/ 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 # deployment of the connectors #cp -v ... /var/opt/midpoint/icf-connectors/
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
atribut:
- exclusiveStrong (pro multihodnoty): do výsledku míchat pouze strong (true) nebo i normal (false)
- tolerant (pro výstup?): zda mohou přicházet hodnoty i z koncového systému
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
- pozor v object template: u single-hodnotových atributů dobré použít ve skriptech také relativityMode=absolute, jinak je midPoint rozhozen z neznámých hodnot (hodnot, co neodpovýdají starému i novému stavu atributů)
- 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.
Konfigurace: -Dhikaricp.configurationFile=hikari.properties (zadaný soubor se pak poctivě hledá na filesystému i v jarech)
Jakákoliv property začínající dataSource. se použije jako parameter pro JDBC driver.
hikari.properties (pomohlo jen zčásti):
dataSource.oracle.jdbc.implicitStatementCacheSize=500
Map attribute only when account is created
AFAIK you can use condition for the mapping, and there is internal variable "operation" which will have value "add" for adding the account (i.e. create).
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ů.
Prism context is not set in PrismTestUtil. Maybe a missing call to resetPrismContext(..) in test initialization?
Jde o nabořené shadow, stává se to při některých druzích výpadků resourců ve verzi midPoint 3.8. Chyba je pak při jakékoliv práci se shadows (např. get), tj. i při updatu identity.
Oprava: jedině smazáním shadow přes repo ninju, kde se nedělají kontroly (nahradit $OID za skutečné oid):
ninja.sh delete --oid $OID
Hromadná oprava (na čerstvých dumpech získaných přes snapshot.sh):
# kontrola stáří dumpu ls -la /var/opt/midpoint/audit/shadows.xml # jen vylistování: # fix-shadow-object-change.py # oprava ./fix-shadow-object-change.sh
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 o 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).
Sequence
Objekt typu sequence generuje ID (např. CroId Sequence pro CRO ID).
Položka count musí být větší než největší přidělené ID! A žádná unusedValues nesmí být přidělená! Pokud to tak není, bude docházet ke konfliktům a k opakovaným pokusům o použití té samé hodnoty (reclamation feature).
Mezery v řadě je možno řešit nastavením unusedValues.
Další featury: maxCounter, allowRewind - po přesažení maxima začne od nuly
Autorizace
Ladění:
Každé autorizaci dát <name></name> a pak zapnout logování:
com.evolveum.midpoint.security: TRACE
Ú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.
Connector connection pool
Viz connector-framework: ObjectPoolConfiguration.java
Parametry
maxObjects = 10:
Max objects (idle+active).
maxIdle = 10:
Max idle objects.
maxWait = 150 * 1000:
Max time to wait if the pool is waiting for a free object to become available before failing. Zero means don't wait.
minEvictableIdleTimeMillis = 120 * 1000:
Minimum time to wait before evicting an idle object. Zero means don't wait.
minIdle = 1:
Minimum number of idle objects.
Poznámky
Musí platit maxObjects >= maxIdle.
V konektoru je dobré mít spolehlivý test checkAlive().
Pokud checkAlive() není a víme, že je potřeba omezit čas idle spojení (různé timeouty, apod.), je možno nastavit minIdle=0 (tj. žádné trvale otevřené spojení) a minEvictableIdleTimeMillis na čas menší než timeout.
Odstranění resourcu
Při odstraňování resourcu je dobré nejprve odstranit většinu závislostí:
- zkontrolovat customizace (XML objekty)
- modifikovat a pustit tasky Purge Org linkRefs, Purge User linkRefs, ...
- v Repository objects odstranit odpovídající shadow objekty
Odkazy na resource v midPointu zůstávají i jinde (audity - odrotuje se časem pryč, historie operací u objektů, ...).
Release konektoru
Best-practice - hodí se znát verze aktuálně používaných konektorů nebo při vystavování konektorů všem.
Releasujeme u midpoint-utils a několika konektorů, kde využíváme maven-release-plugin.
Postup:
1) housekeeing (rok copyrightu v licenci, bundle.version, verze závislostí v .gitlab-ci.xml, apod.)
2) kontrola + testy lokálně
3) vlastní release - zeptá se na verzi (major, minor, patch)
mvn release:clean release:prepare release:perform git log -p git push origin HEAD --tags
4) gitLab CI
"keep" na buildu.
5) midPoint
Při změně bundle.version a po ./autodeployment.sh je potřeba promazat původní verzi connector objektu z repozitáře a znovunaimportovat resource.
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 30 5 * * ? | STAG: Studiums-Recon |
0 0 6 * * ? | SunIdm: Users-Recon |
0 30 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 |
0 15 23 ** ? | Grouper: Group-Recon |
0 20 23 ** ? | Grouper: Memberships-Recon |
Upstream
Nefunkční 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 (ne vždy)
- listování uživatelů: nepoužitelně dlouho trvá, error 500
- nelze slibovat spolehlivost v rychlosti (liveSync občas selže), viz MID-4930
Bugs:
https://jira.evolveum.com/browse/MID-4694 Reconciliation - multiple "Oid must not null or empty" after finishhttps://jira.evolveum.com/browse/MID-4664 Reconciliation sometimes generates NPE- fixed in 3.9https://jira.evolveum.com/browse/MID-4515 Cannot create users with the same normalized names- TODO: feature od 3.8: https://wiki.evolveum.com/display/midPoint/PolyString+Normalization+Configuration- 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 - fixen in 4.0
- https://jira.evolveum.com/browse/MID-3950 Investigate the HHH000010 hiernate messages
- https://jira.evolveum.com/browse/MID-4776 User list is slow - (něco se opravovalo, ale nás se asi oprava netýká)
- https://jira.evolveum.com/browse/MID-4930 Sometimes LockAcquisitionException (could not execute batch)
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
- pouštění tasků přes SOAP WS
- tagované atributy u LDAP, nebo možnost lokálního rozšiřování resource schematu
- hikari zabilo výkon - hodila by se možnost použití c3p0
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í)
- primárná pozice při úplném zmizení PPV/studium role (na změnu asi reaguje OK, ale při selhaném updatu je midPoint rozhozen)
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
Postupy
Seznam emailů zaměstnanců
Např. přes skripty:
./query-user.py --csv=extension/ext:HR_OS_CIS,emailAddress extension/ext:HR_ENABLED=true
Přejmenování konta
- Sun IdM: CRO Unlink User
- midPoint:
- remove login
- change status na "N1" (jak zcuStatus, tak SUNIDM_WFSTATUS, jinak se to pak nepřeklopí správně pří registrace konta)
- rename to CRO ID
- Sun IdM: čekat na dotečení přes activeSync CRO
- registrace konta
- ruční práce - návazné systémy používající na login
- Magion [sis]: detekuje a upozorňuje Sun IdM (někteří zaměstnanci)
- Courseware [sis]: (zaměstanci nebo doktorandi, co mají nějaký předmětm)
- vizitka [dané pracoviště]: (zaměstnanci)
- a další...
Krok 2 je nově po náhradě původního CRO za emulované z midPointu - není tak těsná iterakce Sun IdM s emulovaným CRO.
Propojení konta a osoby
TODO: trochu složitější - někdy přepojit pouze Stag/Magion, ...
Vychází z původního postupu LPS:Konta#Přiřazení existujícího uživatele k osobě v CRO, navíc je potřeba sáhnout do midPointu.
- zrušit konto v midPointu:
- clear SunIdM: Login
- change status to NB
- rename to CRO ID
- clear STAG: Studium
- unlink SunIdM
- unassign studium roles
- smazat i shadow z midPointu! (on si jinak pamatuje propojení)
- odstranění CRO
- buď: smazat CRO identitu ze Sun IdM - jen Lighthouse a dump, ne ISKaM!
- nebo: pustit Server Tasks -> Run Task -> ZCU CRO Unlink
- pustit Server Tasks -> Run Task -> ZCU CRO Link ==> zadat LOGIN a CRO_ID
- v midPointu: import loginu z resourcu SunIdm
- kontroly:
- v Sun IdM jen jedna identita plně aktivní, s CRO a rolemi
- v midPointu stav 'A1' a přítomný login
Oprava blokace
Někeré selhané updaty při blokaci nelze vyřešit pomocí Recompute - reakce jsou často na změnu.
Teoreticky lze provézt opravu pouze ručním překmitem stavových atributů "HR: Aktivní" a/nebo "Stag: stav studia". Ale při přepínání identity stavu do A1 se posílají notifikace.
Postup opravy:
- kontrola, zda má být identita blokována (není Magion, není Stag nebo stav studia N) + kontrola/vyřešení původních příčin selhání (známý bug kolem DB zámků, duplicita shadow, ...)
- rekonciliace rolí (případně lze updatovat jednotlivé role)
- PPV (z Magionu)
- STUDIUM (ze Stagu)
- ruční update identity:
- atributy:
- smazat Typ vztahu (řízení některých výpočtů)
- smazat/zkontrolovat HR: PPV, Stag: Studium (řízení rolí - pozic)
- nastavit/zkontrolovat HR: Aktivní, HR: Aktuálně aktivní na false (řízení mnoha výpočtů)
- nastavit/zkontrolovat Stag: stav studia, 'Stag: aktuální stav studia' na N (řízení mnoha výpočtů)
- smazat/zkontrolovat Stag: souhrn* (jen kosmetika, ale mátlo by to)
- smazat Kolej (pokud nejde o hosta nebo ISKaM identitu)
- assignments: zrušit přiřazení resourců (CRO OUT, JIS Osoby, Magion OUT*, Teachers, ...), rolí (ZCU People*, ZCU User*; ale nechat ZCU User), organizací (Aktivní)
- activationStatus: disable
- atributy:
Přepojení identity na jiný účet na resourcu
...tj. změna account name.
- Resources ->> List resources
- na resourcu smazat účet
- přeuložit identitu - správný účet se připojí/založí v rámci discovery
Poznámka: Nejde smazat a popřepojovat resource přímo na identitě.
Audity
Každé 4 hodiny se pouští získávání všech uživatelů, rolí a shadow, ukládá se ve formě CSV souborů.
Umístění: /var/opt/midpoint/audit/<ROK>.
Kontroly
V rámci získávání auditů se pouští i kontroly dat (interní konzistence v midPointu, porovnání s JIS resource, ...).
Výsledky: /var/opt/midpoint/audit/snapshot.log (jen interní konzisence) a /var/opt/midpoint/audit/report.log (podrobnější)