Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

SimpleSAMLphp SP

Z MAN-HA wiki


Instalacja SimpleSAMLphp SP

Aplikacja - Service Provider jest przygotowana w PHP. Celem jest włączenie logowania federacyjnego, czyli logowania poprzez wskazanego dostawcę tożsamości. Aplikacja ma być dostępna pod adresem https://sp.example.pl/mysp


Wymagania wstępne

  • Aktywny serwis ntp
  • Serwer HTTP mający możliwość wykonywania skryptów PHP
  • PHP w werji >= 5.3.0
  • Rozszerzenia PHP:
    • date, dom, hash, libxml, openssl, pcre, SPL, zlib, mcrypt
    • jeśli będziemy korzystać z bazy użytkowników LDAP: ldap
    • jeśli używamy bazy danych:
      • zawsze: PDO
      • database driver: (mysql, pgsql, ...)


Instalacja

 wget https://simplesamlphp.org/res/downloads/simplesamlphp-1.13.2.tar.gz
 cd /usr/local
 tar xvf simplesamlphp-1.13.2.tar.gz
 

Dostosowanie konfiguracji serwera HTTP:

  • załóżmy, że nazwa naszego serwera to sp.example.pl, serwer o tej nazwie należy skonfigurować jako wirtualny serwer https (port 443), zaleca się również realizację przekierowania adresu http://sp.example.pl na http://sp.example.pl, np:
<VirtualHost *:80>
 ServerName sp.example.pl
 DocumentRoot /var/www/html
 RedirectMatch 301 ^/mysp(.*) https://sp.example.pl/mysp$1
 </VirtualHost>
  • w konfiguracji serwera SSL podajemy klucz prywatny serwera (SSLCertificateKeyFile) oraz certyfikat serwera (SSLCertificateFile) i plik zawierający łańcuch certyfikatów wystawców (SSLCACertificateFile) - należy użyć znanego wystawcy certyfikatów, wymogi spełniają certyfikaty TCS, również tzw. wildcard (czyli wystawione dla nazwy *.example.pl)
  • dodajemy w sekcji wirtualnego hosta SSL
Alias /mysp /usr/local/simplesamlphp-1.13.2/www
  • w przypadku apache 2.4 nadajemy uprawnienia dla katalogu
<Directory /usr/local/simplesamlphp-1.13.2/www/>
 Order allow,deny
 Allow from all
 Require all granted
</Directory>

(niezbędne jest Require all granted)

Konfiguracja SimpleSAMLphp SP

Opis instalacji jest dostępny na stronie Konfiguracja SimpleSAMLphpSP

Plik konfiguracyjny config/config.php

'debug' => true,

oraz

'logging.level' => SimpleSAML_Logger::DEBUG,

Warto również ustawić

 'logging.handler' => 'file',

zamiast logowania via syslog

  • Pamiętamy o ustawieniu praw dostępu do katalogu log (zapis przez użytkownika serwera httpd).
  • Dostosowujemy inne zmienne konfiguracyjne:
    • auth.adminpassword - hasło administratora umożliwiające logowanie na stronie https://login.example.pl/simplesaml
    • secretsalt - poprzez wygenerowanie zmiennej losowej - jej wartość w wersji produkcyjnej należy zarchiwizować, by przy aktualizacjach zagwarantować stosowanie takiej samej
    • technicalcontact_name, technicalcontact_email
    • timezone - należy ustalić 'Europe/Warsaw'


Certyfikat stosowany do podpisywania/szyfrowania danych przekazywanych między IdP a SP

Przygotowujemy certyfikat tzw. self-signed

 openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out example.pl.pem -keyout example.pl.key

i umieszczamy go klucz prywatny oraz certyfikat w katalogu cert

Uwaga! SimpleSAMLphp obsługuje wyłącznie certyfikaty RSA. Nie są wspierane certyfikaty DSA.

Plik config/authsources.php

Dostosowujemy wpis 'default-sp':

  • odkomentowujemy 'signature.algorithm', aby realizowany był podpis SHA-256
  • dodajemy wskazania do pliku klucza prywatnego i certyfikatu
  • dodajemy filtr konwerujący atrybuty z postaci OID do nazwy
'default-sp' => array(
   'saml:SP',
   'signature.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
   'privatekey' => 'example.pl.key',
   'certificate' => 'example.pl.pem',
   'authproc' => array(
       80 => array('class' => 'core:AttributeMap', 'oid2name'),
    ),
),


Moduł metarefresh - pobieranie i odświeżanie metadanych

Moduł metarefresh służy do pobierania metadanych. Jeśli współpracuje z modułem cron, to za jego pomocą można regularne aktualizować metadane. Aby aktywować moduł, wykonujemy:

cd /usr/local/simplesamlphp-1.13.2
touch modules/metarefresh/enable

Aktywizujemy również moduł cron:

touch modules/cron/enable

Kopiujemy pliki konfiguracyjne tych dwóch modułów do katalogu config:

cp modules/cron/config-templates/module_cron.php config/
cp modules/metarefresh/config-templates/config-metarefresh.php config/

W pliku config/module_cron.php ustalamy stosowany tajny klucz (key):

'key' => '0oki8uh',

Aby metarefres regularnie pobierał metadane z określonych lokalizacji, należy dostosować plik config/config-metarefresh.php:

  • Usuwamy wpis:
 'kalmar' => array(.....),
  • Dodajemy wpis:
  'identyfikator_źródła_metadanych' => array(
      'cron'          => array('daily'),
      'sources'       => array(
          array(
           'src' => 'URL_źródła_metadanych',
           'validateFingerprint' => 'fingerprint_certyfikatu_podpisującego_metadane',
          ),
      ),
      'expireAfter' => 60*60*24*4, 
      'outputDir' => 'metadata/katalog_tego_źródła_metadanych/',
      'outputFormat' => 'flatfile',
  ),


Ładowanie metadanych dostawców tożsamości, z którymi ma współpracować SP

Korzystamy ze skonfigurowanego wcześniej modułu metarefresh. Jeśli chcemy pobrać metadane IdP, np. IdP testowego, by umożliwić sprawdzenie czy testowa aplikacja współpracuje z tym dostawcą, wykonujemy polecenie:

./modules/metarefresh/bin/metarefresh.php -o=tmp-testidp adres_metadanych(URL)

W katalogu ./tmp-testidp pojawią się pliki saml20-idp-remote.php i shib13-idp-remote.php. Zawartość pliku saml20-idp-remote.php kopiujemy do ./metadata/saml20-idp-remote.php

Metadane PIONIER.Id

SP umożliwia logowanie federacyjne. Jeśli ma być oferowane logowanie wyłącznie poprzez IdP w federacji PIONIER.Id, to ładujemy metadane PIONIER.Id, dostępne pod adresem https://aai.pionier.net.pl/pionierid.xml. SP musi regularnie odświeżać te dane.

  • Modyfikujemy plik config/config-metarefresh.php - dodajemy dane potrzebne do pobierania metadanych PIONIER.Id:
  'pionierid' => array(
      'cron'          => array('daily'),
      'sources'       => array(
          array(
           'src' => 'https://aai.pionier.net.pl/pionierid.xml',
           'validateFingerprint' => 'D6:84:09:2D:F7:95:B4:96:8A:F7:61:3A:F5:3E:EC:C6:4B:DF:73:5B',
          ),
      ),
      'expireAfter' => 60*60*24*4, 
      'outputDir' => 'metadata/pionierid/',
      'outputFormat' => 'flatfile',
  ),

(dostępna po zalogowaniu jako administrator), np.

00 12 * * * curl --silent "https://ssp-idp.uci.umk.pl/simplesaml/module.php/cron/cron.php?key=0oki8uh&tag=daily" > /dev/null 2>&1

Można również z tej strony uruchomić zadanie natychmiast przez kliknięcie "Run [daily]" Zaplanowane zadanie odświeżania metadanych będzie realizowane w wyznaczonych godzinach.

  • W pliku config/config.php we wpisie metadata.sources dodajemy:
array('type' => 'flatfile', 'directory' => 'metadata/pionierid'),


Metadane PIONIER.Id-eduGAIN

Jeśli dostawca usługi ma akceptować logowania członków eduGAIN, konieczne będzie regularne pobieranie metadanych eduGAIN przygotowanych przez federację PIONIER.Id, dostępnych pod adresem https://aai.pionier.net.pl/pionierid-edugain-idp-feed.xml. Aby regularnie pobierać metadane, wykonujemy następujące kroki:

  • Dodajemy w pliku config/config-metarefresh.php wpis:
'edugain-sp' => array(
      'cron'          => array('hourly'),
      'sources'       => array(
          array(
                'src' => 'https://aai.pionier.net.pl/pionierid-edugain-idp-feed.xml',
                'validateFingerprint' => 'D6:84:09:2D:F7:95:B4:96:8A:F7:61:3A:F5:3E:EC:C6:4B:DF:73:5B',
          ),
       ),
      'expireAfter' => 60*60*24*4, // Maximum 4 days cache time.
      'outputDir' => 'metadata/edugain-sp/',
      'outputFormat' => 'flatfile',
 ),
  • Tworzymy katalog metadata/edugain-idp/ z prawami zapisu dla użytkownika, pod którym pracuje httpd
  • Dodajemy do crontaba wpis wg tego co podaje strona

https://sp.example.pl/mysp/module.php/cron/croninfo.php (dostępna po zalogowaniu jako administrator), np.

10 * * * * curl --silent "https://sp.example.pl/mysp/module.php/cron/cron.php?key=0oki8uh&tag=daily"> /dev/null 2>&1

Można również z tej strony uruchomić zadanie natychmiast przez kliknięcie "Run [hourly]"

  • Zaplanowane zadanie odświeżania metadanych będzie realizowane w wyznaczonych godzinach.

W pliku config/config.php we wpisie 'metadata.sources' należy dodać:

array('type' => 'flatfile', 'directory' => 'metadata/edugain-idp'),

Metadane te zawierają również dostawców tożsamości z PIONIER.Id, a więc po włączeniu ich pobierania należy wyłaczyć metadane PIONIER.Id, tj. anulować zadanie w crontab i usunąć wskazanie katalogu metadata/pionierid w parametrze metadata.sources w pliku config/config.php.


Federacyjne logowanie w aplikacji

<?php
  require_once('/usr/local/sp/lib/_autoload.php');
 
  $as = new SimpleSAML_Auth_Simple('default-sp');
  $as->requireAuth();
  $attributes = $as->getAttributes();
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<html>
<head><title>Usługa federacyjna w PHP</title></head>
<body>
<h1>Moja pierwsza usługa korzystająca z PHP</h1>
<p>Witajcie!</p> 
<h2>Poniżej Twoje atrybuty:</h2>
<ul>
<?php 
foreach ($attributes as $type=>$value) {
print '<li>'; print "$type => ".join(', ',$value);
}
?>
</body></html>

Discovery Service (DS) - usługa poszukiwania dostawcy tożsamości

Discovery Service (DS), czy Where Are You From(WAYF) to usługi oferujące wsparcie SP na etapie poszukiwania dostawcy tożsamości.

SimpleSAMLphp ma wewnętrzną funkcjonalność prezentowania listy dostępnych dostawców tożsamości. Lista obejmuje wszystkich dostawców tożsamości umieszczonych w plikach wskazanych jako źródła metadanych - parametr metadata.sources w pliku config/config.php. Domyślne ustawienie to:

'idpdisco.layout' => 'dropdown',

oznaczające, że prezentowana będzie rozwijalna lista dostawców tożsamości. Alternatywna wartość parametru to links, powoduje ona, że prezentowana jest pełna lista linków do dostawców.

Ustawiając parametr idpdisco.extDiscoveryStorage można wymusić użycie zewnętrznej usługi DS/WAYF"

'idpdisco.extDiscoveryStorage' => 'https://aai.pionier.net.pl/WAYF',

Innym podejściem jest zastosowanie usługi DiscoJuice DiscoJuice.