7.5. Configuration d'un fournisseur d'identité d'en-tête de requête
Configurez le fournisseur d'identité request-header
pour qu'il identifie les utilisateurs à partir des valeurs d'en-tête des requêtes, telles que X-Remote-User
. Il est généralement utilisé en combinaison avec un proxy d'authentification, qui définit la valeur de l'en-tête de la requête.
7.5.1. À propos des fournisseurs d'identité dans OpenShift Container Platform
Par défaut, seul un utilisateur kubeadmin
existe sur votre cluster. Pour spécifier un fournisseur d'identité, vous devez créer une ressource personnalisée (CR) qui décrit ce fournisseur d'identité et l'ajouter au cluster.
Les noms d'utilisateur OpenShift Container Platform contenant /
, :
, et %
ne sont pas pris en charge.
7.5.2. À propos de l'authentification de l'en-tête de la requête
Un fournisseur d'identité d'en-tête de requête identifie les utilisateurs à partir des valeurs d'en-tête de requête, telles que X-Remote-User
. Il est généralement utilisé en combinaison avec un proxy d'authentification, qui définit la valeur de l'en-tête de la requête. Le fournisseur d'identité d'en-tête de requête ne peut pas être combiné avec d'autres fournisseurs d'identité qui utilisent des connexions directes par mot de passe, comme htpasswd, Keystone, LDAP ou l'authentification de base.
Vous pouvez également utiliser le fournisseur d'identité de l'en-tête de la requête pour des configurations avancées telles que l'authentification SAML supportée par la communauté. Notez que cette solution n'est pas prise en charge par Red Hat.
Pour que les utilisateurs puissent s'authentifier à l'aide de ce fournisseur d'identité, ils doivent accéder à https://<namespace_route>/oauth/authorize
(et aux sous-chemins) via un proxy d'authentification. Pour ce faire, configurez le serveur OAuth pour qu'il redirige les demandes non authentifiées de jetons OAuth vers le point d'extrémité du proxy qui fait office de proxy vers https://<namespace_route>/oauth/authorize
.
Pour rediriger les demandes non authentifiées des clients qui attendent des flux de connexion basés sur un navigateur :
-
Attribuez au paramètre
provider.loginURL
l'URL du proxy d'authentification qui authentifiera les clients interactifs et transmettra ensuite la requête àhttps://<namespace_route>/oauth/authorize
.
Pour rediriger les demandes non authentifiées des clients qui s'attendent à être confrontés à WWW-Authenticate
:
-
Définissez le paramètre
provider.challengeURL
à l'URL du proxy d'authentification qui authentifiera les clients qui attendent des défisWWW-Authenticate
, puis transmettra la demande àhttps://<namespace_route>/oauth/authorize
.
Les paramètres provider.challengeURL
et provider.loginURL
peuvent inclure les jetons suivants dans la partie requête de l'URL :
${url}
est remplacé par l'URL actuelle, échappée pour être sûre dans un paramètre de requête.Par exemple :
https://www.example.com/sso-login?then=${url}
${query}
est remplacée par la chaîne de requête actuelle, non codée.Par exemple :
https://www.example.com/auth-proxy/oauth/authorize?${query}
Depuis OpenShift Container Platform 4.1, votre proxy doit prendre en charge TLS mutuel.
7.5.2.1. Prise en charge de la connexion SSPI sous Microsoft Windows
L'utilisation de la prise en charge de la connexion SSPI sur Microsoft Windows est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes d'un point de vue fonctionnel. Red Hat ne recommande pas leur utilisation en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.
Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.
L'OpenShift CLI (oc
) prend en charge la Security Support Provider Interface (SSPI) pour permettre les flux SSO sur Microsft Windows. Si vous utilisez le fournisseur d'identité d'en-tête de demande avec un proxy compatible GSSAPI pour connecter un serveur Active Directory à OpenShift Container Platform, les utilisateurs peuvent s'authentifier automatiquement à OpenShift Container Platform en utilisant l'interface de ligne de commande oc
à partir d'un ordinateur Microsoft Windows connecté à un domaine.
7.5.3. Création d'une carte de configuration
Les fournisseurs d'identité utilisent les objets OpenShift Container Platform ConfigMap
dans l'espace de noms openshift-config
pour contenir le paquet de l'autorité de certification. Ces objets sont principalement utilisés pour contenir les paquets de certificats nécessaires au fournisseur d'identité.
Procédure
Définissez un objet OpenShift Container Platform
ConfigMap
contenant l'autorité de certification en utilisant la commande suivante. L'autorité de certification doit être stockée dans la cléca.crt
de l'objetConfigMap
.$ oc create configmap ca-config-map --from-file=ca.crt=/path/to/ca -n openshift-config
AstuceVous pouvez également appliquer le YAML suivant pour créer la carte de configuration :
apiVersion: v1 kind: ConfigMap metadata: name: ca-config-map namespace: openshift-config data: ca.crt: | <CA_certificate_PEM>
7.5.4. Exemple d'en-tête de requête CR
La ressource personnalisée (CR) suivante indique les paramètres et les valeurs acceptables pour un fournisseur d'identité d'en-tête de requête.
En-tête de requête CR
apiVersion: config.openshift.io/v1 kind: OAuth metadata: name: cluster spec: identityProviders: - name: requestheaderidp 1 mappingMethod: claim 2 type: RequestHeader requestHeader: challengeURL: "https://www.example.com/challenging-proxy/oauth/authorize?${query}" 3 loginURL: "https://www.example.com/login-proxy/oauth/authorize?${query}" 4 ca: 5 name: ca-config-map clientCommonNames: 6 - my-auth-proxy headers: 7 - X-Remote-User - SSO-User emailHeaders: 8 - X-Remote-User-Email nameHeaders: 9 - X-Remote-User-Display-Name preferredUsernameHeaders: 10 - X-Remote-User-Login
- 1
- Ce nom de fournisseur est préfixé au nom d'utilisateur dans l'en-tête de la demande pour former un nom d'identité.
- 2
- Contrôle la manière dont les correspondances sont établies entre les identités de ce fournisseur et les objets
User
. - 3
- Facultatif : URL vers laquelle rediriger les requêtes
/oauth/authorize
non authentifiées, qui authentifiera les clients basés sur un navigateur et transmettra leur requête par proxy àhttps://<namespace_route>/oauth/authorize
. L'URL qui redirige vershttps://<namespace_route>/oauth/authorize
doit se terminer par/authorize
(sans barre oblique à la fin), ainsi que les sous-chemins de proxy, afin que les flux d'approbation OAuth fonctionnent correctement.${url}
est remplacé par l'URL actuelle, échappée pour être sûre dans un paramètre de requête.${query}
est remplacé par la chaîne de requête actuelle. Si cet attribut n'est pas défini,loginURL
doit être utilisé. - 4
- Facultatif : URL vers laquelle rediriger les requêtes
/oauth/authorize
non authentifiées, qui authentifiera les clients qui attendent des défisWWW-Authenticate
, puis les redirigera vershttps://<namespace_route>/oauth/authorize
.${url}
est remplacé par l'URL actuelle, échappée pour être sûre dans un paramètre de requête.${query}
est remplacé par la chaîne de requête actuelle. Si cet attribut n'est pas défini, il faut utiliserchallengeURL
. - 5
- Référence à un objet OpenShift Container Platform
ConfigMap
contenant un paquet de certificats codé en PEM. Utilisé comme ancre de confiance pour valider les certificats TLS présentés par le serveur distant.ImportantDepuis OpenShift Container Platform 4.1, le champ
ca
est obligatoire pour ce fournisseur d'identité. Cela signifie que votre proxy doit prendre en charge TLS mutuel. - 6
- Facultatif : liste de noms communs (
cn
). S'il est défini, un certificat client valide avec un nom commun (cn
) figurant dans la liste spécifiée doit être présenté avant que les en-têtes de la demande ne soient vérifiés pour les noms d'utilisateur. S'il est vide, n'importe quel nom commun est autorisé. Ne peut être utilisé qu'en combinaison avecca
. - 7
- Noms des en-têtes à vérifier, dans l'ordre, pour l'identité de l'utilisateur. Le premier en-tête contenant une valeur est utilisé comme identité. Obligatoire, insensible à la casse.
- 8
- Noms des en-têtes à vérifier, dans l'ordre, pour une adresse électronique. Le premier en-tête contenant une valeur est utilisé comme adresse électronique. Facultatif, insensible à la casse.
- 9
- Noms d'en-tête à vérifier, dans l'ordre, pour un nom d'affichage. Le premier en-tête contenant une valeur est utilisé comme nom d'affichage. Facultatif, insensible à la casse.
- 10
- Noms des en-têtes à vérifier, dans l'ordre, pour un nom d'utilisateur préféré, s'il est différent de l'identité immuable déterminée à partir des en-têtes spécifiés à l'adresse
headers
. Le premier en-tête contenant une valeur est utilisé comme nom d'utilisateur préféré lors du provisionnement. Facultatif, insensible à la casse.
Ressources complémentaires
-
Voir Paramètres du fournisseur d'identité pour des informations sur les paramètres, tels que
mappingMethod
, qui sont communs à tous les fournisseurs d'identité.
7.5.5. Ajouter un fournisseur d'identité à votre cluster
Après avoir installé votre cluster, ajoutez-y un fournisseur d'identité pour que vos utilisateurs puissent s'authentifier.
Conditions préalables
- Créer un cluster OpenShift Container Platform.
- Créez la ressource personnalisée (CR) pour vos fournisseurs d'identité.
- Vous devez être connecté en tant qu'administrateur.
Procédure
Appliquer le CR défini :
$ oc apply -f </path/to/CR>
NoteSi un CR n'existe pas,
oc apply
crée un nouveau CR et peut déclencher l'avertissement suivant :Warning: oc apply should be used on resources created by either oc create --save-config or oc apply
. Dans ce cas, vous pouvez ignorer cet avertissement.Connectez-vous au cluster en tant qu'utilisateur de votre fournisseur d'identité, en saisissant le mot de passe lorsque vous y êtes invité.
$ oc login -u <nom d'utilisateur>
Confirmez que l'utilisateur s'est connecté avec succès et affichez le nom de l'utilisateur.
$ oc whoami
7.5.6. Exemple de configuration de l'authentification Apache à l'aide de l'en-tête de requête
Cet exemple configure un proxy d'authentification Apache pour OpenShift Container Platform en utilisant le fournisseur d'identité de l'en-tête de requête.
Configuration personnalisée du proxy
L'utilisation du module mod_auth_gssapi
est un moyen courant de configurer le proxy d'authentification Apache en utilisant le fournisseur d'identité de l'en-tête de requête ; cependant, ce n'est pas obligatoire. D'autres mandataires peuvent facilement être utilisés si les conditions suivantes sont remplies :
-
Bloquer l'en-tête
X-Remote-User
dans les requêtes des clients pour empêcher l'usurpation d'identité. -
Renforcer l'authentification du certificat du client dans la configuration de
RequestHeaderIdentityProvider
. -
Exiger que l'en-tête
X-Csrf-Token
soit défini pour toutes les demandes d'authentification utilisant le flux de défi. -
Veillez à ce que seuls le point d'accès
/oauth/authorize
et ses sous-chemins soient protégés ; les redirections doivent être réécrites pour permettre au serveur dorsal d'envoyer le client au bon endroit. -
L'URL qui fait office de proxy vers
https://<namespace_route>/oauth/authorize
doit se terminer par/authorize
sans barre oblique de fin. Par exemple,https://proxy.example.com/login-proxy/authorize?…
doit se substituer àhttps://<namespace_route>/oauth/authorize?…
. -
Les sous-chemins de l'URL qui fait office de proxy vers
https://<namespace_route>/oauth/authorize
doivent faire office de proxy vers les sous-chemins dehttps://<namespace_route>/oauth/authorize
. Par exemple,https://proxy.example.com/login-proxy/authorize/approve?…
doit faire office de proxy vershttps://<namespace_route>/oauth/authorize/approve?…
.
L'adresse https://<namespace_route>
est la route vers le serveur OAuth et peut être obtenue en exécutant oc get route -n openshift-authentication
.
Configuration de l'authentification Apache à l'aide de l'en-tête de requête
Cet exemple utilise le module mod_auth_gssapi
pour configurer un proxy d'authentification Apache en utilisant le fournisseur d'identité de l'en-tête de requête.
Conditions préalables
Obtenez le module
mod_auth_gssapi
à partir du canal optionnel. Les paquets suivants doivent être installés sur votre machine locale :-
httpd
-
mod_ssl
-
mod_session
-
apr-util-openssl
-
mod_auth_gssapi
-
Générer une autorité de certification pour valider les demandes qui soumettent l'en-tête de confiance. Définir un objet OpenShift Container Platform
ConfigMap
contenant l'AC. Cette opération s'effectue en exécutant :$ oc create configmap ca-config-map --from-file=ca.crt=/path/to/ca -n openshift-config 1
- 1
- L'autorité de certification doit être stockée dans la clé
ca.crt
de l'objetConfigMap
.
AstuceVous pouvez également appliquer le YAML suivant pour créer la carte de configuration :
apiVersion: v1 kind: ConfigMap metadata: name: ca-config-map namespace: openshift-config data: ca.crt: | <CA_certificate_PEM>
- Générer un certificat client pour le proxy. Vous pouvez générer ce certificat en utilisant n'importe quel outil de certificat x509. Le certificat client doit être signé par l'autorité de certification que vous avez générée pour valider les demandes qui soumettent l'en-tête de confiance.
- Créez la ressource personnalisée (CR) pour vos fournisseurs d'identité.
Procédure
Ce proxy utilise un certificat client pour se connecter au serveur OAuth, qui est configuré pour faire confiance à l'en-tête X-Remote-User
.
-
Créez le certificat pour la configuration Apache. Le certificat que vous spécifiez comme valeur du paramètre
SSLProxyMachineCertificateFile
est le certificat client du proxy qui est utilisé pour authentifier le proxy auprès du serveur. Il doit utiliserTLS Web Client Authentication
comme type de clé étendue. Créez la configuration d'Apache. Utilisez le modèle suivant pour fournir les paramètres et les valeurs nécessaires :
ImportantExaminez attentivement le modèle et adaptez son contenu à votre environnement.
LoadModule request_module modules/mod_request.so LoadModule auth_gssapi_module modules/mod_auth_gssapi.so # Some Apache configurations might require these modules. # LoadModule auth_form_module modules/mod_auth_form.so # LoadModule session_module modules/mod_session.so # Nothing needs to be served over HTTP. This virtual host simply redirects to # HTTPS. <VirtualHost *:80> DocumentRoot /var/www/html RewriteEngine On RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L] </VirtualHost> <VirtualHost *:443> # This needs to match the certificates you generated. See the CN and X509v3 # Subject Alternative Name in the output of: # openssl x509 -text -in /etc/pki/tls/certs/localhost.crt ServerName www.example.com DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/pki/tls/certs/localhost.crt SSLCertificateKeyFile /etc/pki/tls/private/localhost.key SSLCACertificateFile /etc/pki/CA/certs/ca.crt SSLProxyEngine on SSLProxyCACertificateFile /etc/pki/CA/certs/ca.crt # It is critical to enforce client certificates. Otherwise, requests can # spoof the X-Remote-User header by accessing the /oauth/authorize endpoint # directly. SSLProxyMachineCertificateFile /etc/pki/tls/certs/authproxy.pem # To use the challenging-proxy, an X-Csrf-Token must be present. RewriteCond %{REQUEST_URI} ^/challenging-proxy RewriteCond %{HTTP:X-Csrf-Token} ^$ [NC] RewriteRule ^.* - [F,L] <Location /challenging-proxy/oauth/authorize> # Insert your backend server name/ip here. ProxyPass https://<namespace_route>/oauth/authorize AuthName "SSO Login" # For Kerberos AuthType GSSAPI Require valid-user RequestHeader set X-Remote-User %{REMOTE_USER}s GssapiCredStore keytab:/etc/httpd/protected/auth-proxy.keytab # Enable the following if you want to allow users to fallback # to password based authentication when they do not have a client # configured to perform kerberos authentication. GssapiBasicAuth On # For ldap: # AuthBasicProvider ldap # AuthLDAPURL "ldap://ldap.example.com:389/ou=People,dc=my-domain,dc=com?uid?sub?(objectClass=*)" </Location> <Location /login-proxy/oauth/authorize> # Insert your backend server name/ip here. ProxyPass https://<namespace_route>/oauth/authorize AuthName "SSO Login" AuthType GSSAPI Require valid-user RequestHeader set X-Remote-User %{REMOTE_USER}s env=REMOTE_USER GssapiCredStore keytab:/etc/httpd/protected/auth-proxy.keytab # Enable the following if you want to allow users to fallback # to password based authentication when they do not have a client # configured to perform kerberos authentication. GssapiBasicAuth On ErrorDocument 401 /login.html </Location> </VirtualHost> RequestHeader unset X-Remote-User
NoteL'adresse
https://<namespace_route>
est la route vers le serveur OAuth et peut être obtenue en exécutantoc get route -n openshift-authentication
.Mettez à jour la strophe
identityProviders
dans la ressource personnalisée (CR) :identityProviders: - name: requestheaderidp type: RequestHeader requestHeader: challengeURL: "https://<namespace_route>/challenging-proxy/oauth/authorize?${query}" loginURL: "https://<namespace_route>/login-proxy/oauth/authorize?${query}" ca: name: ca-config-map clientCommonNames: - my-auth-proxy headers: - X-Remote-User
Vérifier la configuration.
Confirmez que vous pouvez contourner le proxy en demandant un jeton en fournissant le certificat client et l'en-tête corrects :
# curl -L -k -H "X-Remote-User: joe" \ --cert /etc/pki/tls/certs/authproxy.pem \ https://<namespace_route>/oauth/token/request
Confirmez que les demandes qui ne fournissent pas le certificat du client échouent en demandant un jeton sans le certificat :
# curl -L -k -H "X-Remote-User: joe" \ https://<namespace_route>/oauth/token/request
Confirmez que la redirection
challengeURL
est active :# curl -k -v -H 'X-Csrf-Token: 1' \ https://<namespace_route>/oauth/authorize?client_id=openshift-challenging-client&response_type=token
Copiez la redirection
challengeURL
pour l'utiliser dans l'étape suivante.Exécutez cette commande pour afficher une réponse
401
avec un défi de baseWWW-Authenticate
, un défi de négociation ou les deux défis :# curl -k -v -H 'X-Csrf-Token: 1' \ <challengeURL_redirect + query>
Tester la connexion à l'OpenShift CLI (
oc
) avec et sans l'utilisation d'un ticket Kerberos :Si vous avez généré un ticket Kerberos en utilisant
kinit
, détruisez-le :# kdestroy -c nom_du_cache 1
- 1
- Veillez à indiquer le nom de votre cache Kerberos.
Connectez-vous à l'outil
oc
en utilisant vos identifiants Kerberos :# oc login -u <nom d'utilisateur>
Saisissez votre mot de passe Kerberos à l'invite.
Déconnectez-vous de l'outil
oc
:# oc logout
Utilisez vos identifiants Kerberos pour obtenir un ticket :
# kinit
Saisissez votre nom d'utilisateur et votre mot de passe Kerberos à l'invite.
Confirmez que vous pouvez vous connecter à l'outil
oc
:# oc login
Si votre configuration est correcte, vous êtes connecté sans avoir à saisir d'informations d'identification distinctes.