Shibboleth SP
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>