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.