Man page - request_key(2)

Packages contains this manual

Available languages:

en fr ru

Manual

request_key

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
Demander l’instanciation d’une clĂ© dans l’espace utilisateur
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

request_key - Demander une clé au gestionnaire de clés du noyau

BIBLIOTHÈQUE

Utilitaires de gestion de clefs Linux ( libkeyutils , -lkeyutils )

SYNOPSIS

#include <keyutils.h>

key_serial_t request_key(const char * type , const char * description ,
const char *_Nullable
callout_info ,
key_serial_t
dest_keyring );

DESCRIPTION

request_key () essaie de trouver une clĂ© d’un type donnĂ©, qui correspond Ă  la description (au nom) spĂ©cifiĂ©e. Si aucune clĂ© n’a pu ĂȘtre trouvĂ©e, la clĂ© peut ĂȘtre créée. Si la clĂ© a Ă©tĂ© trouvĂ©e ou créée, request_key () la rattache au trousseau dont l’identifiant est indiquĂ© dans dest_keyring et il renvoie le numĂ©ro de sĂ©rie de la clĂ©.

request_key () cherche une clĂ© correspondant aux critĂšres d’abord rĂ©cursivement Ă  l’intĂ©rieur des trousseaux attachĂ©s au processus appelant, dans l’ordre suivant : trousseau spĂ©cifique au thread, trousseau spĂ©cifique au processus, et enfin le trousseau de session.

Si request_key () est appelĂ© depuis un programme lui-mĂȘme appelĂ© par request_key () au nom d’un autre processus afin de gĂ©nĂ©rer une clĂ©, alors les trousseaux de cet autre processus seront ensuite parcourus en utilisant les identifiants d’utilisateur, de groupe, du groupe supplĂ©mentaire et le contexte de sĂ©curitĂ© de ce processus.

La recherche dans l’arborescence d’un trousseau est de type parcours en largeur : une correspondance est d’abord recherchĂ©e avec toutes les clĂ©s d’un trousseau avant de chercher dans les trousseaux trouvĂ©s dans ce trousseau. Seules les clĂ©s et seuls les trousseaux pour lesquels le processus a l’autorisation search peuvent ĂȘtre examinĂ©s.

Si aucune clĂ© n’est trouvĂ©e et si callout est NULL, l’appel Ă©choue avec l’erreur ENOKEY .

Si aucune clĂ© n’est trouvĂ©e et si callout n’est pas NULL, le noyau essaie d’appeler un programme de l’espace utilisateur pour instancier la clĂ©. Les dĂ©tails sont donnĂ©s ci-dessous.

Le numĂ©ro de sĂ©rie dest_keyring peut ĂȘtre celui d’un trousseau valable sur lequel l’appelant possĂšde les droits en Ă©criture ou il peut s’agir d’un des identifiants de trousseau spĂ©cial suivants :
KEY_SPEC_THREAD_KEYRING

Cela indique le trousseau spĂ©cifique au thread de l’appelant (voir thread-keyring (7)).

KEY_SPEC_PROCESS_KEYRING

Cela indique le trousseau spĂ©cifique au processus de l’appelant (voir process-keyring (7)).

KEY_SPEC_SESSION_KEYRING

Cela indique le trousseau spĂ©cifique Ă  la session de l’appelant (voir session-keyring (7)).

KEY_SPEC_USER_KEYRING

Cela indique le trousseau spĂ©cifique Ă  l’UID de l’appelant (voir user-keyring (7)).

KEY_SPEC_USER_SESSION_KEYRING

Cela indique le trousseau spĂ©cifique Ă  la session de l’UID de l’appelant (voir user-session-keyring (7)).

Quand dest_keyring est indiquĂ© comme 0 et qu’aucune construction de clĂ© n’ait Ă©tĂ© effectuĂ©e, aucune Ă©dition de liens supplĂ©mentaire n’est effectuĂ©e.

Sinon, si dest_keyring est 0 et si une nouvelle clĂ© est construite, la nouvelle clĂ© sera attachĂ©e au trousseau par dĂ©faut. Plus prĂ©cisĂ©ment, quand le noyau essaie de dĂ©terminer le trousseau auquel rattacher la clĂ© nouvellement créée, il essaie les trousseaux les uns Ă  la suite des autres, en commençant par celui dĂ©fini par l’opĂ©ration KEYCTL_SET_REQKEY_KEYRING de keyctl (2), puis en continuant dans l’ordre ci-dessous jusqu’à ce qu’il trouve le premier trousseau existant :

-

Le trousseau du demandeur ( KEY_REQKEY_DEFL_REQUESTOR_KEYRING depuis Linux 2.6.29).

-

Le trousseau spécifique au thread ( KEY_REQKEY_DEFL_THREAD_KEYRING ; voir thread-keyring (7)).

-

Le trousseau spécifique au processus ( KEY_REQKEY_DEFL_PROCESS_KEYRING ; voir process-keyring (7)).

-

Le trousseau spécifique à la session ( KEY_REQKEY_DEFL_SESSION_KEYRING ; voir session-keyring (7)).

-

Le trousseau de la session associĂ© Ă  l’identifiant utilisateur du processus ( KEY_REQKEY_DEFL_USER_SESSION_KEYRING ; voir user-session-keyring (7)). Ce trousseau est censĂ© toujours exister.

-

Le trousseau spĂ©cifique Ă  l’identifiant utilisateur ( KEY_REQKEY_DEFL_USER_KEYRING ; voir user-keyring (7)). Ce trousseau est toujours censĂ© exister.

Si l’opĂ©ration KEYCTL_SET_REQKEY_KEYRING de keyctl (2) indique KEY_REQKEY_DEFL_DEFAULT (ou si aucune opĂ©ration KEYCTL_SET_REQKEY_KEYRING n’est effectuĂ©e), le noyau cherche un trousseau Ă  partir du dĂ©but de la liste.

Demander l’instanciation d’une clĂ© dans l’espace utilisateur

Si le noyau ne peut pas trouver de clĂ© correspondant Ă  type et Ă  description et si callout n’est pas NULL, le noyau essaie d’appeler un programme de l’espace utilisateur pour instancier une clĂ© au type et Ă  la description donnĂ©s. Dans ce cas, les Ă©tapes suivantes sont suivies :

(1)

Le noyau crée une clé non instanciée, U, du type et de la description demandés.

(2)

Le noyau crĂ©e une clĂ© d’autorisation, V, qui se rapporte Ă  la clĂ© U, et enregistre les faits que l’appelant de request_key () est :

(2.1)

le contexte dans lequel la clĂ© U doit ĂȘtre instanciĂ©e et sĂ©curisĂ©e et

(2.2)

le contexte Ă  partir duquel les requĂȘtes associĂ©es Ă  la clĂ© peuvent ĂȘtre honorĂ©es.

La clĂ© d’autorisation est construite comme suit :

-

Le type de clé est « .request_key_auth » .

-

Les identifiants utilisateur et de groupe de la clĂ© sont les mĂȘmes que ceux du systĂšme de fichiers correspondant du processus Ă  l’origine de la demande.

-

La clĂ© accorde le droit de visibilitĂ© , lecture et de recherche au dĂ©tenteur de la clĂ© ainsi que celui de visibilitĂ© Ă  l’utilisateur de la clĂ©.

-

La description (son nom) de la clĂ© est la chaĂźne hexadĂ©cimale reprĂ©sentant l’identifiant de la clĂ© Ă  instancier dans le programme Ă  l’origine de la demande.

-

La charge utile de la clé est récupérée à partir des données indiquées dans callout_info .

-

En interne, le noyau enregistre aussi l’identifiant de processus de la request_key () appelĂ©e.

(3)

Le noyau crĂ©e un processus qui exĂ©cute un service de l’espace utilisateur tel que request-key (8) avec un nouveau trousseau de session contenant un lien vers la clĂ© d’autorisation, V.

Ce programme est fourni avec les options suivantes en ligne de commande :

[0]

La chaßne « /sbin/request-key » .

[1]

La chaĂźne « create » (indiquant qu’une clĂ© doit ĂȘtre créée).

[2]

L’identifiant de la clĂ© Ă  instancier.

[3]

L’identifiant utilisateur du systùme de fichiers de l’appelant de request_key ().

[4]

L’identifiant de groupe du systùme de fichiers de l’appelant de request_key ().

[5]

L’identifiant du trousseau du thread de l’appelant de request_key (). Il peut ĂȘtre zĂ©ro si le trousseau n’a pas Ă©tĂ© créé.

[6]

L’identifiant du trousseau du processus de l’appelant de request_key (). Il peut ĂȘtre zĂ©ro si le trousseau n’a pas Ă©tĂ© créé.

[7]

L’identifiant du trousseau de session de l’appelant de request_key ().

Note : chacune des options de la ligne de commande étant un identifiant de clé est encodé en décimal (contrairement aux identifiants de clé affichés dans /proc/keys , affichés en valeurs hexadécimales).

(4)

Le programme gĂ©nĂ©rĂ© dans l’étape prĂ©cĂ©dente :

-

Assume l’autoritĂ© pour instancier la clĂ© U en utilisant l’opĂ©ration KEYCTL_ASSUME_AUTHORITY de keyctl (2) (gĂ©nĂ©ralement Ă  l’aide de la fonction keyctl_assume_authority (3)).

-

Obtient les donnĂ©es de l’appel Ă  partir de la charge utile de la clĂ© d’autorisation V (en utilisant l’opĂ©ration KEYCTL_READ de keyctl (2) (ou plus gĂ©nĂ©ralement, la fonction keyctl_read (3)) avec une valeur d’identifiant de clĂ© de KEY_SPEC_REQKEY_AUTH_KEY ).

-

Instancie la clĂ© (ou exĂ©cute un autre programme pour faire cette tĂąche), en indiquant la charge utile et le trousseau de destination (on peut accĂ©der Ă  celui indiquĂ© par le demandeur lors de l’appel request_key () en utilisant l’identifiant de clĂ© spĂ©cial KEY_SPEC_REQUESTOR_KEYRING ). L’instanciation est effectuĂ©e en utilisant l’opĂ©ration KEYCTL_INSTANTIATE de keyctl (2) (ou plus gĂ©nĂ©ralement, la fonction keyctl_instantiate (3)). À ce moment, l’appel request_key () se termine et le programme Ă  l’origine de la demande peut continuer son exĂ©cution.

Si ces Ă©tapes ne rĂ©ussissent pas, une erreur ENOKEY sera renvoyĂ©e Ă  l’appelant de request_key () et une clĂ© temporaire et instanciĂ©e de maniĂšre nĂ©gative sera installĂ©e sur le trousseau indiquĂ© par dest_keyring . Elle expirera aprĂšs quelques secondes mais elle permettra aux appels suivants Ă  request_key () d’échouer jusqu’à ce qu’elles rĂ©ussissent. Le but de cette clĂ© instanciĂ©e nĂ©gativement est d’empĂȘcher des processus (potentiellement diffĂ©rents) d’effectuer des demandes rĂ©pĂ©tĂ©es (qui requiĂšrent des appels request-key (8) coĂ»teux) pour une clĂ© qui ne peut pas ĂȘtre instanciĂ©e positivement (pour l’instant).

Une fois que la clĂ© a Ă©tĂ© instanciĂ©e, la clĂ© d’autorisation ( KEY_SPEC_REQKEY_AUTH_KEY ) est rĂ©voquĂ©e et le trousseau de destination ( KEY_SPEC_REQUESTOR_KEYRING ) n’est plus accessible au programme request-key (8).

Si une clĂ© est créée, qu’elle soit valable ou instanciĂ©e nĂ©gativement, elle remplacera toute autre clĂ© possĂ©dant le mĂȘme type et la mĂȘme description dans le trousseau indiquĂ© dans dest_keyring .

VALEUR RENVOYÉE

En cas de succĂšs, request_key () renvoie le numĂ©ro de sĂ©rie de la clĂ© trouvĂ©e ou créée. En cas d’erreur, la valeur -1 est renvoyĂ©e et errno est positionnĂ© pour indiquer l’erreur.

ERREURS

EACCES

Le trousseau n’était pas disponible pour pouvoir ĂȘtre modifiĂ© par l’utilisateur.

EDQUOT

Le quota de clés de cet utilisateur serait dépassé si la clé était créée ou ajoutée au trousseau.

EFAULT

Le type , la description ou la callout_info pointe en dehors de l’espace d’adressage accessible au processus.

EINTR

La requĂȘte a Ă©tĂ© interrompue par un signal ; voir signal (7).

EINVAL

La longueur de la chaĂźne (y compris l’octet NULL final) spĂ©cifiĂ© dans type ou description a dĂ©passĂ© la limite (respectivement 32 et 4096 octets).

EINVAL

La taille de la clé (octet NULL final inclus) indiquée dans callout_info dépassait la taille de la page du systÚme.

EKEYEXPIRED

Une clĂ© expirĂ©e a Ă©tĂ© trouvĂ©e, mais aucun remplacement n’a pu ĂȘtre obtenu.

EKEYREJECTED

La tentative de générer une nouvelle clé a été rejetée.

EKEYREVOKED

Une clĂ© rĂ©voquĂ©e a Ă©tĂ© trouvĂ©e, mais aucun remplacement n’a pu ĂȘtre obtenu.

ENOKEY

Aucune clĂ© correspondante n’a Ă©tĂ© trouvĂ©e.

ENOMEM

Il n’y a pas assez de mĂ©moire pour crĂ©er une clĂ©.

EPERM

Le paramÚtre type commençait par un point ('.').

STANDARDS

Linux.

HISTORIQUE

Linux 2.6.10.

La possibilitĂ© d’instancier des clĂ©s Ă  la demande a Ă©tĂ© ajoutĂ©e dans Linux 2.6.13.

EXEMPLES

Le programme ci-dessous montre l’utilisation de request_key (). Les paramĂštres type , description et callout_info pour l’appel systĂšme sont rĂ©cupĂ©rĂ©s Ă  partir des valeurs fournies dans les options de la ligne de commande. L’appel indique le trousseau de session en tant que trousseau cible.

Pour montrer ce programme, on crĂ©e d’abord une entrĂ©e adĂ©quate dans /etc/request-key.conf .

$ sudo sh
# echo 'création utilisateur mtk:* * /bin/keyctl instantiate %k %c %S' \
> /etc/request-key.conf

# exit

Cette entrĂ©e indique que lorsqu’une nouvelle clĂ© « utilisateur » avec le prĂ©fixe « mtk: » doit ĂȘtre instanciĂ©e, la tĂąche doit ĂȘtre effectuĂ©e par l’opĂ©ration instantiate de la commande keyctl (1). Les paramĂštres fournis Ă  l’opĂ©ration instantiate sont : l’identifiant de la clĂ© non instanciĂ©e ( %k ), les donnĂ©es de l’appel fournies Ă  l’appel request_key () ( %c ) et le trousseau de session ( %S ) du demandeur (Ă  savoir l’appelant de request_key ()). Consulter request-key.conf (5) pour les dĂ©tails de ces spĂ©cificateurs % .

Puis on lance le programme et on vérifie que le contenu de /proc/keys pour vérifier que la clé demandée a été instanciée :

$ ./t_request_key user mtk:key1 "Payload data"
$ grep '2dddaf50' /proc/keys
2dddaf50 I--Q--- 1 perm 3f010000 1000 1000 user mtk:key1: 12

Pour un autre exemple d’utilisation de ce programme, voir keyctl (2).

Source du programme

/* t_request_key.c */
#include <keyutils.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
key_serial_t key;
if (argc != 4) {
fprintf(stderr, "Utilisation : %s type description données-appel\n",
argv[0]);
exit(EXIT_FAILURE);
}
key = request_key(argv[1], argv[2], argv[3],
KEY_SPEC_SESSION_KEYRING);
if (key == -1) {
perror("request_key");
exit(EXIT_FAILURE);
}
printf("L’identifiant de la clĂ© est %jx\n", (uintmax_t) key);
exit(EXIT_SUCCESS);
}

VOIR AUSSI

keyctl (1), add_key (2), keyctl (2), keyctl (3), capabilities (7), keyrings (7), keyutils (7), persistent-keyring (7), process-keyring (7), session-keyring (7), thread-keyring (7), user-keyring (7), user-session-keyring (7), request-key (8)

Les fichiers Documentation/security/keys/core.rst et Documentation/keys/request-key.rst des sources du noyau (ou, avant Linux 4.13, Documentation/security/keys.txt et Documentation/security/keys-request-key.txt ).

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .