Chapitre 12. Utiliser un compte de service comme client OAuth
12.1. Comptes de service en tant que clients OAuth
Vous pouvez utiliser un compte de service comme une forme limitée de client OAuth. Les comptes de service ne peuvent demander qu'un sous-ensemble de champs d'application permettant d'accéder à certaines informations de base sur l'utilisateur et à des pouvoirs basés sur le rôle à l'intérieur de l'espace de noms propre au compte de service :
-
user:info
-
user:check-access
-
role:<any_role>:<service_account_namespace>
-
role:<any_role>:<service_account_namespace>:!
Lors de l'utilisation d'un compte de service en tant que client OAuth :
-
client_id
estsystem:serviceaccount:<service_account_namespace>:<service_account_name>
. client_secret
peut être n'importe quel jeton d'API pour ce compte de service. Par exemple, il peut s'agir de n'importe quel jeton d'API pour ce compte de service :oc sa get-token <service_account_name>
-
Pour obtenir les défis
WWW-Authenticate
, définissez une annotationserviceaccounts.openshift.io/oauth-want-challenges
sur le compte de service àtrue
. -
redirect_uri
doit correspondre à une annotation sur le compte de service.
12.1.1. Redirection des URI pour les comptes de service en tant que clients OAuth
Les clés d'annotation doivent avoir le préfixe serviceaccounts.openshift.io/oauth-redirecturi.
ou serviceaccounts.openshift.io/oauth-redirectreference.
, comme par exemple :
serviceaccounts.openshift.io/oauth-redirecturi.<name>
Dans sa forme la plus simple, l'annotation peut être utilisée pour spécifier directement des URI de redirection valides. Par exemple, l'annotation suivante peut être utilisée pour spécifier directement des URI de redirection valides :
"serviceaccounts.openshift.io/oauth-redirecturi.first": "https://example.com" "serviceaccounts.openshift.io/oauth-redirecturi.second": "https://other.com"
Les postfixes first
et second
dans l'exemple ci-dessus sont utilisés pour séparer les deux URI de redirection valides.
Dans les configurations plus complexes, les URI de redirection statiques peuvent ne pas suffire. Par exemple, vous souhaitez peut-être que tous les Ingresses d'une route soient considérés comme valides. C'est là que les URI de redirection dynamique via le préfixe serviceaccounts.openshift.io/oauth-redirectreference.
entrent en jeu.
Par exemple :
"serviceaccounts.openshift.io/oauth-redirectreference.first": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}"
Comme la valeur de cette annotation contient des données JSON sérialisées, elle est plus facile à voir dans un format développé :
{ "kind": "OAuthRedirectReference", "apiVersion": "v1", "reference": { "kind": "Route", "name": "jenkins" } }
Vous pouvez maintenant voir qu'un OAuthRedirectReference
nous permet de référencer la route nommée jenkins
. Ainsi, toutes les entrées pour cette route seront désormais considérées comme valides. La spécification complète d'un OAuthRedirectReference
est la suivante :
{ "kind": "OAuthRedirectReference", "apiVersion": "v1", "reference": { "kind": ..., 1 "name": ..., 2 "group": ... 3 } }
- 1
kind
fait référence au type de l'objet référencé. Actuellement, seulroute
est pris en charge.- 2
name
fait référence au nom de l'objet. L'objet doit se trouver dans le même espace de noms que le compte de service.- 3
group
fait référence au groupe de l'objet. Laissez ce champ vide, car le groupe d'un itinéraire est la chaîne vide.
Les deux préfixes d'annotation peuvent être combinés pour remplacer les données fournies par l'objet de référence. Par exemple :
"serviceaccounts.openshift.io/oauth-redirecturi.first": "custompath" "serviceaccounts.openshift.io/oauth-redirectreference.first": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}"
Le postfixe first
est utilisé pour relier les annotations entre elles. En supposant que la route jenkins
ait une entrée de https://example.com
, https://example.com/custompath
est maintenant considéré comme valide, mais https://example.com
ne l'est pas. Le format pour fournir partiellement des données d'annulation est le suivant :
Type | Syntaxe |
---|---|
Régime | "https://" |
Nom d'hôte | "//website.com" |
Port | "//:8000" |
Chemin d'accès | \N- "examplepath\N" |
La spécification d'un remplacement de nom d'hôte remplacera les données de nom d'hôte de l'objet référencé, ce qui n'est probablement pas le comportement souhaité.
Toute combinaison de la syntaxe ci-dessus peut être combinée en utilisant le format suivant :
<scheme:>//<hostname><:port>/<path>
Le même objet peut être référencé plusieurs fois pour plus de flexibilité :
"serviceaccounts.openshift.io/oauth-redirecturi.first": "custompath" "serviceaccounts.openshift.io/oauth-redirectreference.first": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}" "serviceaccounts.openshift.io/oauth-redirecturi.second": "//:8000" "serviceaccounts.openshift.io/oauth-redirectreference.second": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}"
En supposant que la route nommée jenkins
a une entrée de https://example.com
, alors les deux https://example.com:8000
et https://example.com/custompath
sont considérés comme valides.
Des annotations statiques et dynamiques peuvent être utilisées en même temps pour obtenir le comportement souhaité :
"serviceaccounts.openshift.io/oauth-redirectreference.first": "{\"kind\":\"OAuthRedirectReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"Route\",\"name\":\"jenkins\"}}" "serviceaccounts.openshift.io/oauth-redirecturi.second": "https://other.com"