Linuxでのグループ、ユーザ追加する方法

<環境>
Linux<概要>
システムへのグループ、ユーザを追加する方法です。<備考>
新規グループに新規ユーザを追加する手順を紹介します。
順序は次の通りです。

(1) groupadd コマンドで新規グループを作成します。
(2) useradd コマンドでユーザを追加します。
(3) 作成したユーザに passwd コマンドでパスワードを付与します。

(1)を行わないと、useradd コマンドでグループを指定できないためエラーになります。
(3)を行わないと、作成したユーザアカウントはロックされたままログインできません。(rootユーザは除く)<備考>
文中の規約はLinuxディストリビューション、版数により異なることがあります。

設定ファイル名:

  • /etc/group
  • /etc/passwd

関連ファイル名:

  • /etc/gshadow
  • /etc/shadow
  • /etc/default/useradd
  • /etc/login.defs
  • /etc/skel/.emacs
  • /etc/skel/.bash_logout
  • /etc/skel/.bash_profile
  • /etc/skel/.bashrc
  • /etc/skel/.zshrc
  • /usr/include/linux/limits.h
  • /usr/share/doc/setup-*/uidgid

主な使用コマンド:

  • /usr/sbin/groupadd
  • /usr/sbin/useradd

1.新規グループの作成

最初にグループ名、グループIDを何にするか決めます。
これらは既存のものと重複させません。
-o オプションを指定することで重複させることは可能ですが、本例では行いません。<設定可能なグループ/ユーザ名>

グループ名に使用できる文字列は次の通りです。

英字大文字 26文字   ABCDEFGHIJKLMNOPQRSTUVWXYZ
英字小文字 26文字   abcdefghijklmnopqrstuvwxyz
数字       10文字   0123456789
記号        3文字   -_$

命名の規約は次の通りです。

  • 最小文字数、最大文字数は、1文字以上、31文字以下です。
  • 但し、先頭は英字か "_" のみ使用可能。
  • 記号 " - " 及び " $ " は先頭文字に使用できません。
  • また、" $ " は最終文字にのみ使用可能です。

上記の決まりはユーザ名でも同様です。<設定可能なグループ/ユーザID>

GID、UIDに指定できる数値は、2の31乗 -2 (0 と 2の31乗 の値を除いた数 )= 2147483646 が最大値となります。
上記の範囲で指定できるのは、useraddコマンドでGID、UIDを指定した場合(後述)です。
groupadd、useraddコマンドでGID、UIDを指定しなかった場合の上限、下限値は/etc/login.defsファイルに設定されています。
次のコマンドを実行して、出力結果から最小値、最大値を確認できます。

# egrep -i 'gid|uid' /etc/login.defs
# Min/max values for automatic uid selection in useradd
UID_MIN                   500
UID_MAX                 60000
# Min/max values for automatic gid selection in groupadd
GID_MIN                   500
GID_MAX                 60000
#

これらの範囲から/etc/group、/etc/passwd に登録済みのGID、UIDに1を足した値が使用されます。
足した値がGID_MAX、UID_MAXと同じの場合、GID_MIN、UID_MIN以上で未使用の空きIDが使用されます。
また上記の制限に関わらず、大抵のUNIX でuid は1-65535の範囲なので、アカウント管理連携、NFSを使用する場合などは他の連携先の規約にも合うように考慮する必要があります。
また、0-100(及び60000台)のUID、GIDはシステムのデフォルト用途使用されることが多いので、使用しないことにして問題が起こることを未然に防いだほうが良いです。
OSが作成する可能性のあるユーザ、グループは/usr/share/doc/setup-*/uidgidファイルに記載されています。(* はカーネルバージョンにより異なります)
上記ファイルはsetupパッケージにより使用されます。<グループの作成例>

ここでは例として、グループ名「test_group」、グループID「1000」を作成します。

1-1.グループ名、GIDの重複が無いことを確認します。

# egrep '^test_group:|:1000:' /etc/group

1-2.新規構築のサーバでない場合、念のため既存の環境にGIDが利用されていないことを確認します。

# find / -group 1000 -ls

上記のコマンドは全てのディレクトリに対して、グループID「1000」のディレクトリ、ファイルがあるかを検索しています。
出力があった場合は、過去にGIDが「1000」のユーザにより作成されたものがあることを意味します。
不要であれば削除し、削除が困難な場合は新規作成するグループからアクセスが可能となることの影響を確認します。
上記の確認が取れない場合、また判断が困難な場合は、新規作成するグループのGIDを変更することを検討して下さい。

1-3.グループを作成します。

# groupadd -g 1000 test_group

特にエラーなど出力されないことを確認してください。

1-4.グループが作成されたことを確認します。

# egrep '^test_group:|:1000:' /etc/group

次の出力が1行のみ出力されることを確認してください。

test_group:x:1000:

ここまでの操作で、グループの作成は完了しました。

2.ユーザの作成

ここでは例として、ユーザ名「test_user」、ユーザID「1000」を作成します。

2-1.ユーザ名、UIDの重複が無いことを確認します。

# egrep '^test_user:|:1000:' /etc/passwd

2-2.新規構築のサーバでない場合、念のため既存の環境にUIDが利用されていないことを確認します。

# find / -user 1000 -ls

本コマンドを実行する目的、及び結果についてはGIDと同じです。

2-3.ユーザを作成します。

ユーザ作成は同時に様々な設定を伴うことが可能です。
一般的にユーザを作成する場合のコマンドオプションを用いて、例とします。

# useradd -u 1000 -g test_group -G root -d /home/test_user -s /bin/bash test_user
^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^
※1     ※2           ※3     ※4                ※5          ※6

※1 UIDを指定します。
※2 所属する1次グループを指定します。GIDでも指定できます。
※3 所属する2次グループを指定します。

2次グループは複数指定できますので、その場合は空白を空けずに,(コンマ)で区切って続けて指定します。
2次グループに指定できるのは、/usr/include/linux/limits.hファイルのNGROUPS_MAXと言われていますが、確認したところ下記のように記載されていました。

#define NGROUPS_MAX    65536    /* supplemental group IDs are available */

この値は信用してよいか判断できる事例などがありませんので、Solaris などのデフォルト16、最大32あたりを上限の参考にすると良いと思います。
2次グループの指定が不要な場合は、-G オプションごと省略します。
※4 ホームディレクトリを指定します。
ディレクトリはユーザ作成前に手動で作成する必要はありません。
useraddコマンド実行時に自動的に作成されます。また事前に作成していた場合、/etc/skelディレクトリのコピーファイルが作成されません。
ディレクトリ名に指定できる文字は半角英数で/(スラッシュ)と-(ハイフン)を除く全ての文字、数字、記号です。
ただし記号は別の意味に解釈されるので、使用しないことで無用のトラブルを未然に防ぐことが出来ます。
※5 ログインシェルを指定します。
※6 ユーザ名を指定します。

上記のオプションを省略した場合の及びuseraddコマンド実行時のデフォルト値は次のコマンドを実行した結果から確認できます。

# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#

上記の内容は/etc/default/useraddファイルに設定されているものと同じです。
それぞれの意味は次の通りです。

  • GROUP

ユーザ作成時にGIDを指定しなかった場合の最小GIDです。
ただし、/etc/login.defsファイルのGID_MINが設定されている場合、そちらが優先されます。

  • HOME

フォルトのホームディレクトリの場所です。
上記の場合、「/home/ユーザー名」でホームディレクトリが作成されます。

  • INACTIVE

ユーザーのパスワードが無効になってから、そのユーザーのアカウントが無効になるまでの期限です。
「-1」は無期限を意味します。

  • EXPIRE

ユーザーアカウントの有効期限です。値が無い場合は無期限を意味します。

  • SHELL

デフォルトのログインシェル名です。

  • SKEL

新規ユーザーのホームディレクトリのテンプレートです。
上記の場合、/etc/skelディレクトリのファイルのコピーが新規ユーザーのホームディレクトリに作成されます。

2-4.ユーザが作成されたことを確認します。

# id -a test_user

次の出力があることを確認します。

uid=1000(test_user) gid=1000(test_group) 所属グループ=1000(test_group),0(root) context=root:system_r:unconfined_t:SystemLow-SystemHigh
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
※1                 ※2                  ※3

※1 UIDとユーザ名が確認できます。
※2 1次グループIDと、そのグループ名が確認できます。
※3 1次グループ名を先頭に、2次グループ名が確認できます。

2-5.ホームディレクトリが作成されたことを確認します。

# find /home/test_user -ls

下記のような出力があることを確認します。

58497    8 drwx------   3 test_user test_group     4096  3月 16 02:11 /home/test_user
58502    8 -rw-r--r--   1 test_user test_group      124  3月 16 02:11 /home/test_user/.bashrc
58498    8 -rw-r--r--   1 test_user test_group       33  3月 16 02:11 /home/test_user/.bash_logout
58499    8 drwxr-xr-x   4 test_user test_group     4096  3月 16 02:11 /home/test_user/.mozilla
58501    8 drwxr-xr-x   2 test_user test_group     4096  3月 16 02:11 /home/test_user/.mozilla/plugins
58500    8 drwxr-xr-x   2 test_user test_group     4096  3月 16 02:11 /home/test_user/.mozilla/extensions
58503    8 -rw-r--r--   1 test_user test_group      176  3月 16 02:11 /home/test_user/.bash_profile
^^^^^^^^^^     ^^^^^^^^^ ^^^^^^^^^^                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
※1            ※2       ※3                               ※4

※1 ファイル、ディレクトリの権限(パーミッション)です。
ディレクトリのデフォルト値は「0777」、ファイルのデフォルト値は「0666」なので、umaskで設定されている値を引いた値が設定されていれば正しいです。
umaskは以下のようにコマンドで確認します。

# umask
0022
#

この場合は、umaskは0022です。この値は殆どのOSでのデフォルト値です。
ちなみにumaskのシステム共通デフォルト値は/etc/login.defsファイルに設定されています。
ただしログインシェルにbashを使用している場合は、/etc/bashrc、もしくは、$HOME/.bashrc にて設定を行う必要があります。
bashを使用する全てのユーザへ設定する場合は、/etc/bashrcへ設定します。(rootユーザと一般ユーザの2つの設定箇所があります)
ユーザ個別で設定する場合は$HOME/.bashrcにて設定します。
上記の出力例を数値に変換するのは次のように行います。
1バイト目は種類を表します。

 - : ファイル
 d : ディレクトリ
 l : リンクファイル 

それ以降は、3バイトごとに区切り、3バイトごとに下記のように置き換えて加算します。

 r : 4
 w : 2
 x : 1
 - : 0

例として「drwxr-xr-x」の場合は、種類はディレクトリで、権限は「755」となります。
参考として、それぞれの区切りの意味は次の通りです。

2〜4バイト目は、その対象物の所有者に対しての権限を表します。
5〜7バイト目は、所有者が所属しているグループに対しての権限を表します。
8〜10バイト目は、上記以外の利用者に対しての権限を表します。

種類がディレクトリ、ファイルにより以下のような意味を持ちます。<ディレクトリの場合>

 r : 呼出権限 : そのディレクトリの一覧の参照が可能です。
 w : 書込権限 : そのディレクトリ内のファイルの削除、名前変更、新規作成が可能です。
 x : 実行権限 : そのディレクトリにアクセス可能です。
 - : 権限なし : 何も出来ません。

<ファイルの場合>

 r : 呼出権限 : ファイルの読み込み可能です。
 w : 書込権限 : ファイルへの書き込みが可能です。
 x : 実行権限 : そのファイルを命令として実行可能です。
 - : 権限なし : 何も出来ません。

個別で権限を計算するのが面倒な場合は、findコマンドのオプションを変更して、下記のように実行します。

# find /home/test_user -printf %p\\t%u\\t%g\\t%m\\n
/home/test_user test_user       test_group      700
/home/test_user/.bashrc test_user       test_group      644
/home/test_user/.bash_logout    test_user       test_group      644
/home/test_user/.mozilla        test_user       test_group      755
/home/test_user/.mozilla/plugins        test_user       test_group      755
/home/test_user/.mozilla/extensions     test_user       test_group      755
/home/test_user/.bash_profile   test_user       test_group      644
#

※2 所有者です。ユーザ作成時に指定したユーザ名が出力されていれば正しいです。
※3 所有グループです。ユーザ作成時に指定した1次グループが出力されていれば正しいです。
※4 useraddコマンドでホームディレクトリを作成した場合に、デフォルトで作成されるファイルです。
これらのファイルの雛形は/etc/skelディレクトリにあります。
以下のようにハッシュ値を比較します。

# md5sum /etc/skel/.* /home/test_user/.* 2> /dev/null | sort
084a1a5de99b4e9ec2bc6b029d9a6b2a  /etc/skel/.bash_logout
084a1a5de99b4e9ec2bc6b029d9a6b2a  /home/test_user/.bash_logout
3e8337f44f84b298a8a99869ae8ca76a  /etc/skel/.bash_profile
3e8337f44f84b298a8a99869ae8ca76a  /home/test_user/.bash_profile
f119c865306c35e64eb00f65d7279664  /etc/skel/.bashrc
f119c865306c35e64eb00f65d7279664  /home/test_user/.bashrc
#

/etc/skel にあるファイルと同じハッシュ値であれば正しいです。
上下の行で比較できますが、目視が不安な場合は、次のように確認することも出来ます。

# md5sum /etc/skel/.* /home/test_user/.* 2> /dev/null | awk '{print $1}' | sort | uniq -c
2 084a1a5de99b4e9ec2bc6b029d9a6b2a
2 3e8337f44f84b298a8a99869ae8ca76a
2 f119c865306c35e64eb00f65d7279664
#

先頭が出力行数なので、出力が3行で、それぞれの行の先頭が2であれば正しいことになります。

ここまでの操作でユーザの作成が完了しました。
ユーザは作成直後ではロックされていて、rootユーザを除き他のユーザからはログインできません。
次の手順でユーザのパスワードを設定します。

3.ユーザのパスワード設定

パスワードに設定可能な内容は次の通りです。

使用可能なパスワード文字長は、6文字〜200文字になります。
使用可能なパスワード文字種は次の通りです。記号には半角スペースも指定できます。

英字大文字 26文字   ABCDEFGHIJKLMNOPQRSTUVWXYZ
英字小文字 26文字   abcdefghijklmnopqrstuvwxyz
数字       10文字   0123456789
記号       33文字   !"#$%&'()*+,-./:;<=>?[\]^_`{|}~@

かなり長い文字長と様々な記号が使用できます。(以前は文字長6〜8文字あたりがデフォルトのことが多かったです)
他サーバとパスワード連携する場合や、ミドルウェアが使用する場合はそちらの制限に当てはまらないように注意してください。

またデフォルトのPAM認証が有効な場合、次に合致するパスワードを入力した場合、警告が出力されます。

1) 短すぎる(5文字以下)パスワード
2) 辞書に記載されているようなパスワード
3) 回文パスワード
4) 旧パスワードと似たパスワード
5) 規則的・簡単すぎるパスワード

上記に合致した場合、次のような警告が出力されます。

BAD PASSWORD: it is too short
BAD PASSWORD: it does not contain enough DIFFERENT characters
BAD PASSWORD: it is based on a (reversed) dictionary word
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: it is too simplistic/systematic

出力されても設定することは可能です。

3-1.ユーザのパスワードを設定します。

# passwd test_user

次のような出力と問合せがあります。

Changing password for user test_user.
New UNIX password:

上記の出力に続いて、パスワードを入力します。
入力後、Enterキーを押下すると、次の出力があります。

Retype new UNIX password:

同じパスワードを入力します。
パスワードが正しく設定されれば、次の出力があります。

passwd: all authentication tokens updated successfully.

ここまでの設定でユーザのパスワード設定が出来ました。

3-2.複数のユーザを作成した場合、一括でパスワードを設定する方法です。

今回の例のように1ユーザのみの追加であれば、パスワードの設定は1回ですみますので、それほど労力を要しません。
これが10を超えるユーザ以上となると、1つ1つ対話式で設定するのは、労力を要しますし、また誤ったパスワードを設定することもありえます。
このような場合は、予めユーザとパスワードを記述したファイルを作成して、一括でパスワードを設定します。
この方法はパスワードを平文で書いたファイルをサーバ上に用意する必要があるので、セキュリティの問題がある場合は利用しないで下さい。

・パスワードがロックされていることを確認します。(ユーザ作成直後の状態です)

# cat /etc/shadow | grep test_user_
test_user_1:!!:15414:0:99999:7:::
test_user_2:!!:15414:0:99999:7:::
test_user_3:!!:15414:0:99999:7:::
#

・読込ませるファイルを作成します。ここでは例としてパスワードは共通にしています。

# cat /etc/shadow | grep test_user_ | awk -F ":" '{print $1":testpass"}' > chpasswd.txt
# cat chpasswd.txt
test_user_1:testpass
test_user_2:testpass
test_user_3:testpass
#

・ユーザのパスワードを一括で設定します。

# /usr/sbin/chpasswd < chpasswd.txt
#

エラーが出力されないことを確認してください。

・パスワードが設定されたことを確認します。

# cat /etc/shadow | grep test_user_
test_user_1:$1$4QNKCVhy$QlNi.P2hACPyNxV0K8VYN1:15414:0:99999:7:::
test_user_2:$1$4QNKCVhy$QlNi.P2hACPyNxV0K8VYN1:15414:0:99999:7:::
test_user_3:$1$4QNKCVhy$QlNi.P2hACPyNxV0K8VYN1:15414:0:99999:7:::
#

・パスワードの暗号化強度は次の設定ファイルに従います。

# cat /etc/login.defs | grep ^MD5_CRYPT_ENAB
MD5_CRYPT_ENAB yes
#

上記の場合は、MD5形式と分かります。(古いOSではDEF形式などがあります)

3-3.パスワードが正しく設定されたか、一般ユーザからログインして確かめます。

rootユーザから一般ユーザへログインする際には、パスワード認証は求められません。
必ず一般ユーザから新規ユーザへログインできるかを試してください。
手順は次の例を参考にして下さい。

・rootユーザから一般ユーザへログインします。パスワード認証は求められません。

# su - test_user_1
$

・現在のユーザを確認します。

$ id
uid=1001(test_user_1) gid=1000(test_group) 所属グループ=0(root),1000(test_group) context=root:system_r:unconfined_t:SystemLow-SystemHigh
$

・新規作成ユーザへログインします。パスワード認証を求められます。

$ su - test_user
パスワード:
$ id
uid=1000(test_user) gid=1000(test_group) 所属グループ=0(root),1000(test_group) context=root:system_r:unconfined_t:SystemLow-SystemHigh
$

パスワードが設定したものと一致して、ログインが出来れば正常に設定できています。