Fournisseurs d’authentification SAML (existants)
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 SHA256
et 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 quersa-sha256
et exclut volontairementrsa-sha1
, qui présente une insécurité cryptographique.