cs:tech:idp:persistent-id

Tento návod je již zastaralý a zůstává zde spíše jen pro dokumentačí důvody. Přejděte na aktuální návod.


Persistentní ID

U Shibboleth IdP 2.x existuje přímá podpora persistentních ID, která vyžaduje externí SQL databázi pro ukládání dat. V následujícím návodě používáme MySQL databázi.

Databáze

Vytvoříme databázi shibboleth a nastavíme práva pro uživatele, pod kterým se bude připojovat Shibboleth:

mysql> CREATE DATABASE shibboleth;
mysql> GRANT ALL PRIVILEGES ON shibboleth.* TO shib@localhost IDENTIFIED BY '<heslo>';

V databázi shibboleth vytvoříme následující tabulku:

CREATE TABLE IF NOT EXISTS shibpid (
  localEntity TEXT NOT NULL,
  peerEntity TEXT NOT NULL,
  principalName VARCHAR(255) NOT NULL default '',
  localId VARCHAR(255) NOT NULL,
  persistentId VARCHAR(36) NOT NULL,
  peerProvidedId VARCHAR(255) default NULL,
  creationDate timestamp NOT NULL default CURRENT_TIMESTAMP
   on update CURRENT_TIMESTAMP,
  deactivationDate timestamp NULL default 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)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Instalace JDBC connectoru

Pro přístup k SQL databázi z prostředí Shibboleth IdP potřebujeme nainstalovat příslušný JDBC connector. Stahneme ho ze stránek MySQL a rozbalíme ho v libovolném adresáři:

# cd /opt/tmp/
# tar xvfz mysql-connector-java-5.1.16.tar.gz

Zkopírujeme příslušnou .jar knihovnu do adresáře lib/ v distribuci Shibboleth IdP:

# cp mysql-connector-java-5.1.16/mysql-connector-java-5.1.16-bin.jar /opt/tmp/shibboleth-identityprovider-2.x.x/lib/

Poté musíme spustit instalační skript Shibboleth IdP. Pokud jde o první spuštění instalačního skriptu, podívejte se do instalačního návodu. Pokud jste instalaci už provedli anebo pokud nastavujete persistentní ID dodatečně, u otázky, zda přepisovat konfiguraci odpovězte negativně:

[..]
The directory '/opt/shibboleth-idp-2.3.0' already exists.  Would you like to overwrite this Shibboleth configuration? (yes, [no])
no
[..]

Konfigurace Shibboleth IdP

V konfiguračním souboru attribute-resolver.xml vytvoříme:

  • StoredID connector, který se bude připojovat k SQL databázi
  • příslušný PrincipalConnector, který má na starost zpětný překlad persistentního ID na identitu uživatele
  • atributy a identifikátory (name identifiers), které budou obsahovat persistentní ID

StoredID connector

Vytvoříme StoredID connector a v něm nastavíme přístup k SQL databázi.

:!: Je potřeba správně nastavit salt, viz níže.

    <resolver:DataConnector id="myStoredId"
        xsi:type="dc:StoredId"
        generatedAttributeID="storedId"
        sourceAttributeID="uid"
        salt="SALT">
        <resolver:Dependency ref="uid" />
        <dc:ApplicationManagedConnection
            jdbcDriver="com.mysql.jdbc.Driver"
            jdbcURL="jdbc:mysql://127.0.0.1:3306/shibboleth?autoReconnect=true"
            jdbcUserName="shib"
            jdbcPassword="HESLO" />
    </resolver:DataConnector>

Význam některých atributů:

  • sourceAttributeID - název zdrojového atributu nesoucí identitu uživatele
  • generatedAttributeID - název vygenerovaného atributu, výchozí hodnota je „storedID“
  • salt - řetězec používaný během generování persistentních ID, jeho minimální dálka musí byt 16 znaků, doporučená délka je 48 znaků, je nezbytné jeho hodnotu zálohovat pro případ ztráty konfigurace, aby nedošlo ke ztrátě všech persistentních ID

Stored ID PrincipalConnector

Tento PrincipalConnector mapuje persistentní ID zpět na identitu z které bylo persistentní ID vytvořeno. Je potřeba v případě, že chceme, aby náš IdP podporoval tzv. persistentní name identifikátory (name identifier). Umístíme ho na konci souboru attribute-resolver.xml za ostatními PrincipalConnectory:

<resolver:PrincipalConnector xsi:type="pc:StoredId" xmlns:pc="urn:mace:shibboleth:2.0:resolver:pc"
                             id="saml2Persistent"
                             nameIDFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" 
                             storedIdDataConnectorRef="myStoredId"/>

Atributy

Pro uvolnění hodnoty persistentního ID se používá atribut typu SAML2NameID:

<resolver:AttributeDefinition xsi:type="ad:SAML2NameID" id="eduPersonTargetedID" 
    nameIdFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" sourceAttributeID="storedId">
 
    <resolver:Dependency ref="myStoredId" />
    <resolver:AttributeEncoder xsi:type="enc:SAML1XMLObject" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" />
    <resolver:AttributeEncoder xsi:type="enc:SAML2XMLObject" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" 
        friendlyName="eduPersonTargetedID" />
</resolver:AttributeDefinition>

Hodnotu persistentního ID je možné také použít pro persistentní name identifier. Na rozdíl oproti výše uvedené definici, jde o atribut typu Simple, kde je použit SAML2StringNameID attribute encoder, viz dokumentace.

<resolver:AttributeDefinition id="persistentId" xsi:type="ad:Simple" sourceAttributeID="storedId">
    <resolver:Dependency ref="myStoredId"/>
    <resolver:AttributeEncoder xsi:type="enc:SAML2StringNameID" nameFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"/>
</resolver:AttributeDefinition>

Ačkoliv v obou případech jde o definice atributů, v druhém případě je to zároveň deklarace dalšího name identifikátora - peristentního, vedle běžného transientního. Víc informací o rozdílech obou indentifikátoru najdete v dokumentaci. V případě, že se rozhodnete podporovat persistentní identifikátor, je potřeba v metadatech IdP tuto skutečnost deklarovat, viz dále.

Aktualizace metadat

V případě, že se rozhodneme podporovat persistentní name identifier a máme správně nastavený příslušný atribut, zároveň je potřeba v metadatech IdP tuto podporu deklarovat elementem ​NameIDFormat,​ který přidáme ​jak do sekce ​IDPSSODescriptor,​ tak i do sekce ​AttributeAuthorityDescriptor:​

<NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat>
Poslední úprava: 2017/02/10 07:02