LPS:IdM/midPoint/Office365
Info
Microsoft Office365 - cloudová aplikace. Identity jsou spravované přes Graph API.
Konektor:
- git repozitář: connector-msgraph
- drobné patche na závislosti
- hlavní změny mergované v upstramu (optimalizace, opravy, podpora licencí)
Resource: Office365
Přes Graph API nelze spravovat emaily. Nastavování přesměrování ve skriptech mimo režii IdM.
Admin přístup
- https://office365.zcu.cz (testovací: https://login.microsoftonline.com/?whr=zcutest.civ.zcu.cz TODO: lepčí URL?)
- Admin Center -> Azure Active Directory -> Azure Active Directory -> App registrations
- identita "OpenICF MSGraph Connector" -> Client credentials
==> jako hlavní ID je Application (client) ID
==> jako heslo: secret z Client credentials
==> (lze si zvolit dobu platnosti, v 2021-05-31 zvoleno na 2 roky)
Model
Osoby
Zaměstnanci, studenti, rozšířená hostovská konta (je vyžadováno CRO ID).
Primární klíče:
- __NAME__ - LOGIN@DOMAIN
- onPremisesImmutableId - CRO ID (nikdy se nesmí měnit)
- userPrincipalName - LOGIN
Atributy:
- mail: LOGIN@DOMENA, jen přo zakládání, ale nelze spravovat přes Graph API
Merge: nelze
Povolení/blokace: 1:1 podle identity v midPointu
Přejmenování: potřeba ruční zásah kolem správy emailů. Původní email je u přejmenovávané identity ponechán. (TODO: čistit to ve skriptech mimo?)
Fyzické mazání: Pro konta ve stavu BD (blokované 2 roky). Po smazání je identita v koši po dobu 1 měsíce. Po tuto dobu ji nelze znovuzaložit automaticky přes Graph API. Lze ji obnovit přes administrátorské rozhraní Office 365, anebo smazat vývojovými administrátorskými nástroji (koš nelze vysypat přes midPoint - umí to Graph API, ale identity mají divoké identifikátory).
Skupiny
Neposílají se (ale jinak vyzkoušeno).
Licence
Read-only identity. V midPointu použito pro výpočty atributů pro přidělováné licencí (technicky: jde o "ruční" query, nelze použít přímo asociace na resourcu).
Licence se skládá z jednotlivých aplikací.
Pro každou licenci lze nastavit globální vyjímku pro nějakou aplikaci. Ale nelze nastavovat různé vyjímky pro každého uživatele (technicky: přes Graph API to lze, ale vedlo by to na strukturovaný atribut u uživatele, což nelze).
Výpočet licencí
Princip
Šílenost. Vychází se z dokumentu: https://software.zcu.cz/files/MS_EES.html
V zásadě dva typy licencí: A1 a A3 a každá z nich má studentskou a zaměstnaneckou verzi.
- Typ studentské se volí podle fakulty (==> GROUP: o365proplus-students)
- Typ zaměstnanecké podle self-managementu (SELF: O365 PRACOVISTE), ale jen pro vybraná pracoviště (==> GROUP: o365proplus-PRACOVISTE). Mimofakultní mají ještě rozdělený self-management, ale slévají se do jednoho GROUP: o365proplus-rek. Pak je ještě MNG: O365 SPECIAL pro zaměstnaneckou A3 licenci bez hlídání, zda jde o zaměstnance na správném pracovišti.
- Přičítá se ještě PowerBI Pro na základě ručně udržované skupiny MNG: O365 PowerBi Pro (==> GROUP: o365powerbipro) (poznámka: ta self skupina by tu být nemusela, nikdo nemá přístup)
Nelze kombinovat studentskou a zaměstnaneckou licenci (body (1) a (2)), studentská má vždy přednost.
Role v midPointu
Počáteční import (aktualizovaný):
# === studenti === ./group.py.fixme o365proplus-students -s "Licence Microsoft pro všechny studenty" for fak in fdu fst fel fav fpe; do ./modify-role.py -q subtype=stag-global-group-student extension/ext:GROUP_ZKRATKA=${fak^^} -a role-group-o365proplus-students:role; done # === per fakulta === # 1) self role for fak in fdu fst fel fav fpe rek-ntc rek-civ rek-ps rek-uk rek-ujp rek-rek rek-skm rek-suz; do FAK=${fak^^} FAK=$(echo $FAK | tr '-' '/') org=$(echo $fak | cut -d - -f2) ORG=${org^^} ./create-role.py "name=SELF: O365 $FAK" displayName="o365proplus-$fak" description="Licence pro Microsoft365 (A3plus) - $ORG" extension/ext:requestableGroups=staff requestable=true -a "$(./query-archetype.py name='ZCU Self Management Role' --oid):archetype" done # tune catchall REK rekoid="$(./query-role.py name='SELF: O365 REK/REK' --oid)" ./modify-role.py --oid $rekoid 'extension/ext:requestableGroups+=!civ' ./modify-role.py --oid $rekoid 'extension/ext:requestableGroups+=!ps' ./modify-role.py --oid $rekoid 'extension/ext:requestableGroups+=!suz' ./modify-role.py --oid $rekoid 'extension/ext:requestableGroups+=!uk' # special fak=special; FAK=${fak^^}; org=$fak; ORG=$FAK; ./create-role.py "name=SELF: O365 $FAK" displayName="o365proplus-$fak" description="Licence pro Microsoft365 (A3plus) - $ORG" extension/ext:requestableGroups+=nobody requestable=false -a "$(./query-archetype.py name='ZCU Self Management Role' --oid):archetype" #./query-org.py extension/ext:OU_ZKRATKA=$FAK 'subtype=hr-org-str' | head -n 3 ##==> OID #oid= #./modify-org.py --oid $oid -i role-group-o365proplus-${fak}:role # 2) output roles (groups) for fak in fdu fst fel fav fpe special; do ORG=${fak^^} ./create-role.py name="GROUP: o365proplus-$org" subtype=group description="Licence Microsoft pro zaměstnance $ORG" displayName="GROUP: o365proplus-$org" identifier="o365proplus-$org" -a $(./query-role.py --oid name="ZCU: Posix Group"):role -a $(./query-archetype.py --oid name="MidPoint: Legacy Group"):archetype done ORG=REK; ./create-role.py name="GROUP: o365proplus-$org" subtype=group description="Licence Microsoft pro zaměstnance $ORG" displayName="GROUP: o365proplus-$org" identifier="o365proplus-$org" -a $(./query-role.py --oid name="ZCU: Posix Group"):role -a $(./query-archetype.py --oid name="MidPoint: Legacy Group"):archetype # 3) self / output connections for fak in fdu fst fel fav fpe special; do ./modify-role.py --oid role-self-o365proplus-$fak -a role-group-o365proplus-${fak}:role done for org in ntc civ ps uk ujp rek skm suz; do ./modify-role.py --oid role-self-o365proplus-rek-${org} -a role-group-o365proplus-rek:role done
Ručně přidat do každé self-management role pro assignment výstupní role (dodatečná kontrola při rušení autorizace):
<condition> <source> <path>$source/name</path> </source> <source> <path>$source/extension/requestableGroups</path> </source> <expression> <script> <relativityMode>absolute</relativityMode> <code> return zcuUtils.execute('authRequestable', [ 'userObj': focus, 'roleName': name, 'requestableGroup': requestableGroups, ]); </code> </script> </expression> </condition>
CA
# C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root G2 keytool -importcert -keystore ./keystore.jceks -file /usr/share/ca-certificates/mozilla/DigiCert_Global_Root_G2.crt -alias digicert-g2 # C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA keytool -importcert -keystore ./keystore.jceks -file /usr/share/ca-certificates/mozilla/DigiCert_Global_Root_CA.crt -alias digicert-ca
(starší postup byl: https://www.microsoft.com/pki/mscorp/cps/default.htm + import např. M$ CA1, CA2, CA4 a CA5)
Postupy
Hostovská konta
Postup přidání přístupu pro hostovská konta:
- přidělit CRO ID, viz LPS:IdM/midPoint#Přidělení CRO ID
- zařadit do role SELF: gapps (nastaví Google Apps a licenci pro Office365, ale Office365 se musí explicitně přiřadit)
- TODO: GROUP: office365 je historická skupina a zřejmě se již na nic nevyužívá (speciální přístupy před změnami kolem licencí 2021-06)
Vyrobení licence
Ručně spravované nebo self-management licence lze zakládat bez nutnosti modifikace kódu v midPointu. Tj. licence, co se nepočítá dynamicky a bez závislostí mezi ostatními licencemi.
Postup:
# název k nalezení v admin sekci M365: Billing -> Licences name="Project Plan 3 Faculty" documentation="https://rt.zcu.cz/rt/Ticket/Display.html?id=..." display=o365-projectplan-faculty ./create-role.py -a $(./query-archetype.py name='ZCU Self Management Role' --oid):archetype:org:default "name=MNG: O365 $name" displayName="$display" description="Licence pro Microsoft365 ($name)" documentation="$documentation" extension/ext:requestableGroups=nobody requestable=false
Přidat sekci: (kde ... je název licence z Graph API, k nalezení v organizační struktuře licencí)
<inducement> <focusMappings> <mapping> <name>License</name> <authoritative>true</authoritative> <strength>strong</strength> <expression> <value>...</value> </expression> <target> <path>$focus/extension/office365Licenses</path> </target> </mapping> </focusMappings> </inducement>
License PowerBi Pro
Řídí se v IdM rolí MNG: O365 PowerBi Pro. Lze nastavit v assignments přímo v IdM nebo přes příkazový řádek.
Přidání přes příkazová řádek (nahradit $LOGIN za login):
./modify-user.py -q name=$LOGIN --assign "$(./query-role.py 'name=MNG: O365 PowerBi Pro' --oid)":role
Odebrání přes příkazový řádek (nahradit $LOGIN za login):
./modify-user.py -q name=$LOGIN --unassign "$(./query-role.py 'name=MNG: O365 PowerBi Pro' --oid)":role