web-dev-qa-db-ja.com

CentOS 6およびRHEL 6でのLinuxユーザー名の実際のルールは何ですか?

Linuxユーザーアカウントの作成に使用できるWeb UIページをいくつか書いています。このWeb UIは、RHEL 6から派生したCentOS 6で使用されます。有効なLinuxユーザー名の構成要素に関する一貫性のない不完全な情報を見つけています。ソースに行ってLinux shadow-utilsソースパッケージを調べましたが、見ているバージョンが実際にはCentOS 6の一部と同じであることを確認しませんでした。

以下は、現在使用しているコードの一部です。これには、shadow-utilsパッケージバージョン4.1.4.3からのコメントのコピー/貼り付けに加えて、いくつかの独自のメモ、およびJava正規表現検索shadow-utilsのソースを見ることで私の理解に従うことができます。

コメント(およびCコードソース)では数字で始まる名前が許可されていないため、chkname.cで参照される「is_valid_name()」チェックは、Linuxのuseraddコマンドから使用されるものではないようです。ただし、useraddでは、「1234」などのアカウントを作成できます。

私が現在持っているものからより正確なものに調整するのを助けてくれること、そしてuseradd.cが若干異なるis_valid_name関数でどのように実装されているかについての情報に感謝します。

ありがとう!アラン

/**
 * 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

基本的なgnu/linuxユーザー名は32文字の文字列(useradd(8))です。これは、BSD 4.3標準のレガシー形式です。 passwd(5)は、大文字を使用しない、ドットを使用しない、ダッシュで終了しない、コロンを含めてはならないなどの追加の制限を追加します。

安全のために、C識別子と同じルールに従ってください:

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

それは問題の半分です。最新のGNU/Linuxディストリビューションは、ユーザー認証にPAMを使用します。これにより、必要なルールとデータソースを選択できます。

プログラムを書いているので、独自のフォーマットを定義し、pam_ldappam_mysqlなど。

36