Idp con shibboleth2 su Debian

Da sia.
Versione del 22 ott 2009 alle 10:49 di Malvezzi (discussione | contributi) (→‎Installare Tomcat)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Vai alla navigazione Vai alla ricerca

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

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.