LPS:IdM/midPoint
ZČU
- https://themis3.civ.zcu.cz/midpoint
- git clone /afs/.zcu.cz/project/software/git/idm/midpoint.git
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/v3.4/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
- interní atributy: https://github.com/Evolveum/midpoint/blob/master/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd
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
# version of midPoint v='3.4' apt-get install -y less mc screen vim man apt-get install -y bzip2 net-tools sudo wget apt-get install -y openjdk-7-jdk tomcat8 apache2 # apache2 cat > /etc/apache2/conf-available/midpoint.conf <<EOF ProxyRequests Off ProxyPreserveHost On ProxyPass /midpoint http://localhost:8080/midpoint ProxyPassReverse /midpoint http://localhost:8080/midpoint RewriteEngine On RewriteRule ^/?$ /midpoint/ [R] EOF # tomcat8 cat << EOF JAVA_OPTS="${JAVA_OPTS} -Xms256m -Xmx768m -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 >> /etc/default/tomcat8 mkdir /var/opt/midpoint chown tomcat8:tomcat8 /var/opt/midpoint service tomcat8 stop # mc (cosmetics) mkdir -p ~/.config/mc/ || : echo 'ENTRY "/var/opt/midpoint" URL "/var/opt/midpoint"' >> ~/.config/mc/hotlist ln -s /usr/lib/mc/mc.csh /etc/profile.d/ || : ln -s /usr/lib/mc/mc.sh /etc/profile.d/ || : # midpoint wget -nv https://evolveum.com/downloads/midpoint/${v}/midpoint-${v}-dist.tar.bz2 tar xjf midpoint-${v}-dist.tar.bz2 echo "alias repo-ninja='`pwd`/midpoint-${v}/bin/repo-ninja'" > /etc/profile.d/midpoint.sh # initial launch without anything a2enmod rewrite proxy proxy_http a2dissite 000-default a2enconf midpoint service apache2 start service tomcat8 start service postgresql start # midpoint initial deployment cp -vp midpoint-${v}/war/midpoint.war /var/lib/tomcat8/webapps/ ln -s /usr/share/java/mysql-connector-java.jar /var/lib/tomcat8/lib/ service tomcat8 start while ! test -f /var/opt/midpoint/config.xml; do sleep 0.5; done 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
2) JDBC ovladač
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-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/ mysql -e "CREATE DATABASE midpoint" mysql -e "GRANT ALL ON midpoint.* TO midpoint IDENTIFIED BY '${pass}'" mysql -u midpoint -p${pass} midpoint < midpoint-${v}/config/sql/_all/mysql-3.4-all.sql 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.gjt.mm.mysql.Driver</driverClassName> <jdbcUsername>midpoint</jdbcUsername> <jdbcPassword>${pass}</jdbcPassword> <jdbcUrl>jdbc:mysql://localhost/midpoint</jdbcUrl> <hibernateDialect>com.evolveum.midpoint.repo.sql.util.MidPointMySQLDialect</hibernateDialect> <hibernateHbm2ddl>validate</hibernateHbm2ddl> </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>
Fix security policy
# maxFailedLogins: 3 -> 10 # loginTimeout: 15 -> 2 vim /var/lib/tomcat8/webapps/midpoint/WEB-INF/ctx-web-security.xml service tomcat8 restart
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)
Upgrade
Postupovat podle release notes a podle obecných pravidel na https://wiki.evolveum.com/display/midPoint/Upgrade+HOWTO .
Upgrade databáze
Např.:
cd /opt/newMidpoint/midpoint-3.4/config/sql/_all mysql -u root -p midpoint < mysql-upgrade-3.3-3.4.sql
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 /etc/profile.d/midpoint.sh
- ln -s /usr/share/java/mysql-connector-java.jar /opt/midpoint.../lib
- vyzkoušet: repo-ninja --validate
Docker
https://hub.docker.com/r/valtri/docker-midpoint/
docker pull valtri/docker-midpoint docker run -itd --name midpoint valtri/docker-midpoint
Tipy
XML
Klonování konfigurace resource
Při kopírování XML nutno smazat sekci <schema></schema>, doporučeno i další.
Smazat:
- schema
- fetchResult
- metadata
- operationalState
Také smazat nebo vymyslet nové OID resourcu a smazat hesla.
Přidat:
- matching rules namespace: xmlns:mr="http://prism.evolveum.com/xml/ns/public/matching-rule-3"
Import do git repozitáře
Připravit XML, u resourců viz také #Klonování konfigurace resource.
Vhodné mít v XML i OID (nechat midPointem vygenerovat nové nebo si něco vymyslet). Možno využít i tzv. "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
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 (při výskytu NULL danou hodnotu také přepíše, resp. smaže)
- 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)
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>
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$'
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
Kterak nakonfigurovat:
- zkompilovat třídu EnvironmentVariableAuthenticationFilter:
git clone /afs/.zcu.cz/project/software/git/idm/midpoint.git && cd midpoint cd webauth make
- nakopírovat class soubor EnvironmentVariableAuthenticationFilter.class do /var/lib/tomcat8/webapps/midpoint/WEB-INF/classes/org/springframework/security/web/authentication/preauth/
- přidat do /var/lib/tomcat8/webapps/midpoint/WEB-INF/ctx-web-security.xml (na správná místa):
<custom-filter position="PRE_AUTH_FILTER" ref="environmentVariableAuthenticationFilter" /> ... <beans:bean id="environmentVariableAuthenticationFilter" class="org.springframework.security.web.authentication.preauth.EnvironmentVariableAuthenticationFilter"> <beans:property name="authenticationManager" ref="authenticationManager" /> </beans:bean>
- 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>
- vyrobit uživatele se správnými access rolemi (End User, Super User, Approver, ...)
Postup je nedokonalý:
- správně se to má změnit ve zdrojácích a postavit nový war k deployování, nebo ještě lépe: vylepšit zdrojáky/zaplatit vývoj
- třída EnvironmentVariableAuthenticationFilter čeká na zahrnutí do Springu
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
Ú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:
JDBC connector
- případně i jako generátor skupin a pracovišť, ale nevíme, jak dobře je to podporované
Aktivace identit
- midPoint má nějaký komplexnější způsob na aktivace/deaktivace identit, které jsou spojené s datumy
- prozkoumání, jak na disablování identit (někde jiné atributy, někde smazané, ...), v Sun Idm na to máme speciální role
- datum deaktivace případně k využití na expirace hostovských kont nebo odchody identit
Sosání skupin
- engine midPointu to zatím neumí tím správným způsobem krz entitlements, ale lze nějak obejít (<focusType>c:RoleType</focusType> v ObjectSynchronization)
- viz také email thread "Sync Entitlements to Role/Org Object with CSVFileConnector"
- otázka mimo midPoint: budem nahrazovat i trychtýř, co máme před Grouperem? (tj. budem se napojovat přímo do několika databází nebo budem sosat sadu csv souborů? nevýhoda přímého napojení by byl větší chaos uvnitř midPointu)
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)
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:
<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>
Košatější příklad:
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)
Bulk action
Základ umíme (modifikace křesního jména u jedné identity).
Příklady:
- vynucený update nebo rekoncilace u seznamu identit
- přidání/odebrání role
Ohledně přidání odebrání role bych to viděl pokud by to byla nějaká multihodnota v někde uložena.
- aktivace/deaktivace
Aktivace/deaktivace by šla řešit sloupcem který by reprezentoval aktivovaný/deaktivovaný účet. Pak při live synchronizaci nebo rekoncilaci by šlo detekovat a dle toho nastavit
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)?
Build ze zdrojových kódů
Teoreticky by se mohlo hodit, pokud bychom chtěli příspívat vlastními změnami (nebo mít vlastní patche) anebo testovat nejnovější featury.
(Není nutno, ale zajímavá věc ke hraní si.)
Kerberos resource
Existuje nativní connector pro Kerberos:
https://stash.forgerock.org/projects/OPENICF/repos/kerberos-connector/browse
Vyzkoušet, jak si to rozumí s midPointem.
Mezivýsledek: není až tak nativní Javový, používají se groovy skripty.
Synchronizace pracovišť
Nic prioritního, jen zajímaovst, pokud zbyde čas a midPoint by měl dost pěkně umět...
Viz orgsync story.