情報セキュリティの基本 ~セキュアなアカウント管理~

　ここでは，セキュリティを重視したアカウント管理を行っていきます．
 
### 内容

* [不要になったアカウント](#不要になったユーザーアカウント)
    * [削除](#削除する)
    * [ロック](#ロックする)
    * [管理者グループから退会](#管理者グループwheelから退会させる)
* [アカウントの有効期限](#アカウントの有効期限)
* [ログインシェルの管理](#ログインシェルの管理)
    * [無効なシェル](#無効なシェルの設定)
    * [falseとnologin](#falseとnologin)
    * [システムアカウント](#システムアカウントのログインシェル)
* [パスワードの有効期限](#パスワードの有効期限)


# 環境

* Cent OS 6.8

　より細かい環境については，[ブログ][blogtop]を参考にしてください．
 
　また，今回の内容はブログの第14回により詳しく掲載しておりますので参考にしてください．
 
　　 [【第14回】情報セキュリティの雪山(2) ~セキュアなアカウント管理~][a00e]
 

# 不要になったユーザーアカウント
## 削除する
　まずは不要になったユーザーアカウントを削除します．ユーザーの削除は**userdel**コマンドによって行います．
 
```shell-session
$ sudo userdel -r USERNAME
# 削除するユーザが使用中の場合，fオプションで強制削除できます
$ sudo userdel -rf USERNAME
```

## ロックする
　もしまたアカウントを使用する可能性がある場合でも，ログインできないようロックしておくことは必要です．アカウントのロックは**passwd**コマンドで行うことができます．
 
```shell-session
$ sudo passwd -l USERNAME
```

　ロックを解除するときはuコマンドを使います．
 
```shell-session
$ sudo passwd -u USERNAME
```

## 管理者グループwheelから退会させる
　管理者交代など，アカウントは残したままだがアクセス権限を変えたいときは，グループから退会させることで制御できるようにするといいでしょう．ここではwheelグループが管理者権限を有するグループとして設定してありますので，前の管理者をグループから退会させることで管理者権限を返還させます．

```shell-session
$ sudo gpasswd -d USERNAME wheel
```

# アカウントの有効期限
　あらかじめアカウントの有効期限を決めておくことも重要です．アカウントにはEXPIRE_DATEを設定でき，この日付を超えるとログインできなくなります．

## 既存のアカウント
```shell-session
# 既存のアカウントの有効期限はchage-Eまたはusermod-eで設定します.
# 日付はYYYY-MM-DDの形式か1970-1-1を0日目として数えた日数で指定します．
$ sudo chage -E YYYY-MM-DD USERNAME
または
$ sudo usermod -e YYYY-MM-DD USERNAME
# 確認はchage-lでできます．
$ sudo chage -l USERNAME
```

## 新規のアカウント
　アカウントを新規に作る際にオプションで有効期限を設定することができます．
 
```shell-session
$ sudo useradd USERNAME -e YYYY-MM-DD
```
 
　また，ユーザー作成時にオプションで指定されなかった値については，/etc/default/useraddに書かれたデフォルト値を使用します．デフォルト値は，直接ファイルを編集するかコマンドを介して変更することができます．
 
```shell-session
# -Dオプションのあとにオプションを続けることでデフォルト設定を変更します．
$ sudo useradd -D -e YYYY-MM-DD
# 確認は-Dオプション単独でできます．
$ sudo useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=yyyy-mm-dd    # 設定した値
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
```

# ログインシェルの管理
## 無効なシェルの設定
　ユーザーがログインしたとき，passwdファイルに書かれた**ログインシェル**を使ってログインします．**/bin/bash, /bin/sh**などが有効なログインシェルで，シェルが起動することでユーザーはシステムの操作を行うことができます．
 
　アカウントには，ログインを想定していないものもあります．ftpやsshdなどの**システムアカウント**がそれです．こうしたアカウントのログインシェルに有効なシェルが設定されてしまうと，それを介して不正ログインが行われる場合もあります．また，ログインを想定しないユーザーアカウントも，ログインシェルに無効なシェルを変更することでログインできなくすることができます．
 
　システムアカウントやログインを想定しないユーザーアカウントのログインシェルには，**/bin/false**という無効なシェルを設定する必要があります．

```shell-session
# ログインシェルの確認はpasswdファイルでできます．
$ getent passwd enryu
enryu:x:500:500:Lost Enryu:/home/enryu:/bin/bash
↑一番末尾に記載されている/bin/bashがログインシェルになります

# 有効なシェルは/etc/shellsファイルで確認できます．chshコマンドを使います．
$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
    :
    
# 無効なシェルに変更します
$ sudo chsh /bin/false USERNAME
または
$ sudo usermod -s /bin/false USERNAME
# 新規ユーザーの場合
$ sudo useradd -s /bin/false USERNAME
```

## falseとnologin
　**/sbin/nologin**というログインできないシェルもあります．これはログインはできませんが，正当なシェルになっているため起動することができます．正当なシェルとは**/etc/shells**に定義されたもので，**FTPでのログイン**ができてしまいます．nologinは起動すると，ログイン試行のログを残してからメッセージを残してログインを拒否します．
 
　サイトによって言っていることはまちまちですが，システムアカウントには/bin/false，ログインを想定しないユーザーアカウントには/sbin/nologinを使うのがいいのかなと思います．
 
```shell-session:/bin/falseと/sbin/nologinの挙動
# /bin/falseへのログイン
$ su user
Password:
$        # パスワードを入力したのち，何も起こらず終了します


# /sbin/nologinへのログイン
$ su user
Password:
This account is currently not available.
$        # シェルは起動し，内部の処理でログインが拒否されます
```

## システムアカウントのログインシェル
　CentOS6.8はデフォルトでシステムアカウントのログインシェルに/sbin/nologinが指定されています．パスワードがロックされているためログインはできませんから，このままでも問題はありませんが，このロックはroot権限で解除できますから，念のために上述の通り/bin/falseに変更します．まとめて変更する場合は直接/etc/passwdを変更する方が効率的でしょう．
 
```shell-session
$ sudo vi /etc/passwd
```

　`:%s;/sbin/nologin;/bin/false/gc`で確認しながらまとめて置換します．
 
# パスワードの有効期限
　万が一パスワードが漏洩してもアカウントが不正利用されるリスクを減らすために，パスワードの有効期限を設定してこまめに変更させるようにしましょう．パスワードに関する設定はこちらをご覧ください．

* [Qiita：情報セキュリティの基本 ~パスワードの強化~ #パスワードポリシーの設定][qiita2]


　今回扱うセキュアなアカウント管理方法は以上となりますが，実際には組織内で**どのようにアカウントを運用していくか，誰がどれだけの権限でいつまで管理していくか**などの**ポリシー**を定めておくことが大切です．刻々と変化する運用状況の中で，常にアカウントの管理について考えていくことを忘れないようにしましょう．

---- 以上

# 参考ページ
* [ゼロから始めるLinuxセキュリティ(1)：インストール直後に絶対やるべき作業と設定][1]
* [知らないと危険な false と nologin の挙動の違い][2]
* [ログインできないユーザの作成とログインできるように変更するコマンドの使用方法][3]
* [/bin/false と /sbin/nologin と /etc/shells について][4]


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

[blogtop]: http://lost-in-forest.hatenablog.com/entry/toppage
[a00e]: http://lost-in-forest.hatenablog.com/entry/a00e
[qiita2]: http://qiita.com/LostEnryu/items/4e439dbf1a61388cc61d#パスワードポリシーの設定

[1]: 
http://www.atmarkit.co.jp/ait/articles/0108/18/news003.html
[2]: http://blog.archinwaterworks.com/2014/06/false_or_nologin/
[3]: http://server-setting.info/centos/login_user.html
[4]: http://d.hatena.ne.jp/littlebuddha/20090805/1249457771