LPS:IdM/midPoint

Z HelpDesk

ZČU

Viz také #Vývoj.

Dokumentace

midPoint:

Connectors:

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

Triky:

Instalace

Příprava

Deployment WAR

git clone ssh://root@agenor.zcu.cz:/var/lib/git/midpoint-overlay.git

# kontroly...
less README.md
vim pom.xml

mvn package

# nakopírovat target/midpoint.war na server ~/root/midpoint.war

Connectory

git clone https://github.com/Tirasa/ConnIdDBBundle && cd ConnIdDBBundle
mvn install
cd ..

git clone https://github.com/CESNET/kerberos-connector && cd kerberos-connector
mvn install
cd ..

# nakopírovat jary na server...
scp -p ConnIdDBBundle/*/target/*.jar kerberos-connector/target/*.jar root@...

Řádkový klient

TODO: jsou tam natvrdo cesty, tj. buildovat na serveru nebo lokálně se stejnými cestami

Potřeba postavit midPoint, pak k nalezení v ./samples/model-client-sample/target.

Je potřeba vlastní spouštěč (např. /usr/local/bin/runscript):

#!/bin/sh

DIR='/opt/midpoint-model-client-3.5.1'
java -cp `ls -1 ${DIR}/*.xml ${DIR}/*.jar ${DIR}/lib/*.jar | tr '\n' :` com.evolveum.midpoint.testing.model.client.sample.RunScript "$@"

Použití: https://wiki.evolveum.com/display/midPoint/runscript+command+line+tool

Na serveru

# version of midPoint
v='3.5.1'
e='DEVEL'

apt-get install -y git less mc screen vim man net-tools
# graphviz - for GUI features
# (xlmstaret - scripts)
# tomcat8 additional packages - to prevent warnings
# libapache2-mod-jk - for apache/tomcat integration
apt-get install -y apache2 bzip2 graphviz libmysql-java openjdk-8-jdk tomcat8 libservlet3.1-java libcommons-dbcp-java libcommons-pool-java wget libapache2-mod-jk
#xmlstarlet

git clone ssh://root@agenor.zcu.cz:/var/lib/git/server-configuration.git

# tomcat8
cat << EOF >> /etc/default/tomcat8
JAVA_OPTS="\${JAVA_OPTS} -Xms256m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256m -Dmidpoint.home=/var/opt/midpoint/ -Djavax.net.ssl.trustStore=/var/opt/midpoint/keystore.jceks -Djavax.net.ssl.trustStoreType=jceks -Doracle.net.tns_admin=/usr/lib/oracle/12.1/client64/network/admin"
TZ=CET
LANG="en_US.UTF-8"
EOF

vimdiff server-configuration/${e}/etc/default/tomcat8 /etc/default/tomcat8

mkdir /var/opt/midpoint
chown tomcat8:tomcat8 /var/opt/midpoint
service tomcat8 stop

# mc (cosmetics)
mkdir -p ~/.config/mc/ || :
cat <<EOF >> ~/.config/mc/hotlist
ENTRY "/var/opt/midpoint" URL "/var/opt/midpoint"
ENTRY "/var/lib/tomcat8/webapps/" URL "/var/lib/tomcat8/webapps/"
EOF

# repo-ninja
wget -nv https://evolveum.com/downloads/midpoint/${v}/midpoint-${v}-dist.tar.bz2 -P ~/
tar xjf ~/midpoint-${v}-dist.tar.bz2
sed -e "s,^\(BASEDIR\).*,\1=\"/opt/midpoint-${v}\"," /opt/midpoint-${v}/bin/repo-ninja > /usr/local/bin/repo-ninja
chmod +x /usr/local/bin/repo-ninja

# initial launch without anything
cp -vp server-configuration/${e}/etc/apache2/sites-available/midpoint.conf /etc/apache2/sites-available/
a2enmod rewrite
a2enmod ssl
a2enmod webauth
a2enmod webauthldap
a2dissite 000-default
a2ensite midpoint
service apache2 restart

# midpoint initial deployment
install -vp -o tomcat8 -g tomcat8 ~/midpoint.war /var/lib/tomcat8/webapps/
ln -s /usr/share/java/mysql-connector-java.jar /var/lib/tomcat8/lib/
ln -s /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/
service tomcat8 start
while ! test -f /var/opt/midpoint/config.xml; do sleep 0.5; done
chmod 0640 /var/opt/midpoint/config.xml
service tomcat8 stop

cp -v ~/net.tirasa.connid*.jar ~/kerberos*.jar /var/opt/midpoint/icf-connectors/
#wget -nv -P /var/opt/midpoint/icf-connectors/ http://nexus.evolveum.com/nexus/content/repositories/openicf-releases/org/forgerock/openicf/connectors/scriptedsql-connector/1.1.2.0.em3/scriptedsql-connector-1.1.2.0.em3.jar

Oracle

1) vyžaduje Oracle clienta

dpkg -i /afs/zcu.cz/project/departments/civ/oracle-install/instant_client/12.1.0.2/linux64/deb/oracle*.deb

2) JDBC ovladač pro tomcat

ln -s /usr/lib/oracle/12.1/client64/lib/ojdbc7.jar /var/lib/tomcat8/lib/

3) do /etc/default/tomcat8:

  • přidat k JAVA_OPTS (kvuli fungování tnsnames): -Doracle.net.tns_admin=/usr/lib/oracle/12.1/client64/network/admin'
  • přidat: TZ=CET (jinak hláška o časových zónách z Oraclu, a vůbec je dobré mít kvuli lokálnímu času ;-))

Switch repository

PostgreSQL

pass=`dd if=/dev/random bs=9 count=1 2>/dev/null | base64`

export PATH=$PATH:/usr/lib/postgresql/9.4/bin
useradd -s /bin/bash midpoint
sudo -u postgres psql -U postgres postgres -c "CREATE USER midpoint password '${pass}'"
sudo -u postgres createdb --owner=midpoint midpoint
sudo -u midpoint psql midpoint < midpoint-${v}/config/sql/_all/postgresql-3.4.1-all.sql

# also for repo-ninja
apt-get install -y postgresql libpostgresql-jdbc-java
ln -s /usr/share/java/postgresql.jar midpoint-${v}/lib/
 
service tomcat8 stop

Manually edit /var/opt/midpoint/config.xml (replace ${pass}):

 <repository>
   <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass>
   <embedded>false</embedded>
   <driverClassName>org.postgresql.Driver</driverClassName>
   <jdbcUsername>midpoint</jdbcUsername>
   <jdbcPassword>${pass}</jdbcPassword>
   <jdbcUrl>jdbc:postgresql://localhost/midpoint</jdbcUrl>
   <hibernateDialect>com.evolveum.midpoint.repo.sql.util.MidPointPostgreSQLDialect</hibernateDialect>
   <hibernateHbm2ddl>validate</hibernateHbm2ddl>
 </repository>

MySQL

pass=`dd if=/dev/random bs=9 count=1 2>/dev/null | base64`

# also for repo-ninja
apt-get install -y mariadb-server libmysql-java
ln -s /usr/share/java/mysql-connector-java.jar midpoint-${v}/lib/

cat > /etc/mysql/conf.d/midpoint.cnf <<EOF
[global]
max_allowed_packet = 256M
# tuning
#query_cache_type=0
#innodb_buffer_pool_size=1G
#innodb_buffer_pool_instances=1
#innodb_log_file_size=400M
EOF
mysql -e "CREATE DATABASE midpoint CHARACTER SET utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin DEFAULT COLLATE utf8_bin"
mysql -e "GRANT ALL ON midpoint.* TO 'midpoint'@'localhost' IDENTIFIED BY '${pass}'"
mysql -u midpoint -p${pass} midpoint < midpoint-${v}/config/sql/_all/mysql-3.4.1-all.sql 

service mysql restart
service tomcat8 stop

Manually edit /var/opt/midpoint/config.xml (replace ${pass}):

<repository>
  <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass>
  <embedded>false</embedded>
  <driverClassName>com.mysql.jdbc.Driver</driverClassName>
  <jdbcUsername>midpoint</jdbcUsername>
  <jdbcPassword>${pass}</jdbcPassword>
  <jdbcUrl>jdbc:mysql://localhost/midpoint?characterEncoding=utf8</jdbcUrl>
  <hibernateDialect>com.evolveum.midpoint.repo.sql.util.MidPointMySQLDialect</hibernateDialect>
  <hibernateHbm2ddl>validate</hibernateHbm2ddl>
</repository>

Oracle

Create (na ZČU máme jinak, viz #Oracle_3):

CREATE USER midpoint IDENTIFIED BY apassword;
GRANT connect,resource TO midpoint;

Apply: midpoint-3.4.1/config/sql/_all/oracle-3.4.1-all.sql

Edit: /var/opt/midpoint/config.xml (replace for real values):

<repository>
  <repositoryServiceFactoryClass>com.evolveum.midpoint.repo.sql.SqlRepositoryFactory</repositoryServiceFactoryClass>
  <database>oracle</database>
  <jdbcUsername>midpoint</jdbcUsername>
  <jdbcPassword>${pass}</jdbcPassword>
  <jdbcUrl>jdbc:oracle:thin:@localhost:1521/xe</jdbcUrl>
</repository>

Common

Finaly:

service tomcat8 stop
killall java
rm -fv /var/opt/midpoint/midpoint*.db
service tomcat8 start

Stronger key

su -s /bin/bash -c "keytool -genseckey -alias strong -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -storepass changeit -keyalg AES -keysize 256 -keypass midpoint" tomcat8

Manualy edit /var/opt/midpoint/config.xml:

<keystore>
  <keyStorePath>${midpoint.home}/keystore.jceks</keyStorePath>
  <keyStorePassword>changeit</keyStorePassword>
  <encryptionKeyAlias>strong</encryptionKeyAlias>
  <xmlCipher>http://www.w3.org/2001/04/xmlenc#aes256-cbc</xmlCipher>
</keystore>

Admin password

Change admin password.

  • initial user: administrator
  • initial password: 5ecr3t

CA

Potřeba přidat CA certifikáty potřebné pro SSL spojení se všemi koncovými systémy do interního truststore midPointu. Např. (pro každý CA certifikát v řetězu):

keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -alias ca1 -file /tmp/ca1.pem
keytool -keystore /var/opt/midpoint/keystore.jceks -storetype jceks -importcert -alias ca2 -file /tmp/ca2.pem

(koukání do trustanchor je přepnuté na vlastní soubor, viz /etc/default/tomcat* - IMHO to pak nepoužívá CA ze systému)

WebAuth

  • 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)
CREATE OR REPLACE SYNONYM ##### FOR MIDPOINT_REPO_ADMIN.#####;

-- 2b) rušené tabulky
DROP SYNONYM #####;

Detaily viz #Oracle

Deployment war

...chtělo to i promazat starý adresář ve /var/lib/tomcat8/webapps/midpoint

Upgrade connectorů

Viz také: https://wiki.evolveum.com/display/midPoint/Connector+Upgrade

  • překlikat resourcy na novější connectory
  • smazat <schema>...</schema> a znovu schéma nacucnout
  • odstranit staré reference z midPointu: Configuration - Repository Objects - Connector
  • radši i restart midPointu (natáhne si případně omylem smazané objekty)

repo-ninja

  • úprava cesty v /usr/local/bin/repo-ninja
  • ln -s /usr/share/java/mysql-connector-java.jar /opt/midpoint.../lib
  • vyzkoušet: repo-ninja --validate

Oracle

Extra zabezpečené nastavení Oracle repozitáře: dva uživatelé midpoint_repo a midpoint_repo_admin.

midpoint_repo_admin

Obsahuje vlastní tabulky - pod ním pouštět SQL script se schematem pro midPoint.

Pak nastavit dodatečná práva.

Pro každou tabulku (nahradit ##### za název tabulky):

GRANT SELECT, INSERT, UPDATE, DELETE ON MIDPOINT_REPO_ADMIN.##### to MIDPOINT_REPO_WRITE_ROLE;

midpoint_repo

Obsahuje synonyma do midpoint_repo_admin. Navíc potřebuje práva pro temporary tabulky vyráběné midPointem:

GRANT CREATE TABLE TO midpoint_repo;
REVOKE UNLIMITED TABLESPACE FROM midpoint_repo;

Pro každou tabulku a sekvenci vyrábět synonyma (nahradit ##### za název tabulky):

CREATE OR REPLACE SYNONYM ##### FOR MIDPOINT_REPO_ADMIN.#####;

Pro každou zrušenou tabulku (např. při upgradu):

DROP SYNONYM #####;

Docker

Image: https://hub.docker.com/r/valtri/docker-midpoint/

Pomocné skripty: /afs/zcu.cz/projekt/software/git/idm/docker.git

Prakticky se pouští nějak takhle (data vytažená mimo container do adresáře midpoint, pomocný adresář docker pro administraci a vystavení Oracle klienta do containeru):

docker pull valtri/docker-midpoint
NAME=midpoint
docker run -itd --restart=on-failure:0 \
  --name $NAME \
   -v `pwd`/midpoint:/var/opt/midpoint \
   -v `pwd`/docker:/docker \
   -v $ORACLE_HOME:$ORACLE_HOME:ro \
   valtri/docker-midpoint

Dobré mít vyrobenou vlastní síť a používat statické adresy (tj. přidat parametry --network XXXXX --ip 172.18.0.XXX).

Více viz LPS:IdM/midPoint/Personální portál#Docker

Tipy

Mapování atributů

Matching rule

V mapování nezapomínat na matching rule, např.:

<matchingRule xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3">mr:stringIgnoreCase</matchingRule>

Jinak to začne duplikovat atributy (nové hodnoty se přidávají místo nahrazování).

Multiplicity

1) Max

Pokud je na koncovém systému víc hodnot jednoho atributu a midPoint by to měl napravovat (nahradit jednou), pak nastavit omezení v mapování:

<limitations>
 <maxOccurs>1</maxOccurs>
</limitations>

Což se vlastně hodí vždy. Není třeba, pokud je omezení již na úrovni schématu z resource adaptéru.

2) Min

Byly potíže s GUI, pokud schéma z resource adaptéru vyžadovalo minimální počet výskytu 1. Lze přerazit v mapování:

<limitations>
 <minOccurs>0</minOccurs>
</limitations>

Detaily

inbound/outbound mappings:

  • authoritative (autoritativní): odebrat hodnotu při odstranění resourcu/role
  • exclusive (exkluzivní): vrátit chybu, pokud přijde hodnota i z jiného zdroje
  • strength (váha):
    • weak (slabý): jen default (nepřepisovat)
    • normal (normální): přepisovat
      • pozor, pokud je v mapování uveden jakýkoliv <source></source>, nová hodnota se posílá pouze při změně daného atributu!
      • dokumentace IMHO lže o NULL, při výskytu NULL má danou hodnotu také přepsat, resp. smazat (TODO: ověřit/reportovat)
    • strong (silný): přepisovat, změnu pošle dále do provisioningu vždy
  • source (zdroj):
    • seznam atributů k dispozici pro výpočet nové hodnoty
    • vyžadováno pro <expression><script><code>...</code></script></expression>, bez výrazu pouze s target není potřeba
    • midPoint to nějak používá k detekcí změn a práci s multihodnotami
    • příklad:
      • xml: <c:path>$account/attributes/ri:MOBIL</c:path>
      • GUI: $account/attributes/MISTNOST
    • nepovinný tag <name>: normálně je daný atribut k dispozici ve výrazu pod svým jménem, tagem name lze změnit
  • target (cíl): kam hodnotu uložit, příklad:
    • xml: <c:path>$user/honorificSuffix</c:path>
    • GUI: $user/honorificSuffix
  • condition (podmínka)
  • tolerant: true znamená nemazat ostatní hodnoty, pokud jde o multihodnotu

Synchronizace

Opatrně při modifikaci účtů při rekoncilaci (="atributová rekoncilace"), může jít o náročnější operaci.

TODO: ověřit. Náročnost se IMHO týkala údržby velké skupiny v LDAPu, což SunIdM zvládá, resp. dělá v rámci ActiveSync najednou a odděleně od účtů.

Modifikaci je možno přeskočit, ale přesto nechat dělat pro live synchronizaci:

<reaction>
    <name>Linked reaction</name>
    <situation>linked</situation>
    <channel>http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#liveSync</channel>
    <action>
        <name>Modify Action</name>
        <handlerUri>http://midpoint.evolveum.com/xml/ns/public/model/action-3#modifyUser</handlerUri>
    </action>
</reaction>

Nebo nejlepší způsob - zapnout synchronizaci (modifikace se provede automaticky a pouze pokud je potřeba):

<reaction>
  <name>linked reaction</name>
  <situation>linked</situation>
  <synchronize>true</synchronize>
</reaction>

Profiling

Konfigurace - Profiling

Koukání do logu jen na tasky >= 1s:

tail -f /var/log/tomcat8/idm-profile.log | egrep '[0-9]{3}\.[0-9]{3} ms$'

Filtry

Jak použít:

  • GUI: <searchFilter>...</searchFilter>
  • eclipse plugin query: <query><filter>...</filter></query>
  • bulk action: <s:searchFilter>...</s:searchFilter>, přidat namespacy - q:org, q:path, q:orgRef
  • REST API query: <q:query><q:filter>...</q:filter></q:query>

Dokumentace:

Source:

Seznam operací:

  • q:equal(q:path, q:value|q:oid|c:expression|...)
  • q:equal(q:path): test na neexistenci atributu
  • q:greater(q:path, q:value|q:oid|c:expression|...)
  • q:greaterOrEqual(q:path, q:value|q:oid|c:expression|...)
  • q:less(q:path, q:value|q:oid|c:expression|...)
  • q:lessOrEqual(q:path, q:value|q:oid|c:expression|...)
  • q:substring(q:path, q:value|q:oid|c:expression|...[,q:anchorStart][,q:anchorEnd])
  • q:ref([q:path,] q:oid)
  • q:org(q:isRoot)
  • q:org(q:ref[,q:maxDepth][q:scope="SUBSTREE"|"ONE_LEVEL"])
  • q:inOid(q:value|..., boolean considerOwner)
  • q:and(A, B)
  • q:or(A, B)
  • q:not(A)
  • q:type(QName type, FILTER)
  • q:exists(string q:path, FILTER)

Příklady operandů:

  • q:path: c:intent, c:resourceRef, ...
  • q:ref: <q:oid>...</q:oid>
  • každá operace má nepovinný parametr q:matching (pokud má smysl/je podporovaný): norm, orig, strict, polyStringNorm

Příklady

Jméno:

<equal>
  <path>name</path>
  <value>1</value>
</equal>

Podřetězec:

<substring>
  <path>name</path>
  <value>ka</value>
</substring>

Někdy nutno přepnout na polystring:

<equal>
  <matching>polyStringNorm</matching>
  <path>displayName</path>
  <value>kps</value>
</equal>
<equal>
  <matching>polyStringOrig</matching>
  <path>displayName</path>
  <value>ZČU</value>
</equal>

Členové pracoviště:

  <org>
    <path>parentOrgRef</path>
    <orgRef oid="20010718-1801-0005-0000-200000000000"/>
  </org>

Departmenty z Magionu:

<equal>
  <path>orgType</path>
  <value>department</value>
</equal>

Objekt podle OID:

<inOid>
  <value>20010718-1801-0005-0000-200000000000</value>
</inOid>

Konkrétní organizace k přiřazení v templatu (tady např. ZČU):

<assignmentTargetSearch>
  <targetType>c:OrgType</targetType>
  <oid>20010718-1801-0005-0000-200000000000</oid>
</assignmentTargetSearch>

Nalezení organizace k přiřazení (klasický příklad):

<assignmentTargetSearch>
  <targetType>c:OrgType</targetType>
  <filter>
    <q:equal>
      <q:path>c:name</q:path>
      <expression>
        <path>$costCenter</path>
      </expression>
    </q:equal>
  </filter>
</assignmentTargetSearch>

Bulk action

TODO příklady:

  • vynucený update nebo rekoncilace u seznamu identit
  • přidání/odebrání role
  • aktivace/deaktivace

TODO: vyzkoušet informace z mailinglistu (http://lists.evolveum.com/pipermail/midpoint/2017-May/003806.html)

Příklady

Ve formě pro Configuration -> Bulk actions.

Mazání všech uživatelů načínajících na "STAG*":

<s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3"
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3">
    <s:type>UserType</s:type>
    <s:searchFilter>
        <q:substring>
            <q:path>name</q:path>
            <q:value>STAG</q:value>
            <q:anchorStart>true</q:anchorStart>
        </q:substring>
    </s:searchFilter>
    <s:action>
        <s:type>delete</s:type>
    </s:action>
</s:search>

Vypsání do logu všech "admin-*" uživatelů, příklad akce execute-script:

<s:search xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3"
          xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
          xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3">
    <s:type>UserType</s:type>
    <s:searchFilter>
        <q:substring>
            <q:path>name</q:path>
            <q:value>admin-</q:value>
            <q:anchorStart>true</q:anchorStart>
        </q:substring>
    </s:searchFilter>
    <s:action>
        <s:type>execute-script</s:type>
        <s:parameter>
            <s:name>script</s:name>
            <c:value>
                <c:code>
log.info('log: {}', input.name);
                </c:code>
            </c:value>
        </s:parameter>
    </s:action>
</s:search>

Interní atributy

Oficiální dokumentace:

https://wiki.evolveum.com/display/midPoint/MidPoint+Common+Schema

Zdrojový kód (seznam interních atributů, hledat name="UserType", name="OrgType", name="RoleType" a jejich rodičovské typy):

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"

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]

Ú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í něco přímo midPoint? (3.4 slibuje "Custom GUI forms" na wicketech)
  • jaká midPoint má API?
  • (šlo by mít i nějakou propojovací tabulku, ale dokumentace midPoint slibuje víc)

Reporty

Naučit se s audity a reporty. Umět poznat, kdy se co měnilo a proč. Logování do tabulek ve formátu doporučovaném midPointem (https://wiki.evolveum.com/display/midPoint/Auditing)? Další dokumentace k auditům https://wiki.evolveum.com/display/midPoint/Audit+configuration je tam i konfigurace jak to má vypadat i když ne asi dobře popsána.

Koncové uživatelské stránky



Grouper GUI

  • prozkoumat možnost propojení s mailinglisty (správci mailinglistů)
    • víc "typů" skupin
    • jednotné GUI (=náhrada mailmana)?
  • portálová aplikace (koncepčnější a pracnější) vs nativní GUI midPointu (škoda nevyužít, ale nejde čistě zandat o portálu)

Import

(náhodné poznámky)

  • nejprve promazat tabulky v CRO-OUT a/nebo provézt rekonciliace CRO-OUT
  • po importu zkontrolovat identity v CRO, co nejsou v midPointu (kvuli duplicitám CRO_ID!)
  • TODO: historie CRO_ID...

Krátkodobé úkoly

Rozšíření pohledů MAGION

  • RODNE_PRIJMENI
  • STAT_IDNO_OBCA_NAME: jmenná hodnota státního občanství
  • STAT_IDNO_OBCANSTVI: číselníková hodnota

Archivní CRO ID

Do midPointu nahrát i "stub" identity s informacemi:

  • CRO_ID
  • poslední RČ

U nás asi připravit pohled. Pak buď UNIONovat v existujícím MP resourcu CRO nebo umět jednorázový import.

Náměty na externí vývoj

Lepčí SSO

  • my se můžem pochlubit pull-requestem na spring-security od Majlena a příkladem konfigurace pro WebAuth
  • vývojáři slibují konfiguraci jinak než čuňácky v rozbaleném WEB-INF

Napojení na Stag

  • tohle bude spíš na nás: je to o designu a jádře řešení pro ZČU
  • viz #Stag

Registrace

  • netušíme vnitřnosti v midPointu (mělo by to umět GUI - něco s wicked)
  • alternativa je externí registrační klient přes midPoint API (přes web services)

Vývoj

Import do git repozitáře

  1. Před importem objektu do repozitáře nutno XML promazat. Pro resource object lze využít skript (smaže tag schema, hesla, provozní informace, ...):
    object/resources/convert.sh < RESOURCE-orig.xml > RESOURCE.xml
  2. Smazané heslo nahradit makrem, např.:
    <icfc:configurationProperties ...
      ...
      <jdbc:password>
        <t:clearValue>$(magionPassword)</t:clearValue>
      </jdbc:password>
      ...

    ...a přidat nové makro (property) do default.properties a testing.properties.

  3. Smazat nebo vymyslet nové OID (třebas s univerzitním prefixem 20010718-1801-0000-XXXX-XXXXXXXXXXXX).
  4. U konektorů: přidat matching rules namespace: xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3"
  5. U konektorů: využít i "Smart References", např.:
    <resource>
       ...
       <connectorRef type="ConnectorType">
         <filter>
           <q:equal>
             <q:path>c:connectorType</q:path>
             <q:value>org.identityconnectors.ldap.LdapConnector</q:value>
           </q:equal>
         </filter>
       </connectorRef>
       ...
     </resource>

Repozitář: viz #ZČU

Eclipse GUI

Eclipse + midPoint plugin.

Příprava repozitáře:

git clone /afs/.zcu.cz/project/software/git/idm/midpoint.git
# zákaz commitu lokálních hesel
git update-index --assume-unchanged default.properties
# doplnění parametrů a hesel
vim default.properties

Build

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

Jenkins repositories:

Aktuální stav

Kerberos resource

Existuje nativní connector pro Kerberos:

https://stash.forgerock.org/projects/OPENICF/repos/kerberos-connector/browse

Napsali jsme si nativní MIT kerneros connector:

https://github.com/CESNET/kerberos-connector

Implementace RA v Javě a používající C knihovnu (JNI), pouze MIT.

Best practices

Proměnné $user, $shadow

Stylově správné použití proměnných:

  • midPoint uživatel: $user
  • midPoint role, organizace: $focus
  • resource cokoliv (account, entitlement): $shadow

Ivan Noris, 2016-12-09:

Personally, I usually use $user for User object, $focus for other Focal objects (Role, Org); and tend to use $shadow everywhere where I previously used $account.