This page was machine-translated. Spotted a mistake?Help improve it.
Skip to content

SAML SSO

SnapOtter obsługuje SAML 2.0 do logowania jednokrotnego. Użytkownicy mogą logować się przez zewnętrznego dostawcę tożsamości (Okta, Azure AD / Entra ID, Google Workspace lub dowolny standardowy dostawca tożsamości SAML 2.0) zamiast lokalnego uwierzytelniania nazwą użytkownika i hasłem.

Funkcja Enterprise

SAML SSO wymaga licencji team lub enterprise z funkcją saml_sso. Jeśli SAML_ENABLED=true jest ustawione bez ważnej licencji, trasy SAML są po cichu pomijane, a w logach zapisywane jest ostrzeżenie.

Wymagania wstępne

  • Działająca instancja SnapOtter osiągalna pod publicznym adresem URL
  • EXTERNAL_URL ustawione na ten publiczny adres URL (np. https://photos.example.com)
  • Klucz licencji team lub enterprise z funkcją saml_sso
  • Dostęp administracyjny do Twojego dostawcy tożsamości SAML

Szybki start

Dodaj te zmienne środowiskowe do swojego docker-compose.yml:

yaml
services:
  snapotter:
    image: snapotter/snapotter:latest
    environment:
      EXTERNAL_URL: "https://photos.example.com"
      SNAPOTTER_LICENSE_KEY: "your-license-key"
      SAML_ENABLED: "true"
      SAML_IDP_SSO_URL: "https://idp.example.com/sso/saml"
      SAML_IDP_CERTIFICATE: |
        MIICpDCCAYwCCQDU+pQ4pHgSpDANBgkqhkiG9w0BAQsFADAUMRIw
        ...your IdP's signing certificate in PEM format...
        EAYHKoZIzj0CAQYFK4EEACIDYgAE

Uruchom ponownie kontener. Na stronie logowania pojawia się przycisk „Zaloguj się przez SAML” (lub etykieta ustawiona przez SAML_PROVIDER_NAME).

Dokumentacja konfiguracji

ZmiennaDomyślnieOpis
SAML_ENABLEDfalseWłącz logowanie SAML.
SAML_IDP_SSO_URLAdres URL punktu końcowego SSO dostawcy tożsamości. Wymagane, gdy SAML jest włączone.
SAML_IDP_CERTIFICATECertyfikat podpisujący X.509 dostawcy tożsamości w formacie PEM (sam tekst certyfikatu, a nie ścieżka do pliku). Wymagane, gdy SAML jest włączone.
EXTERNAL_URLPubliczny URL, pod którym SnapOtter jest osiągalny. Wymagane, gdy SAML jest włączone.
SAML_ENTITY_ID${EXTERNAL_URL}/api/auth/saml/metadataSP Entity ID / Audience URI wysyłane do dostawcy tożsamości.
SAML_CALLBACK_URL${EXTERNAL_URL}/api/auth/saml/callbackAdres URL Assertion Consumer Service (ACS).
SAML_AUTO_CREATE_USERStrueAutomatycznie utwórz lokalne konto użytkownika przy pierwszym logowaniu SAML.
SAML_AUTO_LINK_USERSfalsePowiąż tożsamość SAML z istniejącym lokalnym użytkownikiem, jeśli adres e-mail się zgadza.
SAML_DEFAULT_ROLEuserRola przypisana automatycznie tworzonym użytkownikom SAML. Jedna z: admin, editor lub user.
SAML_PROVIDER_NAMEEtykieta wyświetlana dla przycisku logowania SAML we frontendzie (np. „Okta”, „Azure AD”). Jeśli puste, przycisk pokazuje „SAML”.
SAML_USERNAME_ATTRIBUTEAtrybut asercji SAML używany jako nazwa użytkownika. Jeśli puste, wraca do lokalnej części e-maila, a następnie NameID.
SAML_EMAIL_ATTRIBUTEemailAtrybut asercji SAML używany jako adres e-mail użytkownika.

Serwer odmawia uruchomienia, jeśli SAML_ENABLED=true i brakuje którejkolwiek z trzech wymaganych zmiennych (SAML_IDP_SSO_URL, SAML_IDP_CERTIFICATE, EXTERNAL_URL).

Uwagi dotyczące bezpieczeństwa

Zarówno wantAuthnResponseSigned, jak i wantAssertionsSigned są zakodowane na stałe na true. SnapOtter odrzuca niepodpisane lub nieprawidłowo podpisane odpowiedzi SAML. Asercje od zaufanego dostawcy tożsamości są traktowane jako e-mail zweryfikowany.

Obsługiwane jest tylko logowanie inicjowane przez SP. SnapOtter nie obsługuje logowania inicjowanego przez dostawcę tożsamości (niezamówionego) ani wylogowania jednokrotnego (SLO). Wylogowanie z SnapOtter nie wylogowuje użytkownika z dostawcy tożsamości.

Metadane SP i adresy URL

Twój dostawca tożsamości potrzebuje trzech wartości od SnapOtter:

PoleWartość
ACS URL (Assertion Consumer Service)${EXTERNAL_URL}/api/auth/saml/callback
Entity ID / Audience URI${EXTERNAL_URL}/api/auth/saml/metadata
Metadane SP (XML)GET ${EXTERNAL_URL}/api/auth/saml/metadata

Na przykład, jeśli EXTERNAL_URL to https://photos.example.com:

  • ACS URL: https://photos.example.com/api/auth/saml/callback
  • Entity ID: https://photos.example.com/api/auth/saml/metadata
  • Punkt końcowy metadanych: https://photos.example.com/api/auth/saml/metadata (zwraca XML)

Niektórzy dostawcy tożsamości mogą bezpośrednio zaimportować URL metadanych SP, co automatycznie uzupełnia ACS URL i Entity ID.

Konfiguracja dostawcy

Okta

  1. W konsoli administracyjnej Okta przejdź do Applications > Create App Integration.
  2. Wybierz SAML 2.0 i kliknij Next.
  3. Ustaw nazwę (np. „SnapOtter”) i kliknij Next.
  4. Skonfiguruj ustawienia SAML:
    • Single sign-on URL: Twój ACS URL (np. https://photos.example.com/api/auth/saml/callback)
    • Audience URI (SP Entity ID): Twój Entity ID (np. https://photos.example.com/api/auth/saml/metadata)
    • Name ID format: EmailAddress
    • Application username: Email
  5. W sekcji Attribute Statements dodaj email zmapowane na user.email.
  6. Kliknij Next, a następnie Finish.
  7. Przejdź do zakładki Sign On, kliknij View SAML setup instructions i skopiuj:
    • Identity Provider Single Sign-On URL do SAML_IDP_SSO_URL
    • X.509 Certificate do SAML_IDP_CERTIFICATE

Azure AD / Entra ID

  1. W portalu Azure przejdź do Microsoft Entra ID > Enterprise applications > New application.
  2. Kliknij Create your own application, nazwij ją „SnapOtter” i wybierz Integrate any other application you don't find in the gallery.
  3. Przejdź do Single sign-on > SAML i kliknij Edit w sekcji Basic SAML Configuration:
    • Identifier (Entity ID): Twój Entity ID (np. https://photos.example.com/api/auth/saml/metadata)
    • Reply URL (ACS URL): Twój ACS URL (np. https://photos.example.com/api/auth/saml/callback)
  4. W sekcji SAML Certificates pobierz Certificate (Base64).
  5. W sekcji Set up SnapOtter skopiuj Login URL.
  6. Ustaw SAML_IDP_SSO_URL na Login URL, a SAML_IDP_CERTIFICATE na zawartość pobranego certyfikatu.
  7. Przypisz użytkowników lub grupy do aplikacji w sekcji Users and groups.

Google Workspace

  1. W konsoli administracyjnej Google przejdź do Apps > Web and mobile apps > Add app > Add custom SAML app.
  2. Nazwij aplikację „SnapOtter” i kliknij Continue.
  3. Na stronie Google Identity Provider details skopiuj SSO URL i pobierz Certificate. Kliknij Continue.
  4. Skonfiguruj szczegóły dostawcy usług (Service Provider):
    • ACS URL: Twój ACS URL (np. https://photos.example.com/api/auth/saml/callback)
    • Entity ID: Twój Entity ID (np. https://photos.example.com/api/auth/saml/metadata)
    • Name ID format: EMAIL
    • Name ID: Basic Information > Primary email
  5. Kliknij Continue, a następnie Finish.
  6. Włącz aplikację (ON) dla swoich jednostek organizacyjnych.
  7. Ustaw SAML_IDP_SSO_URL na SSO URL z kroku 3, a SAML_IDP_CERTIFICATE na zawartość pobranego certyfikatu.

Ogólny dostawca tożsamości SAML 2.0

Dla dowolnego dostawcy tożsamości zgodnego z SAML 2.0:

  1. Utwórz nową aplikację SAML / dostawcę usług w swoim dostawcy tożsamości.
  2. Ustaw ACS URL na ${EXTERNAL_URL}/api/auth/saml/callback.
  3. Ustaw Entity ID / Audience na ${EXTERNAL_URL}/api/auth/saml/metadata.
  4. Skonfiguruj dostawcę tożsamości tak, aby wysyłał adres e-mail użytkownika w atrybucie o nazwie email (lub ustaw SAML_EMAIL_ATTRIBUTE, aby dopasować do nazwy atrybutu Twojego dostawcy tożsamości).
  5. Skopiuj IdP SSO URL oraz certyfikat podpisujący do SAML_IDP_SSO_URL i SAML_IDP_CERTIFICATE.

Provisioning użytkowników

Automatyczne tworzenie

Gdy SAML_AUTO_CREATE_USERS ma wartość true (domyślnie), lokalne konto użytkownika jest tworzone przy pierwszym logowaniu przez SAML. Rola jest ustawiana na SAML_DEFAULT_ROLE.

Nazwa użytkownika jest ustalana w tej kolejności:

  1. Wartość atrybutu asercji określonego przez SAML_USERNAME_ATTRIBUTE (jeśli ustawiony i obecny)
  2. Lokalna część adresu e-mail (wszystko przed @)
  3. SAML NameID

Jeśli wystąpi konflikt nazw użytkowników, dodawany jest sufiks numeryczny (np. jane staje się jane_2).

Gdy SAML_AUTO_LINK_USERS ma wartość true, SnapOtter łączy tożsamość SAML z istniejącym lokalnym kontem, jeśli adresy e-mail się zgadzają. Jest to przydatne, gdy masz wcześniej utworzone konta użytkowników i chcesz, aby zaczęli korzystać z SSO bez utraty swoich danych.

WARNING

Włączaj automatyczne łączenie tylko wtedy, gdy ufasz, że Twój dostawca tożsamości SAML weryfikuje adresy e-mail. Niezweryfikowany e-mail od źle skonfigurowanego dostawcy tożsamości mógłby pozwolić komuś na przejęcie konta innego użytkownika.

Mapowanie atrybutów

Pole SnapOtterŹródłoKonfiguracja
EmailAtrybut asercjiSAML_EMAIL_ATTRIBUTE (domyślnie: email)
Nazwa użytkownikaAtrybut asercji, e-mail lub NameIDSAML_USERNAME_ATTRIBUTE (zobacz kolejność ustalania powyżej)
Identyfikator zewnętrznyNameIDZawsze SAML NameID, nie do skonfigurowania

Wymuszanie SSO

Jeśli chcesz wymagać, aby wszyscy użytkownicy logowali się przez SAML (lub OIDC) i zablokować lokalne logowanie hasłem, włącz wymuszanie SSO:

  1. Upewnij się, że funkcja enterprise sso_enforcement jest objęta licencją (dostępna w planach team i enterprise).
  2. W Admin Settings > Security przełącz SSO Enforcement na włączone.
  3. Ustaw break-glass username: to jedno lokalne konto, które nadal może logować się hasłem, na wypadek awaryjnego dostępu, gdy dostawca tożsamości jest nieosiągalny.

Gdy wymuszanie SSO jest aktywne, każda próba lokalnego logowania (poza użytkownikiem break-glass) zwraca błąd 403 z komunikatem „Local password login is disabled. Please use SSO.”

TIP

Zawsze skonfiguruj break-glass username przed włączeniem wymuszania SSO. Bez niego możesz zostać zablokowany poza SnapOtter, jeśli Twój dostawca tożsamości ulegnie awarii.

Używanie SAML obok OIDC

SAML i OIDC można włączyć jednocześnie. Gdy oba są aktywne, strona logowania pokazuje osobne przyciski dla każdego dostawcy (oznaczone przez SAML_PROVIDER_NAME i OIDC_PROVIDER_NAME). Użytkownicy mogą logować się dowolną metodą.

Obaj dostawcy niezależnie korzystają z tych samych ustawień automatycznego tworzenia, automatycznego łączenia i wymuszania SSO: każdy ma własne zmienne *_AUTO_CREATE_USERS, *_AUTO_LINK_USERS oraz *_DEFAULT_ROLE.

Rozwiązywanie problemów

Walidacja asercji nie powiodła się

Nie udało się zweryfikować podpisu odpowiedzi SAML lub podpisu asercji. Sprawdź:

  • Czy certyfikat w SAML_IDP_CERTIFICATE zgadza się z aktualnym certyfikatem podpisującym w Twoim dostawcy tożsamości (certyfikaty się rotują, więc sprawdź datę wygaśnięcia)
  • Czy certyfikat jest w formacie PEM (zaczyna się od -----BEGIN CERTIFICATE-----)
  • Czy certyfikat to pełny tekst, a nie ścieżka do pliku
  • Czy ACS URL i Entity ID skonfigurowane w Twoim dostawcy tożsamości dokładnie zgadzają się z wartościami SnapOtter (schemat, host, port, ścieżka)

Brakujące atrybuty

Jeśli po zalogowaniu nazwy użytkowników lub adresy e-mail są puste, Twój dostawca tożsamości może nie wysyłać oczekiwanych atrybutów. Sprawdź:

  • Czy Twój dostawca tożsamości jest skonfigurowany, aby udostępniać atrybut email (lub taki, na jaki ustawiono SAML_EMAIL_ATTRIBUTE)
  • Jeśli używasz SAML_USERNAME_ATTRIBUTE, zweryfikuj, że ten atrybut jest zawarty w asercji
  • Niektórzy dostawcy tożsamości wymagają jawnej konfiguracji mapowania atrybutów, zanim udostępnią oświadczenia

Odchylenie zegara

Asercje SAML zawierają warunki znacznika czasu (NotBefore, NotOnOrAfter). Jeśli zegar Twojego serwera i zegar dostawcy tożsamości nie są zsynchronizowane, walidacja asercji się nie powiedzie. Uruchom NTP na obu maszynach, aby zegary były zsynchronizowane.

„SAML is enabled via env but saml_sso enterprise feature is not licensed”

To ostrzeżenie pojawia się w logach serwera, gdy SAML_ENABLED=true, ale licencja nie obejmuje funkcji saml_sso. Zweryfikuj swój klucz licencji i plan. Funkcja saml_sso jest dostępna w planach team i enterprise.

Logowanie przekierowuje z powrotem z błędem

Jeśli kliknięcie przycisku logowania SAML przekierowuje z powrotem na stronę logowania z błędem, sprawdź szczegóły w logach serwera. Częste przyczyny:

  • IdP SSO URL jest nieosiągalny z serwera
  • Dostawca tożsamości odrzucił żądanie uwierzytelnienia (sprawdź logi audytu dostawcy tożsamości)
  • Dostawca tożsamości zwrócił niepodpisaną odpowiedź (SnapOtter wymaga, aby zarówno odpowiedź, jak i asercja były podpisane)