Linuxアカウントおよびパスワードのセキュリティ対策

# アカウント管理について
## 超基礎
`/etc/passwd`でデフォルトおよび作成したアカウントは管理されている。
`/etc/shadow`にパスワードが**ハッシュ化**されて記載されている。

## アカウントの作成・削除・ロック
### アカウントの作成
```:bash
$sudo useradd -m -g "グループ" -s "ログインシェル" -d "ホームディレクトリ" -p $(openssl passwd "パスワード") "ユーザー名"
```
<details><summary>オプション(注意事項あり)</summary>

| オプション | 概要 | 例 |
|:-:|:-:|:-:|
| -m | ホームディレクトリ作成 | -m |
| -d | ホームディレクトリの指定 | -d /home/user01 |
| -s | ログインシェルの指定 | -s /bin/bash |
| -u | ユーザIDを指定 | -u 1500 |
| -g | プライマリグループの作成 | -g group01 |
| -e | アカウントの有効期限 | -e 2025-12-31 |
| -r | システムユーザとして作成 | -r |
| -p | 暗号化済みのパスワード指定 | -p $(openssl passwd password) |

:::note alert
"-p"オプションはセキュリティ上非推奨（下記参照）
:::
>このオプションの引数に渡すのは「**ハッシュ化されたパスワード**」です。
>#### 非推奨の理由
>* コマンド履歴`~/.bash_history`に平文がのこってしまう
>* 実行中に`ps aux`で他のユーザーから見えてしまう
>
>#### 推奨
>`useradd`コマンド上ではパスワードをせずに`passwd`コマンドを使用する
>```:command
>$sudo useradd -m -s /bin/bash user01
>$sudo passwd user01
>```
</details>

### アカウントの削除
```:bash
sudo userdel -r "ユーザー名"
```
<details><summary>オプション</summary>

| オプション | 概要 | 例 |
|:-:|:-:|:-:|
| -r | ユーザのホームディレクトリごと削除 | -r |
| -f | ログイン中でもマウント中でも強制削除 | -f |

</details>

### アカウントのロック
#### 方法１（passwdコマンド）
```:bash
$sudo passwd -l "ユーザー名"
```
<details><summary>オプション</summary>

| オプション | 概要 | 例 |
|:-:|:-:|:-:|
| -l | アカウントのロック | -l |
| -u | ロック解除 | -u |

</details>

##### ロック確認
`/etc/shadow`の対象ユーザが以下のように<font color="red">**!!**</font>（エクスクラメーションが2つ）表示されていればロックされている
```:bash
user1:!!$6$adfsaf7ds858s9d.$fsvHgyiY8YR6...(以降略)
```

#### 方法2（usermodコマンド）
```:bash
$sudo usermod -L "ユーザー名"
```
<details><summary>オプション(infoあり)</summary>

| オプション | 概要 | 例 |
|:-:|:-:|:-:|
| -L | アカウントのロック | -L |
| -U | ロック解除 | -U |
| -s | ログインシェルの変更 | -s /sbin/nologin |

:::note info
通常の`passwd`や`usermod`によるロックだと`su`コマンドでの切り替えは行えてしまう。
ログインシェルの変更が一番安全だと思われる。
:::

</details>

##### ロック確認
`/etc/shadow`の対象ユーザが以下のように<font color="red">**!**</font>（エクスクラメーションが1つ）表示されていればロックされている
```:/bash
$sudo getent shadow user01
user1:!$6$adfsaf7ds858s9d.$fsvHgyiY8YR6...(以降略)
```

# パスワード管理について
## `/etc/shadow`について
shadowファイルはハッシュ化されたパスワードが格納されています
ハッシュの種類については**＄**で囲まれた中の数字を見れば判断できる
```:bash
$sudo getent shadow user01
user1:!$6$adfsaf7ds858s9d.$fsvHgyiY8YR6...(以降略)
```
##### ハッシュの種類一覧
| 数字 | ハッシュアルゴリズム |
|:-:|:-:|
| 1| MD5 |
| $5$ | SHA256 |
| $6$ | SHA512 |

## パスワードの詳細設定
### デフォルト値
新規アカウント作成時に`/etc/default/useradd`と`/etc/login.defs`と`/etc/pam.d/system-auth`及び`/etc/security/pwquality.conf`のデータをもとにパスワードの詳細設定がなされます。
##### /etc/default/useradd
| 項目 | 説明 |
|:-:|:-:|
| GROUP | ユーザ作成時のグループID |
| HOME | ホームディレクトリ |
| INACTIVE | パスワード使用期限が過ぎてから、BANまでの猶予日数 |
| EXPIRE | アカウント失効日 |
| SHELL | ログインシェル |
| SKEL | ファイルの雛形があるディレクトリ |
| CREATE_MAIL_SPOOL | メールスプールの作成 |
##### /etc/login.defs
| 項目 | 説明 |
|:-:|:-:|
| PASS_ALWAYS_WARN | パスワードが弱いときの警告の有無 |
| PASS_MAX_DAYS | 同じパスワードが使い続けられる最大日数 |
| PASS_MIN_DAYS | パスワード変更間隔の最短日数 |
| PASS_WARN_AGE | パスワード変更期限の何日前から警告をだすか |
##### /etc/pam.d/system-auth
| 項目 | 説明 |
|:-:|:-:|
| minlen | パスワードの最小文字数 |
| remenber | 過去何世代と異なるものにするか |
| deny | 入力を何回間違えたらアカウントロックするか |
| unlock_time | アカウントロックする時間（秒） |
| miniclass | パスワードに最低限含めるべき文字の種類 |
| maxsequence | '12345', 'abcde'などの連続した並びが何文字以上続いたらパスワードを破棄するかを指定 |
##### /etc/security/pwquality.conf
| 項目 | 説明 |
|:-:|:-:|
| difok | 過去何世代と異なるものにするか |
| minlen | パスワードの最小文字数 |
| dcredit | パスワードに含むべき数字の数（負数で指定） |
| ucredit | パスワードに含むべきアルファベットの大文字の数（負数で指定） |
| lcredit | パスワードに含むべきアルファベットの小文字の数（負数で指定） |
| ocredit | パスワードに含むべき数字・アルファベット以外の数（負数で指定） |
| dictcheck | cracklibの辞書に存在するパスワードを設定不可に（１：有効） |


### ユーザ毎にパスワード設定する方法
ユーザ毎にパスワードの詳細設定をするには`chage`コマンドを使用します
```:bash
$chage -l user01
```
<details><summary>オプション</summary>

| オプション | 概要 | 例 |
|:-:|:-:|:-:|
| -l | ユーザのパスワード情報一覧 | -l user01 |
| -m | パスワード変更最短日数 | -m 60 |
| -M | パスワードの有効期限 | -M 60 |
| -W | 有効期限前の警告開始日数 | -W 5 |
| -I | パスワード期限切れ後の無効化猶予日数 | -I 3 |
| -E | アカウントの有効期限 | -E 2025/12/25 |


</details>