EduID Cloud365
Auto-generated book for EduID Cloud365
EduID Cloud365
EduID Cloud365
Szükséges lépések a O365.eduid.hu szolgáltatás igénybevételéhez:
Intézményi Office365 (intezmenynev.onmicrosoft.com) account igénylése, licenc jogosultságok ellenőrzése
"Modern authentication public preview" (valójában: Azure AD Authentication Library ) bekapcsolása az Office365 management felületén
Domainek beállítása
SAML IdP konfiguráció
Jelzés küldése az aai (AT) niif . hu címre, hogy bekapcsolható a SAML átjáró
Adminisztrátori belépés a hub.eduid.hu portálra
A portálon az Office365 kapcsolat beállítása
Licenc jogosultságok beállítása (milyen termékek érhetők el tanárok, ill. diákok számára)
Office365MailFlow
O365 SAML
Az Office365 szolgáltatások SAML azonosítással történő használatához egy
új SP-t kell konfigurálni az IdP konfigurációjában, mivel ez az SP nem
szerepel a föderációs metaadatok között. A Microsoft által üzemeltetett
SP-nek speciális attribútum igényei vannak:
perzisztens NameID-t kell küldeni ( ImmutableID )
kell küldeni egy IDPEmail nevű attribútumot
Kiadott attribútumok
ImmutableID
Az ImmutableID az eduPersonPrincipalName attribútum MD5 hashének UUID
formátumra konvertált változata.
IDPEmail
A kiadott e-mail értéknek meg kell egyeznie az Office365 által
szolgáltatott e-mail címmel. Ez azt is jelenti, hogy az IdP-től kapott
e-mail attribútum domain részét előzetesen validálni kell az
Office365-ben.
SimpleSAMLphp
A metadata/saml20-sp-remote.php file-ba kell elhelyezni a következő
bejegyzést:
/*
* Office 365
* https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml
*/
$metadata['urn:federation:MicrosoftOnline'] = array(
'entityid' => 'urn:federation:MicrosoftOnline',
// Expose both required attributes
'attributes' => array('IDPEmail', 'ImmutableID'),
'attributes.NameFormat' => "urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified",
// Configure attribute mapping and ImmutableID generation
'authproc' => array(
31 => array(
'class' => 'core:PHP',
'code' => '
$eppn = $attributes["eduPersonPrincipalName"][0];
$chunks = str_split(md5($eppn), 4);
$attributes["ImmutableID"][0] = vsprintf("%s%s-%s-%s-%s-%s%s%s", $chunks);
',
),
36 => array(
'class' => 'core:AttributeMap',
'mail' => 'IDPEmail',
),
),
// Send ImmutableID as a "persistent" NameID
'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
'simplesaml.nameidattribute' => 'ImmutableID',
'contacts' => array(),
'metadata-set' => 'saml20-sp-remote',
'AssertionConsumerService' => array(
0 => array(
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://login.microsoftonline.com/login.srf',
'index' => 0,
'isDefault' => true,
),
1 => array(
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign',
'Location' => 'https://login.microsoftonline.com/login.srf',
'index' => 1,
),
2 => array(
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:PAOS',
'Location' => 'https://login.microsoftonline.com/login.srf',
'index' => 2,
),
),
'SingleLogoutService' => array(
0 =>
array(
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://login.microsoftonline.com/login.srf',
),
),
'keys' => array(
0 => array(
'encryption' => false,
'signing' => true,
'type' => 'X509Certificate',
'X509Certificate' => 'MIIDYDCCAkigAwIBAgIJALLJPAyvf2sjMA0GCSqGSIb3DQEBBQUAMCkxJzAlBgNV
BAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTAeFw0xNDA3MTgxOTUz
NDBaFw0xOTA3MTcxOTUzNDBaMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25p
bmcgUHVibGljIEtleTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANYD
KgByFZdqtTnnpF4IfIp4i2XLg2rLIo+mu4DmW9gRLlBJCNc7YESUxpKzuFYaANd8
fWsDigJZTXbhOQApSpw4xXFnor2vJ1zm94LtqjcVEXTjUml5gAIS4pwuOU3ZfO/0
eTG0gDYp4a0L/mzzTRsnwe/8WMPIE75Bq2zAyAZ9aePvl3QX7cXYLPfeK4QTgK3B
5lwe1wWu3y5oQidjcSok8Frf80xzuCYuOa+ZUK3JibpLLCrT4uwiqf+KREDSdc4b
PPlq0PWI4sQr1tha8yypRSvOH+/MxcfSRSnl6Uc+gm8nVEEWWIu4hhu6NIfG91mM
UqJuzkgLCi6Gov6JS8UCAwEAAaOBijCBhzAdBgNVHQ4EFgQUnQoq7sI3R8rde4sQ
s6nGEbJm3LcwWQYDVR0jBFIwUIAUnQoq7sI3R8rde4sQs6nGEbJm3LehLaQrMCkx
JzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleYIJALLJPAyv
f2sjMAsGA1UdDwQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEAf4jaNhKzRG3k+52W
oM9nnISP7rlWIeWwH6EQGUlF6ozSP/03gYMAdqpdhww5zNwKzi7TQVbDC0pgq/tq
zHv6JEI0R4B6h7/TJ1pYPxdvIFQrE27RHESltH/m+5UkVnayLqRD3/fi4zf4aEpx
SDZ73MCR5LanPGqvlAMz29AL3g1ynj+eu7xMfFsM/8+qJaCXuxT5/30eeLEe+PYi
kA/PhEwp+qkDQWPvdAwEghuUaFvtKAgDZierjpGzHZnYkXTTDTHVe1iP7tsAJH5q
K3qdcv3UGPyZrjC/lietJcAcnwVoZQ93v2ieGfcKKN+PFN9M59/BkPo62HPoGNNx
2ZDQaQ==',
),
1 => array(
'encryption' => false,
'signing' => true,
'type' => 'X509Certificate',
'X509Certificate' => 'MIIDYDCCAkigAwIBAgIJAKLDsqkylLefMA0GCSqGSIb3DQEBBQUAMCkxJzAlBgNV
BAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTAeFw0xNDEwMTAxODE2
MTNaFw0xOTEwMDkxODE2MTNaMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25p
bmcgUHVibGljIEtleTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7A
3m6uvOxEsX+NlB1hnflaR8DJj597wY3qyh/FX4O6rKvU2leAfINmBWcjEFApCKi9
p5uIaZpNlDpPQ+R3BaZx+4NhHbOMpeWlpIiZHL61lwbulzurffUPhtzQNHAVzOBk
ZsOgN9BD/hOleU//d+IXz08ateUb3Ip2vyaodilYQDDi5M9yOhanv1cO1Usjo2xT
LfiK+TVygu+8bo+/8JHGPRy6pnghng970DRBDkVrKzozlrnmMesdSrtuCnsgyRbE
XckxaQ8S2nDYyFqBI0PkcBW8+0akdFWW58Os5cGbPFeHi6vtZCR5pWw5pnqtuoip
rdk9jg1axT3vwu+RVdcCAwEAAaOBijCBhzAdBgNVHQ4EFgQUBjNylGJBvkAY/4yI
IoD00R6p5hIwWQYDVR0jBFIwUIAUBjNylGJBvkAY/4yIIoD00R6p5hKhLaQrMCkx
JzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleYIJAKLDsqky
lLefMAsGA1UdDwQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEAQGZUlJ3zzJvy1OLd
tV3NTYHlbVHm3Fty17xqW9Ui8GE8sEWeUdHA6eURNNpNpd+gAGC6Tp+k+cU1LlPw
Xm7BAATJ/2DjY8tzRc6r6EneQWRkIa8xpbvknXvUml6iFgo2ofOWLaFk6XpQ64MA
O35wv9XEARNabJ9wJSRSevUigAx2U2GvaorV5PgqHImiKTSrL0K6j8B4OqXWUqP0
KGf7pCdGlrq2XEl95N2zj8n/scvA9JasImztsVlZ+WxeF+OAMvWQQFc54gC6lwWc
8kno8vPn3lwxVkTU0o9wcHnOhNi2hzVDV85sz7P9dOZYF73uy1uLshdjCcwlmQ2l
A9OV9w==',
),
),
'saml20.sign.assertion' => true,
// This metadata does not contain an encryption key,
// therefore explicitly disabling assertion encryption so it does not depend on global IDP settings.
'assertion.encryption' => false,
);
ECP (Enhanced Client or Proxy)
Ha szeretnénk elérni az Office365 levelezést IMAP-on keresztül, akkor be
kell kapcsolni még az ECP-t is. Ehhez a metadata/saml20-idp-hosted.php
file-ba fel kell venni az IdP metaadatai közé egy 'saml20.ecp' elemet
true értékkel, illetve az SP metaadatokhoz is hozzá kell adni két
beállítást a metadata/saml20-sp-remote.php file-ban:
/*
* Office 365
* https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml
*/
$metadata['urn:federation:MicrosoftOnline'] = array(
// ...
'signature.algorithm' => 'http://www.w3.org/2000/09/xmldsig#rsa-sha1',
'saml20.sign.response' => false,
);
Shibboleth
Egy unicon/shibboleth-idp alapú docker image készítését mutatjuk be az
alábbiakban.
Kezdeti IdP konfiguráció
# docker run -it -v $(pwd):/ext-mount --rm unicon/shibboleth-idp init-idp.sh
Please complete the following for your IdP environment:
Hostname: [64ed9b77b493.localdomain]
idp.example.com
SAML EntityID: [https://idp.example.com/idp/shibboleth]
https://idp.example.com:4443/idp/shibboleth
Attribute Scope: [localdomain]
example.com
Backchannel PKCS12 Password: XXXsecretXXX
Re-enter password: XXXsecretXXX
Cookie Encryption Key Password: XXXsecretXXX
Re-enter password: XXXsecretXXX
Warning: /opt/shibboleth-idp-tmp/bin does not exist.
Warning: /opt/shibboleth-idp-tmp/edit-webapp does not exist.
Warning: /opt/shibboleth-idp-tmp/dist does not exist.
Warning: /opt/shibboleth-idp-tmp/doc does not exist.
Warning: /opt/shibboleth-idp-tmp/system does not exist.
Generating Signing Key, CN = idp.example.com URI = https://idp.example.com:4443/idp/shibboleth ...
...done
Creating Encryption Key, CN = idp.example.com URI = https://idp.example.com:4443/idp/shibboleth ...
...done
Creating Backchannel keystore, CN = idp.example.com URI = https://idp.example.com:4443/idp/shibboleth ...
...done
Creating cookie encryption key files...
...done
Rebuilding /opt/shibboleth-idp-tmp/war/idp.war ...
...done
BUILD SUCCESSFUL
Total time: 7 minutes 4 seconds
A basic Shibboleth IdP config and UI has been copied to ./customized-shibboleth-idp/ (assuming the
default volume mapping was used).
Most files, if not being customized can be removed from what was exported/the local Docker image and
baseline files will be used.
Keletkezik egy customized-shibboleth-idp mappa a következő
szerkezettel:
conf
credentials
metadata
views
views/admin
views/client-storage
views/intercept
webapp
webapp/css
webapp/images
Az alábbi fájlokat kell majd módosítani:
conf/attribute-filter.xml
conf/attribute-resolver.xml
conf/idp.properties
conf/ldap.properties
conf/metadata-providers.xml
conf/relying-party.xml
conf/saml-nameid.properties
conf/saml-nameid.xml
metadata/idp-metadata.xml
Néhány másik fájlt pedig létre kell hozni:
credentials/idp-browser.p12 (webserver SSL key/cert)
credentials/ldap-server.crt (LDAP server certificate)
metadata/federationmetadata.xml (Office 365 federation metadata)
Mivel ebben a példában az IdP-t a 4443-as porton fogjuk elérni, ezért
ellenőrizni kell minden Location paramétert a
metadata/idp-metadata.xml fájlban, hogy jó helyre mutat-e. Továbbá
engedélyezni kell a SingleLogoutService bejegyzéseket (amelyek alapból
ki vannak iktatva).
A webszerver tanúsítvány előkészítése
A felhasználók által látogatott oldalakhoz célszerű valamilyen
hitelesítés szolgáltató által aláírt tanúsítványt használni. Másoljuk be
a webszerver tanúsítványt, a tanúsítvány láncot és a szerver kulcsot PEM
formátumban egy mappába, majd egyesítsük őket egyetlen p12-es fáljba az
openssl segítségével:
# cat webserver.crt intermediate_ca.crt > cert-chain.txt
# openssl pkcs12 -export -inkey webserver.key -in cert-chain.txt -out idp-browser.p12
Enter Export Password: XXX_secret_XXX
Verifying - Enter Export Password: XXX_secret_XXX
Az előállított idp-browser.p12 fájlt másoljuk be a credentials
mappába.
Microsoft SAML SP metadata és föderációs beállítások
Töltsük le a Microsoft SAML2 SP metaadatait a metadata könyvtárba:
# wget https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml
Készítsünk egy MetadataProvider-t a conf/metadata-providers.xml
fájlban:
A conf/relying-party.xml fájlban néhány speciális beállítást kell
eszközölnünk, hogy a föderáció működjön (a
shibboleth.RelyingPartyOverrides szekció alatt):
Az Office 365 megköveteli a SAML2 NameID használatát, amiben ugyanazt
az értéket várja, mint ami az ImmutableID attribútumban van. Ezt a
conf/saml-nameid.xml fájlban kell beállítani:
LDAP adatforrás beállítása
Mentsük el az LDAP szerver tanúsítványát PEM formátumban a
credentials/ldap-server.crt fájlba.
Az Office 365 két attriútum kiadását kéri: IDPEmail és ImmutableID .
Az IDPEmail értékének meg kell egyeznie a felhasználó Office 365-ös
UserPrincipalName attribútumával (ami egyben a hivatalos (elsődleges)
felhős email címe).
Az ImmutableID esetünkben az eduPerosnPrincilapName MD5 hash
értékének UUID formátumra konvertált változata lesz, amelyet egy
javasccript segítségével képezünk.
Cseréljük le a conf/attribute-resolver.xml fájlt a
conf/attribute-resolver-full.xml nevűvel.
mv conf/attribute-resolver-full.xml conf/attribute-resolver.xml
Az attribute-resolver.xml fájlban beállítunk néhány attribútumot és az
LDAP adatforrást. Az ImmutableID egy Shibboleth ScriptedAttribute
lesz, ami egy javasccript segítségével fogja előállítani az attribútum
értékét az eduPersonPrincipalName LDAP attribútumot felhasználva. Az
MD5 hash kiszámítása külső segítség nélkül történik, ezért a script
kissé hosszú.
Ha anonymous LDAP keresést akarunk használni, akkor a principal és
principalCredential paramétereket törölni kell a myLDAP
DataConnector-ból.
Attribútum kiadás beállítása
Az IdP-nek ki kell adnia az ImmutableID és az IDPEmail
attribútumokat a Microsoft-nak. Ezért létre kell hozni egy új
AttributeFilterPolicy szabályt a conf/attribute-filter.xml fájlban:
A properties fájlok beállításai
conf/idp.properties
idp.session.StorageService = shibboleth.StorageService
idp.session.trackSPSessions = true
idp.session.secondaryServiceIndex = true
conf/ldap.properties
idp.authn.LDAP.ldapURL = ldap://ldap.example.com
idp.authn.LDAP.useStartTLS = true
idp.authn.LDAP.sslConfig = certificateTrust
# idp.authn.LDAP.trustStore = %{idp.home}/credentials/ldap-server.truststore
idp.authn.LDAP.returnAttributes = uid,mail,eduPersonPrincipalName
idp.authn.LDAP.baseDN = ou=People,dc=example,dc=com
idp.authn.LDAP.userFilter = (|(uid={user})(mail={user}))
# idp.authn.LDAP.bindDN = uid=myservice,ou=system
# idp.authn.LDAP.bindDNCredential = myServicePassword
idp.authn.LDAP.dnFormat = uid=%s,ou=People,dc=example,dc=com
conf/saml-nameid.properties
idp.nameid.saml2.default = urn:oasis:names:tc:SAML:2.0:nameid-format:transient
idp.nameid.saml1.default = urn:mace:shibboleth:1.0:nameIdentifier
idp.transientId.generator = shibboleth.CryptoTransientIdGenerator
idp.persistentId.sourceAttribute = eduPersonPrincipalName
idp.persistentId.useUnfilteredAttributes = true
idp.persistentId.salt = XXX_secret_salt_XXX
idp.persistentId.generator = shibboleth.ComputedPersistentIdGenerator
Docker image készítése
Hozzunk létre egy Dockerfile -t ott, ahol a customized-shibboleth-idp
mappa található, az alábbi tartalommal:
FROM unicon/shibboleth-idp
MAINTAINER John Doe
ADD customized-shibboleth-idp/ /opt/shibboleth-idp/
Készítsük el az image fájlt:
docker build -t example-com/idp-shib .
Indítsuk el az új IdP-t. A 4443-as és 8443-as portokat adjuk ki, és ne
feledjük az előzőleg az SSL kulcsok számára beállított jelszavakat sem:
docker run -it --rm
-p 4443:4443
-p 8443:8443
--network bridge
-e JETTY_BROWSER_SSL_KEYSTORE_PASSWORD=XXX_secret_XXX
-e JETTY_BACKCHANNEL_SSL_KEYSTORE_PASSWORD=XXX_secret_XXX
example-com/idp-shib
Hibakeresés
A conf/idp.properties fájlban megadható loglevel beállítások részletes
hibakeresést tesznek lehetővé.
Variable
Default value
Description
idp.loglevel.idp
INFO
Log level for the IdP proper
idp.loglevel.ldap
WARN
Log level for LDAP events
idp.loglevel.messages
INFO
Set to DEBUG for protocol message tracing
idp.loglevel.encryption
INFO
Set to DEBUG to log cleartext versions of encrypted content
idp.loglevel.opensaml
INFO
Log level for OpenSAML library classes
idp.loglevel.props
INFO
Set to DEBUG to log runtime properties during startup
idp.loglevel.spring
ERROR
Log level for Spring Framework (very chatty)
idp.loglevel.container
ERROR
Log level for Tomcat/Jetty (very chatty)
idp.loglevel.xmlsec
INFO
Set to DEBUG for low-level XML Signing/Encryption logging
További leírások
Configure Shibboleth for use with singlesign-on
How to use Shibboleth Identity Provider v3 with Office 365
Cloud365 Domains
Domainek kezdeti konfigurálása
Két szabálynak kell megfelelni:
az Office365 csak olyan domaineken szolgáltat, amelyet az intézmény előtte az adminisztrációs felületen validált
az EduID365 portálon a használt domaineket fel kell venni a portál adminisztrációs felületén. Ennek a lépésnek az Office365 Admin felületen történő beállítása után, ám az első felhasználó belépése előtt meg kell történnie.
Az Office365 alapértelmezetten azt gondolja, hogy az intézmény az adott domain e-mail szolgáltatását is az Office365-re bízza. Amennyiben ez nincs így (márpedig gyakran nincs) az alábbiakat kell tenni:
természetesen nem szabad átállítani a domainhez tartozó MX rekordokat olyan módon, ahogyan a domain beállítási segédlet javasolná;
a validált domainek beállításait módosítani kell
Aldomainek utólagos konfigurálása
Miután az eduID Cloud 365 konfigurálta a fő domaint, újabb domainek hozzáadása már csak PowerShell használatával lehetséges.
Ehhez első lépésként konfigurálni kell egy PowerShell kapcsolatot ahivatkozott leírásszerint . Ezután a következő paranccsal adhatjuk hozzá a domaint:
New-MsolDomain -Name {subdomain}.domain.hu -Authentication Federated
Ezután a lépés után a Cloud 365 portálon is hozzá kell adni az új aldomaint.
A felhasználók domainje
Az alábbi ábra azt mutatja be, hogy a rendszer egyes komponensei milyen adatok alapján dolgoznak:
Office 365
Az Office 365 két attribútumot kaphat:
ImmutableID : ez egy UUID formátumú azonosító, amelyet az eduPersonPrincipalName attribútumból kell generálni MD5 hash használatával
IDPEmail : olvasható azonosító, valamint a felhős levelezésben használt e-mail cím
Az IDPEmail domain részének olyan domainnek kell lennie, amelyet az intézmény az Office365-nél korábban validált. Amennyiben a felhasználó használja az Office365 online mail szolgáltatást, ez a cím kötelezően megegyezik a szolgáltatott e-mail címmel.
hub.eduid.hu
A portál az alábbi attribútumokat várja:
EduPersonPrincipalName : állandó azonosító, amelyből a portál az előző szakaszban leírt módszerrel állítja elő az ImmutableID értékét
eduPersonScopedAffiliation : a felhasználó intézményhez való viszonya; ettől függ az elérhető licencek köre
displayName : a felhasználó megjelenített neve
mail
az az e-mail cím, amelyre a portál a használathoz szükséges értesítéseket küldi (pl. ha a felhasználónak a licencek megtartásához újból be kell jelentkeznie)
amennyiben nem érkezik az opcionális IDPEmail attribútum, akkor ez alapján generálja az Office365 számára ezt az értéket
(opcionális) schacExpiryDate : a felhasználó licenceinek lejárati ideje
(opcionális) IDPEmail : amennyiben az Office365-ben használt e-mail azonosító és az értesítési cím eltér, ebben az attribútumban lehet megadni az Office365-ben használt címet. Ennek domain részére az előző szakaszban kiemelt megjegyzés vonatkozik.