情報セキュリティの基本 ~root権限の保護~

　ここでは，**root権限の保護**についてまとめていきます．よろしくお願いいたします．
 
### 目次

* [root権限の保護](#root権限の保護)
    * [root権限にアクセスできるプログラム・サービス](#root権限にアクセスできるプログラムサービス)
    * [root権限へのアクセスを拒否する方法](#root権限へのアクセスを拒否する方法)
* [rootシェルの無効化](#rootシェルの無効化)
* [securettyの設定](#securettyの設定)
* [OpenSSHのrootログインの無効化](#opensshのrootログインの無効化)
* [PAMによるアクセス制限](#pamによるアクセス制限)
* [その他の防御手段](#その他の防御手段)
    * [suの権限](#suコマンドの権限を制限)
    * [sudoの権限](#sudoersを設定してsudoの権限を制限)
    * [シングルユーザモードの禁止](#シングルユーザモードの禁止)
    * ブートローダのセキュア化
    * ブートローダのインタラクティブモードの禁止
* [参考ページ](#参考ページ)

# 環境

* Cent OS 6.8

　より細かい環境については，[ブログ][blogtop]を参考にしてください．
 
　また，今回の内容はブログの第15回により詳しく掲載しておりますので参考にしてください．
 
　　 [【第15回】情報セキュリティの雪山(3) ~root権限の保護~][a00f]
 
# root権限の保護
## root権限にアクセスできるプログラム・サービス
　root権限にアクセスできるプログラム・サービスを一覧にすると，次のようになります．

* login
* gdm, kdm, xdmなどのディスプレイマネージャ
* ttyを開くその他のネットワークサービス
* su
* ssh, scp, sftpなどのOpenSSHを使用するプログラム
* sudo
* FTPクライアント
* Emailクライアント

## root権限へのアクセスを拒否する方法
　root権限へのアクセスを拒否する方法は，対象とするサービスによって異なります．ここでは，次のような方法でroot権限へのアクセスを拒否していきます．それぞれの方法が上で挙げたサービスに対して有効かどうかと合わせてみていきましょう．有効であればo, 無効または影響がない場合は-で表示しています．

|アクセス拒否方法|概要|login|DM|su|sudo|SSH|FTP|Email|
|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|rootシェルの無効化|rootのログインシェルを無効化します|o|o|o|-|o|-|-|
|securettyの設定|securettyファイルを編集してrootアカウントがログインできるttyを制限します|o|o|-|-|-|o|o|
|SSHのrootログインの無効化|OpenSSHの設定を変更しSSH経由のrootログインを無効化します|-|-|-|-|o|-|-|
|PAMによるアクセス制限|PAMを使用してサービスへのrootアクセスを制限します|o|o|o|o|o|o|o|

　これらの対策を行って，何重にもセキュリティウォールを築いておくことが大切です．それでは早速作業を始めていきましょう．なお，**この作業を始めてしまうとrootアカウントに簡単にはアクセス出来なくなってしまいます**ので，sudoなどで管理者用のユーザーアカウントから**root権限が使えることを確かめてから**行ってください．仮想マシンのバックアップを取っておくのもいいでしょう．

# rootシェルの無効化
　rootアカウントのログインシェルは，デフォルトではbashになっています．これを**nologinシェルに変更してアクセスを阻止し，アクセス試行をログに記録する**ようにします．FTPクライアントやEmailクライアントには影響がないことに注意しましょう．
 
　ログインシェルについてはこちらの記事([セキュアなアカウント管理#ログインシェルの管理][a00e#1])も参考にしてください．
 
```shell-session
$ usermod -s /sbin/nologin root
$ getent passwd root
$ su -
```

![refuse_root#1_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/fffca332-71d0-9839-4408-ce53c61d915b.png)

# securettyの設定
　**securetty**ファイルはrootログインが可能なttyデバイスを指定します．
 
```shell-session
$ sudo cat /etc/securetty
```

![refuse_root#2_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/463544cc-4aa2-1bb3-4fe9-4ab181a68aea.png)

　バックアップを取ってから，このファイルを空にしましょう．なお，**このファイル自体を削除してしまうと，どのデバイスからでもrootログインが可能になってしまう**ため注意しましょう．

```shell-session
$ sudo cp /etc/securetty /etc/securetty.bak
$ sudo vi /etc/securetty
> dG    # ファイルの末尾まで全消去
> :wq
```

　次にディスプレイマネージャのログイン処理時のPAM認証にsecurettyのチェックを加えます．以下のPAMの設定ファイルの先頭に
 
```text:pam_securetty.soの追加
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
```

を追加します．追加するPAM設定ファイルは，

* /etc/pam.d/gdm
* /etc/pam.d/gdm-autologin
* /etc/pam.d/gdm-fingerprint
* /etc/pam.d/gdm-password
* /etc/pam.d/gdm-smartcard
* /etc/pam.d/kdm
* /etc/pam.d/kdm-np
* /etc/pam.d/xdm

のうち存在するものです．また，/etc/pam.d/loginには元から記述されています．

　viでloginごとまとめて開き，該当行をコピーしていくと楽でしょう．`yy`で行のコピー，`Shift+p`で上の行に貼り付け， `p`で下の行に貼り付け，`:wn`で保存して次のファイルに移動です．

![refuse_root#2_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/bde17420-2f75-e8c6-b82b-b754e7bac607.png)

# OpenSSHのrootログインの無効化
　**SSHプロトコル**とは，暗号化された通信を利用して外部から接続する方式で，SSHサーバを立てることでどこからでもアクセスができる便利なサービスを提供します．しかし，**便利なものはそれだけ危険がつきまとう**もの．**セキュアな設定を常に意識する**必要があります．
 
　SSHの設定ファイルは/etc/ssh/sshd_configです．今回はこの中の**PermitRootLogin**のパラメータを設定します．
 
　PermitRootLoginの値は**yes, without-password, forced-commands-only, no**があります．デフォルトではyesになっています．通常はrootログインを拒否し，コマンドオプションを設定したときのみ許可するのがforced-commands-onlyです．完全にrootログインを拒否するのがnoです．設定はこのどちらかにしましょう．ここではnoにします．
 
```shell-session
$ sudo vi /etc/ssh/ssh_config
```

![refuse_root#3_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/1f569622-03fd-bf25-3cd9-28a222c20c01.png)

# PAMによるアクセス制限
　PAMはこれまでも何度となく扱ってきました．suをwheelに限定する際は**pam_wheel**モジュールを使い，物理コンソールでログインしたユーザーにroot権限が必要なコマンドの実行許可を与える際は**pam_console**モジュールを使いました．今回使用するのは**pam_listfile**モジュールです．これは，ファイルにリストされたユーザーやホスト名にサービスの実行許可を与えたり，逆に禁止したりすることができます．`man pam_listfile`で使い方を調べることができます．簡単な使い方は以下の通りです．
 
```text:pam_listfile.soの使い方
# リストに書かれていれば許可
auth required pam_listfile.so onerr=fail item=user sense=allow file=FILENAME
# リストに書かれていたら拒絶
auth required pam_listfile.so onerr=succeed item=user sense=deny file=FILENAME
```

　今はまだ追加すべきファイルがないので割愛しますが，上の3つの方法で制限しきれないときはこちらの方法を使っていきます．使うことがあれば逐次追記していきたいと思います．

# その他の防御手段
## suコマンドの権限を制限
　suコマンドはログイン処理によるroot昇格が可能なコマンドです．suコマンドによる昇格を制限する必要があります．こちらを参考に設定を行ってください．
 
* [Qiita：目指せLinuxマスター(弐) ~suコマンドの権限~][a00c]
    * wheelグループ以外のユーザーのsuをすべて禁止する設定にしていましたが，rootへの昇格のみを制限するように変更しました．ご確認ください．

## sudoersを設定してsudoの権限を制限
　sudoコマンドはrootアカウントにログインすることなく，root権限でコマンドを実行できるようにします．sudoの権限はsudoersファイルで設定します．こちらを参考に設定を行ってください．
 
 * [Qiita：目指せLinuxマスター(壱) ~CUI/GUIからの強制終了/再起動権限~ #CUIでの権限 - visudoの編集][a009]

　今回扱うroot権限保護の手段は以上となりますが，root権限へのアクセス手段はまだまだあります．特に，物理マシンを直接操作できる環境においては，root保護のセキュリティシステムを解除する手段が色々と残っています．
 
　しかし，あまり雁字搦めにしすぎると，トラブルが発生して通常の方法でログインできなくなった場合などに，正規のシステム管理者がアクセスできなくなるという懸念があります．私の作業する環境では，これ以上の厳密さは不要と考えますので，以下の内容は参考程度に記すまでに留めておこうと思います．
 
　情報セキュリティは，**何から何を守るのか，どの程度コストをかけて守るのか**を常に考える必要があります．
 
## シングルユーザモードの禁止
　Linuxには，**シングルユーザモード**という起動方法があります．私たちが普段使っているのは**グラフィカルモード**，GUIなしの場合は**マルチユーザモード**で，どちらもアカウントを選択してログインしますが，シングルユーザモードは，rootアカウントでのみログインできます．
 
　起動モードはシステムの起動時に変更することができ，例えばrootのパスワードを忘れてしまったときなどに利用して，新たにパスワードを設定することができます．
 
　また，ランレベルを1にして起動しても同様にシングルユーザモードで起動します．
 
　これらを制限するには，**ブートローダのパスワード保護**が必要になります．また，**ブートローダのインタラクティブモードを回避**する必要もあります．
 
　ブートローダの設定などは，Red Hat Enterprise Linuxのマニュアルなどを参考にするとよいでしょう．
 
* [RHEL 7 - セキュリティガイド][rhel1]
* [RHEL 7 - システム管理者のガイド][rhel2]

---- 以上

# 参考ページ
* [RHEL 7 - セキュリティガイド 4.2. ROOT アクセスの制御][1]
* [ゼロから始めるLinuxセキュリティ][2]
* [シングル・ユーザー・モード - ITPro][3]

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

[blogtop]: http://lost-in-forest.hatenablog.com/entry/toppage
[a00f]: http://lost-in-forest.hatenablog.com/entry/a00f
[a00e#1]: http://qiita.com/LostEnryu/items/9b0c363877581dc1171f#ログインシェルの管理
[a009]: http://qiita.com/LostEnryu/items/74dbdab6a70fb11b155c#cui%E3%81%A7%E3%81%AE%E6%A8%A9%E9%99%90-%E3%83%BC-visudo%E3%81%AE%E7%B7%A8%E9%9B%86
[a00c]: http://qiita.com/LostEnryu/items/e3d49b7c5ab81f641bef

[1]: https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Controlling_Root_Access.html
[2]: http://www.atmarkit.co.jp/flinux/index/indexfiles/securityindex.html
[3]: http://itpro.nikkeibp.co.jp/article/Keyword/20071101/286165/

[rhel1]: https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Controlling_Root_Access.html#sec-Securing_the_Boot_Loader
[rhel2]: http://access.redhat.com/site/documentation/jp-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/ch-Working_with_the_GRUB_2_Boot_Loader.html