Shibboleth SP

Z PIONIER.Id
Przejdź do nawigacji Przejdź do wyszukiwania
Wersja do druku nie jest już wspierana i może powodować błędy w wyświetlaniu. Zaktualizuj swoje zakładki i zamiast funkcji strony do druku użyj domyślnej funkcji drukowania w swojej przeglądarce.

Shibboleth SP

Jest to oprogramowanie otwarte, wspierane w środowisku Apache oraz na kilku wersjach Microsoft IIS. Działa na poziomie serwera HTTP, jest niezależny od języka programowania. Bieżąca wersja to 2.5.3. Shibboleth SP składa się z dwóch części:

  • demona shibd, który obsługuje komunikację SP-IdP oraz
  • modułu Apache, obsługującego uwierzytelnienie po stronie serwera HTTP

Wymagania wstępne

  • Aktywny serwis ntp
  • Serwer HTTP

Instalacja pakietu

  • via yum (CentOS, Fedora, Redhat)
cd /etc/yum.repos.d 
# CentOS 7 
wget http://download.opensuse.org/repositories/security://shibboleth/CentOS_7/security:shibboleth.repo
# CentOS 6 
wget http://download.opensuse.org/repositories/security://shibboleth/CentOS_CentOS-6/security:shibboleth.repo
# 32b 
yum install shibboleth
# 64b 
yum install shibboleth.x86_64

  • via apt-get (Debian)
apt-get install libapache2-mod-shib2 shibboleth-sp2-schemas

Kolejne kroki to uruchomienie usługi shibd oraz dodanie modułu shib2 do konfiguracji serwera HTTP.

Jeśli w systemie operacyjnym serwera jest aktywny SELinux, to nie będzie działało połączenie shibd-apache. Według instalacji Shibboleth SP na stronach Shibboleth SP i SELinux nie jest zalecane produkcyjne działanie z aktywnym SELinuxem.

Przeprowadzone testy pokazują, że połączenie shibd-apache działa po wykonaniu następujących czynności:

cat > /tmp/audit <<EOF
type=AVC msg=audit(1352298653.415:568): avc:  denied  { write } for  pid=15174 comm="httpd" name="shibd.sock" dev=dm-0 ino=20422 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_run_t:s0 tclass=sock_file
type=AVC msg=audit(1352299235.662:570): avc:  denied  { connectto } for  pid=15178 comm="httpd" path="/var/run/shibboleth/shibd.sock" scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:system_r:initrc_t:s0 tclass=unix_stream_socket
EOF
cat /tmp/audit  | audit2allow -M httpd-shibd > /dev/null
semodule -i httpd-shibd.pp
rm httpd-shibd.pp httpd-shibd.te /tmp/audit

(w systemie CentOS 7 audit2allow należy do pakietu policycoreutils-python)

Konfiguracja

Serwer HTTP

Uruchamiamy serwer HTTP. Konfigurujemy serwer o nazwie https://sp.example.pl. Serwer musi korzystać z certyfikatu wystawionego przez ogólnie znany urząd, np. z certyfikatu TCS. Dodajemy do konfiguracji serwera wymóg uwierzytelnienia opartego na Shibboleth:

<Location /secure>
 AuthType shibboleth
 ShibRequestSetting requireSession 1
 require valid-user
</Location>

W ten sposób wszystkie pliki znajdujące się w katalogu secure będą chronione.

Plik konfiguracyjny /etc/shibboleth/shibboleth2.xml

W elemencie <ApplicationDefaults> zmieniamy entityID, by był to URL przygotowywanego dostawcy usługi

 <ApplicationDefaults entityId="https://sp.example.pl/shibboleth"

Tworzymy parę kluczy SSL, która będzie używana do podpisywania metadanych oraz komunikatów SAML.

openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes  -out shib.pem -keyout shib.key

i wpisujemy nasze nazwy kluczy w wierszu

<CredentialResolver type="File" key="shib.key" certificate="shib.crt"/>

Aby konkretny dostawca tożsamości (IdP) współpracował z tym dostawcą usługi (SP), metadane SP muszą zostać umieszczone w konfiguracji tego IdP, natomiast SP musi podczas uruchomienia wczytywać dane wszystkich IdP mogących z nim współpracować. Jeśli chcemy sprawdzić działanie SP z testowym Shibboleth IdP, to pobieramy jego metadane, np.

wget https://logon.example.pl/idp/shibboleth

i umieszczamy je w pliku, np. /etc/shibboleth/test-shibidp.xml. Dodajemy w konfiguracji:

<MetadataProvider type="XML" file="test-shibidp.xml"/>

Aby SP mógł współpracować z dowolnym IdP zarejestrowanym w PIONIER.Id, dodajemy:

<MetadataProvider type="XML" uri="http://aai.pionier.net.pl/pionierid.xml"
        backingFilePath="pionierid-metadata.xml" reloadInterval="7200">
           <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/>
           <MetadataFilter type="Signature" certificate="pionieridsigner.pem"/>
</MetadataProvider>

i w pliku /etc/shibboleth/pionieridsigner.pem umieszczamy certyfikat pobrany ze strony Informacje techniczne PIONIER.Id Aby SP mógł współpracować z IdP udostępnianymi w eduGAIN, dodajemy

<MetadataProvider type="XML" uri="http://aai.pionier.net.pl/pionierid-edugain-idp-feed.xml"
        backingFilePath="edugain-idp-metadata.xml" reloadInterval="7200">
           <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/>
           <MetadataFilter type="Signature" certificate="pionieridsigner.pem"/>
</MetadataProvider>

W ramach elementu <ApplicationDefaults>..</ApplicationDefaults> jest definiowana sekcja <Sessions>, w której element <SSO> określający sposób komunikacji aplikacji z miejscami logowania. Najbardziej podstawowa sytuacja, gdy SP ma łączyć się z jednym konkretnym IdP, które realizuje zalogowanie jest konfigurowana następująco:

<SSO entityID="https://logon.example.org/idp/shibboleth">
 SAML2 
</SSO>

Aplikacja może używać usługi zwanej Discovery Service, odpowiedzialnej za wybór docelowego IdP. Federacja PIONIER.Id świadczy taką usługę pod adresem https://aai.pionier.net.pl/WAYF. Sekcja SSO ma wówczas postać:

<SSO discoveryProtocol="SAMLDS" ECP="true" discoveryURL="https://aai.pionier.net.pl/WAYF">
 SAML2 
</SSO>

Na potrzeby testów możliwa jest rejestracja IdP w testowej usłudze oferującej wybór IdP: https://aai.pionier.net.pl/WAYF-test.

Metadane SP

Metadane przygotowanego SP znajdują się pod adresem: https://sp.example.pl/Shibboleth.sso/Metadata

Logi

Shibboleth SP domyślnie loguje do plików w katalogu /var/log/shibboleth. Główny log to /var/log/shibboleth/shibd.log. Zasady i poziomy logowania są zdefiniowane w pliku /etc/shibboleth/shibd.logger. Na czas testów można zmienić poziom logowania na DEBUG poprzez modyfikację tego pliku.

Atrybuty

Dostawca usługi dostaje z IdP zestaw atrybuty, który odpowiada ustalonej w IdP polityce w zakresie publikacji atrybutów, czyli są przekazywane tylko te atrybuty, które SP ma otrzymywać. Po stronie Shibboleth SP są dwa pliki dotyczące atrybutów:

  • /etc/shibboleth/attribute-map.xml zawiera wykaz atrybutów które są akceptowane, każdy wpis ma postać
 <Attribute name="..." id="...">
  ...
 </Attribute>

opcjonalnie można dodać element <AttributeDecoder>. attribute-map.xml to wzorcowa postać pliku atrybutów dla Shibboleth SP.

  • /etc/shibboleth/attribute-policy.xml określa zasady dotyczące akceptowanych wartości atrybutów. Możana w nim wskazać, jakie wartości konkretnego atrybutu są dozwolone (np. tylko wartości słownikowe w przypadku eduPersonAffiliation), czy wartości powinny zawierać wskazanie zakresu w jakim obowiązują (np. atrybut dotyczy określonej domeny).

attribute-policy.xml to wzorcowa postać pliku określającego politykę w odniesieniu do atrybutów.

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

{{#lst:Federacja:SimpleSAMLphp_SP|wayf}} Możliwe są dwa podejścia:

  • zastosowanie usługi wbudowanej EDS, która działa w ramach przygotowywanego serwisu, patrz EDS
  • zastosowanie centralnej usługi poszukiwania IdP, DS, która na czas wyboru IdP przeniesie użytkownika na strony centralnego wyboru IdP.

Embedded Discovery Service (EDS)

Ta usługa pozwala, by dostawca usługi (SP) korzystał z wewnętrznej usługi poszukiwania IdP. Użytkownik nie jest przekierowywany do obcych mu lokalizacji. EDS to zestaw plików Javascript i CSS, dzięki czemu jest to narzędzie wygodne i łatwe w użytkowaniu oraz w dostosowaniu do bieżących potrzeb (np. można prezentować tylko te nazwy IdP, z którymi dane SP ma umowy). Aby korzystać z EDS trzeba wcześniej skonfigurować Shibboleth SP.

Opis instalacji i konfiguracji znajduje się na stronie: EDS

Instalacja

W systemach CentOS, Redhat, Fedora można zainstalować pakiet:

yum install shibboleth-embedded-ds

Zalecamy jednak pobranie wskazenego pliku i rozwinięcie go w katalogu /etc: shibboleth-ds.tgz. Plik ten zawiera m.in. polskie wersjie komunikatów. W katalogu /etc/shibboleth-ds pojawią się pliki:

/etc/shibboleth-ds/LICENSE.txt
/etc/shibboleth-ds/README.txt
/etc/shibboleth-ds/RELEASE-NOTES.txt
/etc/shibboleth-ds/idpselect.css
/etc/shibboleth-ds/idpselect.js
/etc/shibboleth-ds/idpselect_config.js
/etc/shibboleth-ds/index.html
/etc/shibboleth-ds/shibboleth-ds.conf
Konfiguracja na potrzeby EDS

W konfiguracji serwera dodajemy wskazania do katalogu '/etc/shibboleth-ds/', np.:

 Alias /shibboleth-ds/idpselect_config.js /etc/shibboleth-ds/idpselect_config.js
 Alias /shibboleth-ds/idpselect.js /etc/shibboleth-ds/idpselect.js
 Alias /shibboleth-ds/idpselect.css /etc/shibboleth-ds/idpselect.css
 Alias /shibboleth-ds/ /etc/shibboleth-ds/index.html
 Alias /shibboleth-ds /etc/shibboleth-ds/index.html
 Alias /shibboleth-ds/index.html /etc/shibboleth-ds/index.html

tak by adres https://sp.example.pl/shibboleth-ds/ prowadził do usługi EDS. W pliku idpselect_config.js można ustawić defaultLogo, wyświetlane gdy w metadanych IdP nie ma wskazania logo.

Modyfikujemy plik /etc/shibboleth/shibboleth2.xml:

  • w elemencie <MetadataProvider> związanym z pobieraniem danych z federacji dodajemy parametr legacyOrgNames:
 <MetadataProvider type="XML" uri="http://aai.pionier.net.pl/pionierid.xml"
  backingFilePath="pionierid-metadata.xml" legacyOrgNames="true" reloadInterval="7200">
    <MetadataFilter type="RequireValidUntil" maxValidityInterval="2419200"/>
    <MetadataFilter type="Signature" certificate="pionieridsigner.pem"/>
 </MetadataProvider>
  • element <SSO> ma mieć postać:
 <SSO discoveryProtocol="SAMLDS" discoveryURL="https://sp.example.pl/shibboleth-ds/">
   SAML2 SAML1
</SSO>
 

Usługa korzystająca z EDS zawiera na stronie następujące elementy:

  • w ramach <head>
 <link rel="stylesheet" type="text/css" href="/shibboleth-ds/idpselect.css">
  • w ramach <body> wpisujemy
 <div id="idpSelect"></div>

W miejscu, gdzie ma się pokazać strona wyboru IdP, po zalogowaniu strona nie powinna zawierać tego elementu.

  • na końcu strony (koniecznie za poprzednim
    ) dodajemy:
 <script src="idpselect_config.js" type="text/javascript" language="javascript"></script>
 <script src="idpselect.js" type="text/javascript" language="javascript"></script>
 
Przykładowa strona korzystająca z EDS
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="/shibboleth-ds/idpselect.css">
</head>
<title>Shibboleth SP test test</title></head>
<?php
if ($_SERVER['REMOTE_USER']) {
 print 'Jesteś zalogowany jako: '.$_SERVER['REMOTE_USER'];
 print_r($_SERVER);
} else {
?>
<div id="idpSelect"></div>
<script src="/shibboleth-ds/idpselect_config.js" type="text/javascript" language="javascript"></script>
<script src="/shibboleth-ds/idpselect.js" type="text/javascript" language="javascript"></script
<?php } ?>
</html>