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

j'écris quelques pages Web UI qui peuvent être utilisées pour créer des comptes 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, en examinant un paquet source Linux shadow-utils, mais je ne me suis pas assuré que la version que je regardais soit en fait la même que celle qui fait partie de CentOS 6.

ci-dessous est le fragment de code que j'utilise actuellement, ce qui inclut copier/coller les commentaires de la version 4.1.4.3 du paquet shadow-utils, en plus de mes propres notes, et une recherche D'expressions régulières Java pour suivre mon interprétation en regardant shadow-utils source.

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

j'apprécierais de l'aide ajustant de ce que j'ai maintenant à ce qui serait plus correct, ainsi que des informations sur comment 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);
}
32
demandé sur Danny Beckett 2011-08-05 03:08:30

1 réponses

un nom d'utilisateur gnu/linux de base est une chaîne de 32 caractères (useradd(8)). Il s'agit d'un ancien format 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 terminez pas en tiret, il ne doit pas inclure de points.

Pour être sur le côté sûr, des choses, suivre les mêmes règles d'identifiants 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 elle, vous pouvez choisir une règle que vous voulez et aussi toute source de données.

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

33
répondu Pablo Castellazzi 2013-05-22 04:53:44