情報セキュリティの基本 ~パスワードの強化~

　ここでは，パスワードに関わる設定を行い，セキュリティを強化する方法を具体的に記しています．

　パスワードの強化は，セキュリティを向上させる大切な手段です．個人レベルでは強力なパスワードを用いたり，定期的にパスワードを変更するよう意識するくらいしかありませんが，管理者レベルでは，ユーザのパスワードレベルを保つための様々な対策を施すことができます． 
 
　ここでは，パスワードのセキュリティを強化させるのに有効な，以下のことを扱っていきます．
 
### 内容
 
* **[シャドウパスワードの設定](#シャドウパスワードの設定)**
    * パスワードが一般ユーザに見えないようにします．
* **[パスワードポリシーの設定](#パスワードポリシーの設定)**
    * パスワードの強度や更新頻度などを指定します．
* **[暗号化アルゴリズムの設定](#暗号化アルゴリズムの設定)**
    * 強力な暗号化アルゴリズムに変更します．


# 環境

* Cent OS 6.8
* PAM(/libpam.so) 0.82.2

　より細かい環境については，[ブログ][blogtop]を参考にしてください．
 
　また，今回の内容はブログの第13回により詳しく掲載しておりますので参考にしてください．
 
#### [【第13回】情報セキュリティの雪山 ~パスワードの強化~][a00d]
 

# シャドウパスワードの設定
## 確認方法
　passwdもshadowもテキストファイルなのでファイル閲覧コマンドで見ることもできますが，これらは**getentコマンド**で表示させるのが一般的です．
 
```shell-session
# /etc/passwdのユーザー名やそれぞれの設定の一覧を表示．
$ getent passwd
# 特定のユーザーを抜き出して表示．
$ getent passwd USERNAME
```

![getent_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/18c85c04-227c-bd80-cb1e-10a25d352bca.png)

　「:」区切りでユーザー名，パスワード，uid，gid，...と並んでいます．**パスワードの欄が「x」という文字に置き換わっていたらシャドウパスワードが有効になっている証拠**です．shadowファイルの方も確認してみると，暗号化されたパスワードが記載されています．
 
```shell-session
# /etc/shadowを表示
$ sudo getent shadow enryu
enryu:$1$********:17089:0:99999:7:::
```

　`********`の部分が暗号化パスワードであり，その前の数字は暗号化アルゴリズムの種類を表しています．また，そのあとにはパスワードに関する設定などが続いています．

## 設定方法
　もしシャドウパスワードになっていなかったり，解除してしまったときには有効化する必要があります．シャドウパスワードを有効にするには，**pwconv**コマンドを使います．詳しくは`$ man pwconv`で調べられます．
 
```shell-session
# シャドウパスワードの有効化
$ sudo pwconv
# シャドウパスワードの無効化
$ sudo pwunconv
```
# パスワードポリシーの設定
## パスワードポリシーとは
　**パスワードポリシー**とは，パスワードの設定や更新に関する決まりのことで，**PAM**で設定するものと**login.defs**で設定するものがあります．以下の項目があります．

|設定方法|項目|意味・概要|例(デフォルト値)|
|---|:---:|---|---:|
|login.defs|PASS_ALWAYS_WARN|パスワードが弱いと警告します．|yes(no)|
|login.defs|PASS_MAX_DAYS|同じパスワードを使える最大日数です．|180(99999)|
|login.defs|PASS_MIN_DAYS|パスワードを変更してから，次に変更できるようになるまでの最小日数です．|1(0)|
|login.defs|PASS_WARN_AGE|パスワードの期限が切れる何日前から警告するかです．マイナスは警告しません．|7(7)|
|PAM|minlen|パスワードの最小文字数です．|8(4)|
|PAM|remember|パスワードを過去何世代と異なるものにするかを指定します．|3()|
|PAM|deny|パスワード入力を何回間違えたらアカウントをロックするかを指定します．|5()|
|PAM|unlock_time|アカウントをロックする時間(秒)を指定します．|180()|
|PAM|minclass|パスワードに最低限含めるべき文字の種類の数を指定します．|2(0)|
|PAM|maxsequence|'12345', 'abcde'などの連続した並びが何文字以上続いたらパスワードを破棄するかを指定します．|4(0)|
|PAM|dcredit, ucredit, lcredit, ocredit|パスワードに含める文字の種類と文字数などを指定します(※)．|0(1)|

※dcreditは数字，ucreditは大文字，lcreditは小文字，ocreditは記号などを表します．これらの振る舞いは少々複雑です．例えば*(case 1)* dcredit=2, minlen=8のとき，数字が1つ含まれていたらパスワードが7文字でも許可します．これを2文字まで許すので，実質パスワードの長さは6文字以上となります．ただし，数字が含まれていなければ8文字以上ということです．*(case 2)* dcredit=-2, minlen=8のとき，数字が2文字以上含まれていないと許可されません．また，数字が含まれていた場合，minlenには影響しません．*(case 3)* creditを何も設定せず，minlen=8のとき，creditのデフォルト値は1となります．数字，大文字，小文字，記号などをすべて含めると，minlenは4になりますが，実際は5文字以下のパスワードは弾かれるため，6文字が最小文字数となります．厳密にminlenを設定したいときは，?creditを0以下に設定すべきです．

## パスワードポリシーの設定
　では実際に設定していきましょう．これからやるのはあくまで一例です．数値などはご自身で決めたものに適宜変えてください．
 
　まずは**login.defs**です．ここでは編集にviを使っていますが，もちろんお好きなテキストエディタで構いません．画像のようにデフォルトでパスワードに関する設定が書かれている場所がありますので，変更していきます．

```shell-session
$ sudo vi /etc/login.defs
```

![login_defs_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/7ce1f69b-fd1c-942f-4daa-178b98c7d4c6.png)

```text:/etc/login.defs
PASS_MAX_DAYS    180
PASS_MIN_DAYS    1
PASS_MIN_LEN    8        # PAMの設定が優先されるのであまり意味はありません
PASS_WARN_AGE    7
```

　次は**PAM**の**system-auth**です．
 
```shell-session
$ sudo vi /etc/pam.d/system-auth
```

![pam_system-auth_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/79cded47-0149-c9dd-de74-bd60681e5934.png)

　ここにどんどん書き足していきます．心配な人はバックアップを取っておいてもいいでしょう．ファイルが大きくて分かりにくいかもしれないので，編集ポイントをまとめます．なお，行数は`:set number`で表示できます．
 
1. 8行目の下に **auth required pam_tally2.so deny=5 unlock_time=180** を挿入
2. 17行目　password requisite pam_cracklib.so に**minlen=8 minclass=3 maxsequence=4 dcredit=-1 ucredit=0 lcredit=0 ocredit=0**を追加
3. 18行目　password required pam_unix.so に**remember=3**を追加

![pam_system-auth_7.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/d2f10a9b-5bcd-9f78-13bd-40f6178d92b9.png)

　これで設定は終了です．:wqで保存して終了しましょう．
 
## ユーザごとの設定
　上で設定した項目のうちのいくつかは，**chage**コマンドで確認したり，変更したりできます．
 
```shell-session
$ chage -l enryu
Last password change            : Nov 02, 2016
Password expires            : May 01, 2017
Password inactive            : never
Account expires            : never
Minimum number of days between password change    : 0
Maximum number of days between password change    : 180
Number of days of warning before password expires    : 7
```

　変更するときは次のオプションを使います．

|オプション|項目|意味|
|:---:|---|---|
|-m|mindays|パスワードを変更してから次に変更できるようになるまでの最小日数を変更|
|-M|maxdays|同じパスワードを使用できる最大日数を変更|
|-W|warndays|パスワードの期限が切れる警告を何日前から行うかを変更|

　このコマンドを使用して，各ユーザーごとに設定を変更することができます．
 
```shell-session
# 例：ユーザenryuのパスワード更新最小日数を0にする
$ sudo chage -m 0 enryu
```

　他のオプションについてはセキュアなアカウント制御の回でお話しします．
 
# 暗号化アルゴリズムの設定
## 暗号化アルゴリズムの種類
　パスワードを暗号化するアルゴリズムにはいろいろ種類があります．ひと昔前は標準的な暗号方式の規格である**DES**が一般的でした．今使っているCentOS6.8では**MD5**によるハッシュ化が用いられています．
 
　しかし，DESは8文字までのパスワードしか扱えず，MD5は脆弱性が発見されてパスワードを破られる可能性が出てきたため，CentOS7からは**SHA-2**というハッシュ化方式が取られています．
 
　暗号化アルゴリズムの方式は，時代を経るにしたがってまだまだ移り変わっていくでしょう．そのたびに新しい方式へと設定を直していく必要があるのです．
 
　ここでは，SHA-2のひとつ，**SHA512**という方式に設定しましょう．
 
　再び**PAMのsystem-auth**を変更します．
 
```shell-session
# cオプションは起動時にコマンドを実行する
$ sudo vi /etc/pam.d/system-auth -c "set number"
```

```text:/etc/pam.d/system-auth
    :
18 password sufficient pam_unix.so md5 shadow nullok remember=3 try_first_pass use_authtok
↑この行のMD5をSHA512に変更↓
18 password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
    :
```

# 設定の反映
　以上でパスワードに関する設定が完了したわけですが，このままでは設定は反映されません．設定の仕方によって，反映されるタイミングは様々です．
 
## login.defsの設定の反映
　login.defsで設定した内容は，useraddで新しくアカウントを作るか，pwconvでshadowファイルを作り直すときに反映されます．useraddの場合は，既存のアカウントへは反映されないので，pwconvしなおすのが良いでしょう．
 
```shell-session
# pwconvしなおす場合
$ sudo pwunconv
$ sudo pwconv
# 確認
$ chage -l USERNAME
```

　なおchageによる設定はその場で反映されます．
 
## PAMの設定
　PAMで設定したパスワードポリシーや，パスワードの暗号化方式は，新たにパスワードを発行するときに有効になります．したがって，既存のパスワードは以前の暗号化形式のままになっています．したがって，各ユーザが次回ログインするときに，パスワードを変更させる必要があります．
 
```shell-session
# 自分で行う場合
$ passwd
# 次回ログイン時にUSERに変更させる場合
$ passwd -e USER
```

---- 以上

# 参考ページ
##### [パスワードをシャドウパスワードに変更するには][1]
##### [Linuxでパスワードポリシーを設定する｜俺的備忘録 〜なんかいろいろ〜][2]
##### [CentOS/パスワードの長さや文字などの制限事項を設定する方法][5]
##### [[FreeBSD]パスワードハッシュにmd5を使うのは小学生までだよねー][3]
##### [Linux,UNIXで次回ログイン時にパスワードを変更させる][4]

# こちらもよろしくお願いいたします．
### [エンリュの迷い森｜トップページ][blogtop]

[blogtop]: http://lost-in-forest.hatenablog.com/entry/toppage
[a00d]: http://lost-in-forest.hatenablog.com/entry/a00d

[1]: http://www.atmarkit.co.jp/flinux/rensai/linuxtips/034shadwpaswd.html
[2]: https://orebibou.com/2014/05/linux%E3%81%A7%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/
[3]: http://d.hatena.ne.jp/flageo/20130113/p1
[4]: https://orebibou.com/2014/05/linuxunix%E3%81%A7%E6%AC%A1%E5%9B%9E%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%99%82%E3%81%AB%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%95%E3%81%9B%E3%82%8B/
[5]: http://linux.just4fun.biz/CentOS/%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AE%E9%95%B7%E3%81%95%E3%82%84%E6%96%87%E5%AD%97%E3%81%AA%E3%81%A9%E3%81%AE%E5%88%B6%E9%99%90%E4%BA%8B%E9%A0%85%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.html