Jednotné přihlášení VUT na FIT

Server auth.fit.vut.cz nabízí služby SSO IdP (Single Sing-On Identity Provider) centrálního VUT přihlášení pomocí protokolu SAML2. Využívá knihovnu SimpleSAMLphp.

Na serveru, který potřebuje uživatele autentizovat je nutné knihovnu také nainstalovat a nastavit tak, aby se chovala jako SP (Service Provider). Samozřejmě je možné využít jakoukoli jinou knihovnu nebo vlastní implementaci. V tomto případě po zprovoznění zašlete správci IdP (Marek Kuchynka) soubor s metadaty ve formátu XML nebo odkaz, kde lze tato metadata přečíst. Příklad takových metadat zde.

Instalace SimpleSAMLphp

Postupujte podle návodu na oficiálních stránkách SimpleSAMLphp: https://simplesamlphp.org/docs/stable/simplesamlphp-install.html. Po ověření funkčnosti na URL https://<server>.fit.vutbr.cz/simplesaml (nebo podobné) postupujte k základnímu nastavení SP.

Konfigurace SP

základní nastavení

soubor config/config.php
'baseurlpath' => 'https://<server>.fit.vutbr.cz/simplesaml/',
'technicalcontact_name' => 'Ing. Jméno Příjmení',
'technicalcontact_email' => 'login@fit.vut.cz',
'timezone' => 'Europe/Prague',

'secretsalt' => '', // vygenerovat např pomocí: LC_CTYPE=C tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom | dd bs=32 count=1 2>/dev/null;echo
'auth.adminpassword' => '', // hash hesla do webové administrace
'admin.protectindexpage' => true,
'admin.protectmetadata' => false,

'showerrors' => false,
'errorreporting' => false,

'language.default' => 'cs',

vygenerování certifikátu

stačí self-signed certifikát, platnost např. 10 let a uložení do složky cert/

cd cert
openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out saml.crt -keyout saml.pem

POZOR na přístupová práva

autentizační body

soubor config/authsources.php

$config = [

    // This is a authentication source which handles admin authentication.
    'admin' => [
        'core:AdminPassword',
    ],


    'default' => [
        'saml:SP',
	'entityID' => 'https://<server>.fit.vut.cz/simplesaml/module.php/saml/sp/metadata.php/default',  // můžete zvolit jak chcete, ale musíte poté používat všude!
        'idp' => 'https://auth.fit.vut.cz/saml/idp/',
        'discoURL' => null,
        'privatekey' => 'saml.pem',
        'certificate' => 'saml.crt',

        // informace o aplikaci pro uživatele (kam povolují předání svých údajů)
        'name' => [
            'cs' => '<aplikace> FIT VUT',
            'en' => '<application> FIT BUT',
        ],
        'description' => [
            'cs' => '<popis aplikace>',
            'en' => '<application description>',
        ],
        'OrganizationName' => [
            'cs' => 'Fakulta informačních technologií Vysokého učení technického v Brně',
            'en' => 'Fakulty of Information Technology, Brno University od Technology',
        ],
        'OrganizationDisplayName' => [
            'cs' => 'FIT VUT',
            'en' => 'FIT BUT',
        ],
        'OrganizationURL' => [
            'cs' => 'https://fit.vut.cz/.cs',
            'en' => 'https://fit.vut.cz/.en',
        ],

        'attributes' => [
            'eduPersonUniqueId' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.13',        // PERID@vutbr.cz
            'givenName' => 'urn:oid:2.5.4.42',                                 // Jméno
            'sn' => 'urn:oid:2.5.4.4',                                         // Příjmení
            'displayName' => 'urn:oid:2.16.840.1.113730.3.1.241',              // celé jméno i s tituly
            'mail' => 'urn:oid:0.9.2342.19200300.100.1.3',                     // e-maily
            'telephoneNumber' => 'urn:oid:2.5.4.20',                           // telefony
            'eduPersonScopedAffiliation' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.9',// vztahy k organizaci
            'o' => 'urn:oid:2.5.4.10',                                         // hlavní org. jednotka (VUT)
            'ou' => 'urn:oid:2.5.4.11',                                        // org. jednotky

        ],
        'attributes.required' => [
            'eduPersonUniqueId',
            'o',
            'ou',
            'eduPersonScopedAffiliation',
        ],


    ],
];

zjištění metadat SP

  1. V administraci simplesaml, záložka federace (https://<server>.fit.vutbr.cz/simplesaml/module.php/admin/federation)
  2. Hosted entities -> SAML 2.0 SP Metadata -> rozbalit
  3. Předat odkaz správci IdP (Marek Kuchynka). Odkaz bude vypadat asi takto: https://<server>.fit.vutbr.cz/simplesaml/module.php/saml/sp/metadata.php/default

uložení metadat IdP

metadata získáte od správce formou odkazu na XML soubor

  1. v nástroji pro konverzi (dole v administraci https://<server>.fit.vutbr.cz/simplesaml/module.php/admin/federation) získáte metadata ve formátu PHP pole
  2. soubor metadata/saml20-idp-remote.php
  3. přidat získaná metadata od správce IdP jako záznam v poli $metadata indexovaný IdP entityID

Použití autentizace

Manuál je určen pro aplikace v PHP. Pokud je aplikace v jiném jazyce, lze použít jinou knihovnu podporující SAML2.

V aplikaci, kde chcete autentizaci použít, je třeba udělat následující:

Veškeré funkce jsou popsány v dokumentaci

Minimalistický příklad by mohl vypadat takto: (test zde)

<?php
require_once('/var/simplesamlphp/lib/_autoload.php');

$as = new \SimpleSAML\Auth\Simple('default'); // klíč do pole v souboru config/authsources.php

// vynutí přihlášeného uživatele
$as->requireAuth($params);
// $params je nepovinné pole parametrů:
//   'ErrorURL' => URL stránky, která zpracuje chybu autentizace.
//   'KeepPost' => bool - budou data zaslaná v POST požadavku zaslána znovu po autentizaci? (výchozí true)
//   'ReturnTo' => URL kam se uživatel vrátí po autentizaci (výchozí je aktuální stránka)
//   'ReturnCallback' => ( array ) funkce volaná po autentizaci

$attributes = $as->getAttributes();

echo "<pre>".print_r($attributes, true)."</pre>";
Odkazy pro přihlášení a odhlášení je možné generovat takto: (test zde)
<?php
require_once('/var/simplesamlphp/lib/_autoload.php');

$as = new \SimpleSAML\Auth\Simple('default'); // klíč do pole v souboru config/authsources.php

// ověří přihlášení
if ($as->isAuthenticated())
    echo "přihlášen - <a href='".$as->getLogoutURL()."'>odhlásit</a>";
else
    echo "nepřihlášen - <a href='".$as->getLoginURL()."'>přihlásit</a>";

$attributes = $as->getAttributes();

echo "<pre>".print_r($attributes, true)."</pre>";
Případně je možné volat funkce pro přihlášení a odhlášení přímo z PHP:
<?php
require_once('/var/simplesamlphp/lib/_autoload.php');

$as = new \SimpleSAML\Auth\Simple('default'); // klíč do pole v souboru config/authsources.php

if (...)
    $as->login($params); // $params - viz první ukázka

if (...)
    $as->logout();