Linuxサーバーでユーザーの作成方法をまとめます。
Linuxサーバーを運用していてroot権限で操作する事はセキュリティ上よくありません。ログインするエンジニアのユーザーを作成しましょう!
またそれぞれの役割のユーザーを作成した方が良いので、今回はLinuxサーバーでユーザーの作成方法とコマンドのオプションを現役エンジニアの筆者がまとめます。
筆者はWindowsサーバーやLinuxサーバーの運用構築を11年間以上おこなってきました。その経験を元に知識を公開していきます!
実践も行いますので、わかりやすくユーザー作成について学ぶ事が出来ます。
Linuxでユーザーの作成方法
Linuxユーザーにも種類が複数あります。
- 管理者ユーザーroot
- 一般ユーザー
- システムアカウント
ここでは一般ユーザーを作成します。
Linuxサーバーで一般ユーザーを作成するコマンドは「useradd」コマンドです。
useradd オプション ユーザー名
「useradd」コマンドでユーザーを作成して、書き込まれるファイルは以下の4つがあります。
- 「/etc/passwd」ファイル・・・ユーザーの情報
- 「/etc/shadow」ファイル・・・ユーザーのパスワード情報
- 「/etc/group」ファイル・・・ユーザーのグループ情報
- 「/etc/gshadow」ファイル・・・ユーザーのグループのパスワード情報
Linuxでユーザー作成コマンドのオプション
Linuxでユーザー作成コマンドのオプションをまとめます。
useraddコマンドのオプション | 効果 |
---|---|
-c コメント | コメントを付ける |
-d パス | ホームディレクトリのパスを指定 |
-e 日付 | アカウントの失効日を設定。指定例:2022-02-22 |
-f 日数 | パスワードが失効してからアカウントが使用不可になるまでの日数指定 |
-g グループID | 1次グループの指定 |
-G グループID | 2次グループの指定 |
-m | ホームディレクトリを作成。ただし「/etc/login.defs」の設定を優先 |
-M | ホームディレクトリを作成しない |
-s パス | ログインシェルのパスを指定 |
-u ユーザーID | ユーザーIDを指定 |
-D | デフォルト値の表示もしくは設定 |
-k パス | skelディレクトリのパスを指定 |
ただしオプションを指定せずにコマンド実行した場合、デフォルトの値を使用してユーザー作成されます。
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 -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 | コメント | ホームディレクトリ | ログインシェル |
---|---|---|---|---|---|---|
taro | x | 1001 | 1001 | コメント | /home/taro | /bin/bash |
実践:useraddのオプション付きでユーザー作成をしてみる
Linuxでユーザー作成するuseraddコマンドのオプションは以下でした。
useraddコマンドのオプション | 効果 |
---|---|
-c コメント | コメントを付ける |
-d パス | ホームディレクトリのパスを指定 |
-e 日付 | アカウントの失効日を設定。指定例:2022-02-22 |
-f 日数 | パスワードが失効してからアカウントが使用不可になるまでの日数指定 |
-g グループID | 1次グループの指定 |
-G グループID | 2次グループの指定 |
-m | ホームディレクトリを作成。ただし「/etc/login.defs」の設定を優先 |
-M | ホームディレクトリを作成しない |
-s パス | ログインシェルのパスを指定 |
-u ユーザーID | ユーザーIDを指定 |
-D | デフォルト値の表示もしくは設定 |
-k パス | skelディレクトリのパスを指定 |
実践として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オプションを用います。
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次グループの指定をする事が可能です。
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次グループの指定もする事が可能です。
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」の設定
ユーザー作成する時のグループIDはgオプションで指定すれば、その設定が優先されます。
オプションで指定しない場合は「/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/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」の設定を確認します。
[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を指定して作成されたので、「/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」で作成されています。
skelディレクトリのパスを指定
ユーザーを作成する時に、既存で配りたいファイルがあったりしないでしょうか?
デフォルトでは「/etc/skel」にファイルを置いておけば、ユーザーのホームディレクトリにそのファイルを自動で置く事が可能です。
[root@localhost ~]# useradd -D | grep -i skel
SKEL=/etc/skel
useraddコマンドのkオプションで、パスを指定してそこにあるファイルをホームディレクトリに置く事が出来ます。
まずcpコマンドで「/etc/skel」ディレクトリを「/etc/skel_test」としてコピーします。
ディレクトリを新規作成しないでください。隠しファイルがありますので「/etc/skel」ディレクトリをコピーしてください。
cp -r /etc/skel /etc/skel_test
ディレクトリを作成できたか、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 | ユーザーのメールのスプールを作成するか |
グループやホームディレクトリやそこに置くファイルなど指定する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」のファイルは各ユーザーのホームディレクトリにあり、それぞれのユーザーのログインした時に実行するスクリプトなどを記述する事が出来ます。またシェルスクリプトも実行できますので、効率を考えてこのファイルなど利用しても良いのではないでしょうか?