SimpleSAMLphp
Az alábbi lapon megkíséreljük összefoglalni a legfontosabb lépéseket, melyek általános esetben elegendőek ahhoz, hogy működő SimpleSAMLphp(SSP) alkalmazást állítsunk üzembe.
Tartalomjegyzék
[elrejtés]Telepítés
A leírás a forrásból történő telepítés lépéseit írja le. Az itt részletezetten kívül a SimpleSAMLphp telepíthető Debian (vagy más) operációs rendszer csomagjából, de ebben az esetben ne telepítsunk composerrel third-party (pl. általunk készített) modulokat! }}
Előkészületek
Ahhoz, hogy problémamentesen telepíthessük SSP alkalmazásunkat, az alábbi szoftverkomponenseknek kell működniük szerverünkön.
- PHP futtatására alkalmas webszerver
- PHP környezet (>=5.4)
- A következő PHP kiterjesztéseket engedélyezni kell
-
date
,dom
,hash
,libxml
,openssl
,pcre
,SPL
,zlib
- LDAP-ból történő autentikáció esetén:
ldap
- Adatbázisból történő autentikáció esetén a megfelelő adatbázis-csatolót
mysql
,pgsql
- RADIUS szerveren keresztül történő autentikáció esetén:
radius
- Assertion-ök titkosítása esetén:
mcrypt
- Memcache használata esetén:
memcache
- HEXAA integrációhoz (SP):
soap
-
Előkészületként telepíteni kell a rendszerre a composert. (Akár forrásból, akár csomagból.)
Letöltés
A GitHubról történő telepítés előnye, hogy a simplesamlphp könnyen frissíthető marad, csak a third party modulokat kell újratelepíteni. Az utolsó stabil verzió számát a https://simplesamlphp.org/download oldalról tudhatjuk meg.
- Megj: Jelenleg néhány saját modulunkat még nem igazítottuk az 1.15-ös kiadás változásaihoz, ezért átmenetileg az utolsó 1.14-es kiadást használjuk!
cd /var git clone https://github.com/simplesamlphp/simplesamlphp.git cd simplesamlphp git checkout v1.14.17 composer install --no-dev
Apache konfigurálás
A webről csak a /var/simplesamlphp/www
könyvtárat kell elérni. Tilos a teljes simplesamlphp könyvtárat a DocumentRoot alá tenni!
Alias /simplesaml /var/simplesamlphp/www <Directory /var/simplesamlphp/www> Require all granted </Directory>
Alapbeállítások
Mielőtt aktiváljuk valamelyik főszolgáltatását (IdP,SP...) a telepített alkalmazásnak, néhány beállítást meg kell adnunk a konfigurációs fájlban config/config.php
.
- Az "admin" felhasználó jelszavát, mellyel webes felületen keresztül be tud lépni a települő SSP-be.
'auth.adminpassword' => 'ujjelszotirdide',
- Titkosítási feladatokhoz szükséges "salt", azaz véletlenszerűen összeálló karaktersorozat
'secretsalt' => 'randombytesinsertedhere',
A karaktersorozat előállításában segíthet az alábbi parancs:
tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom | dd bs=32 count=1 2>/dev/null;echo
- Elérhetőségeket, amely adatok bekerülnek majd a generált metaadatba
'technicalcontact_name' => 'Gipsz Jakab', 'technicalcontact_email' => 'jakab.gipsz@example.org',
- Nyelv és időzóna adatok
'language.default' => 'hu', 'timezone' => 'Europe/Budapest',
Telepítés kész
Amennyiben elkészültünk a fenti lépésekkel, úgy a https://service.example.org/simplesaml/ címen elérjük a telepített SSP-nk webes adminfelületét, ahol megejthetjük a további beállítások nagy részét.
IdP beállítás
IdP funkció engedélyezése
A config/config.php
fájlt kell szerkesztenünk, s engedélyezni a saml20 idp lehetőséget.
'enable.saml20-idp' => true,
Autentikáció LDAP alapon
Meg kell adni, hogy az IdP milyen módon azonosítsa a felhasználót, amennyiben alapértelmezés szerint nem engedélyezett modult szeretnénk használni, úgy a megfelelő modult a modules
könyvtár alatt engedélyezni kell. Az alábbi példában az LDAP alapú azonosítást mutatjuk be, amely külön modult nem igényel, alapértelmezés szerint része a telepített alkalmazásnak.
Ahhoz, hogy megadhassuk az LDAP-hoz tartozó beállításokat, a config/authsources.php
fájlt kell szerkesztenünk. Az alábbi kódrészletet elegendő beszúrni, és az egyes változóknak a helyi LDAP-nak megfelelő adatokat értékül adni.
'example-ldap' => array(
'ldap:LDAP',
/* The hostname of the LDAP server. */
'hostname' => 'ldap.example.org',
/* Whether SSL/TLS should be used when contacting the LDAP server. */
'enable_tls' => FALSE,
/*
* Which attributes should be retrieved from the LDAP server.
* This can be an array of attribute names, or NULL, in which case
* all attributes are fetched.
*/
'attributes' => NULL,
/*
* The pattern which should be used to create the users DN given the username.
* %username% in this pattern will be replaced with the users username.
*
* This option is not used if the search.enable option is set to TRUE.
*/
'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org',
/*
* As an alternative to specifying a pattern for the users DN, it is possible to
* search for the username in a set of attributes. This is enabled by this option.
*/
'search.enable' => FALSE,
/*
* The DN which will be used as a base for the search.
* This can be a single string, in which case only that DN is searched, or an
* array of strings, in which case they will be searched in the order given.
*/
'search.base' => 'ou=people,dc=example,dc=org',
/*
* The attribute(s) the username should match against.
*
* This is an array with one or more attribute names. Any of the attributes in
* the array may match the value the username.
*/
'search.attributes' => array('uid', 'mail'),
/*
* The username & password the simpleSAMLphp should bind to before searching. If
* this is left as NULL, no bind will be performed before searching.
*/
'search.username' => NULL,
'search.password' => NULL,
),
Metaadat alapok
A beállítandó IdP alapvető paraméterei a metadata/saml20-idp-hosted.php
fájlban állíthatók. Az alábbi kódrészlet egy minimális, de már működő példát mutat.
$metadata['__DYNAMIC:1__'] = array(
/*
* The hostname for this IdP. This makes it possible to run multiple
* IdPs from the same configuration. '__DEFAULT__' means that this one
* should be used by default.
*/
'host' => '__DEFAULT__',
/*
* The private key and certificate to use when signing responses.
* These are stored in the cert-directory.
*/
'privatekey' => 'idp.example.org.key',
'certificate' => 'idp.example.org.crt',
/*
* The authentication source which should be used to authenticate the
* user. This must match one of the entries in config/authsources.php.
*/
'auth' => 'example-ldap',
);
Teszteléshez is érdemes, éles használathoz pedig elengedhetetlen, hogy a csomagban érkezett tanúsítványt felülírjuk, ezt célszerű mihamarabb megtenni. Ehhez az alábbi parancs lehet segítségünkre.
openssl req -new -newkey rsa:2048 -x509 -days 3652 -nodes -out idp.example.org.crt -keyout idp.example.org.key
A fingerprint az alábbi módon kérdezhető le a legegyszerűbben
openssl x509 -fingerprint -noout -in idp.example.org.crt
Megfelelő beállítások után a dinamikusan generált metadata a /saml2/idp/metadata.php
útvonalon érhető el.
Tesztelés
Legegyszerűbben a telepített SSP felületén tudjuk ellenőrizni, hogy a beállított autentikációs forrás működik-e. A felületen az Authentication fül alatt található egy 'Test authentication sources' link, amelyre kattintva látható minden beállított autentikációs forrás is, így a két alapértelmezett, teszt célokat szolgáló alatt a most beállított example-ldap névre hallgatónak is meg kell jelenni. (A közvetlen url erre az oldalra: simplesaml/module.php/core/authenticate.php) Ez utóbbira kattintva a beállított LDAP-ból autentikálva be kell tudnunk jelentkeznünk; siker esetén az LDAP-ból kinyerhető attribútumokat láthatjuk.
SP beállítás
Alapadatok
A telepített alkalmazásunk által kezelt SP-ket a config/authsources.php
fájlban tudjuk beállítani.
'default-sp' => array(
'saml:SP',
// The entity ID of this SP.
// Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
'entityID' => NULL,
// The entity ID of the IdP this should SP should contact.
// Can be NULL/unset, in which case the user will be shown a list of available IdPs.
'idp' => NULL,
// The URL to the discovery service.
// Can be NULL/unset, in which case a builtin discovery service will be used.
'discoURL' => NULL,
'privatekey' => 'saml.pem',
'certificate' => 'saml.crt',
),
A fenti beállítások alapján az SP entityID-ja megegyezik a metadata elérési útvonalával (szokásos megoldás SSP-nél), nem adunk meg alapértelmezett idp-t, ezáltal az SSP választási lehetőséget kínál fel számunkra, mikor az SP-re szeretnénk bejelentkezni, ill. most még Discovery Service URL-t sem adunk meg, hanem a beépítettet használjuk. Ez utóbbit majd a HREF-be történő integrációkor meg kell változtatni - lásd lejjebb.
Az IdP beállításához hasonlóan itt is szükség lesz egy self-signed tanúsítvány generálására a cert
könyvtárba. Ehhez segítség lehet az alábbi parancs.
openssl req -new -newkey rsa:2048 -x509 -days 3652 -nodes -out saml.crt -keyout saml.pem
Tesztelés
Amennyiben IdP is beállításra került, úgy a legcélszerűbb ezt összehangolni az SP-vel. Ehhez egyfelől a metadata/saml20-idp-remote.php
fájlban meg kell adni az IdP adatait, amely esetünkben az alábbiak szerint fest.
$metadata['https://example.org/simplesaml/saml2/idp/metadata.php'] = array(
'name' => array(
'en' => 'TestSP'
),
'SingleSignOnService' => 'https://example.org/simplesaml/saml2/idp/SSOService.php',
'SingleLogoutService' => 'https://example.org/simplesaml/saml2/idp/SingleLogoutService.php',
'certFingerprint' => 'afe71c28ef740bc87425be13a2263d37971da1f9'
);
Ehhez hasonlóan a metadata/saml20-sp-remote.php
fájlban meg kell adnunk az SP adatait. Teszteléshez az alábbiak elegendők:
$metadata['https://example.org/simplesaml/module.php/saml/sp/metadata.php/default-sp'] = array (
'AssertionConsumerService' => 'https://example.org/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp',
'SingleLogoutService' => 'https://example.org/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp',
);
Ezek után az IdP tesztelésénél már említett oldalon a default-sp opciót kiválasztva, majd a legördülő menüben a TestSP-re kattintva be kell tudnunk jelentkezni az IdP-n keresztül. Ha működik, akkor az alapvető lépsekkel kész vagyunk, van egy működő SP-nk és egy működő IdP-nk.
HREF-integráció
Metadata beállítása (IdP és SP is)
Az SSP-nél be kell állítani metaadat forrásként a központi metaadatot. Erre két lehetőségünk van:
- MDX használata
- statikus metadata XML-ek használata.
Ez a dokumentáció a statikus metaadatforrások beállítását írja le, az MDX SimpleSAMLphp-nál való használatához lásd a hivatkozott oldalt. A kétféle metaadatforrás akár egyidejűleg is használható, de ez haladó beállítás, leginkább akkor lehet rá szükség, ha az MDX adatforrásban nem szereplő entitásokkal (például nem a föderációban regisztrált SP-k és IdP-k) szeretnénk dolgozni.
- Első lépésként engedélyezzük, hogy az SSP automatikusan frissíthesse a metaadatot, ill. az ezt elvégző két modult
touch modules/metarefresh/enable cp modules/metarefresh/config-templates/*.php config/ touch modules/cron/enable cp modules/cron/config-templates/*.php config/
- Létrehozunk egy könyvtárat, ahová letöltésre kerül az központi metaadat XML fájlja
mkdir metadata/metarefresh-href chmod g+rw metadata/metarefresh-href
![]() |
FIGYELEM!
Ahhoz, hogy az automatikus metadata frissítés gond nélkül működjön, legalább 1.13.2-es verziójú simpleSAMLphp kell, vagy korábbi változatokon frissíteni kell a Ha az eduGAIN metaadatait is feldolgozzuk, akkor fontos, hogy néhány paramétert emeljük legalább az alábbi értékekre:
|
- Ezek után be kell állítani a metaadat kokrét adatait a
config/config-metarefresh.php
fájlban
- Ezek után be kell állítani a metaadat kokrét adatait a
$config = array(
'sets' => array(
'hu' => array(
'cron' => array('hourly'),
'sources' => array(
array(
'src' => 'http://metadata.eduid.hu/2011/href.xml',
'validateFingerprint' => 'FE:AE:0B:E8:FB:59:ED:F7:CB:7F:69:DF:19:4F:8B:6D:C7:F6:96:66',
),
),
'expireAfter' => 60*60*24*4, // Maximum 4 days cache time.
'outputDir' => 'metadata/metarefresh-href/',
'outputFormat' => 'flatfile',
),
),
);
- Be kell állítani, hogy az SSP az automata által generált fájlokból dolgozzon. Ehhez a
config/config.php
fájlban keressük ki ametadata.source
szakaszt, és az alábbiak szerint szerkesszük át. Amennyiben nem csak a központi metaadatból szeretnénk dolgozni, úgy további sorokat is megadhatunk itt bemutatott mintájára.
- Be kell állítani, hogy az SSP az automata által generált fájlokból dolgozzon. Ehhez a
'metadata.sources' => array(
array('type' => 'flatfile'), // IdP esetén kell, itt van az önmagát leíró metadata
array('type' => 'flatfile', 'directory' => 'metadata/metarefresh-href'),
),
- Végül le kell futtatni kézzel a cronjobot, amelyet az SSP webes felületén tudunk megtenni a Configuration fül alatt, a Cron module information page menüpontban. Ekkor létrejönnek a fájlok (majd óránként frissülnek is, ha beállítjuk cronjobként).
![]() |
Megjegyzés
Ha a nemzetközi eduGAIN konföderációhoz is szeretnéd csatlakoztatni az IdP-t vagy SP-t, mindenképpen nézd át a csatlakozás menetéről szóló oldalt! |
IdP
Amennyiben van SSP alapú IdP-nk, melyet szeretnénk a föderáció részévé tenni, úgy a teendők a következők.
- (Az adminisztratív teendőktől itt most eltekintünk, a csatlakozás folyamata itt van leírva)
- Kell küldeni egy levelet a info@eduid.hu címre, benne néhány mondat mellett az IdP metaadatának URL-jével (https://example.org/simplesamlphp/saml2/idp/metadata.php)
- Ha minden rendben megy, akkor az IdP bekerül a Resource_Registry-be, ezáltal a föderációs metaadatba is.
- Az előző pontban leírt módon be kell állítani a központi metadata feldolgozását.
- Amennyiben a föderációs metaadatban már szerepel a mi IdP-nk is, úgy a föderáció valamelyik, tesztelési célokat szolgáló SP-jénél ki is próbálhatjuk a bejelentkezést.
- Fontos, hogy a föderációs Discovery Service óránként generálja újra az IdP-k listáját, így ennyi idő mindenképp szükséges, hogy az új IdP megjelenjen itt, az egyes SP-k pedig két óránként töltik újra a metaadatot, így előfordulhat, hogy azonnal nem fog minden működni, de néhány óra alatt várhatóan beindul. :)
- Tesztelésre használható oldal: https://attributes.eduid.hu
- Ahhoz, hogy a Resource Registry-be is be tudjunk lépni és az IdP további, a föderációra vonatkozó beállításait meg tudjuk ejteni, ehhez az IdP-nek ki kell adnia az alábbi attribútumokat:
- mail - ez belépés után, manuálisan is beállítható
- eduPersonPrincipalName
-
schacHomeOrganizationType(az attribútumot hamarosan kivezetjük a kötelező attribútumok közül) - eduPersonScopedAffiliation
Attribútumok kezelése
Beállított IdP-nk alapértelmezés szerint azokat az attribútumokat adja ki, melyeket a metaadat alapján az SP kért (Lásd a metadatában a RequestedAttribute elemeket), és egyúttal alapból meg tudta szerezni a felhasználói adatbázisból, esetünkben az LDAP-ból. Mivel néhány attribútum nem szerepel az LDAP-ban, hanem az IdP-ben kell előállítani, így pár helyen módosítanunk kell az alapértelmezett konfiguráción.
A metadata/saml20-idp-hosted.php
fájlba szerkesszük be az alábbi kódrészlet értelemszerűen módosított változatát. Az 'auth' => 'example-ldap',
sor alatt kezdjük. Fontos, hogy egyúttal a config.php authproc.idp
részét kikommentezzük, nehogy az ottani sorszámokkal megadott default feladatok bekavarjanak.
'AttributeNameFormat' => 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri',
'userid.attribute' => 'uid', // Itt adjuk meg, hogy mely, az LDAPból származó attribútum alapján fogja az IdP kiszámítani az eduPersonTargetedID-t
'authproc' => array(
10 => array(
'class' => 'core:AttributeMap',
'uid' => 'eduPersonPrincipalName'
//Itt az 'uid' az az attribútum az LDAP-ban, amely a felhasználó azonosítóját tartalmazza, mert ebből képezzük az eduPersonPrincipalName-t.
),
# 20 => array(
# 'class' => 'core:AttributeAdd',
# 'schacHomeOrganizationType' => array('urn:schac:homeOrganizationType:hu:university')
# //Kötelező statikus attribútum az [[HREFAttributeSpec#schacHomeOrganizationType|intézmény jellegének]] megfelelően
# ),
30 => array(
'class' => 'core:AttributeAlter',
'subject' => 'eduPersonPrincipalName',
'pattern' => '/^.*$/',
'replacement' => '${0}@intezmenydomain.hu',
// Itt adjuk hozzá az intézményi scope-ot az eduPersonPrincipalName már meglévő értékéhez
),
40 => array(
'class' => 'core:AttributeAlter',
'subject' => 'eduPersonAffiliation',
'pattern' => '/^.*$/',
'replacement' => '${0}@intezmenydomain.hu',
// Itt adjuk hozzá az intézményi scope-ot az eduPersonAffiliation már meglévő értékéhez
),
50 => array(
'class' => 'core:AttributeMap',
'eduPersonAffiliation' => 'eduPersonScopedAffiliation'
// Az LDAP-ból eduPersonAffiliation-ként érkező attribútumból föderációs elvárásoknak megfelelően eduPersonScopedAffiliationt készítünk
),
60 => array(
'class' => 'core:AttributeAdd',
'eduPersonScopedAffiliation' => array('member@intezmenydomain.hu')
// Az eduPersonScopedAffiliation-ben tesztelés céljából kiadhatjuk member értéket, így ha LDAP-ból nem jön érték, akkor is láthatjuk, hogy működik az attribútum kiadás
),
61 => array(
'class' => 'core:TargetedID',
'nameId' => TRUE,
),
// Itt állítjuk be, hogy az IdP előállítson és kiadhasson állandóazonosítóként eduPersonTargetedID-t, ha kérik
70 => array('class' => 'core:AttributeMap',
'name2oid'
// Az LDAP-os attribútum nevekből itt kreálunk szabványos urn:oid formátumúakat
),
80 => 'core:AttributeLimit',
), // .authproc
'simplesaml.nameidattribute' => 'eduPersonPrincipalName',
'attributeencodings' => array(
'urn:oid:1.3.6.1.4.1.5923.1.1.1.10' => 'raw',
),
'sign.logout' => true
- További tudnivalók a Resource Registry-ről, ill. a Föderációs attribútum specifikációról.
- Ha minden rendben ment, akkor a Resource Registry-ben regisztrált IdP-hez tartozó adminisztrációs jogok átkerülnek az IdP technikai gazdájához, s ezzel a folyamat kész is.
SP
Amennyiben IdP-t is beállítottunk, és be is tudunk lépni a Resource Registry-be, úgy nincs más dolgunk, mint az RR-ben új SP-t hozzáadni a föderációhoz, amely a megfelelő átfutási idő után a föderáció minden tagjánál látható is lesz.
Ellenkező esetben (nincs IdP, és nem is tervezünk beállítani), akkor az IdP hozzáadásánál részletezett pontokon kell végig menni a metaadat betöltéséig, s a továbbiakat az említett e-mail címen megbeszélni.
Attribútum scopeok használata
A HREF föderáció IdP-i ún. scopeolt attribútumokat is használnak. Ez a scopeolás azt jelenti, hogy minden egyes IdP csak a saját scopejában ad ki attribútumokat, és a Shibboleth SP-k ezt ellenőrzik is. A scope és az attribútum valódi értéke egy '@' karakterrel kerül elválasztásra (ilyen attribútumok jelenleg: eduPersonScopedAffiliation illetve eduPersonPrincipalName).
A SimpleSAMLphp alapértelmezett telepítése nem szűri a hibásan scopeolt értékeket. Kiegészítő modulként szűrésre használható az NIIF által fejlesztett attributescope modul, ami reményeink szerint rövid távon a hivatalos SimpleSAMLphp kiadás része lehet.
A telepítésről és konfigurációról bővebben itt lehet olvasni: https://github.com/NIIF/simplesamlphp-module-attributescope
- Az
attributescope
modul használata esetén a következőképp kell módosítani aconfig/config.php
fájlt:
authproc.sp = array(
...
// 49 => array('class' => 'core:AttributeMap', 'oid2name'),
50 => array( 'class' => 'attributescope:FilterAttributes'
),
...
),
Figyeljünk arra, hogy mire a modulhoz ér a vezérlés, az attribútumok nevei friendlyName alakúak legyenek (ne pedig oid-ok). A példában erre utal a 49-es sor.