Installare l`IDP 2.x su Debian Lenny con solo

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