===== 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