Idp con shibboleth2 su Debian
Panoramica su shibboleth2.1
Secondo il nuovo standard:
- si usa solo tomcat (senza apache);
- per la firma e la cifratura dei messaggi con gli SP si usa un certificato self-signed creato all'atto dell'installazione.
Per usare tomcat senza apache, è necessario installare le APR per migliori prestazioni e per evitare di mettere il certificato digitale nel keystore, inoltre bisogna scegliere una porta elevata (sopra la 1024), per non eseguire tomcat come root. D'altra parte le APR dano alcuni problemi, tra cui:
- l'aggiornamento è problematico
- nei log non si riconoscono più gli attributi passati
- sulla mailing list si lamentano anomalie e malfunzionamenti di questa configurazione
Anche se si usa un certificato self-signed per le comunicazioni idp/sp, è necessario un certificato reale per la location di autenticazione (dove giunge il browser dell'utente).
Istruzioni migliori di queste si trovano a: https://www.switch.ch/aai/docs/shibboleth/SWITCH/2.1/idp/install-idp-2.1-debian.html
Installare Tomcat
ATTENZIONE: installare tomcat6 dai sorgenti se si installa una versione di shibboleth superiore alla 2.1.2
apt-get install sun-java5-jdk sun-java5-bin tomcat5.5
PS in /etc/apt/sources.list abilitare contrib non-free Potrebbe essere utile settare alcune variabili di ambiente in /etc/profile:
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun export CATALINA_HOME=/usr/share/tomcat5.5
Come misura di prudenza verificare che non ci siano altre versioni di java installate: il comando
update-alternatives --display java
deve confermare che java è un link a /usr/lib/jvm/java-1.5.0-sun/jre/bin/java in caso contrario, lanciare update-alternatives --config java (e poi anche keytool ecc.)
Ricordarsi di modificare in /etc/default/tomcat (conf per server con 1GB di RAM)
TOMCAT5_SECURITY=no CATALINA_OPTS="-Djava.awt.headless=true -Xmx512M -XX:MaxPermSize=256M -server"
Installare le APR (non so se è il caso, pensarci bene!)
Le Apache Portable Runtime
- aumentano le prestazioni di tomcat55 in certe situazioni
- permettono di servire connessioni ssl con le openssl e non con JSSE
Prerequisiti:
- libapr1-dev
- openssl-dev
Il sito del download e':
http://tomcat.heanet.ie/native/
Istruzioni:
http://tomcat.apache.org/native-doc/
Stringa del configure (in jni/native)
./configure --with-apr=/usr/bin/apr-1-config --prefix=/usr/share/tomcat5.5
Lanciare make e sudo make install e modificare in /etc/default/tomcat5.5:
CATALINA_OPTS="-Djava.library.path=/usr/lib:/usr/share/tomcat5.5/lib -Djava.awt.headless=true -Xmx512M -XX:MaxPermSize=256M -server"
Installare e configurare apache2
apt-get install apache2 a2enmod ssl a2enmod proxy_ajp
File da modificare:
/etc/apache2/mods-enables/proxy.conf
togliere il deny all
Aggiungere "Listen 443" a /etc/apache2/ports Creare /etc/apache2/sites-available/ssl
<VirtualHost _default_:443> # General setup for the virtual host DocumentRoot "/var/www/" ServerAdmin support_security@unimore.it ErrorLog "/var/log/apache2/ssl-error.log" TransferLog "/var/log/apache2/ssl-access.log" # SSL Engine Switch: # Enable/Disable SSL for this virtual host. SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile "/etc/ssl/certs/idp.pem" SSLCertificateKeyFile "/etc/ssl/private/idp.key" #SSLCertificateChainFile "/etc/ssl/certs/scs-chain.pem" #SSLCACertificateFile "/etc/ssl/certs/cacerts.pem" #SSLCACertificateFile "/usr/local/etc/apache22/ssl.crt/ca-bundle.crt" #SSLCARevocationPath "/usr/local/etc/apache22/ssl.crl" #SSLCARevocationFile "/usr/local/etc/apache22/ssl.crl/ca-bundle.crl" # Client Authentication (Type): # Client certificate verification type and depth. Types are # none, optional, require and optional_no_ca. Depth is a # number which specifies how deeply to verify the certificate # issuer chain before deciding the certificate is not valid. #SSLVerifyClient require #SSLVerifyDepth 10 #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> BrowserMatch ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 ProxyPass /idp/ ajp://localhost:8009/idp/ </VirtualHost>
Lanciare
a2ensite ssl
Installare shibboleth
- https://spaces.internet2.edu/display/SHIB2/IdPInstall
- https://spaces.internet2.edu/display/SHIB2/IdPApacheTomcatPrepare
- https://spaces.internet2.edu/display/SHIB2/JVMTuning
Configurare Shibboleth
Copiare i jar della cartella $SHIB_SRC/endorsed in /usr/share/tomcat5.5/common/endorsed dopo averne svuotato il contenuto.
Dare proprieta' a tomcat55 sulle cartelle:
- logs
- conf
- credentials
- metadata
Chiavi e metadata
Editare $IDP_HOME/conf/relying_party.xml per includere la stessa chiave e certificato usata per lo https e per scaricare i metadati via https (metadati di unimore):
<MetadataProvider id="URLMD" xsi:type="FileBackedHTTPMetadataProvider" xmlns="urn:mace:shibboleth:2.0:metadata" metadataURL="https://shibboleth.unimore.it/inner-metadata.xml" backingFile="/opt/shibboleth-idp/metadata/inner-metadata.xml"> <MetadataFilter xsi:type="ChainingFilter" xmlns="urn:mace:shibboleth:2.0:metadata"> <MetadataFilter xsi:type="RequiredValidUntil" xmlns="urn:mace:shibboleth:2.0:metadata" maxValidityInterval="604800" /> <MetadataFilter xsi:type="SignatureValidation" xmlns="urn:mace:shibboleth:2.0:metadata" trustEngineRef="shibboleth.MetadataTrustEngine" requireSignedMetadata="true" /> <MetadataFilter xsi:type="EntityRoleWhiteList" xmlns="urn:mace:shibboleth:2.0:metadata"> <RetainedRole>samlmd:SPSSODescriptor</RetainedRole> </MetadataFilter> </MetadataFilter> </MetadataProvider> </MetadataProvider> <security:Credential id="IdPCredential" xsi:type="security:X509Filesystem"> <security:PrivateKey>/etc/ssl/private/idp.key</security:PrivateKey> <security:Certificate>/etc/ssl/certs/idp.pem</security:Certificate> </security:Credential> <security:TrustEngine id="shibboleth.MetadataTrustEngine" xsi:type="security:StaticExplicitKeySignature"> <security:Credential id="MyFederation1Credentials" xsi:type="security:X509Filesystem"> <security:Certificate>/opt/shibboleth-idp/credentials/garrcert015e.bundle</security:Certificate> </security:Credential> </security:TrustEngine>
Importare le CA nel keystore:
sudo keytool -import -trustcacerts -file /etc/ssl/certs/europki-ca-chain.pem \\ -keystore $IDP_HOME/credentials/idp.jks -alias "europki-chain" sudo keytool -import -trustcacerts -file /etc/ssl/certs/scs-chain.pem \\ -keystore $IDP_HOME/credentials/idp.jks -alias "scs-chain"
(ho dei dubbi che quest'ultimo passo sia inutile).
login.config
Abilitare l'autenticazione ldap:
ShibUserPassAuth { edu.vt.middleware.ldap.jaas.LdapLoginModule required host="ldap1.unimore.it" base="ou=people,dc=unimore,dc=it" tsl="true" userField="uid"; }
decommentare in handler.xml la sezione relativa a Username/password login handler e commentare la sezione dell'autenticazione con il REMOTE_USER.
Potrebbe essere utile aggiungere in relying-party.xml la riga del defaultAuthenticationMethod:
<DefaultRelyingParty provider="https://idp.unimore.it/idp/shibboleth" defaultAuthenticationMethod="urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" defaultSigningCredentialRef="IdPCredential">
Aggiungere i certificati delle europki al portachiavi principale java:
sudo keytool -import -trustcacerts -file /etc/ssl/certs/europki-ca-chain.pem -keystore /etc/java-1.5.0-sun/security/cacerts -alias "europki"
se non e' stata cambiata, la passwd di default è changeit.
StoredID connector
https://spaces.internet2.edu/display/SHIB2/ResolverStoredIDDataConnector
Installare i driver jdbc per mysql
Scaricare i driver mysql per java:
mysql-connector-java-5.1.6.tar.gz
copiare mysql-connector-java-5.1.6-bin.jar in $IDP_SRC/lib e ricreare il war:
$IDP_SRC/ant.sh
Oppure:
apt-get install libmysql-java ln -s /usr/share/java/mysql-connector-java.jar /usr/share/tomcat5.5/common/lib/ ln -s /usr/share/java/mysql-connector-java.jar $IDP_HOME/lib/
Il seconco link soffice serve per far funzionare aacli.sh
Creare il database
Creare un db mysql con i comandi:
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)
Creare la tabella con:
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 attribute-resolver.xml
Aggiungere su attribute-resolver.xml le sezioni:
<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> <resolver:DataConnector xsi:type="StoredId" xmlns="urn:mace:shibboleth:2.0:resolver:dc" id="myStoredID" sourceAttributeID="commonName" generatedAttributeID="persistentID" salt="c3AuZXVyb3BraS5vcmc6ODAyNjAiBggrBgEFBQcwAoYWaHR0cDo"> <resolver:Dependency ref="ldap1" /> <ApplicationManagedConnection jdbcDriver="com.mysql.jdbc.Driver" jdbcURL="jdbc:mysql://localhost:3306/userdb" jdbcUserName="idp_user" jdbcPassword="some_passwd" /> </resolver:DataConnector>
aacli.sh
E' lo strumento per il test da linea di comando dell'attribute resolver:
sudo sh bin/aacli.sh --configDir=conf --principal=malvezzi --requester=https://www.cigs.unimore.it/shibboleth --issuer=https://idp.unimore.it/idp/shibboleth
Potrebbe essere necessari aggiungere in cima allo script:
JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
per poterlo lanciare con sudo.