CentOS7でサーバを構築する際におこなっている基本設定
以前書いた
CentOS6でサーバを構築する際におこなっている基本設定 - オープンソースこねこね
のCentOS7バージョンです。調査中の内容もあるので、情報は随時更新する予定です。
※ここではサーバのロールにかかわらず行う基本的な作業をまとめています。通常この環境の上にWebサーバ(httpd, nginxなど)やDB(MySQLなど)をインストールすることになります。
※本文中のコマンドは基本的にrootユーザで行っているものとします。一般ユーザを使い必要に応じて都度root権限を使うようにしている方はsudo
をつけるなど、コマンドを読み替えてください。
- デフォルトターゲットの確認
- サービスの起動設定の確認
- ディクスサイズの確認
- ロケールの設定
- タイムゾーンとNTPの設定
- ネットワーク関連の設定
- yumリポジトリ
- bash-completion
- ファイアウォール (firewalld)
- sshd
- ログの管理
- logrotate
- sysctl
デフォルトターゲットの確認
systemctl get-default
で取得。CentoOS6までのデフォルトランレベルに相当します。
# systemctl get-default multi-user.target
multi-user.target
になっていることを確認します。
サービスの起動設定の確認
サービスの管理はsystemdによる管理に刷新されています。
systemctl list-unit-files
でサービスの一覧と状態を取得します。
# systemctl list-unit-files --type service --no-pager UNIT FILE STATE arp-ethers.service disabled auditd.service enabled auth-rpcgss-module.service static autovt@.service disabled blk-availability.service disabled brandbot.service static chrony-dnssrv@.service static
STATEの意味は以下の通り。
不要と思われるサービスはサーバリソースの無駄使いになるので、以下のコマンドで停止設定にしておきます。
# systemctl disable nginx.service # systemctl stop nginx.service
OSの起動時に実行させたいサービスは
# systemctl enable nginx.service # systemctl start nginx.service
としておきます。
ディクスサイズの確認
# df -h
サーバスペックにあったディクスサイズになっていることや、パーティションを確認します。
ロケールの設定
現在のロケールの設定を確認します。
# localectl status
利用可能なロケールをlocalectl list-locales
を調べ、
# localectl list-locales --no-pager
localectl set-locale
で変更。
# localectl set-locale LANG=ja_JP.utf8
ロケールを日本語にしたとき、manページを日本語にするために
# yum install man-pages-ja
をインストールします。
タイムゾーンとNTPの設定
現在のタイムゾーンを確認します
# timedatectl status
利用可能なタイムゾーンをtimedatectl list-timezones
で調べます
# timedatectl list-timezones --no-pager
timedatectl set-timezone
で変更。
# timedatectl set-timezone Asia/Tokyo
RTC in local TZ: yes
の設定になっていると警告がでるので以下を設定する
# timedatectl set-local-rtc 0
CentOS7では時刻同期サービスが2つあって従来のntpd
と新しいchronyd
がある。最小構成でOSインストールした場合は
chronyd
だけがインストールされている状態になっているはず。それぞれ設定ファイルは
/etc/chrony.conf
または/etc/ntp.conf
です。設定ファイルのフォーマットはほとんど同じなので
server 0.centos.pool.ntp.org iburst
のような、時刻問い合わせ先サーバの設定を確認します。
# systemctl start ntpd.service or # systemctl start chronyd.service
でサービスを起動します。
最後にtimedatectl
でntpによる時刻合わせを有効化します。
# timedatectl set-ntp yes
ネットワーク関連の設定
CentOS7ではネットワーク周りの管理がNetworkManagerを使った方式に変更されています。
NetworkManagerのコマンドラインインターフェースであるnmcli
を使って設定するのが標準の方法ですが、
ひとまず従来CentOS6の方法でできることは、それを踏襲してます(非推奨の方法だと思うので、のちのち更新予定です)。
まず、従来のifconfigなどがデフォルトでは提供されていないのでnet-tools
パッケージをインストールします。
# yum install net-tools
ホスト名
従来/etc/sysconfig/network
に記載していたホスト名はCentOS7では/etc/hostname
に記述します。
ネットワーク・インターフェースの確認
CentOS6のときと同様に/etc/sysconfig/network-scripts
配下のifcfg-xxx
を確認します。
設定を変更したら、
systemctl restart network
で反映させます。
IPアドレスの確認
# ifconfig
IPアドレスの設定が、設定通りか確認します。
ネットワークの疎通確認
# ping yahoo.co.jp
pingが外に向けて通るかを確認します。0% packet lossとなればOK。
# traceroute yahoo.co.jp
外につなぎに行く際にどのようなIPを経由するかを確認。ネットワーク管理者ではないので、ざっと結果を眺めるだけです。
yumリポジトリ
CentOS6のときと同様。epelとremiは(個人的に)必須なのでインストールします。epelは直接yumからインストールできます。
# yum install epel-release # yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
その他、設定ファイルなどはCentOS6のときと同様。
bash-completion
CentOS6のときと同様。素のbashのままだとzshになれた補完脳にはツライので、bash-completionを入れます。
# yum install bash-completion
インストールするだけで、ある程度補完が効くようになります。カスタマイズは特にしていません。
ファイアウォール (firewalld)
ファイアウォールはiptablesからfirewalldに変わりました。 firewalldはiptablesをバックエンドにしたファイアウォール管理のフロントエンド的なもので、実は内部的にはiptablesが依然使われています。とはいえ、設定に関してはやることがガラっと変わっています。
設定のための覚書
firewalldにはゾーンという概念があり、サービスやポートへの接続許可、拒否などの設定をまとめた単位。ゾーンはデフォルトで
- block
- dmz
- drop
- external
- home
- internal
- public
- trusted
- work
があります。ファイアウォールはこのゾーンをNICに割り当てることで、有効化され、機能します。
デフォルトではpublic
ゾーンが、有効化、割り当てされています。
# firewall-cmd --list-all
で確認できます。ゾーンについては
# firewall-cmd --list-all-zone
で一覧がでます。
デフォルトで有効になっているpublic
ゾーンは、明示的に許可した通信しか受け入れないようになっているので、基本的にこのゾーンに接続許可するポートやサービスの設定をしておけば、普通のファイアウォールの用途としては要件を満たせそうです。設定はfirewall-cmd
を実行することで行います。
設定
いくつか典型的な設定パターンをメモしておきます。
特定の接続先(この例では192.168.0.1/24)からのみサービスへの接続(この例ではSSH)を許可する場合:
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.1/24" service name="ssh" accept' --permanent
サービスの定義は/usr/lib/firewalld/services/
配下にあるxmlファイルを読む。ポート番号などがここに定義されています。
特定の接続先(この例では192.168.0.1/24)からのみポート8000の接続を許可する場合:
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.1/24" port port="8000" protocol="tcp" accept' --permanent
ポート80の接続を許可する場合:
# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" port port="80" protocol="tcp" accept' --permanent
ちなみに上記のポートを単純に開放するだけなら
# firewall-cmd --zone=public --add-port=80/tcp --permanent
でも良さそう。個人的に設定の書き方を統一しておきたいので基本的に--add-rich-rule
を使っています。
設定を変更したら
# firewall-cmd --reload
で反映させます。その後確認のために
# firewall-cmd --list-all
でゾーンの設定を表示し、内容をチェックします。
sshd
CentOS6のときと同様。ポート番号を変えて、鍵認証オンリーにします。以下、編集および確認箇所のみを記載します。
/etc/ssh/sshd_config
# 22以外に変えます Port 2222 # rootログインは禁止 PermitRootLogin no # パスワード認証は禁止 PasswordAuthentication no
再起動して設定を反映します。
# systemctl restart sshd
ログの管理
syslogに代わる新しいログデーモンとしてjournaldが提供されています。systemdのサービスとして起動されたプログラムの標準出力、標準エラー出力は自動的にjournaldへと送られてログ管理の対象になります。ログはバイナリデータで保存され、専用のjournalctl
コマンドを使って検索、表示させるという操作になります。
ログの保存場所はデフォルトで/var/run/log/journal
。これは一時領域なので再起動したら消えてしまうため、/var/log/journal
に変更する。
# mkdir /var/log/journal # systemctl restart systemd-journald
上記のように/var/log/journal
を作成して、journaldを再起動すればOK。
ログの容量の最大サイズはファイルシステムの10%まで。変更するには/etc/systemd/journald.conf
ないで
SystemMaxUse=500M RuntimeMaxUse=500M
のようにサイズ指定すればよいです。
参考:http://www.server-memo.net/centos-settings/journald/journald.html
logrotate
ログのローテート設定です。journaldにではなく、サービスが直接ファイルになどに出力したログファイルをローテートします。
CentOS6のときと同様です。ログが無尽蔵に大きくなってディクスサイズを圧迫しないように設定、確認します。 初期設定時の他にhttpdなどのデーモンやログを出力するアプリケーションを追加した時にも目を通します。
/etc/logrotate.d/以下にログの対象ごとに設定ファイルがあるのでそれを確認します。例えばnginxは以下のようになっていたりします。
/etc/logrotate.d/nginx
/var/log/nginx/*log { create 0644 nginx nginx daily rotate 10 missingok notifempty compress sharedscripts postrotate /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true endscript }
実際の設定はログのサイズや保存期間の要件などによって異なるので、それを考慮し設定します。
sysctl
CentOS6と同様、カーネルパラメータの設定です。CentOS6のときは/etc/sysctl.conf
を編集してましたが/etc/sysctl.d/
配下にxxx..conf
ファイルを配置しても設定できるので、そうしてます。(実はCentOS6のときからできたっぽいですが。参考:http://qiita.com/ngyuki/items/002a4a153ac6d8075bdb)
/etc/sysctl.d/override.conf
net.nf_conntrack_max = 1000000 net.netfilter.nf_conntrack_max = 1000000 net.core.somaxconn = 1024 vm.overcommit_memory = 1
設定の内容はCentOS6でサーバを構築する際におこなっている基本設定 - オープンソースこねこねを参照。設定値の反映は以下のコマンドを実行します。
# sysctl --system
参考: http://tsunokawa.hatenablog.com/entry/2015/09/02/175619
以下のコマンドで確認。
# sysctl -a