Fournisseurs d’authentification SAML (existants)

Fournisseurs d’authentification SAML (existants)

ℹ️
Cette rubrique fait référence à la syntaxe de configuration existante. Les fournisseurs d’authentification SAML sont désormais définis comme des applications SAML, avec un fournisseur SAML correspondant.

L’orchestrateur Maverics peut être configuré pour agir comme un fournisseur d’identité SAML. L’utilisation de l’orchestrateur en tant que fournisseur d’identité SAML peut s’avérer utile lorsque des applications existantes s’authentifient à l’aide du protocole SAML ou lorsque l’identité doit être confirmée dans un autre système, tel qu’un fournisseur d’identité existant.

Name

La valeur name doit être un nom unique à chaque instance du fournisseur SAML.

Type

Le type de protocole d’identité SAML, qui sera utilisé.

Fournisseurs d’attributs

Les fournisseurs d’attributs constituent une configuration facultative pour un système d’identité ou un magasin de données à partir duquel le SAMLProvider peut récupérer des attributs supplémentaires utilisés dans claimsMapping.

Connector

Connector est une référence au nom du connecteur défini qui sera utilisé en tant que fournisseur d’attributs.

usernameMapping

usernameMapping définit l’attribut qui sera utilisé en tant que clé de recherche pour interroger les attributs de l’utilisateur.

MetadataEndpoint

Le terminal metadataEndpoint correspond à l’URL à partir de laquelle le serveur SAML fournit son fichier de métadonnées. Il s’agit d’une configuration facultative, si elle n’est pas activée, les fournisseurs de services en cours de connexion devront être configurés manuellement.

Single Sign On Service Endpoint

Le terminal singleSignOnService correspond à l’emplacement où les fournisseurs de services enverront les demandes d’authentification SAML.

Issuer

issuer correspond au fournisseur d’identité qui émet des assertions SAML. Cette valeur est généralement une URL.

Signature

signature correspond à la configuration permettant de signer les réponses SAML.

Certificate

certificate correspond au certificat x509 utilisé par les clients pour valider la signature des assertions SAML.

Private Key

privateKey est la clé privée RSA256 utilisée pour signer les assertions SAML.

Disable Signing Response

Le champ facultatif disableSignedResponse vous permet de remplacer la signature de la réponse par défaut. La valeur par défaut est false. Veuillez noter que la réponse ou l’assertion doit être signée.

Disable Signing Assertion

Le champ facultatif disableSignedAssertion vous permet de remplacer la signature de l’assertion par défaut. La valeur par défaut est false. Veuillez noter que la réponse ou l’assertion doit être signée.

Clients

clients correspond aux clients SAML enregistrés (appelés également fournisseurs de services et parties utilisatrices).

Name

Un nom d’identification unique pour le client.

Audience

Audience désigne l’identité du client. Il doit correspondre au champ « Issuer » (Émetteur) fourni par le fournisseur de services. Cette valeur doit être unique.

Consumer Service URL

consumerServiceURL correspond à l’URL vers laquelle les réponses SAML seront envoyées.

Duration

duration correspond à la durée en secondes pendant laquelle les réponses de ce serveur sont valides.

Format NameID

nameIDFormat est un champ facultatif utilisé pour définir le format NameID qui sera utilisé dans l’assertion SAML. Lorsqu’elle n’est pas définie, une valeur de 'urn:oasis:names:tc:SAML:1.0:nameid-format:unspecified' sera appliquée. Si une règle NameIDPolicy est définie dans la requête d’authentification SAML, elle doit correspondre au format NameID défini sur le client. Pour plus de détails sur le format NameID, veuillez consulter les sections 2.2, 3.4.1 et 8.3 du document SAML spec.

Request Verification

requestVerification est une configuration obligatoire. Elle contient la clé publique utilisée pour valider la signature des requêtes entrantes ou désactive la vérification de la signature des requêtes.

Certificate

certificate correspond au certificat RSA x509, qui sera utilisé pour vérifier les signatures des requêtes entrantes. Cette valeur peut être définie en ligne ou à l’aide d’un fournisseur de secrets. Elle doit être compatible avec le système RSA. Actuellement, ce fournisseur d’authentification ne prend en charge que l’algorithme SHA-256 pour la signature et le prétraitement des requêtes.

requestVerification:
  certificate: |+
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----    
requestVerification:
  certificate: <clientSigningCert>

Ignorer la vérification

skipVerification est une valeur booléenne utilisée lorsque le client ne souhaite pas valider les signatures des requêtes entrantes.

requestVerification:
  skipVerification: true

Authentification avec les fournisseurs d’identité

Le champ authentication permet de répertorier les fournisseurs d’identité qui seront utilisés pour authentifier un utilisateur.

Dans l’exemple ci-dessous, l’utilisateur sera invité à s’authentifier dans un premier temps avec Azure, puis avec Okta.

authproviders:
  - name: saml
    type: samlAuthProvider
    # ...
    clients:
      - name: ExampleClient
        # ...
        authentication:
          idps:
            - azure
            - okta

AttrProviders

Les fournisseurs d’attributs constituent une configuration facultative pour un système d’identité ou un magasin de données à partir duquel le SAMLProvider peut récupérer des attributs supplémentaires utilisés dans claimsMapping. Cette configuration au niveau du client remplacera toute configuration au niveau du fournisseur.

Connector

Connector est une référence au nom du connecteur défini qui sera utilisé en tant que fournisseur d’attributs.

usernameMapping

La configuration usernameMapping permet de s’assurer que le fournisseur d’attributs (c’est-à-dire le connecteur LDAP) dispose de l’attribut correct nécessaire à l’interrogation des attributs de l’utilisateur. Elle spécifie l’attribut utilisé pour rechercher les attributs utilisateur à partir du fournisseur d’attributs défini.

Assertion

assertion correspond à la catégorie principale pour le stockage des configurations liées aux assertions SAML du client. Si elles sont omises, les assertions pour ce client ne seront pas
chiffrées.

Encryption

encryption correspond à la catégorie de configuration pour le chiffrement de l’assertion SAML.

Key Encrypt Method

keyEncryptMethod permet de configurer la méthode de chiffrement de la clé symétrique utilisée pour chiffrer l’assertion. Deux valeurs sont actuellement prises en charge : RSA_OAEP et RSA-1_5.

Conformément aux spécifications de cryptage XML, la valeur RSA-1_51 n’est pas recommandée en raison des risques de sécurité associés à l’algorithme.

Méthode de chiffrement des données

dataEncryptMethod permet de configurer la méthode de chiffrement des données réelles de l’assertion. Les valeurs valides sont AES128CBC , AES192CBC et AES256CBC.

Digest Method

digestMethod correspond à l’algorithme de prétraitement des messages utilisé pour le calcul dudit prétraitement dans le cadre du processus de cryptage. Les valeurs valides sont SHA256et SHA512.

Certificate

certificate se trouve en dessous de la section assertion et correspond à la chaîne encodée au format PEM qui peut être définie en ligne ou par l’intermédiaire d’un fournisseur de secrets. Ce certificat est généralement récupéré auprès du fournisseur de services. Vous trouverez ci-dessous un exemple de définition du certificat en ligne.

    assertion:
      encryption:
        keyEncryptMethod: RSA_OAEP
        dataEncryptMethod: AES256CBC
        digestMethod: SHA256
        certificate: |+ # An example of defining the certificate value inline.
          -----BEGIN CERTIFICATE-----
          ...
          -----END CERTIFICATE-----

ClaimsMapping

claimsMapping permet de fournir des réclamations supplémentaires à cet utilisateur. Cela permet de faire correspondre les réclamations aux attributs de session fournis par le(s) fournisseur(s) d’identité et tout fournisseur d’attributs éventuellement défini. Ces champs de correspondance sont utilisés pour mapper les demandes des connecteurs vers le fournisseur de services SAML dans AttributeStatement en tant qu’AttributeValue.
Notez que le nom de la clé est utilisé pour désigner la valeur qui sera utilisée comme objet de la réponse SAML.

Exemple de configuration :

authproviders:
  - name: samlAuthProvider
    type: saml
    # ...
    clients:
      - name: ExampleClient
        # ...
        attrProviders:
          - connector: ldap
            usernameMapping: azure.email
        claimsMapping:
          name: azure.objectidentifier
          email: azure.name
          family_name: azure.surname
          given_name: azure.givenname
          phone: ldap.mobile

IDP Initiated Login

La clé idpInitiatedLogin est une configuration facultative qui, lorsqu’elle est spécifiée, permet au fournisseur d’authentification d’effectuer la connexion initiée par le fournisseur d’identité au client.

Login URL

loginURL correspond au terminal consulté par l’utilisateur à partir de son navigateur pour initier le flux de connexion au fournisseur d’identité. Il doit s’agir de l’unique terminal sur l’orchestrateur.

Relay State URL

relayStateURL correspond au terminal transmis au fournisseur de services qui servira de page d’accueil à l’utilisateur à l’issue du flux d’authentification.

authproviders:
  - type: saml
    # ...
    clients:
      - name: sonar
        # ...
        idpInitiatedLogin:
          loginURL: https://maverics.sonarsystems.com/login-sonar
          relayStateURL: https://app.sonarsystems.com/index.html

Extensions de services au niveau du fournisseur d’authentification et du client

Les extensions de services ci-dessous peuvent être définies au niveau du fournisseur d’authentification ou du client afin de contrôler le comportement de ces derniers.

isAuthenticatedSE

isAuthenticatedSE est une extension de services optionnelle qui peut être utilisée pour modifier le comportement par défaut qui détermine si un utilisateur est déjà authentifié.

authproviders:
  - name: samlAuthProvider
    type: saml
    isAuthenticatedSE:
      funcName: IsAuthenticated
      file: /etc/maverics/extensions/auth.go

/etc/maverics/extensions/auth.go

package main

import (
  "net/http"

  "maverics/auth"
  "maverics/session"
)

func IsAuthenticated(sp *auth.SAMLProvider, rw http.ResponseWriter, req *http.Request) bool {
  if session.GetString(req, "azure.authenticated") == "true" {
    return true
  }

  return false
}

authenticateSE

L’extension de service optionnelle authenticateSE est utilisée pour contrôler la manière dont l’authentification est effectuée.

authproviders:
  - name: saml
    type: samlAuthProvider
    authenticateSE:
      funcName: Authenticate
      file: /etc/maverics/extensions/auth.go
    # ...

/etc/maverics/extensions/auth.go

package main

import (
  "net/http"

  "maverics/auth"
)

func Authenticate(sp *auth.SAMLProvider, rw http.ResponseWriter, req *http.Request) {
  sp.IDPs["azure"].CreateRequest().Login(rw, req)
}

buildClaimsSE

buildClaimsSE est une extension de services facultative qui permet de personnaliser les attributs qui seront communiqués au fournisseur de services SAML en amont sous la forme d’un AttributeStatement SAML 2.0.

authproviders:
  - name: samlAuthProvider
    type: saml
    buildClaimsSE:
      funcName: BuildClaims
      file: /etc/maverics/extensions/buildClaims.go

/etc/maverics/extensions/buildClaims.go

package main

import (
  "fmt"
  "net/http"

  "maverics/auth"
  "maverics/log"
  "maverics/session"
)

func BuildClaims(sp *auth.SAMLProvider, rw http.ResponseWriter, req *http.Request) (map[string]string, error) {
  log.Debug("msg", "building custom claims")

  email := session.GetString(req, "azure.email")
  if email == "" {
    return nil, fmt.Errorf("did not find user email on session")
  }

  returnAttrs := map[string]string{
    "email": email,
  }
  log.Debug(
    "msg", "successfully built custom claims",
    "claims", fmt.Sprintf("%v", returnAttrs),
  )
  return returnAttrs, nil
}

Exemples

basiques

Cet exemple présente la définition du fournisseur d’authentification SAML.

authproviders:
  - name: samlAuthProvider
    type: saml
    metadataEndpoint: https://maverics.com/idp/saml/metadata.xml # Optional endpoint.
    singleSignOnServiceEndpoint: https://maverics.com/idp/saml/sso
    issuer: https://maverics.com/idp/
    signature:
      certificate: |+ # An example of defining the certificate value inline.
        -----BEGIN CERTIFICATE-----
        ...
        -----END CERTIFICATE-----
      privateKey: <samlTestPrivateKey> # An example of using a secret provider to load the private key.
      disableSignedResponse: false
      disableSignedAssertion: false
    clients:
      - name: exampleClient
        audience: https://exampleco.com/
        consumerServiceURL: https://exampleco.com/saml/acs
        duration: 60
        nameIDFormat: urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
        requestVerification:
          skipVerification: true
        authentication:
          idps:
            - azure
        attrProviders: # An optional config to support non-idps to be used in claimsMapping.
          - connector: ldap
            usernameMapping: azure.email
        assertion:
          encryption:
            keyEncryptMethod: RSA_OAEP
            dataEncryptMethod: AES256CBC
            digestMethod: SHA256
            certificate: <encryptionCert>
        claimsMapping:
          name: azure.username
          # Optional claim mappings.
          email: azure.name
          family_name: azure.surname
          given_name: azure.givenname
          phone: ldap.mobile

Extensions de services

L’exemple ci-dessous présente une configuration complète utilisant la mise en œuvre par défaut, ainsi que les définitions des extensions de services au niveau du fournisseur d’authentification et du client.

authproviders:
  - name: samlAuthProvider
    type: saml
    metadataEndpoint: https://maverics.com/idp/saml/metadata.xml # optional
    singleSignOnServiceEndpoint: https://maverics.com/idp/saml/sso
    issuer: https://maverics.com/idp/
    signature:
      certificate: |+ # An example of defining the certificate value inline.
        -----BEGIN CERTIFICATE-----
        ...
        -----END CERTIFICATE-----
      privateKey: <samlTestPrivateKey> # An example of using a secret provider to load the private key.
      disableSignedResponse: false
      disableSignedAssertion: false

    # Below are examples of optional Service Extension definitions at the
    # AuthProvider level. These will run for clients which do not use `claimsMapping`
    # or define their own Service Extensions.
    isAuthenticatedSE:
      funcName: IsAuthenticated
      file: /etc/maverics/extensions/authprovider.go

    authenticateSE:
      funcName: Authenticate
      file: /etc/maverics/extensions/authprovider.go

    buildClaimsSE:
      funcName: BuildClaims
      file: /etc/maverics/extensions/authprovider.go

    clients:
      # An example of a client definition using the default implementations for authentication
      # and building attributes.
      - name: alphaClient
        audience: https://clientapp.com/audience/
        consumerServiceURL: https://exampleco.com/saml/acs
        duration: 60
        requestVerification:
          skipVerification: true
        authentication:
          idps:
            - azure
        claimsMapping:
          name: azure.objectidentifier
          email: azure.name
          family_name: azure.surname
          given_name: azure.givenname

      # An example of a client definition which falls back to using the AuthProvider
      # level Service Extensions for authentication and building attributes.
      - name: betaClient
        audience: https://clientapp.com/audience/
        consumerServiceURL: https://exampleco.com/saml/acs
        duration: 60
        requestVerification:
          certificate: <fallbackSEClientSigningCert>

      # An example of a client definition which uses its own Service Extensions for
      # authentication and building attributes.
      - name: gammaClient
        audience: https://clientapp.com/audience/
        consumerServiceURL: https://exampleco.com/saml/acs
        duration: 60
        requestVerification:
          certificate: <seClientSigningCert>
        authentication:
          isAuthenticatedSE:
            funcName: IsAuthenticated
            file: /etc/maverics/extensions/gammaClient.go

          authenticateSE:
            funcName: Authenticate
            file: /etc/maverics/extensions/gammaClient.go

        buildClaimsSE:
          funcName: BuildClaims
          file: /etc/maverics/extensions/gammaClient.go

/etc/maverics/extensions/authprovider.go

package main

import (
  "errors"
  "net/http"

  "maverics/auth"
  "maverics/log"
  "maverics/session"
)

func IsAuthenticated(sp *auth.SAMLProvider, rw http.ResponseWriter, req *http.Request) bool {
  result := session.GetString(req, "azure.authenticated") == "true"
  log.Debug(
    "msg", "called isAuthnAuthProvider",
    "path", req.URL.Path,
    "result", result,
  )
  return result
}

func Authenticate(sp *auth.SAMLProvider, rw http.ResponseWriter, req *http.Request) error {
  log.Debug("msg", "authenticating user", "path", req.URL.Path)

  idp, ok := sp.IDPs["azure"]
  if !ok {
    return errors.New("missing idp definition for 'azure' in 'idps'")
  }

  // The IDP exists. Attempt to login and proceed to the authz flow.
  log.Debug("msg", "azure IDP exsits, start login", "path", req.URL.Path)
  idp.CreateRequest().Login(rw, req)

  http.Redirect(rw, req, req.URL.Path, 302)

  return nil
}

func BuildClaims(sp *auth.SAMLProvider, rw http.ResponseWriter, req http.Request) (map[string]string, error) {
  return map[string]string{
    "role": session.GetString("ldap.role"),
  }, nil
}

/etc/maverics/extensions/gammaClient.go

package main

import (
  "errors"
  "net/http"

  "maverics/auth"
  "maverics/log"
  "maverics/session"
)

func IsAuthenticated(sp *auth.SAMLProvider, rw http.ResponseWriter, req *http.Request) bool {
  result := session.GetString(req, "azure.authenticated") == "true"
  log.Debug("msg", "called isAuthnClient",
    "path", req.URL.Path,
    "result", result)
  return result
}

func Authenticate(sp *auth.SAMLProvider, rw http.ResponseWriter, req *http.Request) error {
  log.Debug("msg", "authenticating user", "path", req.URL.Path)

  idp, ok := sp.IDPs["azure"]
  if !ok {
    return errors.New("missing idp definition for 'azure' in 'idps'")
  }

  // The IDP exists. Attempt to login and proceed to the authz flow.
  log.Debug("msg", "azure IDP exsits, start login", "path", req.URL.Path)
  idp.CreateRequest().Login(rw, req)

  http.Redirect(rw, req, req.URL.Path, 302)

  return nil
}

func BuildClaims(sp *auth.SAMLProvider, rw http.ResponseWriter, req http.Request) (map[string]string, error) {
  return map[string]string{
    "role": session.GetString("ldap.role"),
  }, nil
}

Limites

Requête Authn

  • ProtocolBinding est une référence URI qui identifie la liaison de protocole SAML à utiliser lors du renvoi du message de réponse. Les liaisons prises en charge sont :
    • urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST
    • urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect
  • SignatureMethod  : les assertions et les protocoles SAML doivent utiliser des signatures intégrées lors de la signature des assertions et des messages de protocole. Le fournisseur SAML ne prend en charge que rsa-sha256 et exclut volontairement rsa-sha1, qui présente une insécurité cryptographique.