Linux

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

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

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

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

 言語情報は地域、文字セットとともに Locale として設定します。 現在の Locale の設定や利用できる Locale 名を表示するには GNU Cライブラリlocale をつかいます。

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 などです。

/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

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

 時刻系やタイムゾーンは /etc/sysconfig/clock に設定します。また、タイムゾーン情報は tzdata のバイナリファイルを /etc/localtime に保存します。

/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

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

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

/etc/sysconfig/keyboard
$ sudo vi /etc/sysconfig/keyboard

KEYTABLE="jp106"
KEYBOARDTYPE="pc"

 kbdloadkeys をつかって一時的に変更することもできます。

loadkeys
$ loadkeys jp106
Loading /lib/kbd/keymaps/i386/qwerty/jp106.map.gz

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

(参考) man pages | KBD

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

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

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

/etc/sysconfig/network
$ sudo vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=localhost.localdomain

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

/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"

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

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

(参考) ネットワーキング – Red Hat Customer Portal

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

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

/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 に設定します。

/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 に設定します。

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

(参考)

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

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

getenforce
$ getenforce
Enforcing

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

setenforce
$ sudo setenforce 0
$ getenforce
Permissive

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

/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 をつかいます。

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 <ブール値名> <値> をつかいます。

setsebool
$ sudo setsebool -P httpd_can_network_connect_db on

(参考) Scientific Linux 6 でのSELinux管理コマンドまとめ | 複眼中心

パケットフィルタリングの設定(iptables)

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

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

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) オプションを追加します。

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 するという内容になります。

(参考)

自動起動の設定(chkconfig)

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

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 にしてください。

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 をつかいます。

/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

参考