オープンソースこねこね

Webプログラミングなどについてあれこれ。

CentOS7でサーバを構築する際におこなっている基本設定

以前書いた

CentOS6でサーバを構築する際におこなっている基本設定 - オープンソースこねこね

のCentOS7バージョンです。調査中の内容もあるので、情報は随時更新する予定です。

※ここではサーバのロールにかかわらず行う基本的な作業をまとめています。通常この環境の上にWebサーバ(httpd, nginxなど)やDB(MySQLなど)をインストールすることになります。

※本文中のコマンドは基本的にrootユーザで行っているものとします。一般ユーザを使い必要に応じて都度root権限を使うようにしている方はsudoをつけるなど、コマンドを読み替えてください。

デフォルトターゲットの確認

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の意味は以下の通り。

  • enable: 自動起動有効
  • disabled: 自動起動無効
  • static: 他のユニットに依存。有効/無効が設定できないもの。

不要と思われるサービスはサーバリソースの無駄使いになるので、以下のコマンドで停止設定にしておきます。

# 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