Installazioni disponibili IDP 2.x :: Debian Lenny solo Tomcat Pacchetti da installare • • • • • • • • • openssl; ntp; sun-java6-jdk (non-free); sun-java6-bin (non-free); tomcat5.5; expat (per il parsing di xml); keytool UI; shib-cert.jar; shibboleth-jce-1.0.0.jar Preparare il sistema wget dell'idp wget http://shibboleth.internet2.edu/downloads/shibboleth/idp/2.1.2/shibbolethidentityprovider-2.1.2-bin.tar.gz wget http://shibboleth.internet2.edu/downloads/shibboleth/idp/2.1.2/shibbolethidentityprovider-2.1.2-bin.tar.gz.asc salvare il file http://shibboleth.internet2.edu/downloads/KEYS e poi verificare le firme gpg --import KEYS gpgv --keyring .gnupg/pubring.gpg shibboleth-identityprovider-2.1.2bin.tar.gz.asc preparare la directory di installazione ed installare i file dell'Idp tar xvzf shibboleth-identityprovider-2.1.2-bin.tar.gz cd shibboleth-identityprovider-2.1.2 cp endorsed/* /usr/share/tomcat5.5/common/endorsed/ chmod u+x install.sh Durante l'installazione dovranno essere scelti: • la directory di installazione (default /opt/shibboleth-idp) • la password per la protezione del keystore Impostare i permessi chown tomcat55:nogroup /opt/shibboleth-idp/logs/ chown tomcat55:nogroup /opt/shibboleth-idp/metadata/ chown tomcat55:nogroup /opt/shibboleth-idp/credentials/ Aggiungere in /etc/default/tomcat5.5 JAVA_OPTS="-Djava.awt.headless=true -Xmx512M -XX:MaxPermSize=512M" TOMCAT5_SECURITY=no da aggiungere inoltre in /etc/profile o in .bashrc export JAVA_HOME=/usr/lib/jvm/java-6-sun export CATALINA_HOME=/var/lib/tomcat5.5 Installare Shibboleth Security Provider • copiare la libreria shibboleth-jce-1.0.0.jar, che si trova nella directory lib di shibbolethidentityprovider-2.1.2, nella directory $JAVA_HOME/jre/lib/ext (if you do not have an ext directory, create it.) cp ./lib/shibboleth-jce-1.0.0.jar $JAVA_HOME/jre/lib/ext • Modificare il file java.security, che si trova nella directory $JAVA_HOME/jre/lib/security, aggiungendo la seguente linea dopo l'ultima della sezione security.provider (dove # deve essere sostituto con il primo numero progressivo disponibile): security.provider.#=edu.internet2.middleware.shibboleth.DelegateToApplicationProv ider Specificare per Tomcat l'equivalente di optional_no_ca di Apache 2 • copiare il file shib-cert.jar nella directory $JAVA_HOME/jre/lib/ext cp shib-cert.jar %JAVA_HOME/jre/lib/ext/ • Aggiungere ancora in sequenza il security provider "AnyCertProvider" al file $JAVA_HOME/jre/lib/security/java.security: security.provider.#=edu.internet2.middleware.shibboleth.quickInstallIdp.AnyCertPr ovider Preparare Tomcat La scelta adottata implica l'assenza del server Apache e l'assenza di un servizio in ascolto sulla porta 80 Nella configurazione del file /etc/tomcat5.5/server.xml modificare il numero della porta di ascolto di Tomcat 8080 in 80 e modificare la porta https da 8443 in 443 <Connector port="80" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" /> <Connector port="443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keyAlias="idp2.dominio.it" keystoreFile="/opt/shibbolethidp/credentials/idp2-ssl.jks" keypass="**********" /> Sostituire gli asterischi con la password reale del keystore che potra' essere creato impiegando lo strumento KeyTool UI http://yellowcat1.free.fr/index_ktl.html http://yellowcat1.free.fr/jws/ktl/241/on_ktl_main.jnlp (Java Web Start) Il keystore a cui stiamo facendo riferimento e' differente ed indipendente dal keystore che l'installazione dell'IdP generera' successivamente, che si chiamera' idp.jks e sara' associato alla porta 8443 (scegliete dunque un nome differente da idp.jks). Stiamo per creare il keystore per la configurazione di https sulla porta 443 richiedendo un certificato ad una CA conosciuta dalla maggior parte dei browser e dunque pop-up free per favorire una buona user-experience Per creare il keystore occorre (si deve/puo' fare tutto da un pc con grafica e java jre) : 1. Richiedere un certificato server ad una delle CA accettate (SCS, TCS, ... pop-up free) 2. Preparare due file cert-server-chain.pem e key-server.pem contenenti rispettivamente il certificato corredato dalla catena dei certificati della CA e la chiave privata associata al certificato (ottenuto dal processo eseguito al punto 1) 3. Lanciare il programma grafico KeyTool UI (stand-alone o JWS) 4. Creare un nuovo keystore scegliendo il file di destinazione e la password (ad es. idp-ssl.jks) 5. Importare la chiave privata specificando il file key-server.pem, la catena dei certificati con il file cert-server-chain.pem, il target keystore indicando il file e la password scelta al punto 4. 6. Dopo aver dato OK scegliere un alias per il certificato appena importato all'interno del keystore e proteggerlo con la stessa password del keystore 7. Il keystore appena creato e' disponibile per essere usato dall'Idp copiandolo nella directory /opt/ shibboleth-idp/credentials Assicurarsi che il Connector port="443" punti al keystore appena creato e che la password sia corretta. • Riavviare Tomcat /etc/init.d/tomcat5.5 restart • Connettersi alle porte 80 e 443 http://idp.dominio.it https://idp.dominio.it ottenendo semplici pagine bianche (a meno di non installare il software tomcat-admin o tomcatexamples) • In caso di errore consultare /var/log/tomcat5.5/catalina.<date>.log /opt/shibboleth-idp/logs/idp-process.log Modificare ancora il file /etc/tomcat5.5/server.xml questa volta andando a specificare un connector per la porta del back-channel 8443. La nuova definizione dovra' essere posta come prima o come ultima definizione tra i connector esistenti (80 e 443) <Connector port="8443" maxHttpHeaderSize="8192" maxSpareThreads="75" scheme="https" secure="true" clientAuth="want" SSLEnabled="true" sslProtocol="TLS" keystoreFile="IDP_HOME/credentials/idp.jks" keystorePass="PASSWORD" truststoreFile="IDP_HOME/credentials/idp.jks" truststorePass="PASSWORD" truststoreAlgorithm="DelegateToApplication"/> Sostituire IDP_HOME con la directory in cui e' stato installato l'IdP (by default: /opt/shibboleth-idp) e PASSWORD con la password che avete scelto durante l'installazione per proteggere il keystore. Creare un Context Deployment Fragment Creare il file /var/lib/tomcat5.5/conf/Catalina/localhost/idp.xml <Context docBase="IDP_HOME/war/idp.war" privileged="true" antiResourceLocking="false" antiJARLocking="false" unpackWAR="false" swallowOutput="true" /> Sostituire IDP_HOME con la directory in cui avete installato l'IdP (by default: /opt/shibboleth-idp) Testare l'installazione http://idp.dominio.it/idp/profile/Status (se disponibile la porta 80) https://idp.dominio.it/idp/profile/Status visualizzera' un OK • In caso di errore consultare /var/log/tomcat5.5/catalina.<date>.log /opt/shibboleth-idp/logs/idp-process.log Configurazione dell'IdP File di log utili durante la configurazione: • IDP /opt/shibboleth-idp/logs/idp-process.log • TOMCAT /var/log/tomcat5.5/catalina-<date>.log • LDAP /var/log/ldap.log I log dell'IdP si configurano in conf/logging.xml - Levels: OFF, ERROR, WARN, INFO, DEBUG, TRACE, ALL E' possibile aggiungere in logging.xml anche un logger per gli attributi (non in produzione) <!-- aggiunto per testing --> <logger name="edu.internet2.middleware.shibboleth.common.attribute"> <level value="DEBUG" /> </logger> Quando si lavora con file XML conviene inoltre sempre controllare che siano sintatticamente ben formulati xmlwf conf/<file>.xml Elenco dei file da modificare/personalizzare per attivare l'IdP: relying-party.xml Impostazioni generali del server: profili SAML, certificati digitali, metadati; attribute-resolver.xml Risoluzione degli attributi: definizione dei servizi a cui richiederli (LDAP, db con driver jdbc), definizione degli attributi da estrarre e loro denominazione; attribute-filter.xml Poliche di rilascio degli attributi: definisce quali attributi rilasciare a quali SP; handler.xml enumerazione degli handler esposti; login.config configurazione del login (JAAS). I certificati usati dall'IdP: /opt/shibboleth/credentials/idp.key e /opt/shibboleth/credentials/idp.crt chiave privata e certificato x509 self-signed in formato PEM generate durante l'installazione; /opt/shibboleth/credentials/idp.jks keystore protetto da password contenente la chiave privata e il certificato self-signed del punto precedente; /opt/shibboleth/credentials/idp-ssl.jks keystore che abbiamo creato manualmente per la porta 443 con un certificato pop-up free; cacerts keystore principale di JVM ($JAVA_HOME/jre/lib/security): contiene un set predefinito di Trusted CA. Deve inoltre contenere le CA delle risorse a cui shibboleth accede: metadati, data sources, backend di autenticazione ecc... (passphrase “changeit”). Consultazione di un keystore: • da linea di comando: keytool -list -keystore <keystore>.jks (opz. -v per un dettaglio maggiore) • tool grafico: KeyTool UI idp2:/opt/shibboleth-idp# keytool -list -keystore credentials/idp.jks Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry idp.dominio.it, Jul 16, 2009, PrivateKeyEntry, Certificate fingerprint (MD5): 5F:D2:96:47:29:12:D9:4A:04:50:40:FD:2B:82:D2:71 Modificare il file di configurazione handler.xml (/opt/shibboleth-idp/conf/handler.xml) • commentare il blocco relativo all'endpoint RemoteUser • abilitare il blocco relativo all'endpoint UsernamePassword Modificare il file di configurazione login.config (/opt/shibboleth-idp/conf/login.config) IdPAuthUserPass • esempio di connessione a LDAP senza ssl edu.vt.middleware.ldap.jaas.LdapLoginModule required host="ldap://gt3.fi.infn.it:389" base="dc=garr,dc=it" serviceCredential="password_serviceUser" serviceUser="cn=ldapadmin,dc=garr,dc=it" ssl="false" userField="uid" subtreeSearch="true"; • esempio di connessione a LDAP con ssl edu.vt.middleware.ldap.jaas.LdapLoginModule required host="ldap://gt3.fi.infn.it:636" base="dc=garr,dc=it" serviceCredential="password_serviceUser" serviceUser="cn=ldapadmin,dc=garr,dc=it" ssl="true" userField="uid" subtreeSearch="true"; Gestire l'attributo eduPersonTargetedID come tipo StoredId 1. installare mysql 2. installare libmysql-java 3. ln -s /usr/share/java/mysql-connector-java.jar /usr/share/tomcat5.5/common/lib/ 4. ln -s /usr/share/java/mysql-connector-java.jar $IDP_HOME/lib/ 5. creare il DB mysql> create database userdb; Query OK, 1 row affected (0.00 sec) mysql> grant all privileges on userdb.* to ’idp_user’@’localhost’ identified by ’some_passwd’; Query OK, 0 rows affected (0.00 sec) CREATE TABLE shibpid ( localEntity VARCHAR(255) NOT NULL, peerEntity VARCHAR(255) NOT NULL, principalName VARCHAR(255) NOT NULL, localId VARCHAR(255) NOT NULL, persistentId VARCHAR(255) NOT NULL, peerProvidedId VARCHAR(255) NULL, creationDate TIMESTAMP NOT NULL, deactivationDate TIMESTAMP NULL, KEY persistentId (persistentId), KEY persistentId_2 (persistentId, deactivationDate), KEY localEntity (localEntity(16), peerEntity(16),localId), KEY localEntity_2 (localEntity(16), peerEntity(16), localId, deactivationDate) ); Modificare il file attribute-resolver.xml • Attribute Definitions (decommentare tutti gli attributi o solo quelli necessari, facendo attenzione a mantenere 1 solo eduPersonTargetedID) <resolver:AttributeDefinition id="eduPersonTargetedID" xsi:type="SAML2NameID" xmlns="urn:mace:shibboleth:2.0:resolver:ad" nameIdFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" sourceAttributeID="persistentID"> <resolver:Dependency ref="myStoredID" /> <resolver:AttributeEncoder xsi:type="SAML1XMLObject" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" /> <resolver:AttributeEncoder xsi:type="SAML2XMLObject" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" friendlyName="eduPersonTargetedID" /> </resolver:AttributeDefinition> • Data Connectors (personalizzare la connessione a LDAP e al DB per eduPersonTargetedID) <resolver:DataConnector id="myLDAP" xsi:type="LDAPDirectory" xmlns="urn:mace:shibboleth:2.0:resolver:dc" ldapURL="ldap://gt3.fi.infn.it" baseDN="dc=garr,dc=it" principal="cn=ldapadmin,dc=garr,dc=it" principalCredential="password_principal"> <FilterTemplate> <![CDATA[ (uid=$requestContext.principalName) ]]> </FilterTemplate> </resolver:DataConnector> <resolver:DataConnector xsi:type="StoredId" xmlns="urn:mace:shibboleth:2.0:resolver:dc" id="myStoredID" sourceAttributeID="uid" generatedAttributeID="persistentID" salt="q9Kk/8_#0mQv:\bsui(V:\fL;eP9Cq"> <resolver:Dependency ref="myLDAP" /> <ApplicationManagedConnection jdbcDriver="com.mysql.jdbc.Driver" jdbcURL="jdbc:mysql://localhost:3306/userdb" jdbcUserName="idp_user" jdbcPassword="password_idp_user" /> </resolver:DataConnector> Modificare il file attribute-filter.xml • slides del corso InstallFest di SWITCH attribute_filtering.ppt • guida di Internet2 IdPAddAttributeFilter • esempio che rilascia vari attributi a tutti <AttributeFilterPolicyGroup id="ShibbolethFilterPolicy" xmlns="urn:mace:shibboleth:2.0:afp" xmlns:basic="urn:mace:shibboleth:2.0:afp:mf:basic" xmlns:saml="urn:mace:shibboleth:2.0:afp:mf:saml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mace:shibboleth:2.0:afp classpath:/schema/shibboleth-2.0-afp.xsd urn:mace:shibboleth:2.0:afp:mf:bas ic classpath:/schema/shibboleth-2.0-afp-mf-basic.xsd urn:mace:shibboleth:2.0:afp:mf:sam l classpath:/schema/shibboleth-2.0-afp-mf-saml.xsd"> <!-- Release the transient ID to anyone --> <AttributeFilterPolicy id="releaseTransientIdToAnyone"> <PolicyRequirementRule xsi:type="basic:ANY" /> <AttributeRule attributeID="transientId"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> </AttributeFilterPolicy> <!-- Release information to anyone --> <AttributeFilterPolicy id="attributesToAnyone"> <PolicyRequirementRule xsi:type="basic:ANY" /> <AttributeRule attributeID="commonName"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="uid"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="email"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="surname"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="organizationName"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="organizationalUnit"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="givenName"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="preferredLanguage"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="eduPersonAffiliation"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="eduPersonEntitlement"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="eduPersonOrgUnitDN"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="eduPersonPrimaryAffiliation"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="eduPersonPrincipalName"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="eduPersonScopedAffiliation"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> <AttributeRule attributeID="eduPersonTargetedID"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> </AttributeFilterPolicy> Modificare il file relying-party.xml • esempio per parlare con uno specifico SP IdPSPLocalTestInstall • entrare in una federazione come IDEM 1. inviare il proprio frammento idp-metadata.xml alla federazione 2. scaricare i metadati firmati e aggiornati (in cui sia incluso il proprio idp) 3. installare il certificato con cui i metadati sono stati firmati