サイトアイコン スグブログ

【Linux初心者向け】ユーザー作成の方法とオプション一覧

ランニング

Linuxサーバーでユーザーの作成方法をまとめます。

Linuxサーバーを運用していてroot権限で操作する事はセキュリティ上よくありません。ログインするエンジニアのユーザーを作成しましょう!

またそれぞれの役割のユーザーを作成した方が良いので、今回はLinuxサーバーユーザーの作成方法コマンドのオプションを現役エンジニアの筆者がまとめます。

筆者はWindowsサーバーやLinuxサーバーの運用構築を11年間以上おこなってきました。その経験を元に知識を公開していきます!

実践も行いますので、わかりやすくユーザー作成について学ぶ事が出来ます。

Linuxでユーザーの作成方法

Linuxユーザーにも種類が複数あります。

Linuxのユーザーの種類一覧
  • 管理者ユーザーroot
  • 一般ユーザー
  • システムアカウント

ここでは一般ユーザーを作成します。

Linuxサーバー一般ユーザー作成するコマンド「useradd」コマンドです。

一般ユーザーを作成できるのは管理者のrootユーザーのみです。

useradd オプション ユーザー名

「useradd」コマンドでユーザーを作成して、書き込まれるファイルは以下の4つがあります。

Linuxでユーザーを作成して記入されるファイル
  • 「/etc/passwd」ファイル・・・ユーザーの情報
  • 「/etc/shadow」ファイル・・・ユーザーのパスワード情報
  • 「/etc/group」ファイル・・・ユーザーのグループ情報
  • 「/etc/gshadow」ファイル・・・ユーザーのグループのパスワード情報

Linuxでユーザー作成コマンドのオプション

Linuxユーザー作成コマンドオプションをまとめます。

useraddコマンドのオプション効果
-c コメントコメントを付ける
-d パスホームディレクトリのパスを指定
-e 日付アカウントの失効日を設定。指定例:2022-02-22
-f 日数パスワードが失効してからアカウントが使用不可になるまでの日数指定
-g グループID1次グループの指定
-G グループID2次グループの指定
-mホームディレクトリを作成。ただし「/etc/login.defs」の設定を優先
-Mホームディレクトリを作成しない
-s パスログインシェルのパスを指定
-u ユーザーIDユーザーIDを指定
-Dデフォルト値の表示もしくは設定
-k パスskelディレクトリのパスを指定
Linuxのuseraddコマンドのオプション一覧

ただしオプションを指定せずにコマンド実行した場合、デフォルトの値を使用してユーザー作成されます。

Linuxでユーザー作成のデフォルト値

Linuxでユーザー作成コマンド「useradd」デフォルト値をまとめているファイルが「/etc/default/useradd」ファイルです。このファイルに記述している内容をまとめます。

useraddコマンドのデフォルト値効果
GROUP=100「/etc/login.defs」の設定が「no」の場合のグループID
HOME=/homeホームディレクトリを作成するパス
INACTIVE=-1パスワード期限が過ぎ、アカウントが無効になるまでの期間
EXPIRE=パスワードの有効期限
SHELL=/bin/bashログインシェルのパス
SKEL=/etc/skelユーザー作成時にホームディレクトリに置くファイルを格納するパス
CREATE_MAIL_SPOOL=yesユーザーのメールのスプールを作成するか
useraddコマンドのデフォルト値一覧

このファイルの値は「useradd -D」コマンドでも参照できます。

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

ユーザーの情報の「passwd」ファイルのフィールド情報

Linuxのユーザー作成コマンド「useradd」で作成されたユーザー情報が記載されている「/etc/passwd」ファイルフィールド情報をまとめます。

区切り文字を「:」としています。

ユーザー名パスワードユーザーIDグループIDコメントホームディレクトリログインシェル
tarox10011001コメント/home/taro/bin/bash
「/etc/passwd」ファイルのフィールド情報

実践:useraddのオプション付きでユーザー作成をしてみる

Linuxユーザー作成するuseraddコマンドオプションは以下でした。

useraddコマンドのオプション効果
-c コメントコメントを付ける
-d パスホームディレクトリのパスを指定
-e 日付アカウントの失効日を設定。指定例:2022-02-22
-f 日数パスワードが失効してからアカウントが使用不可になるまでの日数指定
-g グループID1次グループの指定
-G グループID2次グループの指定
-mホームディレクトリを作成。ただし「/etc/login.defs」の設定を優先
-Mホームディレクトリを作成しない
-s パスログインシェルのパスを指定
-u ユーザーIDユーザーIDを指定
-Dデフォルト値の表示もしくは設定
-k パスskelディレクトリのパスを指定
Linuxのuseraddコマンドのオプション一覧

実践としてLinuxサーバーでuseraddコマンドとオプションを指定して、ユーザー作成してみます。

ユーザー作成でコメントを付ける

ユーザー作成する時にコメントを付ける事が可能です。

useradd -c コメントです。 user-comment

上のユーザー作成コマンドを実行してみます。

「/etc/passwd」ファイルをgrepで抽出して確認してみます。

[root@localhost ~]# cat /etc/passwd | grep user-comment
user-comment:x:1004:1004:コメントです。:/home/user-comment:/bin/bash

5項目目のコメントの欄に、先程指定したコメントを残す事が可能です。

ホームディレクトリのパスを指定

ユーザー作成する時にホームディレクトリのパスを指定する事が可能です。

useradd -d /home/test/user-homedir user-homedir

上のユーザー作成コマンドを実行して見ます。

「/etc/passwd」ファイルをgrepで抽出して確認してみます。

[root@localhost ~]# cat /etc/passwd | grep user-homedir
user-homedir:x:1005:1005::/home/test/user-homedir:/bin/bash

6項目目のホームディレクトリの欄に、先程指定したパスが記述されています。

アカウントの失効日を設定

ユーザー作成する時にアカウントの失効日を指定する事が可能です。

useradd -e 2024-05-25 user-e

本日より10日後の「2024-05-25」を指定した、上のユーザー作成コマンドを実行して見ます。

「chage -l」コマンドで確認してみます。

[root@localhost ~]# chage -l user-e
最終パスワード変更日                            : 5月 15, 2024
パスワード期限:                                 : なし
パスワード無効化中                                      : なし
アカウント期限切れ                                              :  5月 25, 2024
パスワードが変更できるまでの最短日数            : 0
パスワードを変更しなくてよい最長日数            : 99999
パスワード期限が切れる前に警告される日数                : 7

「アカウント期限切れ」の欄に指定した日付が入っています。

「/etc/shadow」ファイルをgrepで抽出しても確認できます。

[root@localhost ~]# cat /etc/shadow | grep user-e
user-e:!!:19858:0:99999:7::19868:

「19858」が最終バスワード変更日で、指定した10日後の「19868」が記述されています。

パスワードが失効してからアカウントが使用不可になるまでの日数指定

ユーザー作成する時にパスワードが失効してから、アカウントが使用不可になるまでの日数を指定する事が可能です。

useradd -f 3 user-f

上のユーザー作成コマンドを実行してみます。

「/etc/shadow」ファイルをgrepで抽出して確認します。

[root@localhost ~]# cat /etc/shadow | grep user-f
user-f:!!:19858:0:99999:7:3::

7項目目の「パスワードが失効してからアカウントが使用不可になるまでの日数」欄に、指定した「3」が記述されています。

「chage -l」コマンドでも確認してみます。

[root@localhost ~]# chage -l user-f
最終パスワード変更日                            : 5月 15, 2024
パスワード期限:                                 : なし
パスワード無効化中                                      : なし
アカウント期限切れ                                              : なし
パスワードが変更できるまでの最短日数            : 0
パスワードを変更しなくてよい最長日数            : 99999
パスワード期限が切れる前に警告される日数                : 7

「パスワード無効化中」の欄が「なし」となっています。特に変化していません

設定したのに「なし」になっている原因は、「パスワードの期限」が設定されていないからです。この設定は「パスワードが失効してから」の話ですのでパスワードの期限がなければ、そもそも意味がない設定になります。

パスワードの期限を設定するには、パスワードを設定する「passwd」コマンドのxオプションを用います。

Linuxのパスワードを変更するオプションなど、詳細は以下の記事を参照下さい。

passwd -x 2 user-f

上のコマンドでパスワードの有効期限を2日後に設定しました。

「/etc/shadow」ファイルをgrepで抽出して確認します。

[root@localhost ~]# cat /etc/shadow | grep user-f
user-f:!!:19858:0:2:7:3::

5項目目の「パスワード有効期限」欄に無制限を意味する「99999」が記述されていたのが、指定した「2」に上書きされています。

「chage -l」コマンドでも確認してみます。

[root@localhost ~]# chage -l user-f
最終パスワード変更日                            : 5月 15, 2024
パスワード期限:                                 :  5月 17, 2024
パスワード無効化中                                      :  5月 20, 2024
アカウント期限切れ                                              : なし
パスワードが変更できるまでの最短日数            : 0
パスワードを変更しなくてよい最長日数            : 2
パスワード期限が切れる前に警告される日数                : 7

「パスワード期限」が「なし」から2日後に設定されています。そうした事で先程設定した「パスワード無効化中」の欄が「なし」から「パスワード期限」の3日後が反映されました。

「パスワードが失効してからアカウントが使用不可になるまでの日数」は後からパスワード期限も設定しましょう!

1次グループの指定

ユーザー作成する時に1次グループの指定をする事が可能です。

ないグループは指定できません。既存のグループIDを指定してください。

useradd -g 1007 user-1group

先程作成したユーザーのグループIDを指定してグループに入れます。上のユーザー作成コマンドを実行して見ます。

Linuxでグループの確認ができる「id」コマンド「groups」コマンドで確認してみます。

[root@localhost ~]# id user-1group
uid=1008(user-1group) gid=1007(user-f) groups=1007(user-f)

[root@localhost ~]# groups user-1group
user-1group : user-f

デフォルトではユーザーIDと同じ番号のグループが割り当てられますが、今回は指定した「user-f」のIDの「1007」のグループに入っています。

「/etc/passwd」ファイルをgrepで抽出しても確認できます。

[root@localhost ~]# cat /etc/passwd | grep 1007
user-f:x:1007:1007::/home/user-f:/bin/bash
user-1group:x:1008:1007::/home/user-1group:/bin/bash

グループIDが「1007」で抽出してみましたが、指定したユーザーが指定したグループに所属しています。

2次グループの指定

ユーザー作成する時に2次グループの指定もする事が可能です。

ないグループは指定できません。既存のグループIDを指定してください。

useradd -g 1007 -G 1006 user-2group

先程作成したユーザーのグループID「1007」を指定してグループに入れます。更に2次グループとして「1006」にも入れます。上のユーザー作成コマンドを実行して見ます。

Linuxでグループの確認ができる「id」コマンドと「groups」コマンドで確認してみます。

[root@localhost ~]# id user-2group
uid=1009(user-2group) gid=1007(user-f) groups=1007(user-f),1006(user-e)

[root@localhost ~]# groups user-2group
user-2group : user-f user-e

指定した「user-f」のIDの「1007」のグループと「user-e」のIDの「1006」のグループに入っています。

「/etc/group」ファイルをgrepで抽出しても確認できます。

[root@localhost ~]# cat /etc/group
~省略~
user-e:x:1006:user-2group
user-f:x:1007:

グループ1006の方の4項目目に今回作成したユーザーの名前が記述されています。2次で指定されたユーザー名が入るようです。

ユーザー作成時の「/etc/login.defs」の「USERGROUPS_ENAB」の設定

ユーザー作成する時のグループIDgオプションで指定すれば、その設定が優先されます。

オプションで指定しない場合は「/etc/login.defs」の「USERGROUPS_ENAB」の設定が関係してきます。

「/etc/login.defs」の「USERGROUPS_ENAB」の設定
  • yesの場合・・・ユーザーIDと同IDとなります。使用されている場合は、同じく「/etc/login.defs」の設定のGID_MINとGID_MAXの範囲内で現在使用されている値+1が使用されます。
  • noの場合・・・「/etc/default/useradd」のGROUP=の値になります。デフォルトではID=100のusersが設定されています。

「/etc/login.defs」の「USERGROUPS_ENAB」の設定はyesがデフォルトとなります。

[root@localhost ~]# cat /etc/login.defs  | grep -i group
# Min/max values for automatic gid selection in groupadd
# This enables userdel to remove user groups if no members exist.
USERGROUPS_ENAB yes

ホームディレクトリを作成

デフォルトではオプションなしで、ホームディレクトリを作成します。

しかし「/etc/login.defs」の「CREATE_HOME」の設定がnoになっている場合は、mオプションをつけないとホームディレクトリを作成してくれません。

「/etc/passwd」ファイルにホームディレクトリのパスは記述されますが、実際のディレクトリは作成されません。

「/etc/login.defs」の項目「CREATE_HOME」の設定を「yes」から「no」にviエディタで修正します。

Linuxでは設定ファイルが長い事が多いので、viエディタでも検索など行い効率よく修正しましょう!

書き換えたらファイルを保存して、viエディタを終了しましょう!

修正できたか必ず確認します。

[root@localhost home]# cat /etc/login.defs  | grep -i create_home
CREATE_HOME     no

修正が完了したのでオプションなしユーザーを作成してみます。

useradd user-home-no

ユーザー作成したので「/etc/passwd」ファイルを確認します。

[root@localhost home]# cat /etc/passwd | grep user-home-no
user-home-no:x:1011:1011::/home/user-home-no:/bin/bash

ホームディレクトリのパスにはきちんと記述しています。実際のディレクトリを「ls」コマンドで確認します。

[root@localhost home]# ls -l | grep user-home-no
[root@localhost home]#

実際のディレクトリは作成されていません。

ではmオプションを使用してユーザー作成してみます。

useradd -m user-home-no-m-option

ホームディレクトリのパスにはもちろん記述されています。実際のディレクトリを確認します。

[root@localhost home]# ls -l | grep user-home-no-m-option
drwx------  2 user-home-no-m-option user-home-no-m-option  62  5月 15 22:22 user-home-no-m-option

「/etc/login.defs」の「CREATE_HOME」の設定が「no」の場合でも、ホームディレクトリが作成されています。

ホームディレクトリを作成しない

デフォルトではオプションなしで、ホームディレクトリを作成します。

ホームディレクトリを作成したくない場合Mオプションをつけましょう!

「/etc/login.defs」の項目「CREATE_HOME」の設定が「no」ならば、Mオプションなしでもホームディレクトリは作成されません。

「/etc/login.defs」の項目「CREATE_HOME」の設定を確認します。

[root@localhost home]# cat /etc/login.defs  | grep -i create_home
CREATE_HOME     yes

「yes」なのでオプションなしでは、ホームディレクトリが作成されてしまいます。Mオプションを付けてユーザーを作成してみます。

useradd -M user-home-yes-M-option

作成されたので実際のホームディレクトリを確認します。

[root@localhost home]# ls -l | grep user-home-yes-M-option
[root@localhost home]#

想定通り、ホームディレクトリは作成されていません。

ユーザーIDを指定

ユーザーを作成する時のユーザーIDをuオプションで指定する事が可能です。

useradd -u 1020 user-id-shitei

IDが重複していたらエラーとなり、ユーザー作成できません。

ユーザーIDを指定して作成されたので、「/etc/passwd」ファイルで確認します。

[root@localhost home]# cat /etc/passwd | grep user-id-shitei
user-id-shitei:x:1020:1020::/home/user-id-shitei:/bin/bash

ユーザーIDが指定した「1020」で作成されています。

グループIDもユーザーIDと同様の番号が設定されています。

skelディレクトリのパスを指定

ユーザーを作成する時に、既存で配りたいファイルがあったりしないでしょうか?

デフォルトでは「/etc/skel」にファイルを置いておけば、ユーザーのホームディレクトリにそのファイルを自動で置く事が可能です。

[root@localhost ~]# useradd -D | grep -i skel
SKEL=/etc/skel

「useradd- D」コマンドはユーザー作成する時の、デフォルト値を決める「/etc/default/useradd」ファイルを参照するコマンドです。

useraddコマンドのkオプションで、パスを指定してそこにあるファイルをホームディレクトリに置く事が出来ます。

まずcpコマンドで「/etc/skel」ディレクトリを「/etc/skel_test」としてコピーします。

ディレクトリを新規作成しないでください。隠しファイルがありますので「/etc/skel」ディレクトリをコピーしてください。

cp -r /etc/skel /etc/skel_test

Linuxではcpコマンドにrオプションを指定する事で、ディレクトリごとコピーできます。

ディレクトリを作成できたか、findコマンドで検索して確認します。

[root@localhost ~]# find / -name skel_test
/etc/skel_test

ディレクトリが作成されたので、その配下にファイルとシンボリックリンクを作成してみます。

cd /etc/skel_test
touch skel-test
ln -s /var/log

このディレクトリを指定してユーザー作成してみます。

useradd -k /etc/skel_test user-skel-pass

上のユーザー作成コマンドを実行します。

[root@localhost ~]# useradd -k /etc/skel_test user-skel-pass
useradd: -k フラグは -m フラグと共に指定する必要があります

エラーがでました。「useradd: -k フラグは -m フラグと共に指定する必要があります」とメッセージが出ています。

ユーザー作成するコマンドのmオプションは、ホームディレクトリを作成するコマンドです。ホームディレクトリ配下にファイルを置くので、ホームディレクトリ作成は必須なのでエラーとなります。

useradd -km /etc/skel_test user-skel-pass

useraddコマンドにkmオプションとして実行してみます。

[root@localhost ~]# useradd -km /etc/skel_test user-skel-pass
useradd: -k フラグは -m フラグと共に指定する必要があります

エラーがでました。またまた「useradd: -k フラグは -m フラグと共に指定する必要があります」とメッセージが出ています。意味不明です。。。

先にmオプションでホームディレクトリを作成してから、kオプションでファイルを置いてという意味も込めてmkオプションにしてみます。

useradd -mk /etc/skel_test user-skel-pass

ユーザー作成できました!

ホームディレクトリに先程のファイルがあるか確認します。

[root@localhost ~]# ls -l /home/user-skel-pass/
合計 0
lrwxrwxrwx 1 user-skel-pass user-skel-pass 8  5月 16 16:47 log -> /var/log
-rw-r--r-- 1 user-skel-pass user-skel-pass 0  5月 16 16:46 skel-test

指定したパスのファイルが、ユーザーのホームディレクトリに作成されています。

実践:デフォルト値を変更してユーザー作成してみる

Linuxでユーザー作成コマンド「useradd」のデフォルト値をまとめているファイルが「/etc/default/useradd」ファイルでした。

useraddコマンドのデフォルト値効果
GROUP=100「/etc/login.defs」の設定が「no」の場合のグループID
HOME=/homeホームディレクトリを作成するパス
INACTIVE=-1パスワード期限が過ぎ、アカウントが無効になるまでの期間
EXPIRE=パスワードの有効期限
SHELL=/bin/bashログインシェルのパス
SKEL=/etc/skelユーザー作成時にホームディレクトリに置くファイルを格納するパス
CREATE_MAIL_SPOOL=yesユーザーのメールのスプールを作成するか
useraddコマンドのデフォルト値一覧

グループやホームディレクトリやそこに置くファイルなど指定するSKELは行いましたので、パスワードとメールを試してみます。

パスワード有効期限とパスワード期限が過ぎ、アカウントが無効になるまでの期間

パスワード有効期限とパスワード期限が過ぎ、アカウントが無効になるまでの期間のデフォルトは以下です。

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

INACTIVE「-1」デフォルトです。無制限を意味します。パスワードの期限が来てもアカウントが無効になる事はありません。

EXPIRE空白デフォルトです。パスワードの期限がない事を意味します。パスワードが永久に使用できます。

「/etc/default/useradd」の中身をviエディタで修正して確認します。

[root@localhost ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=1
EXPIRE=2024-05-30
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

アカウント有効期限「2024-05-30」に設定して、パスワードの有効期限1日に設定しました。

これでユーザーを作成してみます。

useradd user-default-change

確認します。

[root@localhost ~]# chage -l user-default-change
最終パスワード変更日                            : 5月 16, 2024
パスワード期限:                                 : なし
パスワード無効化中                                      : なし
アカウント期限切れ                                              :  5月 30, 2024
パスワードが変更できるまでの最短日数            : 0
パスワードを変更しなくてよい最長日数            : 99999
パスワード期限が切れる前に警告される日数                : 7

アカウントの有効期限は反映されていますが、パスワード有効期限が切れてから無効になるまでの日付が「なし」になっています。

パスワードの有効期限「passwd」コマンドのxオプションで設定します。

passwd -x 3 user-default-change

もう一度確認します。

[root@localhost ~]# chage -l user-default-change
最終パスワード変更日                            : 5月 16, 2024
パスワード期限:                                 :  5月 19, 2024
パスワード無効化中                                      :  5月 20, 2024
アカウント期限切れ                                              :  5月 30, 2024
パスワードが変更できるまでの最短日数            : 0
パスワードを変更しなくてよい最長日数            : 3
パスワード期限が切れる前に警告される日数                : 7

パスワードの有効期限を設定した事で、パスワード無効化中の日付も指定した日付で表示されています。

ユーザーのメールのスプールを作成するか否か

ユーザー作成時にメールのスプール領域を作成するか設定できます。デフォルトではyesなのでnoに設定して確認します。

[root@localhost mail]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

ではユーザーを作成します。

useradd user-default-mail-no

メールのスプール領域は「/var/mail/」配下です。確認してみます。

[root@localhost mail]# ls /var/mail/ | grep user-default-mail-no

先程の作成したユーザーのファイルは、想定どおりありませんでした。

Linuxサーバーでユーザー管理に関するその他の記事について

ユーザー一覧を表示する方法について

ユーザー削除する方法について

ユーザー名変更する方法について

ユーザーのパスワード管理について

ユーザーの「~/.bashrc」ファイルについて

ユーザー作成時にホームディレクトリに自動でファイルを置く「/etc/skel」ディレクトリですが、中身は空に見えます。

[root@localhost ~]# ls -l /etc/skel
合計 0

しかし隠しファイルが入っています。隠しファイルも全て表示する「ls -a」コマンドを実行します。

[root@localhost ~]# ls -al /etc/skel
合計 24
drwxr-xr-x.  2 root root   62  5月 16 17:26 .
drwxr-xr-x. 99 root root 8192  5月 16 17:22 ..
-rw-r--r--.  1 root root   18 11月 25  2021 .bash_logout
-rw-r--r--.  1 root root  193 11月 25  2021 .bash_profile
-rw-r--r--.  1 root root  231 11月 25  2021 .bashrc

つまり作成した各ユーザーのホームディレクトリにはこれらの隠しファイルが入っています。

「.bashrc」のファイルは各ユーザーのホームディレクトリにあり、それぞれのユーザーのログインした時に実行するスクリプトなどを記述する事が出来ます。またシェルスクリプトも実行できますので、効率を考えてこのファイルなど利用しても良いのではないでしょうか?

モバイルバージョンを終了