Linuxのユーザー追加、useraddコマンドの使い方（パスワード指定）

*Linux*（ここでは*CenOS7*）で`useradd`コマンドを使用してユーザーを追加する方法を紹介します。
*Linuxコマンド*でユーザーを追加する方法として、`useradd`コマンドと`adduser`コマンドがありますが、*CentOS7*では`adduser`は`useradd`のシンボリックリンクとなっているため同じコマンドとなります。

```console:コマンド参照結果
[root@CENTOS7 ~]# ls -l /usr/sbin/useradd
-rwxr-xr-x. 1 root root 137616  8月  9  2019 /usr/sbin/useradd
[root@CENTOS7 ~]# ls -l /usr/sbin/adduser
lrwxrwxrwx. 1 root root 7 10月 12 17:04 /usr/sbin/adduser -> useradd
[root@CENTOS7 ~]#
```

# 環境

+ OS:CentOS Linux release 7.7.1908 (Core)

```console:CenOS7バージョン確認結果
[root@CENTOS7 ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@CENTOS7 ~]#
```

#1. useraddコマンドでユーザーを追加（オプション無し）

ユーザーを追加するには以下のコマンドを実行します。

`useradd [ユーザー名]`

```console:実行結果
[root@CENTOS7 ~]# useradd yasushi
[root@CENTOS7 ~]#
```

以下のコマンドでパスワードを設定します。
`passwd [ユーザー名]`

```console:実行結果
[[root@CENTOS7 ~]# passwd yasushi
ユーザー yasushi のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[root@CENTOS7 ~]#
```

オプション無しの場合、デフォルトでユーザーが追加されます。
デフォルトの値は以下のコマンドで確認できます。
`useradd -D`

```console:実行結果
[root@CENTOS7 ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@CENTOS7 ~]#
```

各項目の意味は以下の通りです。

|項目|内容|
|:-----|:------------------|
|GROUP|指定されていない場合の所属グループ|
|HOME|ホームディレクトリの作成場所|
|INACTIVE|パスワードの期限が切れてから、アカウントが無効になるまでの期間<br/>※（-1）は期限無し|
|EXPIRE|パスワードの有効期限|
|SHELL|ログインシェル|
|SKEL|skeletonファイルのある場所|
|CREATE_MAIL_SPOOL|メールスプールを作成するかの設定|


# 2. ユーザー情報の確認

### 2.1. ユーザー一覧の確認

ユーザー一覧を確認するには以下のコマンドで`/etc/passwd`ファイルを参照します。
`cat /etc/passwd`

```console:実行結果
[root@CENTOS7 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
～～～～～
（省略）
～～～～～
yasushi:x:1002:1002::/home/yasushi:/bin/bash
[root@CENTOS7 ~]#
```

`/etc/passwd`は`:`区切りで以下の情報を保持しています。

||項目|作成された情報|
|:--|:-----|:------------------|
|1|ユーザー名|yasushi|
|2|ダミーパスワード|x|
|3|ユーザーID|1002|
|4|グループID|1002|
|5|コメント|（空）|
|6|ホームディレクトリ|/home/yasushi|
|7|ログインシェル|/bin/bash|

### 2.2. パスワード一覧の確認
`/etc/shadow`ファイルに暗号化されたパスワードの一覧が格納されています。このファイルrootのみ参照可能です。
`cat /etc/shadow`

```console:実行結果
[root@CENTOS7 ~]# cat /etc/shadow
root:$6$n.LBF.Pi$pGDNeMrJNjOgXlcjQdguA/tZTryDlrDR2LCYgCrlT3KDpAu55nGmoh.4.OHlVL0zDw/YQlpV4HM6zzKCd2hQH.:18307:0:99999:7:::
～～～～～
（省略）
～～～～～
yasushi:$6$rwTX74Ir$YhhyryrTsbKdlAIWMKJqRQoQsK1TgelnQmHSpGmCDoXiGWQeQLTDtD73FEGur6tw5wZ50SbBo2QNVKEQUDcpV0:18307:0:99999:7:::
[root@CENTOS7 ~]#
```

`/etc/shadow`は`:`区切りで以下の情報を保持しています。

||項目|内容|作成された情報|
|:--|:-----|:------------------|:------------------|
|1|ユーザー名|ユーザ名|yasushi|
|2|パスワード|暗号化されたパスワード|（省略）|
|3|最終パスワード変更日|最後にパスワードが変更された年月日（1970年1月1日からの経過日数で表示）|18307|
|4|パスワード変更可能日数|パスワードが再度変更可能になるまでの日数|0|
|5|パスワード有効期限|パスワードの変更が必要になるまでの日数|99999|
|6|パスワード変更期間警告通知日|パスワード有効期限切の警告を何日前から通知するかの日数|7|
|7|アカウント無効日数|有効期限経過後にパスワードを変更しなかった場合にアカウントが使用不可になるまでの日数|（空）|
|8|アカウント有効期限|アカウントが使用不可になるまでの日数（1970年1月1日からの経過日数で表示）|（空）|
|9|予約フィールド|未使用|（空）|

### 2.3. グループ一覧の確認

グループ一覧を確認するには以下のコマンドで`/etc/group`ファイルを参照します。
`cat /etc/group`

```console:実行結果
[root@CENTOS7 ~]# cat /etc/group
root:x:0:
～～～～～
（省略）
～～～～～
yasushi:x:1002:
[root@CENTOS7 ~]#
```

`/etc/group`は`:`区切りで以下の情報を保持しています。

||項目|作成された情報|
|:--|:-----|:------------------|
|1|グループ名|yasushi|
|2|ダミーパスワード|x|
|3|グループID|1002|
|4|サブグループとして所属しているユーザー<br/>（複数の場合はカンマ区切り）|（空白）|

# 3. useraddコマンドでユーザーを追加（オプション有り）

オプション有りでユーザーを追加するには以下のコマンドを実行します。

`useradd [オプション] [ユーザー名]`

主要なオプションは以下となります。

|オプション|内容|
|:-----|:------------------|
|-c comment|コメントを設定|
|-d home_dir|ホームディレクトリを指定|
|-e expire_date|ユーザアカウントが使用不能になる日付を[YYYY-MM-DD]の書式で指定|
|-f inactive_days|パスワードの使用期限が切れてからアカウントが永久に使用不能になるまでの日数を指定<br/>0：パスワードの期限が切れると同時にこのアカウントは使用不能となる<br/>-1：この機能が無効となる|
|-g initial_group|ユーザの属する主グループのグループ名またはグループIDを指定|
|-G group,[...]|ユーザの属する補助グループのリストをカンマ区切りで指定|
|-m [-k skeleton_dir]|ホームディレクトリが存在しない場合にはホームディレクトリを作成<br/>-k オプションを同時に指定すると skeleton_dir 以下のファイルが、指定しないと /etc/skel 以下のファイルがホームディレクトリにコピーされる|
|-o|重複した UID でユーザを作成できるようにする|
|-p passwd|cryptでハッシュ化されたパスワードを指定|
|-s shell|ユーザのログインシェルを指定|
|-u uid|UID を指定|

以下のコマンドで、ホームディレクトリを「/data/test」、ログインシェルを「/bin/sh」で`yasushi02`ユーザーを作成する。

`useradd -d /data/test -s /bin/sh yasushi02`

```console:実行結果
[root@CENTOS7 ~]# useradd -d /data/test -s /bin/sh yasushi02
[root@CENTOS7 ~]#
```

以下のコマンドでパスワードを設定します。
`passwd [ユーザー名]`

```console:実行結果
[root@CENTOS7 ~]# passwd yasushi02
ユーザー yasushi02 のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[root@CENTOS7 ~]#
```

ユーザー一覧（`/etc/passwd`）を確認

```:/etc/passwd
root:x:0:0:root:/root:/bin/bash
～～～～～
（省略）
～～～～～
yasushi:x:1002:1002::/home/yasushi:/bin/bash
yasushi02:x:1003:1003::/data/test:/bin/sh
```

パスワード一覧（`/etc/shadow`）を確認

```:/etc/shadow
root:$6$n.LBF.Pi$pGDNeMrJNjOgXlcjQdguA/tZTryDlrDR2LCYgCrlT3KDpAu55nGmoh.4.OHlVL0zDw/YQlpV4HM6zzKCd2hQH.:18307:0:99999:7:::
～～～～～
（省略）
～～～～～
yasushi:$6$pJe9DpYg$6i9N217uNBwwIAGjuzfavGWffUyZVWMh0PpgaUEm5Ti3PN8T/KdUvEG4fibaBClUq7AzDphHfAqGuVgnEHfWf.:18307:0:99999:7:::
yasushi02:$6$lXu7BN1C$OcFWVxt/weU4Sh2EUNC4YO5s/e5kqeNQ5EEX0PtwLOf1t/Cm86AGmLdbbJr51Qz0xFWWKwZYmHl0.WPJcyqLU1:18307:0:99999:7:::
```

グループ一覧（``/etc/group'）を確認

```:/etc/group
root:x:0:
～～～～～
（省略）
～～～～～
yasushi:x:1002:
yasushi02:x:1003:
```

ホームディレクトリを確認

```
[root@CENTOS7 ~]# cd /data
[root@CENTOS7 data]# ls
test
[root@CENTOS7 data]# cd test
[root@CENTOS7 test]# ls -a
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc
[root@CENTOS7 test]#
```

# 4. パスワードを指定してユーザーを追加

パスワードを指定する場合、cryptでハッシュ化されたパスワードを指定する必要があります。

ユーザー「yasushi03」、パスワード「password03」でユーザーを追加する場合のコマンドは以下となります。
ここではsalt（パスワードを暗号化する際に追加する文字列のこと）に「salt03」を設定しています。saltは任意の文字列を使用可能です。

`useradd -p $(perl -e 'print crypt("password03", "\$6\$salt03")') yasushi03`

```console:実行結果
[root@CENTOS7 ~]# useradd -p $(perl -e 'print crypt("password03", "\$6\$salt03")') yasushi03
[root@CENTOS7 ~]#
```

上記コマンドでは、cryptでハッシュ化されたパスワードとして`perl`を使用しています。

`perl -e 'print crypt("[パスワード]", "[ハッシュ化方式記号][salt]");'`

ハッシュ化方式の一覧は以下となります。

|ハッシュ化方式記号|ハッシュ化方式|
|:--|:--|
|\$1\$|MD5|
|\$2\$|Blowfish|
|\$5\$|SHA-256|
|\$6\$|SHA-512|


`perl -e 'print crypt("password03", "\$6\$salt03")'`

```console:実行結果
[root@CENTOS7 ~]# perl -e 'print crypt("password03", "\$6\$salt03")'
$6$salt03$/DhkQIuDsIIuvys.ISNOUB.OlWKxzgovMIBdCX2vlwCzEdNuIxMakytppnAGsKwT0hn12BW9XbCBd3KKXBh0/0[root@CENTOS7 ~]#
```

---

以上