# 1. SimpleSAMLphp telepítése és konfigurálása szerver környezetben
Előfeltételek: A szervernek a simpleSAMLphp céljára legyen egy saját, alkalamzásoktól független neve és vhostja, mely
- alapja az automatikus DNS bejegyzéseknek (cname)
- szükséges a cron jobok futtatásához
### 1.1. Telepítés csomagként
A SimpleSAMLphp-t egyes linux disztribúciókban az operációs rendszer csomagjaként is lehet telepíteni, bár a SimpleSAMLphp dokumentációja ezt kifejezetten nem javasolja.
Egyes disztribúciók esetén a SimpleSAMLphp egy közös gyökérben található, például /var/simplesamlphp, más esetekben a
konfigurációk külön találhatók a /etc/simplesamlphp mappa alatt. A leírásban szereplő mappákat ennek megfelelően kell értelmezni.
Használjuk bátran a gyártói [dokumentációt](https://simplesamlphp.org/docs/stable/simplesamlphp-sp) is.
Legyen az Apache konfigurációban egy globális path prefix a `/simplesaml`, mely minden vhost esetén a `...simplesamlphp/public` mappára mutat
A `https://szervernév.pte.hu/simplesaml` cím alatt be kell jönnie a SimpleSAMLphp adminisztratív felületének.
Állítsuk be az admin jelszót: `'auth.adminpassword' => '...',` ennek egy hashnak kell lennie (lásd vendor/simplesamlphp/simplesamlphp/bin/pwgen.php)
Állítsuk be a technikai kontaktot, pl:
'technicalcontact_name' => 'Uherkovich Peter',
'technicalcontact_email' => 'uherkovich.peter@pte.hu',
Állítsuk be egyedire a secret saltot, pl:
'secretsalt' => 'kwudxo2erufio75crzjh',
Ha szeretnénk lokális teszt-IDP-t is, akkor ugyanezt a példányt konfiguráljuk IdP-nek is, de az külön fejezet.
Session cookie-név legyen egyedi:
'session.cookie.name' => 'SimpleSAML_szervernév',
'session.phpsession.cookiename' => 'SimpleSAMLphp_szervernév',
Simplesamlphp session tárolást írjuk át sqlite-ra:
'store.type' => 'sql',
'store.sql.dsn' => 'sqlite:'.dirname(__DIR__).'/data/simplesaml.sq3',
Ne felejtsük el a fent megjelölt mappát létrehozni!
Attributumfeldolgozás: az alkalmazások felé névvel adjuk át az attributumokat. Ehhez írjuk be az `'authproc.sp'` utolsó szabályának:
'authproc.sp' => array(
...
100 => array('class' => 'core:AttributeMap', 'oid2name'),
);
Aktivizáljuk a cron modult. Ez a modul fogja kezdeményezni a metaadatok frissítését rendszeres időközönként:
* Másoljuk be a config mappába a `module_cron.php` fájlt. A benne lévő kulcsot írjuk át egyedire. (www-data/www-data+w)
* kapcsoljuk be a `cron` modult: `touch ...modules/cron/enable`
* A hosting szerveren (vagy a cront futtató egyéb környezetben) hozzunk létre egy cron fájlt a következő tartalommal a `/etc/cron.d` mappában: (a kulcs helyére a fent beírtat használjuk)
```
02 0 * * * curl --silent "https://szervernév.pte.hu/simplesaml/module.php/cron/cron.php?key=secret&tag=daily" > /dev/null 2>&1
01 * * * * curl --silent "https://szervernév.pte.hu/simplesaml/module.php/cron/cron.php?key=secret&tag=hourly" > /dev/null 2>&1
```
#### Tanúsítvány létrehozása
Parancssorból hozzuk létre a szerverhez tartozó tanúsítványt a .../simplesaml/cert mappában:
cd cert
openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out szervernév.crt -keyout szervernév.pem
### 1.2 Reverse proxy kezelése
Ha a szerveren reverse proxy fut, és a belső elérés http, akkor a hívási url-t a SimpleSAMLphp tévesen http-nek fogja
érzékelni https esetén is, így nem jó a `config.php` elején lévő standard `'baseurlpath'`. (Lásd a mellé írt megjegyzést is).
__A megoldáshoz:__
* Be kell szúrni a `$config` elé:
```
$https = isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : getenv('HTTPS');
$scheme = ($https == "on") ? 'https' : 'http';
```
* Majd a `'baseurlpath'` helyére:
```
'baseurlpath' => $scheme.'://'.$_SERVER['SERVER_NAME'].'/simplesaml/',
```
* Szükséges még, hogy minden érintett vhost konfigurációban legyen beállítva a `HTTPS = on` környezeti változó.
* docker környzete estén a `HTTPS = on` változó a stack configba is kerülhet.
### 1.3 Docker környezet sajátosságai
A simplesamlphp-t egy olyan tárhelyre telepítjük, melyet minden stack-ben ugyanoda mappalünk be. Például:
```yml
volumes:
- /mnt/ocfs2/docker-data/fo/simplesaml:/var/simplesamlphp
```
A simplesamlphp-nak létrehozunk egy önálló, alkalmazásfüggetlen apache/php konténert, amely a szerver saját nevével elérhető.
Amennyiben a szerveren https-t termináló reverse proxy üzemel, akkor a https oldal helyes működéséhez kell egy környezeti változó:
```yml
environment:
HTTPS: on
```
A cachelést a /simplesaml url-ekre ki kell kapcsolni!
### 1.4 Intézményi testreszabás
A SimpleSAMLphp terméknek van önálló kezelőfelülete, mely az `alkalmazás/simplesaml` url-en jön be (bármely regisztrált alkalmazás esetén).
Ugyancsak ez a felület jelenik meg akkor, ha (egy alkalmazáshoz) sem IdP-t, sem discoURL-t nem konfiguráltunk. Ezért
célszerű telepíteni az intézményi modult, mely a felület design-ján kívül tartalmazza a saját attributumok definícióit és
egyes helyi módosításokat a magyar fordításokban.
#### 1.4.1 PTE modul telepítése
A pte modult (megtalálható: `https://iig-gitlab.pte.local/UHPOAAP.PTE/pte2`) az ott található leírás alapján kell
composerrel telepíteni. Ezt követően a `config.php`-ban a CONFIGURATION fejezetben
leírtak szerint kell konfigurálni. A telepített példány megjelenését célszerű címmel és színnel egyedivé tenni.
'theme.use' => 'pte:ptetheme',
'attributes.extradictionary' => 'pte:pteattributes',
'pte.title' => 'Szerver nyilvános neve',
'pte.color' => '#446655',
### 1.5 IdP-k konfigurálása
Csak olyan IdP-hez lehet csatlakozni, mely az SP számára ismert. A kézi konfigurációval szemben itt a RR-ből való frissítést állítjuk be.
Szövetségi környzetben hasonlóképpen töltődnek az elérhető megbízható IdP-k a szövetségi metaaadat-szerverről.
#### 1.5.1 IdP Metaadatok regisztrálása az SP-ben
A `metadata/saml20-idp-remote.php` fájlba kell beírni az alábbiakat. A teszt idp hozzáadása opcionális, amennyiben előfordul
fejlesztés alatt lévő alkalmazás is, melyhez szükséges tesztfelhasználó beléptetése is. (Ez nem jelenti automatikusan
azt, hogy az éles alkalmazásoknál is megjelenik)
/*
* PTE IdP
*/
$metadata['https://idp.pte.hu/saml2/idp/metadata.php'] = array(
'name' => array(
'hu' => 'Pécsi Tudományegyetem',
'en' => 'Pecs University, Hungary'
),
'description' => 'Here you can login with your account on PTE.',
'SingleSignOnService' => 'https://idp.pte.hu/saml/saml2/idp/SSOService.php',
'SingleLogoutService' => 'https://idp.pte.hu/saml/saml2/idp/SingleLogoutService.php',
'certFingerprint' => '91:FF:FB:8B:D1:35:1E:2E:71:05:2D:EB:03:29:BC:26:91:63:E1:AC'
);
/*
* PTE teszt IdP
*/
$metadata['http://testidp.pte.hu/saml2/idp/metadata.php'] = array(
'name' => array(
'hu' => 'Pécsi Tudományegyetem teszt',
'en' => 'Pecs University, Hungary, Test'
),
'description' => array(
'hu' => 'Itt a PTE teszt IdP-n meghatározott tesztuserekkel tud bejelentkezni (alfa, OpenLDAP alapú)',
'en' => 'Here you can login with a test account on PTE.',
),
'SingleSignOnService' => 'http://testidp.pte.hu/saml/saml2/idp/SSOService.php',
'SingleLogoutService' => 'http://testidp.pte.hu/saml/saml2/idp/SingleLogoutService.php',
'certFingerprint' => '8E:45:21:0D:16:67:AF:EC:3C:D4:EA:73:9C:48:30:E7:E2:9D:6B:B3'
);
#### 1.5.2 SP Metaadatok automatikus és kézi regisztrálása az SP-ben
Telepítsük a [refreshAuthsources](https://git@iig-gitlab.pte.hu:UHPOAAP.PTE/simplesamlphp-module-refresauthsources.git) modult.
Ez a modul frissíti az alkalmazások SP oldali meataadatait az RR alapján. Ekkor az alkalmazásokat nem kell kézzel konfigurálni
az SP konfigurációs állományaiban, elég az RR-be rögzíteni.
* Hozzuk létre a `.../simplesamlphp/authsources/rr` mappát. (www-data/www-data g+w)
* Másoljuk be a `config-refreshauthsources.php` fájlt a config mappába.
* A `config/authsources.php` végéhez fűzzük hozzá:
```
$externalsourcefile = dirname(__FILE__).'/authsources/rr/authsources.php';
if(file_exists($externalsourcefile)) include $externalsourcefile;
```
A cron óránként fogja frissíteni a RR 'PTE-PRIVATE' metaadatforrásából az itteni `config/authsources.php` fájlt.
Azokat az alkalmazásokat, melyeket a 'PTE-PRIVATE' alá nem regisztráltunk (mert pl. csak teszt idp-t használunk), kézzel
kell regisztrálni a `config/authsources.php`-ban, például:
'foo' => array(
'saml:SP',
'privatekey' => 'foo.pem',
'certificate' => 'foo.crt',
),
(Az, hogy nem állítottunk be 'idp'-t, azt jelzi, hogy fel fogja ajánlani az ismert idp-ket belépéskor)
### 1.6 SP szerver regisztrációja az RR-ben
A PTE Resource Registryben (https://rr.pte.hu) az Id-be regisztrált alkalmazásokat szerverenként tartjuk nyilván. Ez az
adinisztratív nyilvántartáson túl alapja az automatikus DNS generálásnak, az alapértelemezett konfigurációk kiszámításának,
és az SP szintű automatizált konfigurációnak.
A szervert ezért az első rajta lévő alkalmazás regisztrációja előtt szerverként regisztráljuk.
A SAML/szerverek menüpontban [Új szerver] gomb.
(A legegyszerűbb megnézni egy meglévőt, és annak mintájára eljárni, az űrlapon elhelyezett útmutatók figyelembe vételével)
Szerver szinten felvehetjük azokat az attributumokat, melyek várhatóan minden alkalmazásnak kelleni fognak.
### 1.7 Szövetségi környezet beállítása (opcionális)
Erre a lépésre akkor van szükség, ha van olyan alkalmazás, mely a saját IdP-ken kívül szövetségi IdP-ktől is szeretne elfogadni felhasználókat.
Lásd: [SP csatlakoztatása EduID-hez](href)