Differenze tra le versioni di "SAML-Subject-ID-Attribute"
(26 versioni intermedie di 3 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
− | == | + | ==Identificatori utente nella Federazione IDEM== |
− | Dal 2019 con la pubblicazione del documento | + | 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: | |
− | *<nowiki>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</nowiki> | + | #Attributi SAML (provenienti dallo schema [https://wiki.refeds.org/display/STAN/eduPerson eduPerson]): |
− | *<nowiki>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</nowiki> | + | #*<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. | ||
− | <u>L'attributo è destinato a sostituire identificatori | + | 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==== | ====Sintassi==== | ||
− | Il valore è costituito da due sottostringhe ( | + | 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 è | + | 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 ] è | + | La grammatica ABNF [RFC2234] è: |
<value> = <uniqueID> "@" <scope> | <value> = <uniqueID> "@" <scope> | ||
<uniqueID> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "=" / "-") | <uniqueID> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "=" / "-") | ||
<scope> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "-" / ".") | <scope> = (ALPHA / DIGIT) 0*126(ALPHA / DIGIT / "-" / ".") | ||
− | ====Strategie per la scelta dell'attributo sorgente | + | ====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: | 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>. | *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>. | ||
− | *non utilizzare attributi come il | + | *utilizzare solo identificatori indipendenti dai dati dell'utente |
− | *prestare attenzione all'uso di <code>uid</code>, <code>sAMAccountName</code>, <code>userPrincipalName</code> | + | *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 |
− | *attributi che già | + | *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?=== | ===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>. | |
− | + | '''!! Attenzione !!''' Nel caso sia specificato <code>any</code> allora l'Identity Provider potrebbe rilasciare <code>pairwise-id</code>. | |
− | + | Tale dichiarazione '''<u>è soggetta all'approvazione del servizio IDEM</u>''' e <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> | ||
− | + | <u>La modifica non sarà visibile fino a quando il servizio IDEM non avrà approvato la richiesta di aggiornamento amministrativo via Registry.</u> | |
+ | <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 | + | ==Configurazione per supportare i nuovi standard in Shibboleth IdP e SP== |
===Identity Provider (>=4.0.0)=== | ===Identity Provider (>=4.0.0)=== | ||
Riga 97: | Riga 171: | ||
====Attribute Resolver==== | ====Attribute Resolver==== | ||
− | Nel file | + | 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 --> | ||
Riga 123: | Riga 197: | ||
<Script><![CDATA[ | <Script><![CDATA[ | ||
var digestUtils = Java.type("org.apache.commons.codec.digest.DigestUtils"); | var digestUtils = Java.type("org.apache.commons.codec.digest.DigestUtils"); | ||
− | var saltedHash = digestUtils.sha256Hex(%{idp.persistentId.sourceAttribute}.getValues().get(0) + "%{idp.persistentId.salt}"); | + | var saltedHash = digestUtils.sha256Hex("%{idp.persistentId.sourceAttribute}.getValues().get(0)" + "%{idp.persistentId.salt}"); |
subjectHash.addValue(saltedHash); | subjectHash.addValue(saltedHash); | ||
]]></Script> | ]]></Script> | ||
Riga 134: | Riga 208: | ||
====Attribute Filter==== | ====Attribute Filter==== | ||
− | Nel file | + | 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 165: | Riga 239: | ||
====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 171: | Riga 245: | ||
</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 177: | Riga 254: | ||
#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 203: | Riga 280: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
− | |||
− | |||
− | ==Configurazione per per supportare i nuovi standard in | + | [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 216: | Riga 292: | ||
===Identity Provider (>=2.0.0)=== | ===Identity Provider (>=2.0.0)=== | ||
− | Gli Identity Provider che sono stati configurati secondo | + | 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. | ||
+ | |||
+ | |||
+ | [https://wiki.idem.garr.it/wiki/IDEM-OPS:SAML-Subject-ID-Attribute <nowiki>[TOP]</nowiki>] | ||
− | + | ===Riferimenti=== | |
− | + | *[SAML-SubjectID-v1.0]: https://wiki.oasis-open.org/security/SAMLSubjectIDAttr | |
− | + | *[RFC2234]: https://www.rfc-editor.org/rfc/rfc2234 |
Versione attuale delle 12:48, 15 gen 2025
Indice
- 1 Identificatori utente nella Federazione IDEM
- 2 Definizione
- 3 Configurazione per supportare i nuovi standard in Shibboleth IdP e SP
- 4 Configurazione per per supportare i nuovi standard in simpleSAMLphp IdP e Sp
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:
urn:oasis:names:tc:SAML:attribute:subject-id
: un identificatore generale e globalmente univoco (vedi la sezione Definizione per maggiori dettagli).
urn:oasis:names:tc:SAML:attribute:pairwise-id
: 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 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
)
<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)
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>
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>
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) eObjectSid
. - 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'attributosubjectHash
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.
Approfondimento: Perché è necessario adottare i nuovi Subject Identifiers?
Dal passato abbiamo imparato che:
- 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. - utilizzare un identificatore come il
SAML Persistent NameID
oeduPersonTargetedID
, 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 (
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.
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
.
!! Attenzione !! Nel caso sia specificato any
allora l'Identity Provider potrebbe rilasciare pairwise-id
.
Tale dichiarazione è soggetta all'approvazione del servizio IDEM e 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
La modifica non sarà visibile fino a quando il servizio IDEM non avrà approvato la richiesta di aggiornamento amministrativo via Registry.
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:
- Modificare
attribute-resolver.xml
- Modificare, se necessario,
attribute-filter.xml
(la versione di default già contiene le regole di rilascio opportune) - 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>
Service Provider (>=3.0.0)
Per abilitare il supporto ed l'utilizzo di subject-id
e pairwise-id
è necessario:
- Modificare, se necessario,
attribute-policy.xml
- Modificare
attribute-map.xml
- 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>
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:
- https://simplesamlphp.org/docs/2.0/saml/authproc_pairwiseid.html
- https://simplesamlphp.org/docs/2.0/saml/authproc_subjectid.html
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:
- Controllare che SimpleSAMLphp li riconosca entrambi nel file
attributemap/urn2name.php
(default dalla v2.0.0) - Abilitare la loro generazione ed il loro rilascio attraverso il file
metadata/saml20-idp-hosted.php
(default nell'HOWTO di IDEM) - 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");
}
}
}
Service Provider (>= 2.0.0)
Per abilitare il supporto ed l'utilizzo di subject-id
e pairwise-id
è necessario:
- Abilitare la richiesta su IDEM Entity Registry come Entity Attribute.
- Utilizzare
$attributes['urn:oasis:names:tc:SAML:attribute:subject-id']
o$attributes['urn:oasis:names:tc:SAML:attribute:pairwise-id']
nella propria applicazione PHP.
Riferimenti
- [SAML-SubjectID-v1.0]: https://wiki.oasis-open.org/security/SAMLSubjectIDAttr
- [RFC2234]: https://www.rfc-editor.org/rfc/rfc2234