CentOS 6 のシステム設定を確認する

> [!NOTE]
> この記事は 2013/09/01 に [momoto.github.io](http://momoto.github.io) へ投稿した内容を Qiita へ移行してきたものです

　CentOS 6 の基本的なシステム設定を確認します。 ここでいうシステム設定は、地域化、ネットワーク、セキュリティ、サービス管理 などの設定を対象にしています。デスクトップ環境や外観の設定は含みません。 また、各機能については基本的な設定までを概観するにとどめて、詳細な設定までは踏み込みません。

## 言語の設定 (/etc/sysconfig/i18n)

　言語情報は地域、文字セットとともに Locale として設定します。 現在の Locale の設定や利用できる Locale 名を表示するには [GNU Cライブラリ](https://www.gnu.org/software/libc/) の [locale](https://www.gnu.org/software/libc/manual/html_node/Locales.html) をつかいます。

```shell-session:locale
$ locale
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=

$ locale -a | grep -Ei "ja|jp"
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
```

　Locale は LANG 変数に設定します。 一時的な変更であれば `$ export LANG=ja_JP.UTF-8` のようにコマンドで定義するか、永続的な変更であればファイルに変数を定義します。 変数を定義するファイルは、システム全体に適用する場合は `/etc/sysconfig/i18n`、ユーザごとに適用する場合は `~/.bashrc` などです。

```shell-session:/etc/sysconfig/i18n
$ LANG=ja_JP.UTF-8
$ locale | sudo tee /etc/sysconfig/i18n
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```

　日本語を設定する場合の注意点として、Locale名は `ja_JP.utf8` ではなく `ja_JP.UTF-8` を使用したほうが良いようです。

（参考） [ただのメモ: ja_JP.UTF-8 vs ja_JP.utf8](http://blog.at-dk.info/2011/03/jajputf-8-vs-jajputf8.html)

## システム時刻の設定 (/etc/sysconfig/clock)

　時刻系やタイムゾーンは `/etc/sysconfig/clock` に設定します。また、タイムゾーン情報は [tzdata](https://www.iana.org/time-zones) のバイナリファイルを `/etc/localtime` に保存します。

```shell-session:/etc/sysconfig/clock
$ sudo vi /etc/sysconfig/clock

ZONE="Asia/Tokyo"
UTC=false

$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

（参考） [Date and Time – The GNU C Library](https://www.gnu.org/software/libc/manual/html_node/Date-and-Time.html#Date-and-Time)

## キー配列の設定 (/etc/sysconfig/keyboard)

　キー配列は `/etc/sysconfig/keyboard` に設定します。KEYTABLE に指定できる値は `/lib/kbd/keymaps/i386/<配列>/<表名>.map.gz` にある表名です。日本語 106 であれば jp106 を設定します。

```shell-session:/etc/sysconfig/keyboard
$ sudo vi /etc/sysconfig/keyboard

KEYTABLE="jp106"
KEYBOARDTYPE="pc"
```

　[kbd](http://kbd-project.org) の [loadkeys](http://kbd-project.org/manpages/man1/loadkeys.1.html) をつかって一時的に変更することもできます。

```shell-session:loadkeys
$ loadkeys jp106
Loading /lib/kbd/keymaps/i386/qwerty/jp106.map.gz
```

　`/etc/sysconfig/keyboard` の設定は X Window System のキーボード設定とは異なります。

（参考） [man pages | KBD](http://kbd-project.org/manpages/index.html)

## ネットワークの設定 (/etc/sysconfig/{network,network-scripts/})

　ネットワークの設定は、ネットワークインタフェースによらないグローバルな設定とインタフェースごとに固有の設定とでファイルがわかれています。

　グローバルな設定では `/etc/sysconfig/network` にホスト名やゲートウェイなどの情報を設定します。

```shell-session:/etc/sysconfig/network
$ sudo vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=localhost.localdomain
```

　インタフェースごとの設定では `/etc/sysconfig/ifcfg-<インタフェース名>` に DHCP の利用するかどうか、DHCP を利用しない場合の IP 情報などを設定します。

```shell-session:/etc/sysconfig/network-scripts/ifcfg-eth0
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
BOOTPROTO="dhcp"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
```

　設定ファイルを書き換えたらネットワークサービスを再起動して変更を反映します。

```shell-session
$ sudo service network restart
インターフェース eth0 を終了中:                            [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:
eth0 のIP情報を検出中... 完了。
                                                           [  OK  ]
```

（参考） [ネットワーキング – Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/part-networking)

## 名前解決の設定 (nsswitch.conf、host.conf、hosts、resolv.conf)

　名前解決の方法の順序は `/etc/nsswitch.conf` に設定します。

```shell-session:/etc/nsswitch.conf
  $ sudo vi /etc/nsswitch.conf

  ...
  #hosts:     db files nisplus nis dns
  hosts:      files dns
  ...
```

　`/etc/host.conf` にも同様の設定がありますが、CentOS 6では `nsswitch.conf` が優先されるようです（System V系とBSD系のちがい？）。ローカルホストでのみ有効なホストテーブルは `/etc/hosts` に設定します。

```shell-session:/etc/hosts
  $ sudo vi /etc/hosts

  127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

　ネームサーバのIPアドレスは `/etc/resolv.conf` に設定します。

```shell-session:/etc/resolv.conf
  $ sudo vi /etc/resolv.conf
  ; generated by /sbin/dhclient-script
  nameserver 10.0.2.3
```

（参考）

- [Man page of NSSWITCH.CONF](http://linuxjm.osdn.jp/html/LDP_man-pages/man5/nsswitch.conf.5.html)
- [Man page of HOST.CONF](http://linuxjm.osdn.jp/html/LDP_man-pages/man5/host.conf.5.html)
- [Man page of HOSTS](http://linuxjm.osdn.jp/html/LDP_man-pages/man5/hosts.5.html)
- [Man page of RESOLV.CONF](http://linuxjm.osdn.jp/html/LDP_man-pages/man5/resolver.5.html)

## SELinuxの設定 (/etc/sysconfig/selinux)

　現在の SELinux の状態を表示するには `getenforce` をつかいます。 SELinux の状態は Enforcing（SELinux が有効、ポリシーは強制される）、Permissive（SELinux が有効、ポリシーは強制されない）、Disabled（SELinux が無効）のいずれかです。 ポリシーが強制されるとルールに基づいてアクセスが制限されます。 強制されない場合はアクセスの制限はありませんが、ルールに反するアクセスがログに記録されます。

```shell-session:getenforce
$ getenforce
Enforcing
```

　一時的に Enforcing、Permissive を切替えるには `setenforce` をつかいます。`setenforce 0` で Permissive へ、`setenforce 1` で Enforcing へ切り替わります。

```shell-session:setenforce
$ sudo setenforce 0
$ getenforce
Permissive
```

　永続的に状態を切り替えるには `/etc/sysconfig/selinux` の `SELINUX=<状態>` を設定して、システムを再起動します。SELinux を無効化する場合は `SELINUX=disabled` を設定します。

```shell-session:/etc/sysconfig/selinux
$ sudo vi /etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=disabled

$ sudo reboot
```

　SELinux には、ポリシー記述の知識がなくても変数の on/off を切り替えるだけでポリシーを変更できるブール値が用意されています。このブール値の一覧を表示するには `getsebool -a` をつかいます。

```shell-session:getsebool
$ getsebool -a | head
abrt_anon_write --> off
abrt_handle_event --> off
allow_console_login --> on
allow_cvs_read_shadow --> off
allow_daemons_dump_core --> on
...
```

　ブール値を変更するには `setsebool -P <ブール値名> <値>` をつかいます。

```shell-session:setsebool
$ sudo setsebool -P httpd_can_network_connect_db on
```

（参考） [Scientific Linux 6 でのSELinux管理コマンドまとめ | 複眼中心](https://rewse.jp/blog/p/4825)

## パケットフィルタリングの設定（iptables）

　iptables 管理ツールをつかって、パケットフィルタリングのルール (Netfilterのfilterテーブル) までを簡単に見ていきます。 この記事で扱うのは iptables の機能のほんの一部で、その他の機能 (nat、mangle や ip6tables) については扱いません。

　現在のパケットフィルタリングのルールを表示するには `iptables -L` をつかいます。

```shell-session:iptables
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

　上の出力例は、テーブル（filter）に設定された 3 つのチェーン（INPUT、FORWARD、OUTPUT）と各チェーンのルール（INPUT に 5 行、FORWARD に 1 行、OUTPUT に 0 行）の内容を表示しています。 この場合、OUTPUT チェーンにはルールが何も設定されておらず、OUTPUT のポリシーには ACCEPT が設定されているので、ローカルからネットワークへ出ていくパケットに適用されるのは常に ACCEPT です。 一方、INPUT チェーンのポリシーにも ACCEPT が設定されていますが、INPUT にはルールが 5 つ設定されているので、ネットワークからローカルへ入ってくるパケットはルールのマッチオプションに一致する target が適用されます。

　iptables の `-L (--list)` オプションだけではルールのマッチオプションまで詳しく表示されないので、より詳しい出力を表示させるには `-v (--verbose)` オプションを追加します。

```shell-session:iptables
$ sudo iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 2290  234K ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
   27  2268 ACCEPT     icmp --  any    any     anywhere             anywhere
   26  1560 ACCEPT     all  --  lo     any     anywhere             anywhere
    3   132 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:ssh
    1    40 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 1534 packets, 283K bytes)
 pkts bytes target     prot opt in     out     source               destination
```

　`-L (—list)` だけでは表示されていなかった pkts, bytes, in, out の列が表示されています。それぞれの列が示しているのは次のような内容です。

|列名|説明|
|:---|:---|
|**pkts**|ルールにマッチしたパケット数|
|**bytes**|同バイト数|
|**target**|ルールにマッチしたパケットに対するターゲット|
|**prot**|ルールを適用するプロトコル|
|**opt**|パケットの断片化の区別|
|**in**|ルールを適用する入力インタフェース|
|**out**|ルールを適用する出力インタフェース、INPUT チェーンでは指定不可|
|**source**|ルールを適用するパケットの送信元アドレス|
|**destination**|ルールを適用するパケットの送信先アドレス|
|**追加のマッチオプション**|拡張マッチモジュール (state や reject-with など) |

　上記例の INPUT チェーン 1 行目のルールだけ見てみると、プロトコル、インタフェース、送信元・送信先のいずれも指定していませんが、 state モジュールによって既に接続が確立している状態 (ESTABLISHED) と既存の接続に関連して新しく接続された状態 (RELATED) を指定していて、 プロトコル、インタフェース等を問わず既存の接続は ACCEPT するという内容になります。

（参考）

- [ファイアウォール – Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-firewalls)
- [Man page of IPTABLES](http://linuxjm.osdn.jp/html/iptables/man8/iptables.8.html)
- [Man page of iptables-extensions](http://ipset.netfilter.org/iptables-extensions.man.html)

## 自動起動の設定（chkconfig）

　サービスの自動起動は `chkconfig` で設定します。サービスと現在の設定の一覧を表示するには `chkconfig --list` をつかいます。

```shell-session:chkconfig
$ chkconfig --list
NetworkManager  0:off   1:off   2:on    3:on    4:on    5:on    6:off
abrtd           0:off   1:off   2:off   3:on    4:off   5:on    6:off
acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
anamon          0:off   1:off   2:off   3:off   4:off   5:off   6:off
atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
...
```

　上記の一覧は一行ずつ、サービス名とどのランレベル (0〜6) で起動するか (on/off) を示しています。

　サービスの自動起動を有効にするには `chkconfig <サービス名> on` をつかいます。無効にするには `chkconfig <サービス名> off` にしてください。

```shell-session:chkconfig
$ sudo chkconfig httpd on
$ chkconfig --list httpd
httpd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

　ランレベルとは、システムの状態（シングルユーザモードかマルチユーザモードなど）によって切り替わる数字です。CUI のマルチユーザモードであれば 3、GUI のマルチユーザモードであれば 5 が、CentOS 6 のデフォルトです。 ランレベルについて詳しく踏み込みませんが `/etc/inittab` のコメントで少し説明されています。現在のランレベルを確認するには`runlevel` をつかいます。

```shell-session:/etc/inittab
$ tail /etc/inittab

# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

$ runlevel
N 3
```

（参考） [10.2.3. chkconfig ユーティリティの使用 – Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s2-services-chkconfig)

## 参考

- [導入ガイド – Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/index)
- [セキュリティガイド – Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security_guide/index)
- [Security-Enhanced Linux – Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security-enhanced_linux/index)