web-dev-qa-db-fra.com

Quelles sont les vraies règles pour les noms d'utilisateurs Linux sur CentOS 6 et RHEL 6?

J'écris des pages Web UI qui peuvent être utilisées pour créer des comptes d'utilisateurs Linux. Cette interface Web sera utilisée sur CentOS 6 (qui est dérivé de RHEL 6). Je trouve des informations incohérentes et incomplètes sur ce qui constitue un nom d'utilisateur Linux valide. Je suis allé à la source, examinant un paquet source Linux shadow-utils mais je ne me suis pas assuré que la version que je regardais est en fait la même que celle qui fait partie de CentOS 6.

Vous trouverez ci-dessous le fragment de code que j'utilise actuellement, qui inclut le copier/coller des commentaires de la version 4.1.4.3 du package shadow-utils, ainsi que certaines de mes propres notes, et une recherche d'expression régulière Java Java pour suivre ma compréhension en regardant la source des shadow-utils.

La vérification référencée "is_valid_name ()" dans chkname.c n'est apparemment pas celle utilisée à partir de la commande useradd sur Linux, car les commentaires (et la source de code C) n'autorisent pas les noms commençant par un nombre. Cependant, useradd permet de créer un compte comme "1234".

J'apprécierais l'aide à l'ajustement de ce que j'ai maintenant à ce qui serait plus correct, ainsi que des informations sur la façon dont useradd.c est implémenté avec une fonction is_valid_name légèrement différente.

Merci! Alan

/**
 * Define constants for use in isNameLinuxCompatible(...) method.
 *
 * The source for the Linux compatible user name rule is is_valid_name(...) a function in the "shadow" package
 * for Linux.  The source file for that function has a comment as follows:
 *      User/group names must match [a-z_][a-z0-9_-]*[$]
 * That expression is a little loose/sloppy since
 * (1) the trailing $ sign is optional, and
 * (2) uppercase A-Z is also ok (and case is significant, 'A' != 'a').
 *
 * We deal with (1) by using the [$]? form where the ? means zero or more characters (aka "greedy").
 * We deal with (2) by using the CASE_INSENSITIVE option.
 *
 * Another way to express this is:
 *  1st character:                      a-z_         required at least one char
 *  chars other than first and last:    a-z0-9_-     optional
 *  last character:                     $            optional
 * Max length is 31.  Min length is 1.
 *
 * NOTE: The initial ^ and final $ below are important since we need the entire string to satisfy the rule,
 * from beginning to end.
 *
 * See http://download.Oracle.com/javase/6/docs/api/Java/util/regex/Pattern.html for reference info on pattern matching.
 */

private static final String  LINUX_USERNAME_REGEX     = "^[a-z_][a-z0-9_-]*[$]?$";
private static final Pattern LINUX_USERNAME_PATTERN   = Pattern.compile(LINUX_USERNAME_REGEX, Pattern.CASE_INSENSITIVE);
private static final int     LINUX_USERNAME_MINLENGTH = 1;
private static final int     LINUX_USERNAME_MAXLENGTH = 31;

/**
 * See if username is compatible with standard Linux rules for usernames, in terms of length and
 * in terms of content.
 *
 * @param username the name to be checked for validity
 * @return true if Linux compatible, else false
 */
public boolean isNameLinuxCompatible (final String username) {
    boolean nameOK = false;
    if (username != null) {
        int len = username.length();
        if ((len >= LINUX_USERNAME_MINLENGTH) && (len <= LINUX_USERNAME_MAXLENGTH)) {
            Matcher m = LINUX_USERNAME_PATTERN.matcher(username);
            nameOK = m.find();
        }
    }
    return (nameOK);
}
34
Alan Carwile

Un nom d'utilisateur gnu/linux de base est une chaîne de 32 caractères (useradd(8)). Il s'agit d'un format hérité de la norme BSD 4.3. passwd(5) ajoute quelques restrictions supplémentaires comme, n'utilisez pas de majuscules, n'utilisez pas de points, ne le terminez pas en tiret, il ne doit pas inclure de deux points.

Pour être du bon côté des choses, suivez les mêmes règles qu'un identifiant C:

([a-z_][a-z0-9_]{0,30})

C'est la moitié du problème. Les distributions GNU/Linux modernes utilisent PAM pour l'authentification des utilisateurs. Avec lui, vous pouvez choisir n'importe quelle règle que vous souhaitez et également n'importe quelle source de données.

Puisque vous écrivez un programme, il est préférable de définir votre propre format, puis d'utiliser quelque chose comme pam_ldap, pam_mysql, etc. pour y accéder.

36
Pablo Castellazzi