Differenze tra le versioni di "SAML-Subject-ID-Attribute"

Da WIKI IDEM GARR.
Jump to navigation Jump to search
m (Vaghetti@garr.it ha spostato la pagina IDEM-OPS:SAML-Subject-ID-Attribute a SAML-Subject-ID-Attribute)
 
(49 versioni intermedie di 3 utenti non mostrate)
Riga 1: Riga 1:
==Configurazione per Shibboleth==
+
==Identificatori utente nella Federazione IDEM==
 +
Dal 2019, con la pubblicazione del documento ''"SAML V2.0 Subject Identifier Attributes Profile Version 1.0"'' <nowiki>[SAML-SubjectID-v1.0]</nowiki>, sono stati introdotti due nuovi attributi standard per SAML 2.0 al fine di identificare gli utenti e risolvere molti dei problemi legati agli identificatori SAML 2.0 già in uso.
 +
 
 +
Il documento SAML-SubjectID-v1.0 definisce due attributi con NameFormat URI da utilizzare come identificatori utenti:
 +
 
 +
*'''<code>urn:oasis:names:tc:SAML:attribute:subject-id</code>''': un identificatore generale e globalmente univoco (vedi la sezione Definizione per maggiori dettagli).
 +
 
 +
*'''<code>urn:oasis:names:tc:SAML:attribute:pairwise-id</code>''': un identificatore specifico per il servizio a cui è rilasciato (vedi la sezione Definizione per maggiori dettagli).
 +
 
 +
 
 +
I nuovi identificatori si vanno ad aggiungere agli identificatori già supportati e permessi nella Federazione IDEM, ovvero:
 +
 
 +
#Attributi SAML (provenienti dallo schema [https://wiki.refeds.org/display/STAN/eduPerson eduPerson]):
 +
#*<code>eduPersonPrincipalName</code>
 +
#*<code>eduPersonUniqueID</code>
 +
#*<code>eduPersonTargetedID</code> ('''deprecato, ma ancora utilizzato da alcuni servizi'''; assume normalmente lo stesso valore del NameID di tipo '''persistent''<nowiki/>': <code><nowiki>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</nowiki></code>)
 +
#<code><saml2:NameID></code> Name Identifiers nel <code><saml2:Subject></code> dell'asserzione SAML nei formati:
 +
#*<code><nowiki>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</nowiki></code> ('''SAML Persistent NameID)'''
 +
#*<code><nowiki>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</nowiki></code> ('''SAML Transient NameID)'''
 +
 
 +
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
 +
 
 +
<br />
 +
 
 +
==Definizione==
 +
===Attributo SAML2 Subject ID===
 +
Identificatore di individuo unico e globale per tutti i relying party/SP.
 +
 
 +
Le sue caratteristiche sono:
 +
 
 +
*Indipendente dal relying party/SP a cui viene rilasciato
 +
*Di lunga durata nel tempo
 +
*Non riassegnabile ad altri individui
 +
*Opaco (non può contenere informazioni sull'individuo)
 +
 
 +
 
 +
<u>L'attributo è destinato a sostituire identificatori generali come <code>eduPersonUniqueID</code> e <code>eduPersonPrincipalName</code></u>
 +
 
 +
====Sintassi====
 +
Il valore è costituito da due sottostringhe (<code>unique ID</code> e <code>scope</code>) separate dal simbolo <code>@</code> (ASCII 64).
 +
 
 +
Lo <code>unique ID</code> è un valore alfanumerico di massimo 127 caratteri che può contenere il simbolo di uguale (<code>=</code> ASCII 61) o il simbolo del trattino (<code>-</code> ASCII 45). DEVE iniziare con un carattere alfanumerico.
 +
 
 +
Lo scope è un valore alfanumerico di massimo 127 caratteri che può contenere il simbolo del punto (<code>.</code> ASCII 46) o il simbolo del trattino (<code>-</code> ASCII 45). DEVE iniziare con un carattere alfanumerico.
 +
 
 +
La grammatica ABNF [RFC2234] è:
 +
<value> = <uniqueID> "@" <scope>
 +
<uniqueID> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "=" / "-")
 +
<scope> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "-" / ".")
 +
 
 +
====Esempio====
 +
Valore dell'attributo:
 +
 
 +
<code>idm123-456789=@example.com</code>
 +
 
 +
Codifica SAML 2.0:<syntaxhighlight lang="xml">
 +
<saml:Attribute Name="urn:oasis:names:tc:SAML:attribute:subject-id"
 +
      NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
 +
    <saml:AttributeValue>idm123-456789=@example.com</saml:AttributeValue>
 +
</saml:Attribute>
 +
</syntaxhighlight>
 +
 
 +
 
 +
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
 +
 
 +
===Attributo SAML2 Pairwise ID===
 +
Identificatore di individuo specifico per ciascun relying party/SP.
 +
 
 +
Le sue caratteristiche sono:
 +
 
 +
*Dipendente dal relying party/SP a cui viene rilasciato
 +
*Di lunga durata nel tempo
 +
*Non riassegnabile ad altri individui
 +
*Opaco (non può contenere informazioni sull'individuo)
 +
 
 +
 
 +
<u>L'attributo è destinato a sostituire identificatori ''targeted'' come <code>eduPersonTargetedID</code> ed il <code><saml2:NameID></code> di tipo ''persistent''.</u>
 +
 
 +
====Sintassi====
 +
Il valore è costituito da due sottostringhe (<code>unique ID</code> e <code>scope</code>) separate dal simbolo <code>@</code> (ASCII 64).
 +
 
 +
Lo <code>unique ID</code> è un valore alfanumerico di massimo 127 caratteri che può contenere il simbolo di uguale (<code>=</code> ASCII 61) o il simbolo del trattino (<code>-</code> ASCII 45). DEVE iniziare con un carattere alfanumerico.
 +
 
 +
Lo scope è un valore alfanumerico di massimo 127 caratteri che può contenere il simbolo del punto (<code>.</code> ASCII 46) o il simbolo del trattino (<code>-</code> ASCII 45). DEVE iniziare con un carattere alfanumerico.
 +
 
 +
La grammatica ABNF [RFC2234] è:
 +
<value> = <uniqueID> "@" <scope>
 +
<uniqueID> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "=" / "-")
 +
<scope> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "-" / ".")
 +
 
 +
====Esempio====
 +
Valore dell'attributo:
 +
 
 +
<code>HA2TKNZZGE2TOZDCGMZWKOLDHBQWIMBSGM4TGZBYGUYGINRQHAYTINBZGYZDOZBZMZRGKNZTME3TMNBXGYYTIOBYGMYWKNLFMYYDAYY=@osu.edu</code>
 +
 
 +
Codifica SAML 2.0:<syntaxhighlight lang="xml">
 +
<saml:Attribute Name="urn:oasis:names:tc:SAML:attribute:pairwise-id"
 +
        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
 +
    <saml:AttributeValue>
 +
HA2TKNZZGE2TOZDCGMZWKOLDHBQWIMBSGM4TGZBYGUYGINRQHAYTINBZGYZDOZBZMZRGKNZTME3TMNBXGYYTIOBYGMYWKNLFMYYDAYY=@osu.edu
 +
    </saml:AttributeValue>
 +
</saml:Attribute>
 +
 
 +
 
 +
</syntaxhighlight>
 +
 
 +
 
 +
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
 +
 
 +
===Strategie per la scelta dell'attributo sorgente===
 +
Si rende <u>assolutamente necessario</u> riflettere sulla scelta della parte univoca, <code><uniqueID></code>, inserita nei nuovi identificatori.
 +
 
 +
Ecco alcune raccomandazioni:
 +
 
 +
*non usare identificatori dipendenti dal database o dalla directory utenti come <code>entryCSN</code> (in OpenLDAP), <code>ObjectGUID</code> (Active Directory) e <code>ObjectSid</code>.
 +
*utilizzare solo identificatori indipendenti dai dati dell'utente
 +
*un ottimo esempio di identificatore che rispetta gli standard è Universally unique identifier (UUID) nella versione 4 (non utilizzare la versione 3 e 5). Riferimento: https://datatracker.ietf.org/doc/html/rfc4122
 +
*non utilizzare attributi come il Codice Fiscale senza applicare una funzione che ne offuschi il valore. (Vedere l'esempio riportato per la definizione dell'attributo <code>subjectHash</code> più avanti).
 +
*prestare attenzione all'uso di <code>uid</code>, <code>sAMAccountName</code>, <code>userPrincipalName</code>. Se il loro valore rivela l'identità dell'utente è necessario offuscarlo. (Vedere l'esempio riportato per la definizione dell'attributo <code>subjectHash</code> più avanti).
 +
*non utilizzare attributi che possono essere riassegnati come <code>eduPersonPrincipalName</code> o altri.
 +
*attributi già opachi che non necessitano di offuscare valori che rivelano l'identità dell'utente sono ottimi com attributi sorgente per la generazione dei nuovi identificatori.
 +
 
 +
 
 +
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
 +
 
 +
===Approfondimento: Perché è necessario adottare i nuovi Subject Identifiers?===
 +
Dal passato abbiamo imparato che:
 +
 
 +
#utilizzare un identificatore come <code>eduPersonPrincipalName</code>, non opaco e riassegnabile, è pericoloso:  Un individuo potrebbe non essere identificato correttamente se il valore dell'identificatore venisse riassegnato e, inoltre, potrebbero essere esposte informazioni personali.
 +
#utilizzare un identificatore come il <code>SAML Persistent NameID</code> o <code>eduPersonTargetedID</code>, che integra nel suo valore l'entityID di IdP ed SP, è problematico:  Un individuo perde l'accesso alle risorse che lo utilizzano e che ne memorizzano il valore localmente nel momento in cui l'SP o l'IdP decide di modificare il proprio entityID.  Questo comportamento costringe alla rigenerazione dell'identificatore da parte dell'IdP e la modifica dei valori salvati da parte dell'SP con un notevole dispendio di tempo.  Oltre a questo, se non viene trattato come un valore "case-sensitive" dalle risorse, l'identificazione sicura dell'utente non può essere garantita.
 +
#nel momento in cui scriviamo non è possibile per un relying party/SP richiedere il rilascio di un identificatore qualsiasi (<code>any</code>) tra i molteplici che supporta, ma è costretto a sceglierne uno come obbligatorio (<code>isRequired="True"</code>) e dichiarare l'altro come desiderato (<code>isRequired="False"</code>) portando spesso gli Identity Provider al mancato rilascio dell'identificatore necessario all'accesso delle risorse.
 +
 
 +
Esiste un consenso generale da parte degli esperti del settore su alcuni requisiti comuni:
 +
 
 +
*Gli identificatori dovrebbero essere il più possibile stabili e dovrebbero avere un rischio minimo o nullo di riassegnazione a soggetti diversi.
 +
*Gli identificatori opachi (cioè, superficialmente casuali) sono intrinsecamente più stabili degli identificatori basati sul nome o degli indirizzi e-mail in molte organizzazioni.
 +
*Gli identificatori dovrebbero essere compatti e semplici da maneggiare e manipolare.
 +
*La capacità di esprimere l'ambito di unicità di un identificatore e di applicare politiche che definiscano quali entità possono emettere tali identificatori è fondamentale per i sistemi federati. La mancanza di queste politiche ha portato ad incidenti ben noti.
 +
 
 +
 
 +
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
 +
 
 +
===Come segnalare la richiesta di tali identificatori per un SP===
 +
I Service Provider segnalano la richiesta di voler ricevere '''Subject Id''' o '''Pairwise Id''' attraverso la dichiarazione nei metadata di uno specifico <code><md:EntityAttribute></code>.
 +
 
 +
I valori possibili per l'Entity Attribute sono <code>subject-id</code>, <code>pairwise-id</code>, <code>any</code> e <code>none</code>. Nel caso sia specificato <code>any</code> allora l'Identity Provider dovrebbe rilasciare <code>pairwise-id</code>.
 +
 
 +
Tale dichiarazione <u>avviene esclusivamente</u> modificando i metadata del SP via [https://registry.idem.garr.it IDEM Entity Registry] tramite il percorso ''Edit Provider'' -> ''Entity Attributes'' e selezionando quello opportuno tra gli Entity Attribute:
 +
 
 +
*<code>SAML Profiles subject-id:req - subject-id</code>
 +
*<code>SAML Profiles subject-id:req - pairwise-id</code>
 +
*<code>SAML Profiles subject-id:req - any</code>
 +
*<code>SAML Profiles subject-id:req - none</code>
 +
 
 +
<br />[[File:Idem-registry-subject-id-values.png|miniatura|300x300px|alt=|nessuno]]
 +
 
 +
 
 +
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
 +
 
 +
==Configurazione per supportare i nuovi standard in Shibboleth IdP e SP==
  
 
===Identity Provider (>=4.0.0)===
 
===Identity Provider (>=4.0.0)===
Riga 9: Riga 168:
  
 
====Attribute Resolver====
 
====Attribute Resolver====
Nel file "<code>attribute-resolver.xml</code>" si deve aggiungere la definizione dei 2 nuovi attributi con:<syntaxhighlight lang="xml">
+
Nel file <code>conf/attribute-resolver.xml</code> si deve aggiungere la definizione dei 2 nuovi attributi con:<syntaxhighlight lang="xml">
 
<!-- Schema: SAML Subject ID attributes -->
 
<!-- Schema: SAML Subject ID attributes -->
 
   
 
   
 
<AttributeDefinition id="samlPairwiseID" xsi:type="Scoped" scope="%{idp.scope}">
 
<AttributeDefinition id="samlPairwiseID" xsi:type="Scoped" scope="%{idp.scope}">
 
     <InputDataConnector ref="computed" attributeNames="computedId" />
 
     <InputDataConnector ref="computed" attributeNames="computedId" />
 +
</AttributeDefinition>
 +
 +
<DataConnector id="computed" xsi:type="ComputedId"
 +
    generatedAttributeID="computedId"
 +
    salt="%{idp.persistentId.salt}"
 +
    algorithm="%{idp.persistentId.algorithm:SHA}"
 +
    encoding="%{idp.persistentId.encoding:BASE32}">
 +
 +
        <InputDataConnector ref="myLDAP" attributeNames="%{idp.persistentId.sourceAttribute}" />
 +
 +
</DataConnector>
 +
 +
 +
<!-- subjectHash è di tipo "scripted" e prende in ingresso "idp.persistentId.sourceAttribute" -->
 +
<!-- "idp.persistentId.sourceAttribute" subisce la funzione "salted hash" -->
 +
<!-- subjectHash così generato viene usato in seguito come parte sinistra di "samlSubjectID" -->
 +
 +
<AttributeDefinition id="subjectHash" xsi:type="ScriptedAttribute" dependencyOnly="true">
 +
    <InputDataConnector ref="myLDAP" attributeNames="%{idp.persistentId.sourceAttribute}" />
 +
    <Script><![CDATA[
 +
      var digestUtils = Java.type("org.apache.commons.codec.digest.DigestUtils");
 +
      var saltedHash  = digestUtils.sha256Hex(%{idp.persistentId.sourceAttribute}.getValues().get(0) + "%{idp.persistentId.salt}");
 +
      subjectHash.addValue(saltedHash);
 +
    ]]></Script>
 
</AttributeDefinition>
 
</AttributeDefinition>
 
   
 
   
 
<AttributeDefinition id="samlSubjectID" xsi:type="Scoped" scope="%{idp.scope}">
 
<AttributeDefinition id="samlSubjectID" xsi:type="Scoped" scope="%{idp.scope}">
     <InputDataConnector ref="myLDAP" attributeNames="%{idp.persistentId.sourceAttribute}" />
+
     <InputAttributeDefinition ref="subjectHash" />
 
</AttributeDefinition>
 
</AttributeDefinition>
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
====Attribute Filter====
 
====Attribute Filter====
Nel file "<code>attribute-filter.xml</code>", all'interno dell'elemento <code><AttributeFilterPolicyGroup></code> deve essere presente la seguente regola:<syntaxhighlight lang="xml">
+
Nel file <code>conf/attribute-filter.xml</code>, all'interno dell'elemento <code><AttributeFilterPolicyGroup></code> deve essere presente la seguente regola:<syntaxhighlight lang="xml">
 
     <!--
 
     <!--
 
     Example rule for honoring Subject ID requirement tag in metadata.
 
     Example rule for honoring Subject ID requirement tag in metadata.
Riga 53: Riga 236:
  
 
====Services====
 
====Services====
Nel file services.xml va abilitato l'<code>attribute-filter.xml</code> contenente le regole per il rilascio di <code>subject-id</code> e <code>pairwise-id</code><syntaxhighlight lang="xml">
+
Nel file <code>conf/services.xml</code> va abilitato l'<code>attribute-filter.xml</code> contenente le regole per il rilascio di <code>subject-id</code> e <code>pairwise-id</code><syntaxhighlight lang="xml">
 
<util:list id ="shibboleth.AttributeFilterResources">
 
<util:list id ="shibboleth.AttributeFilterResources">
 
   <value>%{idp.home}/conf/attribute-filter.xml</value>
 
   <value>%{idp.home}/conf/attribute-filter.xml</value>
Riga 59: Riga 242:
 
</util:list>
 
</util:list>
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
 +
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
  
 
===Service Provider (>=3.0.0)===
 
===Service Provider (>=3.0.0)===
Riga 65: Riga 251:
 
#Modificare, se necessario, <code>attribute-policy.xml</code>
 
#Modificare, se necessario, <code>attribute-policy.xml</code>
 
#Modificare <code>attribute-map.xml</code>
 
#Modificare <code>attribute-map.xml</code>
#Abilitare la richiesta su IDEM Entity Registry
+
#Abilitare la richiesta su [https://registry.idem.garr.it IDEM Entity Registry] come Entity Attribute
  
 
====Attribute Policy====
 
====Attribute Policy====
Per richiedere il subject-id e pairwise-id per il proprio SP nel formato corretto:<syntaxhighlight lang="xml">
+
Per richiedere il <code>subject-id</code> e <code>pairwise-id</code> per il proprio SP nel formato corretto:<syntaxhighlight lang="xml">
 
<AttributeRule attributeID="subject-id">
 
<AttributeRule attributeID="subject-id">
 
   <PermitValueRuleReference ref="ScopingRules"/>
 
   <PermitValueRuleReference ref="ScopingRules"/>
Riga 91: Riga 277:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
====IDEM Entity Registry====
 
Configurare il valore del Subject-ID richiesto dalla scheda EntityAttribute di [https://registry.idem.garr.it IDEM Entity Registry] tenendo in considerazione che selezionando "Any" si riceverà prevalentemente il valore di <code>pairwise-id</code> in quanto più safe di <code>subject-id</code>.
 
[[File:Idem-registry-subject-id-values.png|miniatura|300x300px|alt=|nessuno]]
 
  
==Configurazione per SimpleSAMLphp==
+
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
 +
 
 +
==Configurazione per per supportare i nuovi standard in simpleSAMLphp IdP e Sp==
 
Il supporto ufficiale alla generazione e al rilascio di <code>subject-id</code> e <code>pairwise-id</code> in SimpleSAMLphp arriva ufficialmente dalla [https://simplesamlphp.org/docs/2.0/simplesamlphp-changelog.html#version-200 v2.0.0].
 
Il supporto ufficiale alla generazione e al rilascio di <code>subject-id</code> e <code>pairwise-id</code> in SimpleSAMLphp arriva ufficialmente dalla [https://simplesamlphp.org/docs/2.0/simplesamlphp-changelog.html#version-200 v2.0.0].
  
Riga 104: Riga 289:
  
 
===Identity Provider (>=2.0.0)===
 
===Identity Provider (>=2.0.0)===
Gli Identity Provider che sono stati configurati secondo i nostri [https://github.com/ConsortiumGARR/idem-tutorials/blob/master/idem-fedops/HOWTO-SimpleSAMLphp/Identity%20Provider/HOWTO%20Install%20and%20Configure%20a%20SimpleSAMLphp%20IdP%20v2.x%20on%20Debian-Ubuntu%20Linux%20with%20Composer.md idem-tutorials] per la v2.x sono già in grado di rilasciare <code>subject-id</code> e <code>pairwise-id</code>.
+
Gli Identity Provider che sono stati configurati secondo l'[https://github.com/ConsortiumGARR/idem-tutorials/blob/master/idem-fedops/HOWTO-SimpleSAMLphp/Identity%20Provider/HOWTO%20Install%20and%20Configure%20a%20SimpleSAMLphp%20IdP%20v2.x%20on%20Debian-Ubuntu%20Linux%20with%20Composer.md HOWTO per SimpleSAMLphp IdP v2.x] sono già in grado di rilasciare <code>subject-id</code> e <code>pairwise-id</code>.
 +
 
 +
 
 +
Per abilitare il supporto ed il rilascio di <code>subject-id</code> e <code>pairwise-id</code> è necessario:
 +
 
 +
#Controllare che SimpleSAMLphp li riconosca entrambi nel file <code>attributemap/urn2name.php</code> (default dalla v2.0.0)
 +
#Abilitare la loro generazione ed il loro rilascio attraverso il file <code>metadata/saml20-idp-hosted.php</code> (default nell'HOWTO di IDEM)
 +
#Aggiornare, se necessario, il file <code>conf/idem-attribute-filter.php</code> distribuito in [[RilascioAttributi#SimpleSAMLphp Identity Provider]]
 +
 
 +
'''attributemap/urn2name.php'''<syntaxhighlight lang="php">
 +
'urn:oasis:names:tc:SAML:attribute:pairwise-id'              => 'pairwise-id',
 +
'urn:oasis:names:tc:SAML:attribute:subject-id'                => 'subject-id',
 +
 
 +
</syntaxhighlight>
 +
 
 +
====metadata/saml20-idp-hosted.php====
 +
 
 +
Nel file <code>metadata/saml20-idp-hosted.php</code>, all'interno dell'elemento <code>'authproc'</code> devono essere presenti i seguenti Authentication Process Filter:<syntaxhighlight lang="php">
 +
// Add subject-id
 +
13 => [
 +
      'class' => 'saml:SubjectID',
 +
      'identifyingAttribute' => 'uid',
 +
      'scopeAttribute' => 'schacHomeOrganization',
 +
],
 +
 
 +
// Add pairwise-id
 +
14 => [
 +
      'class' => 'saml:PairwiseID',
 +
      'identifyingAttribute' => 'uid',
 +
      'scopeAttribute' => 'schacHomeOrganization',
 +
],
 +
 
 +
// The Attribute Limit will be use to release all possibile values supported by IdP to SPs
 +
// Remember to comment out the same part with "50" on config/config.php file
 +
// or no attributes will be released
 +
50 => [
 +
      'class' => 'core:AttributeLimit',
 +
      'uid','givenName','sn','cn','mail','displayName','mobile',
 +
      'title','preferredLanguage','telephoneNumber',
 +
      'schacMotherTongue','schacPersonalTitle','schacHomeOrganization',
 +
      'schacHomeOrganizationType','schacUserPresenceID','schacPersonalPosition',
 +
      'schacPersonalUniqueCode','schacPersonalUniqueID',
 +
      'eduPersonPrincipalName','eduPersonEntitlement',
 +
      'urn:oasis:names:tc:SAML:attribute:subject-id',
 +
      'urn:oasis:names:tc:SAML:attribute:pairwise-id',
 +
      'eduPersonTargetedID',
 +
      'eduPersonOrcid','eduPersonOrgDN','eduPersonOrgUnitDN',
 +
      'eduPersonScopedAffiliation' => [
 +
        'regex' => true,
 +
        '/^student@.*/',
 +
        '/^staff@.*/',
 +
        '/^library-walk-in@.*/',
 +
        '/^affiliate@.*/',
 +
        '/^member@.*/',
 +
        '/^alum@.*/',
 +
        '/^employee@.*/',
 +
        '/^faculty@.*/',
 +
      ],'eduPersonAffiliation' => [
 +
        'student',
 +
        'staff',
 +
        'member',
 +
        'alum',
 +
        'affiliate',
 +
        'library-walk-in',
 +
        'faculty', // NO IDEM
 +
        'employee', // NO IDEM
 +
      ],
 +
],
 +
 
 +
// IDEM Attribute Filter:
 +
// IDEM SPs + Entity Category SPs + Custom SPs
 +
60 =>[
 +
    'class' => 'core:PHP',
 +
    'code'  =>
 +
    '
 +
    $config_dir = apache_getenv("SIMPLESAMLPHP_CONFIG_DIR");
 +
    include($config_dir."/idem-attribute-filter.php");
 +
    '
 +
],
 +
</syntaxhighlight>
 +
 
 +
====conf/idem-attribute-filter.php====
 +
<syntaxhighlight lang="php">
 +
$sp_subject_id_array = [];
 +
$subject_id = "subject-id";
 +
$pairwise_id = "pairwise-id";
 +
$any_id = "any";
 +
 
 +
if (isset($state["SPMetadata"]["EntityAttributes"]["urn:oasis:names:tc:SAML:profiles:subject-id:req"]))
 +
  $sp_subject_id_array = $state["SPMetadata"]["EntityAttributes"]["urn:oasis:names:tc:SAML:profiles:subject-id:req"];
 +
 
 +
// Subject-ID and/or Pairwise-ID attribute release
 +
if ($sp_subject_id_array){
 +
  foreach ($sp_subject_id_array as $sp_id){
 +
    if (strcmp($sp_id, $subject_id) == 0){
 +
      array_push($remaining_attributes, "urn:oasis:names:tc:SAML:attribute:subject-id");
 +
    }
 +
 
 +
    if ((strcmp($sp_id, $pairwise_id) == 0) or (strcmp($sp_id, $any_id) == 0)){
 +
      array_push($remaining_attributes, "urn:oasis:names:tc:SAML:attribute:pairwise-id");
 +
    }
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 
 +
 
 +
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
 +
 
 +
===Service Provider (>= 2.0.0)===
 +
Per abilitare il supporto ed l'utilizzo di <code>subject-id</code> e <code>pairwise-id</code> è necessario:
 +
 
 +
#Abilitare la richiesta su [https://registry.idem.garr.it IDEM Entity Registry] come Entity Attribute.
 +
#Utilizzare <code><nowiki>$attributes['urn:oasis:names:tc:SAML:attribute:subject-id']</nowiki></code> o <code><nowiki>$attributes['urn:oasis:names:tc:SAML:attribute:pairwise-id']</nowiki></code> nella propria applicazione PHP.
 +
 
  
<code>idem-attribute-filter.php</code> da testare: https://gitlab.dir.garr.it/-/snippets/7
+
[https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>]
  
===Service Provider===
+
===Riferimenti===
TBD
 
==Riferimenti==
 
  
https://docs.oasis-open.org/security/saml-subject-id-attr/v1.0/saml-subject-id-attr-v1.0.pdf
+
*[SAML-SubjectID-v1.0]: https://wiki.oasis-open.org/security/SAMLSubjectIDAttr
 +
*[RFC2234]: https://www.rfc-editor.org/rfc/rfc2234

Versione attuale delle 17:24, 9 lug 2024

Identificatori utente nella Federazione IDEM

Dal 2019, con la pubblicazione del documento "SAML V2.0 Subject Identifier Attributes Profile Version 1.0" [SAML-SubjectID-v1.0], sono stati introdotti due nuovi attributi standard per SAML 2.0 al fine di identificare gli utenti e risolvere molti dei problemi legati agli identificatori SAML 2.0 già in uso.

Il documento SAML-SubjectID-v1.0 definisce due attributi con NameFormat URI da utilizzare come identificatori utenti:


I nuovi identificatori si vanno ad aggiungere agli identificatori già supportati e permessi nella Federazione IDEM, ovvero:

  1. Attributi SAML (provenienti dallo schema eduPerson):
    • eduPersonPrincipalName
    • eduPersonUniqueID
    • eduPersonTargetedID ('deprecato, ma ancora utilizzato da alcuni servizi; assume normalmente lo stesso valore del NameID di tipo persistent': urn:oasis:names:tc:SAML:2.0:nameid-format:persistent)
  2. <saml2:NameID> Name Identifiers nel <saml2:Subject> dell'asserzione SAML nei formati:
    • urn:oasis:names:tc:SAML:2.0:nameid-format:persistent (SAML Persistent NameID)
    • urn:oasis:names:tc:SAML:2.0:nameid-format:transient (SAML Transient NameID)

[TOP]


Definizione

Attributo SAML2 Subject ID

Identificatore di individuo unico e globale per tutti i relying party/SP.

Le sue caratteristiche sono:

  • Indipendente dal relying party/SP a cui viene rilasciato
  • Di lunga durata nel tempo
  • Non riassegnabile ad altri individui
  • Opaco (non può contenere informazioni sull'individuo)


L'attributo è destinato a sostituire identificatori generali come eduPersonUniqueID e eduPersonPrincipalName

Sintassi

Il valore è costituito da due sottostringhe (unique ID e scope) separate dal simbolo @ (ASCII 64).

Lo unique ID è un valore alfanumerico di massimo 127 caratteri che può contenere il simbolo di uguale (= ASCII 61) o il simbolo del trattino (- ASCII 45). DEVE iniziare con un carattere alfanumerico.

Lo scope è un valore alfanumerico di massimo 127 caratteri che può contenere il simbolo del punto (. ASCII 46) o il simbolo del trattino (- ASCII 45). DEVE iniziare con un carattere alfanumerico.

La grammatica ABNF [RFC2234] è:

<value> = <uniqueID> "@" <scope>
<uniqueID> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "=" / "-")
<scope> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "-" / ".")

Esempio

Valore dell'attributo:

idm123-456789=@example.com

Codifica SAML 2.0:

<saml:Attribute Name="urn:oasis:names:tc:SAML:attribute:subject-id"
      NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
    <saml:AttributeValue>idm123-456789=@example.com</saml:AttributeValue>
</saml:Attribute>


[TOP]

Attributo SAML2 Pairwise ID

Identificatore di individuo specifico per ciascun relying party/SP.

Le sue caratteristiche sono:

  • Dipendente dal relying party/SP a cui viene rilasciato
  • Di lunga durata nel tempo
  • Non riassegnabile ad altri individui
  • Opaco (non può contenere informazioni sull'individuo)


L'attributo è destinato a sostituire identificatori targeted come eduPersonTargetedID ed il <saml2:NameID> di tipo persistent.

Sintassi

Il valore è costituito da due sottostringhe (unique ID e scope) separate dal simbolo @ (ASCII 64).

Lo unique ID è un valore alfanumerico di massimo 127 caratteri che può contenere il simbolo di uguale (= ASCII 61) o il simbolo del trattino (- ASCII 45). DEVE iniziare con un carattere alfanumerico.

Lo scope è un valore alfanumerico di massimo 127 caratteri che può contenere il simbolo del punto (. ASCII 46) o il simbolo del trattino (- ASCII 45). DEVE iniziare con un carattere alfanumerico.

La grammatica ABNF [RFC2234] è:

<value> = <uniqueID> "@" <scope>
<uniqueID> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "=" / "-")
<scope> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "-" / ".")

Esempio

Valore dell'attributo:

HA2TKNZZGE2TOZDCGMZWKOLDHBQWIMBSGM4TGZBYGUYGINRQHAYTINBZGYZDOZBZMZRGKNZTME3TMNBXGYYTIOBYGMYWKNLFMYYDAYY=@osu.edu

Codifica SAML 2.0:

<saml:Attribute Name="urn:oasis:names:tc:SAML:attribute:pairwise-id"
        NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
    <saml:AttributeValue>
HA2TKNZZGE2TOZDCGMZWKOLDHBQWIMBSGM4TGZBYGUYGINRQHAYTINBZGYZDOZBZMZRGKNZTME3TMNBXGYYTIOBYGMYWKNLFMYYDAYY=@osu.edu
    </saml:AttributeValue>
</saml:Attribute>


[TOP]

Strategie per la scelta dell'attributo sorgente

Si rende assolutamente necessario riflettere sulla scelta della parte univoca, <uniqueID>, inserita nei nuovi identificatori.

Ecco alcune raccomandazioni:

  • non usare identificatori dipendenti dal database o dalla directory utenti come entryCSN (in OpenLDAP), ObjectGUID (Active Directory) e ObjectSid.
  • utilizzare solo identificatori indipendenti dai dati dell'utente
  • un ottimo esempio di identificatore che rispetta gli standard è Universally unique identifier (UUID) nella versione 4 (non utilizzare la versione 3 e 5). Riferimento: https://datatracker.ietf.org/doc/html/rfc4122
  • non utilizzare attributi come il Codice Fiscale senza applicare una funzione che ne offuschi il valore. (Vedere l'esempio riportato per la definizione dell'attributo subjectHash più avanti).
  • prestare attenzione all'uso di uid, sAMAccountName, userPrincipalName. Se il loro valore rivela l'identità dell'utente è necessario offuscarlo. (Vedere l'esempio riportato per la definizione dell'attributo subjectHash più avanti).
  • non utilizzare attributi che possono essere riassegnati come eduPersonPrincipalName o altri.
  • attributi già opachi che non necessitano di offuscare valori che rivelano l'identità dell'utente sono ottimi com attributi sorgente per la generazione dei nuovi identificatori.


[TOP]

Approfondimento: Perché è necessario adottare i nuovi Subject Identifiers?

Dal passato abbiamo imparato che:

  1. utilizzare un identificatore come eduPersonPrincipalName, non opaco e riassegnabile, è pericoloso: Un individuo potrebbe non essere identificato correttamente se il valore dell'identificatore venisse riassegnato e, inoltre, potrebbero essere esposte informazioni personali.
  2. utilizzare un identificatore come il SAML Persistent NameID o eduPersonTargetedID, che integra nel suo valore l'entityID di IdP ed SP, è problematico: Un individuo perde l'accesso alle risorse che lo utilizzano e che ne memorizzano il valore localmente nel momento in cui l'SP o l'IdP decide di modificare il proprio entityID. Questo comportamento costringe alla rigenerazione dell'identificatore da parte dell'IdP e la modifica dei valori salvati da parte dell'SP con un notevole dispendio di tempo. Oltre a questo, se non viene trattato come un valore "case-sensitive" dalle risorse, l'identificazione sicura dell'utente non può essere garantita.
  3. nel momento in cui scriviamo non è possibile per un relying party/SP richiedere il rilascio di un identificatore qualsiasi (any) tra i molteplici che supporta, ma è costretto a sceglierne uno come obbligatorio (isRequired="True") e dichiarare l'altro come desiderato (isRequired="False") portando spesso gli Identity Provider al mancato rilascio dell'identificatore necessario all'accesso delle risorse.

Esiste un consenso generale da parte degli esperti del settore su alcuni requisiti comuni:

  • Gli identificatori dovrebbero essere il più possibile stabili e dovrebbero avere un rischio minimo o nullo di riassegnazione a soggetti diversi.
  • Gli identificatori opachi (cioè, superficialmente casuali) sono intrinsecamente più stabili degli identificatori basati sul nome o degli indirizzi e-mail in molte organizzazioni.
  • Gli identificatori dovrebbero essere compatti e semplici da maneggiare e manipolare.
  • La capacità di esprimere l'ambito di unicità di un identificatore e di applicare politiche che definiscano quali entità possono emettere tali identificatori è fondamentale per i sistemi federati. La mancanza di queste politiche ha portato ad incidenti ben noti.


[TOP]

Come segnalare la richiesta di tali identificatori per un SP

I Service Provider segnalano la richiesta di voler ricevere Subject Id o Pairwise Id attraverso la dichiarazione nei metadata di uno specifico <md:EntityAttribute>.

I valori possibili per l'Entity Attribute sono subject-id, pairwise-id, any e none. Nel caso sia specificato any allora l'Identity Provider dovrebbe rilasciare pairwise-id.

Tale dichiarazione avviene esclusivamente modificando i metadata del SP via IDEM Entity Registry tramite il percorso Edit Provider -> Entity Attributes e selezionando quello opportuno tra gli Entity Attribute:

  • SAML Profiles subject-id:req - subject-id
  • SAML Profiles subject-id:req - pairwise-id
  • SAML Profiles subject-id:req - any
  • SAML Profiles subject-id:req - none



[TOP]

Configurazione per supportare i nuovi standard in Shibboleth IdP e SP

Identity Provider (>=4.0.0)

Per abilitare il supporto ed il rilascio di subject-id e pairwise-id è necessario:

  1. Modificare attribute-resolver.xml
  2. Modificare, se necessario, attribute-filter.xml (la versione di default già contiene le regole di rilascio opportune)
  3. Modificare, se necessario, services.xml

Attribute Resolver

Nel file conf/attribute-resolver.xml si deve aggiungere la definizione dei 2 nuovi attributi con:

<!-- Schema: SAML Subject ID attributes -->
 
<AttributeDefinition id="samlPairwiseID" xsi:type="Scoped" scope="%{idp.scope}">
    <InputDataConnector ref="computed" attributeNames="computedId" />
</AttributeDefinition>

<DataConnector id="computed" xsi:type="ComputedId"
    generatedAttributeID="computedId"
    salt="%{idp.persistentId.salt}"
    algorithm="%{idp.persistentId.algorithm:SHA}"
    encoding="%{idp.persistentId.encoding:BASE32}">

        <InputDataConnector ref="myLDAP" attributeNames="%{idp.persistentId.sourceAttribute}" />

</DataConnector>


<!-- subjectHash è di tipo "scripted" e prende in ingresso "idp.persistentId.sourceAttribute" -->
<!-- "idp.persistentId.sourceAttribute" subisce la funzione "salted hash" -->
<!-- subjectHash così generato viene usato in seguito come parte sinistra di "samlSubjectID" -->

<AttributeDefinition id="subjectHash" xsi:type="ScriptedAttribute" dependencyOnly="true">
    <InputDataConnector ref="myLDAP" attributeNames="%{idp.persistentId.sourceAttribute}" />
    <Script><![CDATA[
      var digestUtils = Java.type("org.apache.commons.codec.digest.DigestUtils");
      var saltedHash  = digestUtils.sha256Hex(%{idp.persistentId.sourceAttribute}.getValues().get(0) + "%{idp.persistentId.salt}");
      subjectHash.addValue(saltedHash);
    ]]></Script>
</AttributeDefinition>
 
<AttributeDefinition id="samlSubjectID" xsi:type="Scoped" scope="%{idp.scope}">
    <InputAttributeDefinition ref="subjectHash" />
</AttributeDefinition>

Attribute Filter

Nel file conf/attribute-filter.xml, all'interno dell'elemento <AttributeFilterPolicyGroup> deve essere presente la seguente regola:

    <!--
    Example rule for honoring Subject ID requirement tag in metadata.
    The example supplies pairwise-id if subject-id isn't explicitly required.
    -->
    <AttributeFilterPolicy id="subject-identifiers">
        <PolicyRequirementRule xsi:type="ANY" />

        <AttributeRule attributeID="samlPairwiseID">
            <PermitValueRule xsi:type="OR">
                <Rule xsi:type="EntityAttributeExactMatch"
                    attributeName="urn:oasis:names:tc:SAML:profiles:subject-id:req"
                    attributeNameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
                    attributeValue="pairwise-id" />
                <Rule xsi:type="EntityAttributeExactMatch"
                    attributeName="urn:oasis:names:tc:SAML:profiles:subject-id:req"
                    attributeNameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
                    attributeValue="any" />
            </PermitValueRule>
        </AttributeRule>

        <AttributeRule attributeID="samlSubjectID">
            <PermitValueRule xsi:type="EntityAttributeExactMatch"
                attributeName="urn:oasis:names:tc:SAML:profiles:subject-id:req"
                attributeNameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
                attributeValue="subject-id" />
        </AttributeRule>
    </AttributeFilterPolicy>

Services

Nel file conf/services.xml va abilitato l'attribute-filter.xml contenente le regole per il rilascio di subject-id e pairwise-id

<util:list id ="shibboleth.AttributeFilterResources">
   <value>%{idp.home}/conf/attribute-filter.xml</value>
   <ref bean="IdemAttributeFilterFull"/>
</util:list>


[TOP]

Service Provider (>=3.0.0)

Per abilitare il supporto ed l'utilizzo di subject-id e pairwise-id è necessario:

  1. Modificare, se necessario, attribute-policy.xml
  2. Modificare attribute-map.xml
  3. Abilitare la richiesta su IDEM Entity Registry come Entity Attribute

Attribute Policy

Per richiedere il subject-id e pairwise-id per il proprio SP nel formato corretto:

<AttributeRule attributeID="subject-id">
   <PermitValueRuleReference ref="ScopingRules"/>
</AttributeRule>

<AttributeRule attributeID="pairwise-id">
   <PermitValueRuleReference ref="ScopingRules"/>
</AttributeRule>

Attribute Map

<!-- New standard identifier attributes for SAML. -->

<Attribute name="urn:oasis:names:tc:SAML:attribute:subject-id" id="subject-id">
   <AttributeDecoder xsi:type="ScopedAttributeDecoder" caseSensitive="false"/>
</Attribute>
  
<Attribute name="urn:oasis:names:tc:SAML:attribute:pairwise-id" id="pairwise-id">
   <AttributeDecoder xsi:type="ScopedAttributeDecoder" caseSensitive="false"/>
</Attribute>


[TOP]

Configurazione per per supportare i nuovi standard in simpleSAMLphp IdP e Sp

Il supporto ufficiale alla generazione e al rilascio di subject-id e pairwise-id in SimpleSAMLphp arriva ufficialmente dalla v2.0.0.

Nella nuova versione di SimpleSAMLphp sono stati sviluppati 2 nuovi moduli per il loro supporto:

Identity Provider (>=2.0.0)

Gli Identity Provider che sono stati configurati secondo l'HOWTO per SimpleSAMLphp IdP v2.x sono già in grado di rilasciare subject-id e pairwise-id.


Per abilitare il supporto ed il rilascio di subject-id e pairwise-id è necessario:

  1. Controllare che SimpleSAMLphp li riconosca entrambi nel file attributemap/urn2name.php (default dalla v2.0.0)
  2. Abilitare la loro generazione ed il loro rilascio attraverso il file metadata/saml20-idp-hosted.php (default nell'HOWTO di IDEM)
  3. Aggiornare, se necessario, il file conf/idem-attribute-filter.php distribuito in RilascioAttributi#SimpleSAMLphp Identity Provider

attributemap/urn2name.php

'urn:oasis:names:tc:SAML:attribute:pairwise-id'               => 'pairwise-id',
'urn:oasis:names:tc:SAML:attribute:subject-id'                => 'subject-id',

metadata/saml20-idp-hosted.php

Nel file metadata/saml20-idp-hosted.php, all'interno dell'elemento 'authproc' devono essere presenti i seguenti Authentication Process Filter:

// Add subject-id
13 => [
      'class' => 'saml:SubjectID',
      'identifyingAttribute' => 'uid',
      'scopeAttribute' => 'schacHomeOrganization',
],

// Add pairwise-id
14 => [
      'class' => 'saml:PairwiseID',
      'identifyingAttribute' => 'uid',
      'scopeAttribute' => 'schacHomeOrganization',
],

// The Attribute Limit will be use to release all possibile values supported by IdP to SPs
// Remember to comment out the same part with "50" on config/config.php file 
// or no attributes will be released
50 => [
      'class' => 'core:AttributeLimit',
      'uid','givenName','sn','cn','mail','displayName','mobile',
      'title','preferredLanguage','telephoneNumber',
      'schacMotherTongue','schacPersonalTitle','schacHomeOrganization',
      'schacHomeOrganizationType','schacUserPresenceID','schacPersonalPosition',
      'schacPersonalUniqueCode','schacPersonalUniqueID',
      'eduPersonPrincipalName','eduPersonEntitlement',
      'urn:oasis:names:tc:SAML:attribute:subject-id',
      'urn:oasis:names:tc:SAML:attribute:pairwise-id',
      'eduPersonTargetedID',
      'eduPersonOrcid','eduPersonOrgDN','eduPersonOrgUnitDN',
      'eduPersonScopedAffiliation' => [
         'regex' => true,
         '/^student@.*/',
         '/^staff@.*/',
         '/^library-walk-in@.*/',
         '/^affiliate@.*/',
         '/^member@.*/',
         '/^alum@.*/',
         '/^employee@.*/',
         '/^faculty@.*/',
      ],'eduPersonAffiliation' => [
         'student',
         'staff',
         'member',
         'alum',
         'affiliate',
         'library-walk-in',
         'faculty', // NO IDEM
         'employee', // NO IDEM
      ],
],

// IDEM Attribute Filter:
// IDEM SPs + Entity Category SPs + Custom SPs
60 =>[
    'class' => 'core:PHP',
    'code'  =>
    '
    $config_dir = apache_getenv("SIMPLESAMLPHP_CONFIG_DIR");
    include($config_dir."/idem-attribute-filter.php");
    '
],

conf/idem-attribute-filter.php

$sp_subject_id_array = [];
$subject_id = "subject-id";
$pairwise_id = "pairwise-id";
$any_id = "any";

if (isset($state["SPMetadata"]["EntityAttributes"]["urn:oasis:names:tc:SAML:profiles:subject-id:req"]))
   $sp_subject_id_array = $state["SPMetadata"]["EntityAttributes"]["urn:oasis:names:tc:SAML:profiles:subject-id:req"];

// Subject-ID and/or Pairwise-ID attribute release
if ($sp_subject_id_array){
  foreach ($sp_subject_id_array as $sp_id){
    if (strcmp($sp_id, $subject_id) == 0){
       array_push($remaining_attributes, "urn:oasis:names:tc:SAML:attribute:subject-id");
    }

    if ((strcmp($sp_id, $pairwise_id) == 0) or (strcmp($sp_id, $any_id) == 0)){
       array_push($remaining_attributes, "urn:oasis:names:tc:SAML:attribute:pairwise-id");
    }
  }
}


[TOP]

Service Provider (>= 2.0.0)

Per abilitare il supporto ed l'utilizzo di subject-id e pairwise-id è necessario:

  1. Abilitare la richiesta su IDEM Entity Registry come Entity Attribute.
  2. Utilizzare $attributes['urn:oasis:names:tc:SAML:attribute:subject-id'] o $attributes['urn:oasis:names:tc:SAML:attribute:pairwise-id'] nella propria applicazione PHP.


[TOP]

Riferimenti