===== Shibboleth IdP ===== Stiahneme a rozbalíme inštalačný balíček: wget https://shibboleth.net/downloads/identity-provider/3.4.1/shibboleth-identity-provider-3.4.1.tar.gz tar -xzf shibboleth-identity-provider-3.4.1.tar.gz Spustíme inštaláciu: ./shibboleth-identity-provider-3.4.1/bin/install.sh Výstup: Source (Distribution) Directory (press to accept default): [/root/shibboleth-identity-provider-3.4.1] Installation Directory: [/opt/shibboleth-idp] Hostname: [demoidp.sanet.sk] SAML EntityID: [https://demoidp.sanet.sk/idp/shibboleth] Attribute Scope: [sanet.sk] Backchannel PKCS12 Password: Re-enter password: Cookie Encryption Key Password: Re-enter password: Warning: /opt/shibboleth-idp/bin does not exist. Warning: /opt/shibboleth-idp/edit-webapp does not exist. Warning: /opt/shibboleth-idp/dist does not exist. Warning: /opt/shibboleth-idp/doc does not exist. Warning: /opt/shibboleth-idp/system does not exist. Generating Signing Key, CN = demoidp.sanet.sk URI = https://demoidp.sanet.sk/idp/shibboleth ... ...done Creating Encryption Key, CN = demoidp.sanet.sk URI = https://demoidp.sanet.sk/idp/shibboleth ... ...done Creating Backchannel keystore, CN = demoidp.sanet.sk URI = https://demoidp.sanet.sk/idp/shibboleth ... ...done Creating cookie encryption key files... ...done Rebuilding /opt/shibboleth-idp/war/idp.war ... ...done BUILD SUCCESSFUL Total time: 3 minutes 8 seconds Presunieme inštalačný adresár do ''/opt'' (zatial neviem načo) a nastavíme opravnenia: mv shibboleth-identity-provider-3.4.1 /opt/ chown -R idp:idp /opt/shibboleth-id* Reštartujeme Jetty, servlet by sa mal nahrať: systemctl restart jetty Stav IdP môžeme zobraziť príkazom: /opt/shibboleth-idp/bin/status.sh Funkčnost je možné overiť aj zobrazením stránky v prehliadači: https://demoidp.sanet.sk/idp ===== Konfigurácia IdP ===== Prepnúť sa na používateľa idp: su - idp Aby Shibboleth poznal cestu k Jave aj pod neprivilegovaným učtom musíme ju špecifikovať: JAVA_HOME=/usr/java/latest /opt/shibboleth-idp/bin/reload-service.sh -id shibboleth.ReloadableAccessControlService ==== conf/idp.properties ==== V konfigurácii idp nastavíme premennú ''idp.cookie.secure'' na true (odkomentovať a zmeniť na true): vim /opt/shibboleth-idp/conf/idp.properties idp.cookie.secure = true a reštartujeme jetty (ako root) systemctl restart jetty ==== conf/access-control.xml ==== Tu je možné obmedziť prístup k stránkam so špeciálnou funkcionalitou (pre adminov): vim /opt/shibboleth-idp/conf/access-control.xml ... Znovunačitame konfigurácie (pokiaľ robíme pod userom idp musíme stále zadávať JAVA_HOME): JAVA_HOME=/usr/java/latest /opt/shibboleth-idp/bin/reload-service.sh -id shibboleth.ReloadableAccessControlService Teraz by malo byť možné z vybraných IP zobraziť napríklad info o stave idp: https://demoidp.sanet.sk/idp/status ==== conf/ldap.properties ==== Zaitaľ sa mi nepodarilo nakonfigurovať IdP tak aby mu stačilo spojenie s LDAP bez SSL. Možno je to bug: http://shibboleth.net/pipermail/users/2015-August/023536.html Pre použitie SSL treba stiahnuť ssl certifikat z LDAP servera: openssl s_client -showcerts -connect io.fpv.umb.sk:636 /dev/null|openssl x509 -outform PEM > /opt/shibboleth-idp/credentials/ldap-server.crt vim /opt/shibboleth-idp/conf/ldap.properties idp.authn.LDAP.authenticator = bindSearchAuthenticator idp.authn.LDAP.ldapURL = ldaps://ldap.umb.sk:636 idp.authn.LDAP.useStartTLS = false idp.authn.LDAP.useSSL = true idp.authn.LDAP.connectTimeout = PT3S idp.authn.LDAP.responseTimeout = PT3S idp.authn.LDAP.sslConfig = certificateTrust idp.authn.LDAP.trustCertificates = %{idp.home}/credentials/ldap-server.crt idp.authn.LDAP.baseDN = ou=users,dc=ldap,dc=umb,dc=sk idp.authn.LDAP.subtreeSearch = true idp.authn.LDAP.userFilter = (uid={user}) idp.authn.LDAP.bindDN = cn=demoidp,ou=system,ou=users,dc=ldap,dc=umb,dc=sk idp.authn.LDAP.bindDNCredential = ------- heslo pre ldap usera ------- idp.attribute.resolver.LDAP.ldapURL = %{idp.authn.LDAP.ldapURL} idp.attribute.resolver.LDAP.connectTimeout = %{idp.authn.LDAP.connectTimeout:PT3S} idp.attribute.resolver.LDAP.responseTimeout = %{idp.authn.LDAP.responseTimeout:PT3S} idp.attribute.resolver.LDAP.baseDN = %{idp.authn.LDAP.baseDN:undefined} idp.attribute.resolver.LDAP.bindDN = %{idp.authn.LDAP.bindDN:undefined} idp.attribute.resolver.LDAP.bindDNCredential = %{idp.authn.LDAP.bindDNCredential:undefined} idp.attribute.resolver.LDAP.useStartTLS = %{idp.authn.LDAP.useStartTLS:true} idp.attribute.resolver.LDAP.trustCertificates = %{idp.authn.LDAP.trustCertificates:undefined} idp.attribute.resolver.LDAP.searchFilter = (uid=$resolutionContext.principal) ==== conf/metadata-providers.xml ==== vim /opt/shibboleth-idp/conf/metadata-providers.xml Stiahnuť verejný kľúč pre kontrolu podpisu metadát: cd /opt/shibboleth-idp/credentials wget https://www.safeid.sk/metadata/cert/SAFEID_metadata_signer.pem Reštart služby pre načítanie metadát: JAVA_HOME=/usr/java/latest /opt/shibboleth-idp/bin/reload-service.sh -id shibboleth.MetadataResolverService Kontrola, či sa metadata stiahli: ls -l /opt/shibboleth-idp/metadata/ Vo výpise by sa mal nachádzať súbor ''safeid.xml'' s aktuálnym časom vytvorenia. ==== conf/attribute-resolver.xml ==== cd /opt/shibboleth-idp/conf mv attribute-resolver-ldap.xml attribute-resolver.xml > TODO: Doplnit alebo nalinkovat obsah suboru attribute-resolver.xml ==== conf/attribute-filter.xml ==== Tu definujeme, ktoré atribúty budeme uvolnovať a komu. vim /opt/shibboleth-idp/conf/attribute-filter.xml > TODO: Doplnit alebo nalinkovat obsah suboru attribute-filter.xml ==== metadata/idp-metadata.xml ==== Tu treba doplniť metadata. vim /opt/shibboleth-idp/metadata/idp-metadata.xml > TODO: Doplnit alebo nalinkovat obsah suboru idp-metadata.xml Po reštarte jetty budú metadata dostupné na adrese https://demoisp.sanet.sk/idp/shibboleth. Metadata je potrebné validovať vo validátore: https://mdr.safeid.sk/saml-validator/ ===== Persistentný identifikátor / eduPersonTargetedID ===== Identifikátor sa generuje pre každý pár používateľ-služba a slúži na ochranu súkromia používatela (služba zároveň vie, že sa jedná o rovnakého používateľa). Kedže sa pre každú sluzbu generuje iný identifikátor a tento identifikátor je nahodny reťazec, nie je jednoducho možne pre prevádzkovateľa služby používateľa identifikovať ale zároven to umožäuje zo strany služby ukladať rôzne personalizované nastavenia atď. V tom je hlavný rozdiel oproti identifikátoru ''eduPersonPrinciaplName'', ktorý má spravidla hodnotu ''login@domena''. Podpora pre túto funkcionalitu nie je povinná, ale je doporučovaná. Podobný efekt je možné dosiahnuť používaním generovaného čísla namiesto loginu používateľa v ''eduPersonPrinciaplName''. Samorejme to stráca zmysel ak spolu s týmto identifikátorom posielame ďalšie údaje ako meno, mail atď. Navyše niektoré z konfigurašnych krokov, ktoré budú potrebné pre jeho spravádzkovanie bude potrebné aj tak urobiž kvôli ukladaniu súhlasov s poskytovaním atribútov. Pre ukladanie údajov je odporúčané použiť databázu MySQL (nie MariaDB). ==== MySQL ==== Nainštalovať repozitár od Oracle - MySQL server: yum install https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm yum update yum install mysql-community-server Spustiť server: systemctl enable mysqld systemctl startmysqld Po spustení server vygeneruje heslo pre roota, ktoré sa nachádza v logu: cat /var/log/mysqld.log | grep password Spustíme procedúru pre zabezpečenie databazy, v rámci ktorej zmeníme heslo pre roota (pozor, mysql8 má štandardne aktívne dosť prísne požiadavky na zložitosť hesla). Aby sa nám s DB ľahšie pracovalo môžeme uložiť prihlasovacie údaje do súboru ''.my.cnf'': vim /root/.my.cnf obsah súboru: [client] user=root password="4T............1I" Nastavíme oprávnenia pre súbor: chmod go-rwx .my.cnf Prihlásime sa do cmd clienta a spustíme SQL príkazy pre vytvorenie databázy a používateľa (nezabudneme na silné heslo): mysql SET NAMES 'utf8'; SET CHARACTER SET utf8; CHARSET utf8; CREATE DATABASE IF NOT EXISTS shibboleth CHARACTER SET=utf8; CREATE USER 'shibboleth'@'localhost' IDENTIFIED BY 'jeGYjU....hFf7S'; GRANT ALL ON shibboleth.* TO 'shibboleth'@'localhost'; FLUSH PRIVILEGES; Vytvoríme novú tabuľku v datábaze shibboleth: USE shibboleth; CREATE TABLE IF NOT EXISTS `shibpid` ( `localEntity` VARCHAR(255) NOT NULL, `peerEntity` VARCHAR(255) NOT NULL, `principalName` VARCHAR(255) NOT NULL DEFAULT '', `localId` VARCHAR(255) NOT NULL, `persistentId` VARCHAR(50) NOT NULL, `peerProvidedId` VARCHAR(255) DEFAULT NULL, `creationDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deactivationDate` TIMESTAMP NULL DEFAULT NULL, PRIMARY KEY (localEntity, peerEntity, persistentId) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Doinštalujeme knižnice do Jetty: http://tux.rainside.sk/apache//commons/dbcp/binaries/commons-dbcp2-2.5.0-bin.tar.gz http://tux.rainside.sk/apache//commons/pool/binaries/commons-pool2-2.6.0-bin.tar.gz https://search.maven.org/remotecontent?filepath=commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-8.0.13.tar.gz > TODO: Momentalne to bezi so starsimi kniznicami: https://search.maven.org/remotecontent?filepath=org/apache/commons/commons-dbcp2/2.1.1/commons-dbcp2-2.1.1.jar https://search.maven.org/remotecontent?filepath=org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2.jar Keďže MySQL je v aktuálnej verzii 8, driver musí byť tieť "najnovší" ''mysql-connector-java-8.0.13.tar.gz''. Archívy treba porozbaľovať a potom skopírovať súbory: cp commons-dbcp2-2.5.0/commons-dbcp2-2.5.0.jar /opt/jetty/lib/ext/ cp commons-pool2-2.6.0/commons-pool2-2.6.0.jar /opt/jetty/lib/ext/ cp commons-logging-api-1.1.jar /opt/jetty/lib/ext/ cp mysql-connector-java-8.0.13/mysql-connector-java-8.0.13.jar /opt/jetty/lib/ext/ chown idp:idp /opt/jetty/lib/ext/* ==== Konfigurácia IdP ==== vim /opt/shibboleth-idp/conf/attribute-resolver.xml Doplniť nový atribút: A nový data konektor: shibboleth.MySQLDataSource Konfiguračný súbor uložíme. Vygenerujeme salt pomocou príkazu: openssl rand -base64 36 2>/dev/null Vystup vyzerá napríklad takto: LdudV6JOJDzQOaF/4a75mApxsIFf7LVbjdgG3ME3hh7saPJw Dodefinujeme potrebné beany v ''global.xml'' vim /opt/shibboleth-idp/conf/global.xml Nový atribút zaradíme aj do konfigurácie filtrov ''attribute-filter.xml''. Keďže sa jedná o anonymný atribút, môžeme ho sprístupnovať všetkým. vim /opt/shibboleth-idp/conf/attribute-filter.xml Upravíme súbor ''saml-nameid.properties'': vi /opt/shibboleth-idp/conf/saml-nameid.properties Doplníme potrebné atribúty (odkazy na beany a salt): idp.persistentId.generator = shibboleth.StoredPersistentIdGenerator idp.persistentId.dataSource = shibboleth.MySQLDataSource idp.persistentId.sourceAttribute = uid idp.persistentId.salt = LdudV6JOJDzQOaF/4a75mApxsIFf7LVbjdgG3ME3hh7saPJw Ďalej upravíme konfiguráciu v ''saml-nameid.xml'' vim /opt/shibboleth-idp/conf/saml-nameid.xml V sôbore odkomentujeme tento riadok: Ďalej upravíme súbor: vim /opt/shibboleth-idp/conf/idp.properties V súbore doplníme riadok: idp.consent.StorageService = shibboleth.JPAStorageService Ešte ostáva upraviť súbor ''subject-c14n.xml'': vim /opt/shibboleth-idp/conf/c14n/subject-c14n.xml V súbore odkomentujeme riadok: V metadatach budeme oznamovaž, že IdP podporuje persistentný identifikátor: vim /opt/shibboleth-idp/metadata/idp-metadata.xml Do elementu ''IDPSSODescriptor'' pridáme element (napríklad za element ): urn:oasis:names:tc:SAML:2.0:nameid-format:persistent Vygenerujeme nový WAR súbor a reľtartujeme Jetty: /opt/shibboleth-idp/bin/build.sh systemctl restart jetty ===== Úprava prihlasovacej stránky ===== > TODO