LPS:IdM/midPoint

Z HelpDesk
< LPS:IdM
Verze z 14. 6. 2018, 09:41, kterou vytvořil Valtri (diskuse | příspěvky) (→‎Oracle: - silně doporučeno použít NLS_LANG)

ZČU

Viz také #Vývoj.

Dokumentace

midPoint:

Connectors:

  1. OpenICF:
  2. ConnId:
  3. Polygon (ConnId+OpenICF):

Triky:

Instalace

Postup

git clone https://:@ipmil.civ.zcu.cz:443/midpoint/scripts.git
scripts/autodeployment.sh --wait

Tento skript automaticky:

  1. stáhne z Jenkins CI postavené konektory (Stag číselníky + studenti + učitelé, JIS, Kerberos, Magion RW, ...)
  2. 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

  • název třídy filtru změnit z EnvironmentVariableAuthenticationFilter na RequestAttributeAuthenticationFilter podle změn v pull-requestu

Kterak nakonfigurovat:

  1. 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í.
  2. 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
    
  3. vyrobit uživatele se správnými access rolemi (End User, Super User, Approver, ...)
  4. vidlička mimo webauth - funguje to pouze pro API (např. Eclipse plugin)
    1. /etc/apache2/site-available/01midpoint.conf: mít sekci <VirtualHost localhost:8443>
    2. /etc/tomcat8/server.xml: žádné SSL a řádka:
      <Connector port="8009" protocol="AJP/1.3" redirectPort="443" />
    3. 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

  • ú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

  1. pro situaci deleted nezapínat reconcile, jinak vyskakují šílené výjimky
  2. 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

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):

https://github.com/Evolveum/midpoint/blob/master/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd


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:

  1. vyrobit cílovou databázi, radši včetne nahrnutí schema
  2. 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

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).

Databázový connection pool

  1. lokálně pustit jconsole
  2. připojit se na org.apache.catalina
  3. MBeans/com.mchange.v2.c3p0/PooledDataSource/*/*/Attributes

Zajímavé atributy jsou např.:

  • maxPoolSize (default 20)
  • minPoolSize (default 8)
  • maxStatements (default 0!)
  • maxStatementsPerConnection (default 0!)

Konfigurace: skrz WEB-INF/classes/c3p0-config.xml

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:

  1. v repozitáři najít m_object WHERE oid='00000000-0000-0000-0000-000000000002'
  2. ve fullObject smazat <password><value>...</value></password> a nahradit za <value><clearValue>...</clearValue></value>
  3. 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

  1. zkontrolovat/změnit default password ve WEB-INF/classes/initial-objects/050-user-administrator.xml (musí odpovídat politice)
  2. smazat z repozitáře objekt z m_object a m_user
  3. restart midPoint

Reset hesla

  1. v repozitáři najít m_object WHERE oid='...'
  2. ve fullObject smazat <password><value>...</value></password> a nahradit za <value><clearValue>...</clearValue></value>
  3. 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ů.

Ú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:

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:

trafo story

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:

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



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: https://gitlab.meta.zcu.cz/midpoint

Continuous integration: https://emian.zcu.cz/job/midPoint/

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://gitlab.meta.zcu.cz/midpoint/test-environment

Testsuite

Automatizované testy.

https://gitlab.meta.zcu.cz/midpoint/testsuite

Eclipse GUI

Eclipse + midPoint plugin.

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

  1. Před importem objektu do repozitáře dobré XML promazat. U konektorů generované schema a native cap.
  2. U konektorů: parametry resourcu přesunout do properties
  3. 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:

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

LPS:IdM/midPoint/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

LPS:IdM/midPoint/Grouper

  • skupiny: mng stem z grouperu (vyjma mng:sprava) + členství
  • administrace: mng:sprava - bez členství (jen na experimenty)

CRO-OUT

LPS:IdM/midPoint/CRO-OUT

Sun IdM

LPS:IdM/midPoint/SunIdM

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: Students-Recon
0 0 6 * * ? CRO: User-Recon
0 0 6 * * ? SunIdm: Users-Recon
0 0 6 * * ? STAG: Studiums-Recon
0 0 7 * * ? STAG: Predmety-Recon
0 0 8 ? * SAT MAGION-OUT: Person-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

Bugs:

Features:

TODO

(k implementaci nebo otestování)

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.

[RT #274023]

  • 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