Passerelles d’applications (existantes)
AppGateways contrôle l’accès des utilisateurs aux applications en fournissant des outils déclaratifs pour les proxy
et les connecteurs. AppGateways établit des proxy d’applications et peut déterminer quels systèmes d’accès
doivent être utilisés pour authentifier et autoriser les utilisateurs. Ces passerelles peuvent également être utilisés pour étendre
ces systèmes d’accès en gérant les sessions ou en mettant en correspondance des attributs ou des réclamations avec des
en-têtes
spécifiques dont les applications existantes ont besoin pour autoriser l’accès. AppGateways peut également
utiliser attrProviders
pour obtenir des données supplémentaires qui peuvent être utilisées pour évaluer la politique.
Name
La valeur name
correspond à un identifiant unique pour chaque AppGateway.
Base Path
basePath
définit le préfixe du chemin sur lequel AppGateway recevra les
requêtes. Par exemple, un basePath
/foo
signifie que l’AppGateway recevra toutes
les requêtes dont le préfixe est /foo
, par exemple /foo/index.html
.
Host
host
est un champ facultatif utilisé permettant d’acheminer les demandes vers la bonne AppGateway lorsque les
basePaths
d’une ou plusieurs AppGateways entrent en conflit. Par exemple, deux applications peuvent
avoir un basePath
correspondant à /
et ont donc besoin d’une valeur host
spécifiée pour permettre
un routage correct.
appgateways:
- name: alpha
basePath: /
host: alpha.com
- name: beta
basePath: /
host: beta.com
Upstream
upstream
correspond à l’URL de l’application protégée qui fait l’objet d’une transmission par proxy. Il peut s’agir d’une
adresse IP ou d’un nom d’hôte, et d’un port sur lequel l’application est connectée.
Preserve Host
preserveHost
est un champ booléen facultatif utilisé pour déterminer si l’en-tête Host
doit être conservé dans les requêtes sortantes. Par défaut, l’orchestrateur définit
l’en-tête pour qu’il corresponde à l’hôte en amont
. Ce champ est souvent utilisé lorsque
l’orchestrateur transfère le trafic vers un autre proxy inverse tel qu’Apache.
TLS
Le champ tls
est utilisé pour spécifier la configuration TLS pour les requêtes sortantes en
amont
. La valeur doit faire référence à un objet TLS défini dans la configuration
TLS de premier niveau. Ce champ est facultatif et est
généralement utilisé lorsque la cible en amont
utilise des certificats signés par une autorité de
certification inconnue.
Rewrites
rewrites
sont les réécritures utilisées pour remplacer les URL dans la requête et dans la réponse. Cela peut s’avérer
pratique lors de l’accès par proxy à une application qui utilise des URL absolues. Cette fonctionnalité doit être
utilisée avec prudence car elle aura un impact sur les performances d’une AppGateway.
appgateways:
- name: rewritesExample
basePath: /
rewrites:
# The URL on the left side of the colon is replaced with the URL on the right.
https://app-internal.example.com: https://app.example.com
Attribute Providers
attrProviders
représente le système d’accès ou le magasin de données à partir duquel une AppGateway
récupère les attributs supplémentaires nécessaires à l’évaluation des politiques
et à la construction
des en-têtes
.
appgateways:
- name: exampleAttrProvider
basePath: /
attrProviders:
- connector: ldap
usernameMapping: azure.mail
- connector: mysql
usernameMapping: azure.mail
Connector
connector
est une référence au connecteur utilisé pour
charger les attributs.
Mappage des noms d’utilisateur
Définit l’attribut à utiliser en tant que clé de recherche afin de charger les attributs à partir du
fournisseur d’attributs. La valeur provient généralement du fournisseur d’identité
utilisé pour l’authentification primaire, par exemple azure.sub
.
Headers
Les AppGateways protègent souvent des applications qui nécessitent un fournisseur d’identité externe pour
authentifier l’utilisateur et définir des valeurs dans les headers
(en-têtes) HTTP avant d’autoriser l’accès.
Les en-têtes sont configurés sous forme de paires clé-valeur où la clé correspond au nom de l’en-tête
et la valeur correspond à la valeur de l’en-tête. Les valeurs sont déclarées à l’aide d’un espace de noms, par
exemple, azure.sub
.
appgateways:
- name: exampleHeaders
basePath: /
headers:
SM_USER: azure.sub
firstName: ldap.givenName
lastName: ldap.sn
Extension de services Create Header
Des en-têtes personnalisés peuvent être créés en utilisant l’extension de services createHeader
. Pour plus
d’informations, veuillez consulter les documents relatifs à
l’extension de services Create Header.
Policies
policies
correspond aux politiques qui déterminent si une demande donnée doit être autorisée, et qui définissent en bout de ligne
les utilisateurs autorisés à accéder à l’application. Si aucune politique n’est définie dans la
configuration de l’AppGateway, celle-ci refusera toutes les requêtes.
Les AppGateways utilisent l’authentification
et l’autorisation
pour évaluer si un utilisateur doit être
autorisé à accéder à un emplacement
d’application. Ces politiques étendent les
politiques d’authentification et d’autorisation natives du ou des systèmes d’accès connectés. L’utilisateur
obtient le droit d’accès s’il remplit les conditions établies : avoir été
authentifié par le fournisseur d’identité
, ou comporter des attributs qui peuvent indiquer l’appartenance à un
groupe ou tout autre aspect de l’utilisateur évalué dans le cadre de la politique.
Location
location
correspond à l’emplacement de la politique utilisé pour faire correspondre une ressource d’application à une politique. L’AppGateway
établit une correspondance entre une requête et l’emplacement
le plus spécifique. L’ordre dans la
configuration des emplacements de politique n’a pas d’importance.
appgateways:
- name: examplePolicy
basePath: /
policies:
- location: /index.html
authentication:
allowUnauthenticated: true
authorization:
allowAll: true
Pour appliquer la correspondance d’expression rationnelle au chemin d’accès à la ressource, ajoutez ~
(notez l’espace) à
l’avant de l’emplacement
. Vous pouvez utiliser des outils tels que regex101
(sélectionnez Golang) pour tester votre expression rationnelle avec les chemins URL que vous aimeriez faire correspondre. Par
exemple, pour faire correspondre une ressource commençant par myresource
:
appgateways:
- name: examplePolicyWithRegex
basePath: /
policies:
- location: ~ ^/myresource.*
authentication:
allowUnauthenticated: true
authorization:
allowAll: true
Veuillez prendre note du caractère ^
pour vous assurer que l’expression rationnelle ne correspond qu’au début du chemin d’accès à la ressource.
L’orchestrateur ajoute automatiquement les caractères d’échappement /
dans le chemin d’accès à l’URL, il n’est donc pas
nécessaire de les ajouter manuellement (par exemple, .^\/
).
Des expressions rationnelles mal construites peuvent affecter les performances de l’orchestrateur. Utilisez des ancres
(^
ou $
) si possible, et des compteurs ou des plages (.{0,15}
) au lieu de métacaractères « gourmands »
(.*
).
Query Param Matching
useQueryParamsForMatchingPolicy
est utilisé pour faire correspondre les requêtes comportant des paramètres à
la politique appropriée. La correspondance des paramètres de requête ne fonctionne qu’avec les emplacements qui utilisent
des expressions rationnelles (c’est-à-dire précédés de ~
).
Pour faire correspondre les URL qui incluent des paramètres de requête tels que l’URL https://mydomain.com/myresource/?param=abcd
, vous devez définir une politique similaire à la suivante :
appgateways:
- name: examplePolicyWithQueryParams
basePath: /
policies:
- location: ~ ^/myresource/\?param=abcd
useQueryParamsForMatchingPolicy: true
authentication:
allowUnauthenticated: true
authorization:
allowAll: true
Dans le cas de paramètres d’interrogation multiples avec un ordre cohérent :
appgateways:
- name: examplePolicyWithQueryParams
basePath: /
policies:
- location: ~ ^/myresource/\?param=abc&code=def
useQueryParamsForMatchingPolicy: true
authentication:
allowUnauthenticated: true
authorization:
allowAll: true
Dans le cas où les paramètres de la requête peuvent apparaître dans n’importe quel ordre, avec d’autres paramètres entre eux :
appgateways:
- name: examplePolicyWithQueryParams
basePath: /
policies:
- location: ~ ^/myresource/\?.{0,15}(param=abc|code=def){1}.{0,15}\&(param=abc|code=def){1}
useQueryParamsForMatchingPolicy: true
authentication:
allowUnauthenticated: true
authorization:
allowAll: true
Authentication
authentification
déclare la politique d’authentification d’un emplacement. Lorsqu’une requête non authentifiée
est reçue pour une ressource, une politique d’authentification par défaut traite la
requête non authentifiée et redirige l’utilisateur vers un fournisseur d’identité ou un fournisseur d’autentification multifacteur pour qu’il se connecte
si nécessaire.
Exemple d’utilisation d’Azure pour l’authentification :
appgateways:
- name: exampleAuthnPolicy
basePath: /
policies:
- location: /sonar
authentication:
idps:
- azure
authorization:
allowAll: true
Exemple d’utilisation d’Azure pour l’authentification primaire et de PingOne pour l’authentification multifacteur :
include:
- "/etc/maverics/configs/connectors/azure.yaml"
- "/etc/maverics/configs/connectors/pingone.yaml"
appgateways:
- name: exampleAuthnMFAPolicy
basePath: /
policies:
- location: /sonar
authentication:
idps:
- azure
mfa:
- pingone:
mapping:
- email: azure.email
IDPs
idps
contient une liste d’un ou de plusieurs noms de fournisseurs d’identité à utiliser pour l’authentification.
MFA
mfa
contient une liste d’un ou de plusieurs noms de connecteurs MFA (authentification multifacteur).
Sous chaque connecteur, une section de mappage
est nécessaire pour définir comment une identité MFA
est mappée à l’identité de fournisseur d’identité correspondante.
Le champ mapping
prend en charge les mots-clés and
, or
et not
pour exprimer des
évaluations complexes. Si les noms correspondent à une liste YAML sans mots-clés, ils seront évalués
à l’aide d’un and
implicite.
Allow Unauthenticated Access
allowUnauthenticated
peut être utilisé pour permettre un accès libre à une ressource.
Si la valeur est « true
», la ressource correspondant à cette politique ne nécessite pas d’authentification.
Cet opérateur est généralement utilisé pour des ressources telles que les pages d’erreur ou de connexion.
Authorization
L’opérateur authorization
déclare la politique d’autorisation d’un emplacement et permet la formation de politiques arbitrairement complexes. L’opérateur d’autorisation peut être utilisé en conjonction avec les opérateurs all, any, equal et contains. S’il n’est pas spécifié, l’accès à l’emplacement est refusé. La section authorization
peut utiliser les évaluateurs décrits ci-dessous
pour établir une politique d’autorisation.
Exemple avec une politique d’autorisation simple :
appgateways:
- name: exampleAuthzPolicy
basePath: /
policies:
- location: /
authentication:
idps:
- azure
authorization:
- or:
- contains: ["{{azure.groups}}", "admins"]
- contains: ["{{azure.groups}}", "executives"]
Allow All
L’opérateur allowAll
(allowAll: true
) autorise tous les utilisateurs d’un emplacement. Ce paramètre doit être défini
explicitement pour que chaque emplacement soit accessible à tous les utilisateurs et ne doit pas être utilisé en
combinaison avec d’autres règles de politique pour un emplacement.
And
Toutes les conditions et tous les opérateurs définis dans un bloc and
doivent être évalués à la valeur true
pour
que la politique soit évaluée à la valeur true
.
Or
Toutes les conditions et tous les opérateurs définis dans un bloc or
doivent être évalués à la valeur true
pour que la politique soit évaluée à la valeur true
.
Not
Toute condition ou opérateur défini dans un bloc not
s’évalue à l’inverse. Si
la condition de la politique not
est true
, la politique sera évaluée à false
et vice-versa. Pour évaluer une liste de conditions avec not
, vous devez imbriquer les
conditions dans un bloc or
ou and
.
Contains
contains
requiert deux chaînes de caractères, généralement un attribut de la session et une valeur à laquelle le comparer, et renvoie la valeur true si la deuxième chaîne correspond à une partie de la première (c’est-à-dire une correspondance de sous-chaîne). Les valeurs de la session de l’utilisateur peuvent être incluses dans l’évaluation de la politique en les entourant de doubles accolades. Par exemple,contains: ["{{azure.name}}", "@example.com"]
.
Equals
S’évalue à true si les deux valeurs sont
equal
au moment de l’exécution de la politique.
Headers
headers
définit l’ensemble des en-têtes pour un emplacement spécifique. Ces en-têtes
remplacent les en-têtes
du même nom définis au niveau de l’AppGateway. L’extension
de services createHeader
peut également être utilisée
à ce niveau.
Cet exemple de configuration définit des en-têtes au niveau de la politique afin d’inclure des en-têtes pour un emplacement spécifique. Il remplace également les en-têtes au niveau de l’AppGateway.
appgateways:
- name: Sonar
basePath: /
headers:
SM_USER: azure.username
firstname: azure.givenName
lastname: azure.surname
policies:
- location: /
authentication:
idps:
- azure
headers:
# Override 'firstname' header defined in 'headers'.
firstname: azure.preferred_username
- location: /admin
authentication:
idps:
- azure
headers:
# Add new header for /admin location.
IS_ADMIN: azure.isAdmin
Error Page
errorPage
correspond à l’URL vers laquelle l’utilisateur est redirigé en cas d’erreur.
Unauthorized Page
unauthorizedPage
est l’URL vers laquelle l’utilisateur est redirigé lorsque l’évaluation de la politique
conduit à un refus d’accès à l’application.
Extensions de services
Les AppGateways utilisent des extensions de services pour permettre une logique personnalisée qui n’est pas prise en charge de manière native. Les extensions de services peuvent être utilisées pour charger des attributs, étendre les évaluations des politiques d’authentification et d’autorisation et créer des en-têtes.
Authentification
Bien que Maverics fournisse un grand nombre de connecteurs à utiliser pour l’authentification des utilisateurs, certaines organisations souhaitent personnaliser l’expérience d’authentification ou peuvent avoir des besoins qui ne sont pas pris en compte dans les connecteurs existants. L’extension de services Authentication permet aux administrateurs de définir le processus d’authentification précisément de la manière dont ils en ont besoin.
Pour plus de détails, reportez-vous à la section [Extension de services Authentication](service-extension-authentication.
Chargement des attributs
Le chargement des attributs de la session d’un utilisateur est également personnalisable via les extensions de services.
Pour plus de détails, reportez-vous à la section Chargement des attributs via l’extension de services.
Autorisation
Les extensions de services permettent également un contrôle complet de l’accès aux ressources protégées par le biais d’une autorisation.
Pour plus de détails, reportez-vous à la section Autorisation via l’extension de services.
Connexion en amont
Il peut être utile de déterminer si une requête adressée à une application en amont est authentifiée et de pouvoir se connecter à une application en amont.
Pour plus de détails, reportez à la section Connexion à l’application en amont.
Modification des requêtes et des réponses
Certaines situations requièrent la possibilité de modifier chaque requête et réponse qui passe par le proxy de l’AppGateway.
Pour plus de détails, reportez-vous à la section Extension de services Request & Response Modification
Remplacer le flux de requêtes par défaut de l’AppGateway
Obtenez un contrôle plus précis sur la façon dont une requête est traitée dans une AppGateway.
Pour plus de détails, reportez-vous à la section Extension de services Serve
Exemples
Base
Cet exemple de configuration YAML de base déclare :
- Une application appelée « Sonar »
- Un emplacement protégé sur l’application
- Qu’une session doit être présente et validée pour que l’utilisateur puisse accéder à l’application
- Un locataire Azure AD connecté en tant que fournisseur d’identité pour l’utilisateur
- Les mappages d’attributs des réclamations Azure AD vers les en-têtes HTTP
- Une politique qui autorise l’accès à l’application lorsque l’utilisateur est authentifié auprès d’Azure
- Une politique qui n’autorise l’accès à un emplacement spécifique que si les données de l’utilisateur répondent à des critères spécifiques
version: 0.1
tls:
maverics:
certFile: certs/example-strata.crt
keyFile: certs/example-strata.key
http:
address: :443
tls: maverics
include:
- "/etc/maverics/configs/connectors/azure.yaml"
appgateways:
- name: Sonar
basePath: /
host: app.sonarsystems.com
upstream: https://example.com:8443
errorPage: https://app.sonarsystems.com/sonar/error
unauthorizedPage: https://app.sonarsystems.com/sonar/accessdenied
headers:
SM_USER: azure.username
firstname: azure.givenName
lastname: azure.surname
policies:
- location: /
authentication:
idps:
- azure
- location: /sonar/accessdenied
authentication:
allowUnauthenticated: true
authorization:
allowAll: true
- location: /sonar/execs
authentication:
idps:
- azure
authorization:
- or:
- contains: ["{{azure.email}}", "@sonarsystems.com"]
- contains: ["{{azure.email}}", "@example.com"]
Politique d’authentification
Flux d’authentification avec mappage de l’authentification multifacteur à l’aide d’opérateurs logiques
Dans la section authentication
, vous trouverez un fournisseur d’identité et une authentification multifacteur prédéfinis. Dans le
flux d’authentification par défaut, l’utilisateur s’authentifie auprès du connecteur
Azure
, puis auprès du fournisseur d’authentification multifacteur spécifié
dans la section MFA
. Dans cet exemple, la configuration présentée utilise pingone
en tant que connecteur
pour le fournisseur d’authentification multifacteur. Le mappage est ici exprimé sous la forme de deux conditions différentes dans un
cas où certains utilisateurs sont mappés avec l’attribut email
et d’autres
avec l’attribut userid
pour un même connecteur pingone
. Si la session de l’utilisateur
ne contient pas l’attribut email
, le flux d’authentification par défaut
tentera d’authentifier l’utilisateur auprès du connecteur pingone
à l’aide de
l’attribut userid
.
...
include:
- "/etc/maverics/configs/connectors/azure.yaml"
- "/etc/maverics/configs/connectors/pingone.yaml"
appgateways:
- name: Sonar
# ...
policies:
- location: /sonar
authentication:
idps:
- azure
mfa:
- pingone:
mapping:
- or:
- email: azure.email
- userid: azure.userid
Dans la configuration ci-dessous, l’opérateur and
est utilisé pour indiquer qu’un mappage de deux champs
est souhaité.
...
include:
- "/etc/maverics/configs/connectors/azure.yaml"
- "/etc/maverics/configs/connectors/pingone.yaml"
appgateways:
- name: Sonar
# ...
policies:
- location: /sonar
authentication:
idps:
- azure
mfa:
- pingone:
mapping:
- and:
- email: azure.email
- tenantID: azure.group
Cette configuration présente un scénario plus avancé et plus complexe, permettant une expression à l’aide de plusieurs opérateurs.
...
include:
- "/etc/maverics/configs/connectors/azure.yaml"
- "/etc/maverics/configs/connectors/pingone.yaml"
appgateways:
- name: Sonar
# ...
policies:
- location: /sonar
authentication:
idps:
- azure
mfa:
- pingone:
mapping:
- or:
- and:
- email: azure.email
- tenantID: azure.group
- email: azure.email
Cette configuration démontre un mappage exprimé avec l’opérateur not
dans lequel, en présence de l’attribut
azure.custom
dans la session, le mappage de l’utilisateur vers pingone
se fait à l’aide de l’e-mail secondaire.
...
include:
- "/etc/maverics/configs/connectors/azure.yaml"
- "/etc/maverics/configs/connectors/pingone.yaml"
appgateways:
- name: Sonar
# ...
policies:
- location: /sonar
authentication:
idps:
- azure
mfa:
- pingone:
mapping:
- or:
- and:
- email: azure.verified_primary_email
- not:
custom: azure.custom
- email: azure.verified_secondary_email
Politique d’autorisation
L’AppGateway utilise authorization
pour protéger les ressources, renvoyant 403 Forbidden
lors d’une tentative d’accès à la ressource si la politique n’est pas évaluée à true.
Politique utilisant authorization
avec des conditions imbriquées
Dans cet exemple de configuration, l’AppGateway utilise authorization
pour permettre à
certains utilisateurs d’accéder à /sonar/reports
. Si le courriel de l’utilisateur contient le domaine strata.io
,
l’accès est autorisé pour les utilisateurs portant les noms Marie
, Ivan
et Ludwig
. Si l’adresse électronique de l’utilisateur
contient le domaine sonarsystems.com
, l’accès est autorisé pour les utilisateurs portant les
noms Donna
, Jacob
et Rufus
.
...
include:
- "/etc/maverics/configs/connectors/azure.yaml"
appgateways:
- name: Sonar
# ...
policies:
- location: /sonar
authentication:
idps:
- azure
authorization:
allowAll: true
- location: /sonar/reports
authentication:
idps:
- azure
authorization:
- and:
- equal: [ "{{azure.custom}}", "expected" ]
- or:
- and:
- contains: [ "{{azure.name}}", "@strata.io" ]
- or:
- equal: [ "{{azure.givenname}}", "Marie" ]
- equal: [ "{{azure.givenname}}", "Ivan" ]
- equal: [ "{{azure.givenname}}", "Ludwig" ]
- and:
- contains: [ "{{azure.name}}", "@sonarsystems.com" ]
- or:
- equal: [ "{{azure.givenname}}", "Donna" ]
- equal: [ "{{azure.givenname}}", "Jacob" ]
- equal: [ "{{azure.givenname}}", "Rufus" ]
Politique utilisant des attributs LDAP
Cet exemple de configuration utilise une instance de connecteur LDAP pour obtenir des informations supplémentaires sur les utilisateurs. Lorsque les attributs supplémentaires sont chargés, Maverics effectue un contrôle d’autorisation par rapport aux attributs chargés avant d’autoriser l’accès à l’utilisateur.
include:
- "/etc/maverics/configs/connectors/azure.yaml"
connectors:
- name: ldap
type: ldap
url: "ldap://ldap.example.com:389"
serviceAccountPassword: <PASSWORD>
serviceAccountUsername: cn=admin,dc=example,dc=com
baseDN: ou=People,dc=example,dc=com
usernameSearchKey: mail
appgateways:
- name: Sonar
# ...
attrProviders:
- connector: ldap
usernameMapping: azure.emailaddress
policies:
- location: /sonar
loadAttrsSE:
funcName: LoadAttrs
file: /etc/maverics/extensions/loadAttrs.go
authentication:
idps:
- azure
authorization:
- equal: [ "{{ldap.department}}", "Accounting" ]