getspnam, getspnam_r, getspent, getspent_r, setspent, endspent, fgetspent,
fgetspent_r, sgetspent, sgetspent_r, putspent, lckpwdf, ulckpwdf - Obtenir une
entrée du fichier des mots de passe cachés
Bibliothèque C standard (
libc,
-lc)
/* API globale du fichier des mots de passe cachés */
#include <shadow.h>
struct spwd *getspnam(const char *nom);
struct spwd *getspent(void);
void setspent(void);
void endspent(void);
struct spwd *fgetspent(FILE *flux);
struct spwd *sgetspent(const char *s);
int putspent(const struct spwd *p, FILE *flux);
int lckpwdf(void);
int ulckpwdf(void);
/* Extension GNU */
#include <shadow.h>
int getspent_r(struct spwd *spbuf,
char tampon[.taille_tampon], size_t taille_tampon, struct spwd **spbufp);
int getspnam_r(const char *nom, struct spwd *spbuf,
char tampon[.taille_tampon], size_t taille_tampon, struct spwd **spbufp);
int fgetspent_r(FILE *flux, struct spwd *spbuf,
char tampon[.taille_tampon], size_t taille_tampon, struct spwd **spbufp);
int sgetspent_r(const char *s, struct spwd *spbuf,
char tampon[.taille_tampon], size_t taille_tampon, struct spwd **spbufp);
getspent_r(),
getspnam_r(),
fgetspent_r(),
sgetspent_r():
Depuis la glibc 2.19 :
_DEFAULT_SOURCE
Pour la glibc 2.19 et précédentes :
_BSD_SOURCE || _SVID_SOURCE
Il a longtemps été considéré comme sûr
d'avoir des mots de passe chiffrés ouvertement visibles dans le fichier
des mots de passe. Lorsque les ordinateurs sont devenus plus rapides et que
les gens sont devenus plus conscients des problèmes de
sécurité, cela n'était plus acceptable. Julianne Frances
Haugh a implémenté la suite d'utilitaires
« shadow » qui conserve les mots de passe
chiffrés dans la base de données des mots de passe cachés
« shadow » (par exemple, le fichier local des mots
de passe cachés
/etc/shadow, NIS ou LDAP), lisible seulement par
le superutilisateur.
Les fonctions décrites ci-dessous ressemblent aux fonctions
traditionnelles de la base de données des mots de passe (par exemple,
consultez
getpwnam(3) et
getpwent(3)).
La fonction
getspnam() renvoie un pointeur vers une structure contenant
les champs d'un enregistrement extrait de la base de données
« shadow » de l'entrée correspondant au
nom de l'utilisateur.
La fonction
getspent() renvoie un pointeur sur l'entrée suivante
de la base de données « shadow ». La
position dans le flux d'entrée est initialisée par
setspent(). Lorsque la lecture est finie, le programme devrait appeler
endspent() pour désallouer les ressources.
La fonction
fgetspent() est similaire à
getspent(), mais
utilise le flux spécifié plutôt que celui implicitement
ouvert par
setspent().
La fonction
sgetspent() analyse la chaîne
s fournie dans la
structure
spwd.
La fonction
putspent() écrit le contenu de la structure
spwd *p fournie sous forme d'une ligne de texte au format du
fichier des mots de passe cachés dans le
flux. Les
entrées chaînes de valeur
NULL et les entrées
numériques de valeur
-1 sont écrites comme des
chaînes vides.
La fonction
lckpwdf() a pour but de protéger la base de
données des mots de passe cachés contre des accès
simultanés. Elle tente d'obtenir un verrou, renvoie
0 si elle y
arrive ou
-1 si elle échoue (le verrou n'a pas pu être
obtenu dans les 15 secondes). La fonction
ulckpwdf()
libère le verrou. Veuillez noter qu'il n'y a pas de protection contre
l'accès direct au fichier des mots de passe cachés. Seuls les
programmes qui utilisent
lckpwdf() remarqueront le verrou.
C'étaient les routines qui composaient l'API originale
« shadow ». Elles sont largement disponibles.
De manière analogue aux routines réentrantes pour la base de
données des mots de passe, la glibc possède aussi des versions
réentrantes pour la base de données des mots de passe
cachés. La fonction
getspnam_r() est équivalente à
la fonction
getspnam(), mais enregistre la structure des mots de passe
cachés trouvée dans l'espace pointé par
spbuf.
Cette structure des mots de passe cachés contient des pointeurs vers
des chaînes qui sont stockées dans le
tampon de taille
taille_tampon. Un pointeur vers le résultat (en cas de
réussite) ou
NULL (si aucune entrée n'a été
trouvée ou si une erreur est survenue) est stocké dans
*spbufp.
Les fonctions
getspent_r(),
fgetspent_r() et
sgetspent_r()
sont analogues à leurs homologues non réentrantes.
Certains systèmes non glibc ont également des fonctions portant
ces noms, souvent avec des prototypes différents.
La structure des mots de passe cachés est définie dans
<shadow.h> de la manière suivante :
struct spwd {
char *sp_namp; /* Identifiant de connexion */
char *sp_pwdp; /* Mot de passe chiffré */
long sp_lstchg; /* Date de dernière modification
(mesurée en jours depuis l'époque,
1er janvier 1970 à 00:00:00 (UTC)) */
long sp_min; /* Nombre de jours minimum entre
deux modifications */
long sp_max; /* Nombre de jours maximum entre
deux modifications */
long sp_warn; /* Nombre de jours avant l'expiration
du mot de passe pour avertir
l'utilisateur de le modifier */
long sp_inact; /* Nombre de jours après l'expiration
du mot de passe pour la désactivation
du compte */
long sp_expire; /* Date à laquelle le compte expirera,
(mesurée en jours depuis l'époque,
1er janvier 1970 à 00:00:00 (UTC)) */
unsigned long sp_flag; /* Réservé */
};
Les routines qui renvoient un pointeur renvoient
NULL s'il n'y a plus
d'entrée disponible ou si une erreur est survenue pendant le
traitement. Les routines qui ont un
int comme valeur de retour
renvoient
0 en cas de réussite. En cas d'erreur,
-1 est renvoyé et
errno est définie pour
préciser l'erreur.
Pour les fonctions non réentrantes, la valeur de retour peut pointer sur
une zone statique et peut être écrasée par des appels
ultérieurs de ces fonctions.
Les fonctions réentrantes renvoient zéro si elles
réussissent. Si elles échouent, une valeur d'erreur est
renvoyée.
- EACCES
- L'appelant n'a pas le droit d'accéder au fichier de
mots de passe cachés.
- ERANGE
- Le tampon fourni est trop petit.
- /etc/shadow
- fichier base de données des mots de passe
cachés
- /etc/.pwd.lock
- fichier verrou
Le fichier d'inclusion
<paths.h> définit la constante
_PATH_SHADOW comme étant le chemin du fichier des mots de passe
cachés.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
getspnam() |
Sécurité des threads |
MT-Unsafe race:getspnam locale |
getspent() |
Sécurité des threads |
MT-Unsafe race:getspent race:spentbuf locale |
setspent(), endspent(), getspent_r() |
Sécurité des threads |
MT-Unsafe race:getspent locale |
fgetspent() |
Sécurité des threads |
MT-Unsafe race:fgetspent |
sgetspent() |
Sécurité des threads |
MT-Unsafe race:sgetspent |
putspent(), getspnam_r(), sgetspent_r() |
Sécurité des threads |
MT-Safe locale |
lckpwdf(), ulckpwdf(), fgetspent_r() |
Sécurité des threads |
MT-Safe |
Dans le tableau ci-dessus,
getspent dans
race:getspent signifie
que si des fonctions parmi
setspent(),
getspent(),
getspent_r() ou
endspent() sont utilisées en
parallèle dans différents threads d'un programme, des situations
de compétition entre données pourraient apparaître.
La base de données de mots de passe masqués et son API ne sont pas
spécifiées dans POSIX.1. Cependant, beaucoup de systèmes
fournissent une API similaire.
getgrnam(3),
getpwnam(3),
getpwnam_r(3),
shadow(5)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Lucien Gentis <
[email protected]>
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 à
[email protected]