Linuxユーザーとグループ管理コマンド - ユーザー作成

# ユーザーとグループ管理コマンド - ユーザー作成

## ユーザー管理コマンド
- `useradd`: 新しいLinuxユーザーを作成するコマンド
- `usermod`: 存在するユーザーの情報を変更するコマンド
- `userdel`: ユーザーを削除するコマンド

## グループアカウント維持コマンド
- `groupadd`: 新しいグループを作成するコマンド
- `groupmod`: 存在するグループの情報を変更するコマンド
- `groupdel`: グループを削除するコマンド

## ユーザー作成
`useradd` コマンドで新しいLinuxユーザーを作成することができます。

### フォーマット：
```shell
useradd [options] LOGIN
useradd -D
useradd -D [options]
```

### # 主なオプション
- `-u`、`--uid UID`: UIDを指定します。
- `-g`、`--gid GID`: 初期ユーザーグループを指定します。`-g groupname`または `--gid GID`とします。
- `-c`、`--comment COMMENT`: 新しいアカウントのGECOSフィールドです。
- `-d`、`--home-dir HOME_DIR`: ホームディレクトリーを指定します。存在しなくても指定可能ですが、それにより自動的にディレクトリーが作られるわけではありません。
- `-s`、`--shell SHELL`: 使用するシェルを指定します。使用可能なシェルは`/etc/shells`で確認できます。
- `-r`、`--system`: システムユーザーを作成します。CentOS 6以前はID<500がシステムユーザー、CentOS7以降はID<1000がそれに該当します。ログインユーザーに関する情報は作成されません。
- `-m`、`--create-home`: ホームディレクトリーを作成します。通常ログインユーザーに使われます。
- `-M`、`--no-create-home`: ホームディレクトリーを作成しません。ログイン不要なユーザーに使われます。
- `-p`、`--password PASSWORD`: パスワードを設定します。このパスワードは `/etc/shadow` ファイル中で平文の形式になります。
- `-o`、`--non-unique`: 重複するUIDを持つユーザーを作成できます。
- `-G`、`--groups GROUP1[,GROUP2,...]`: ユーザーの追加グループを明記します。グループは事前に存在している必要があります。
- `-N`、`--no-user-group`: 同名のグループを作成しないようにし、代わりに`users`グループを主グループとして使用します。
- `-D`、`--defaults`: `useradd` のデフォルト設定を表示または変更します。デフォルト設定ファイルは `/etc/default/useradd` です。
- `-e`、`--expiredate EXPIRE_DATE`: アカウントの有効期限を YYYY-MM-DD フォーマットで指定します。
- `-f`、`--inactive INACTIVE`: パスワード有効期限切れ後、アカウントが完全に禁止されるまでの日数を指定します。`0`はパスワード有効期限切れと同時に禁止、`-1`はこの機能を使用しないことを意味します。
- `-k`、`--skel SKEL_DIR`: ホームディレクトリのテンプレートを指定します。ホームディレクトリを作成する際には、このディレクトリからファイルがコピーされます。デフォルトは `/etc/skel/`ですが、`-m`オプションと併用する必要があります。
- `-K`、`--key KEY=VALUE`: `/etc/login.defs` のデフォルト値を使用せず、自分で指定します。例えば `-K UID_MIN=100` のように使用します。
- `-l`、`--no-log-init`: ユーザーをログインの最近の記録とログイン失敗の記録に追加しません。以前に取り上げた認証監査に関連する `lastlog`、`lastb`、`cat /var/log/secure` に該当します。

### 范例:
```shell
[root@rocky8 ~]#rpm -q --scripts postfix
preinstall scriptlet (using /bin/sh):
# 必要に応じてユーザーやグループを追加する
/usr/sbin/groupadd -g 90 -r postdrop 2>/dev/null
/usr/sbin/groupadd -g 89 -r postfix 2>/dev/null
/usr/sbin/groupadd -g 12 -r mail 2>/dev/null
/usr/sbin/useradd -d /var/spool/postfix -s /sbin/nologin -g postfix -G mail -M -r -u 89 postfix 2>/dev/null
```

### 范例:
```shell
# ユーザーを作成する前に先にグループを作成することで、グループIDの把握が可能
# 既に存在するグループIDの利用は避ける
[root@rocky8 ~]# groupadd -g 33 mysql
groupadd: GID '33' already exists
# システムグループを作成
[root@rocky8 ~]# groupadd -g 336 -r mysql
# 確認
[root@rocky8 ~]# getent group mysql
mysql:x:336:
[root@rocky8 ~]# getent gshadow mysql
mysql:!::
# ユーザーを作成
useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
# 確認
[root@rocky8 ~]# useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
[root@rocky8 ~]# getent passwd mysql
mysql:x:336:336::/data/mysql:/sbin/nologin
[root@rocky8 ~]# getent shadow mysql
mysql:!!:19168::::::
```

### デフォルトでのユーザー作成
```shell
[root@rocky8 ~]# useradd tom
# 確認
[root@rocky8 ~]# getent passwd tom
tom:x:1003:1003::/home/tom:/bin/bash
[root@rocky8 ~]# getent shadow tom
tom:!!:19168:0:99999:7:::
[root@rocky8 ~]# getent group tom
tom:x:1003:
[root@rocky8 ~]# getent gshadow tom
tom:!::
[root@rocky8 ~]# ls -a /home/tom/
. .. .bash_logout .bash_profile .bashrc
```

`useradd` のデフォルト設定は `/etc/default/useradd` によって定義されています。
```shell
[root@rocky8 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100 # useraddがグループを指定しない、あるいは/etc/login.defs中のUSERGROUPS_ENABが「no」、あるいはuseradd -Nの場合、groupは100です
HOME=/home # デフォルトのホームディレクトリの親ディレクトリ
INACTIVE=-1 # 対応するのは/etc/shadowファイルの7列目、つまりユーザーパスワードの有効期限が切れた後のアカウントロックの猶予期間です。-1はロックしないことを意味します
EXPIRE= # 対応するのは/etc/shadowファイルの8列目、つまりユーザーアカウントの有効期限です
SHELL=/bin/bash # デフォルトはbashです
SKEL=/etc/skel # 新たに作ったユーザーのホームディレクトリ制作のための模擬ファイルです
CREATE_MAIL_SPOOL=yes # デフォルトで受信箱の作成を行います
```

デフォルト設定の表示または変更：
```shell
# useradd -Dで見ることができます
# useradd –D -s SHELLで変更
# useradd –D –b BASE_DIRで変更
# useradd –D –g GROUPで変更
```

確認と変更例：
```shell
[root@rocky8 ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

# デフォルトのshellを変更
[root@rocky8 ~]# useradd -D -s /bin/sh

# 変更後
[root@rocky8 ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
```

### ホームディレクトリのテンプレート
```shell
[root@rocky8 ~]# ls -a /etc/skel/
. .. .bash_logout .bash_profile .bashrc
# このディレクトリの内容を変更すると、新しく作成されるユーザーのホームディレクトリの中身も変わります
```

新規ユーザーに関連するファイル：
- `/etc/default/useradd`
- `/etc/skel/*`
- `/etc/login.defs`

### 一括ユーザー作成コマンド
```shell
newusers file
```

范例：
```shell
[root@rocky86 ~]# cat user.txt
u1:123456:1024:1024::/home/u1:/bin/bash
u2:123456:1025:1025::/home/u2:/bin/bash

[root@rocky86 ~]# newusers user.txt
[root@rocky86 ~]# id u1
uid=1024(u1) gid=1024(u1) groups=1024(u1)
[root@rocky86 ~]# id u2
uid=1025(u2) gid=1025(u2) groups=1025(u2)
```

### 一括ユーザーパスワード変更コマンド
```shell
chpasswd < file
```

范例：
```shell
[root@rocky86 ~]# cat pwd.txt
u1:1234567
u2:1234567

# 標準入力からリダイレクト
[root@rocky86 ~]# chpasswd < pwd.txt

# 複数行のリダイレクト
[root@rocky86 ~]# chpasswd <<EOF
> u1:1234567
> u2:1234567
> EOF

# パイプからリダイレクト
[root@rocky86 ~]# echo u1:123456 | chpasswd
```

CentOS 8ではsha512アルゴリズムで暗号化されたパスワードを生成する例：
```shell
[root@centos8 ~]#openssl passwd -6 magedu
$6$UOyYOao.iM2.rPnM$jCpTnBVIQBuGCLOm4N5hqh5YUc3wWXcDzkDMddthpKNL3scOZjTHh9fXds8E
u6gNdEQqLMQgOboipZ08mnz2V
```

CentOS 7でPythonを用いてsha512アルゴリズムで暗号化されたパスワードを生成する例：
```shell
[root@centos7 ~]#python -c 'import crypt,getpass;pw="magedu";print(crypt.crypt(pw))'
$6$pt0SFMf6YqKea3mh$.7Hkslg17uI.Wu7BcMJStVVtkzrwktXrOC8DxcMFC4JO1igrqR7VAi87H5PH
OuLTUEjl7eJqKUhMT1e9ixojn1
```

CentOS 6 でsha512アルゴリズムに基づくパスワードを含むユーザーを作成する例：
```shell
[root@centos6 ~]#grub-crypt --help
Usage: grub-crypt [OPTION]...
Encrypt a password.
-h, --help Print this message and exit
-v, --version Print the version information and exit
--md5 Use MD5 to encrypt the password
--sha-256 Use SHA-256 to encrypt the password
--sha-512 Use SHA-512 to encrypt the password (default)
Report bugs to <bug-grub@gnu.org>.
EOF

[root@centos6 ~]#grub-crypt --sha-512
Password:
Retype password:
$6$v9A2/xUNwAWwEmHN$q7Wz.uscsV/8J5Gss3KslX8hKXOoaP3hDpOBWeBfMQHVIRZiwHUUkii84cvQ
WIMnvtnXYsdVHuLO4KhOiSOMh/

[root@centos6 ~]#useradd -p
'$6$v9A2/xUNwAWwEmHN$q7Wz.uscsV/8J5Gss3KslX8hKXOoaP3hDpOBWeBfMQHVIRZiwHUUkii84cv
QWIMnvtnXYsdVHuLO4KhOiSOMh/' test

[root@centos6 ~]#getent shadow test
test:$6$v9A2/xUNwAWwEmHN$q7Wz.uscsV/8J5Gss3KslX8hKXOoaP3hDpOBWeBfMQHVIRZiwHUUkii
84cvQWIMnvtnXYsdVHuLO4KhOiSOMh/:18459:0:99999:7:::
```

Ubuntu 18.04 でsha512アルゴリズムに基づくパスワードを生成する例：
```shell
[root@ubuntu1804 ~]#openssl passwd -6 123456
$6$RyaXh7L.7fORQBjB$0WXRATSjh3IU.eufhsY5uJpKZwCAGjyAj5r/et9ymohEKsTdMvagEW92t1IA
kNte0yVZ88YyMUqx1b6uHIrxM/
```