Linuxユーザーとグループ管理コマンド - パスワード管理

# パスワードの設定方法

`passwd` コマンドを使用してユーザーパスワードを変更します。

## 書式

```shell
passwd [OPTION...] <accountName>
```

## 常用オプション

```shell
-k, --keep-tokens             # 認証トークンの有効期限を保持する
-d, --delete                  # ユーザーパスワードを削除し、ロックも解除する（root権限が必要）
-l, --lock                    # ユーザーパスワードをロックする（root権限が必要）
-u, --unlock                  # ユーザーパスワードのロックを解除する（root権限が必要）
-e, --expire                  # ユーザーパスワードの有効期限を切る（root権限が必要）
-f, --force                   # 操作を強制実行する
-x, --maximum=DAYS            # パスワードの最大有効期間を設定する（root権限が必要）
-n, --minimum=DAYS            # パスワードの最小有効期間を設定する（root権限が必要）
-w, --warning=DAYS            # パスワードの有効期限が切れる何日前に警告するか設定する（root権限が必要）
-i, --inactive=DAYS           # パスワードが失効した後、アカウントを無効にするまでの日数（root権限が必要）
-S, --status                  # ユーザーのパスワード状態を照会する（root権限が必要）
--stdin                       # パスワードを標準入力から受け取る（Ubuntuにはない）
```

## 一般ユーザーが自分のパスワードを変更する

```shell
[jose@rocky8 ~]$ passwd
Changing password for user jose.
Current password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
```

## rootが他のユーザーのパスワードを変更

```shell
[root@rocky8 ~]# passwd jose
Changing password for user jose.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
```

パスワードの変更は、基本的に /etc/shadow ファイルを更新します。

```shell
[root@rocky8 ~]# ll /etc/shadow
----------. 1 root root 1475 Jun 25 17:16 /etc/shadow
```

## 対話形式でないユーザーパスワードの変更方法

```shell
# レッドハット系Linuxで使用可能
[root@rocky8 ~]# echo '123456' | passwd --stdin jose
Changing password for user jose.
passwd: all authentication tokens updated successfully.

[root@rocky8 ~]# passwd --stdin jose <<<123456
Changing password for user jose.
passwd: all authentication tokens updated successfully.

# Ubuntuの passwd コマンドは --stdin オプションがない
# このやり方でCentOSでも動くので、より汎用性が高い
root@ubuntu20:~# echo -e '123456\n123456' | passwd jose
New password: Retype new password: passwd: password updated successfully
```

## 次回ログイン時にユーザーにパスワード変更を強制する

```shell
[root@rocky8 ~]# passwd -e jose
Expiring password for user jose.
passwd: Success

# jose が次回ログイン時に表示されるメッセージ
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user jose.
Current password:
```
# ユーザーパスワードポリシーの変更

`chage` コマンドはユーザーのパスワードポリシーを変更する際に使用します。

## 書式

```shell
chage [options] LOGIN
```

## 常見オプション

```shell
-d LAST_DAY            # パスワードを変更した日を設定
-m, --mindays MIN_DAYS # パスワードの最小使用期間
-M, --maxdays MAX_DAYS # パスワードの最大使用期間
-W, --warndays WARN_DAYS # パスワードの有効期限が切れる何日前に警告するか設定
-I, --inactive INACTIVE # パスワード失効後の猶予期間
-E, --expiredate EXPIRE_DATE # アカウントの有効期限
-l                      # パスワードポリシーを表示
```

## ユーザーのパスワードポリシーを確認する

```shell
[root@rocky8 ~]# chage -l jose
Last password change                    : Jun 25, 2022
Password expires                        : never
Password inactive                       : never
Account expires                         : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
```

## 例

```shell
[root@rocky8 ~]# chage jose
Changing the aging information for jose
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 3
Maximum Password Age [99999]: 42
Last Password Change (YYYY-MM-DD) [2021-03-14]: 2021-03-29
Password Expiration Warning [7]: 10
Password Inactive [-1]: 20
Account Expiration Date (YYYY-MM-DD) [-1]: 2022-03-29

[root@rocky8 ~]# getent shadow jose
jose:$6$UpJNaaFGwCqFBSN9$MA4OMcJRJWbNPeMmQPvVjUcI4RYbGywipqYc9hlg87YUXvmpbi.Zcni
8ktdzw/DuECug4IBoEC/yXYv7dknu/0:18715:3:42:10:20:19080:
```

## 単一項目のみを変更

```shell
[root@rocky8 ~]# chage -d 2022-06-25 jose
[root@rocky8 ~]# getent shadow jose
jose:$6$O.JbzJijqCDIHsXM$jnhJl6cucyUXE9WOaZB9WLbKAimOn/lq0Q0/UoJyMrlY1c9xOCQBWCr
qflfjLflueoFz60w7QuHZhCzSw2CKi/:19168:0:99999:7:::
```

# パスワードファイルにおける各時間項目の表示：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/ced2a109-4c00-ab1b-3a6b-ca46d910c0a9.png)