CentOS 7のインストール後におこなうLinuxの基本設定 13ポイント

CentOS 7(バージョン7.0~7.6)のインストール完了後に、設定する最低限のポイントを13点纏めてみました。(2019年6月に追加)本記事で紹介した手順は一例で、これ以外にもサーバーを構築するためには複数の手順が必要になります。まずはLinuxの設定について慣れる意味でも実際に設定を行ってみて、ある程度理解を深めたうえで、ご自身のベストな設定手順や構成を探していく形が良いと思います。

参考 CentOS 7のインストール手順については7.5系までは以下の記事で詳しく紹介しています。

CentOS
centos7-install
CentOS 7.1 をインストール Linuxを始めるにはインストールからがお勧め

こんにちは、レムシステム株式会社でITインフラを担当している小村(@system_kom)です。 ここ最近、お客様と会話してみて思うのが、意外とLinux使ってないなーということ。 Linuxは最近のディストリビューションだとGUI環境が充 ...

7.6系の導入方法(こちらの記事をお勧め)は

CentOS
centos76-install-top3
CentOS 7.6をインストール Linuxのインストールは難しくありません

こんにちは、ITエンジニアの小村(@system_kom)です。 Windowsをインストールした経験のある人は多いと思いますが、Linuxをインストール経験がある人は少ないのではないでしょうか。 Linuxのインストールはサーバー構築の基 ...

で詳細に紹介していますので、是非、参照してみてください。

[st_af id="20510"]

1. CentOSの基本的な設定についての概要とユーザーの操作

CentOSのインストール直後に、最低限これだけは行ったほうが良い設定から紹介します。OS自体に用意されたセキュリティ機能を無効にする設定も一部含まれますが、ここでは利便性を天秤にかけて運用面から、より有用だと思われる手順を記載しています。
CentOS 7.6インストール後の環境は以下のようになります。

CentOS 7.6 インストール後の環境

  • CentOS 7.0~7.6 (64bit)
  • CentOSセットアップ時のアプリケーショングループとしてインフラストラクチャサーバーを選択
  • IPアドレスについては、初期セットアップ用で設定したDHCP(IPアドレスの動的設定)で自動取得
  • インターネットへ接続できるネットワーク環境

注意ポイント

ソフトウェアグループとして「最小限のインストール」を選択されている場合は、追加でソフトウェアパッケージ(以下、パッケージ)のインストールが必要になります。不足分についてはyumコマンドでインストールを行って下さい。

1-1. 一般ユーザーと管理ユーザーについて

Linuxではユーザーの権限として、操作が限定されている一般ユーザーとシステムに対して全ての操作権限をもつ管理ユーザーの(rootユーザーと呼ばれます。)2つがあります。

一般ユーザーはシステムに対して変更を行う権限を持たないため、システムの設定変更を行う場合には管理ユーザーに切り替える必要があります。通常の操作では操作ミスによるシステム障害を防止するために一般ユーザーを利用して、システムの設定変更を行うときだけrootユーザーへ切り替えを行います。

1-2. rootユーザーへの切り替え

一般ユーザーからrootユーザーへの切り替えは"su"(Super User)コマンドを利用します。(sudoコマンドを利用する方法もありますが、本記事ではsuコマンドを利用します。)権限を切り替えたい場合には

 command
$ su -

と実行します。最後の"-"ハイフンは切り替えるユーザーの操作環境を引き継ぐ場合に付与します。基本的には付けて実行したほうがトラブルが少ないと思います。
suコマンドを実行すると、パスワードの入力プロンプトが表示されます。

 command
Password:

OSのセットアップ時に指定したrootユーザーのパスワードを入力します。パスワードが認証されるとプロンプトが"$"から"#"に変わります。これで管理権限もつrootユーザーへの切り替えは完了です。
切り替え後には、ディレクトリがrootユーザーのホームディレクトリになります。

1-3. rootユーザーから一般ユーザーへの切り替え

rootユーザーはシステム全ての操作権限を持つため、利用が終わったら一般ユーザーへ切り替えを行うことをお勧めします。
一般ユーザーへの切り替えは"exit"コマンドを入力します。

 command
# exit

実行するとプロンプトが"$"に変わります。

ポイント

本記事では一般ユーザーでの実行が可能なコマンドについてはプロンプトとして"$"、rootユーザーでの実行が必要なコマンドについては"#"を記載しています。

2. selinuxの無効化

まず、selinuxを無効化します。selinuxはLinuxの監査やセキュリティを向上させる機能ですが、有効になっているとサービスの動作や、設定内容にかなりの制限が出てきます。そのため、基本的には無効にする場合が多いのが実情です。

ウェブサイトを見ながらサーバー構築を行って、思った通りに動作しない場合は、このselinuxが有効化されていることが原因だったりします。その為、インストール後に忘れずに無効化します。

[st_af id="20510"]

2-1. selinuxの状態を確認

selinuxが有効になっているかの確認はgetenforceコマンドで行います。(基本的にデフォルトで有効になっています。)以下のようにgetenforceコマンドを実行して「Enforcing」と表示された場合にはselinuxが有効になっています。

 command
$ getenforce
Enforcing

2-2. selinuxを無効に設定

selinuxを無効にするには/etc/selinux/configファイルを修正します。
修正はviなどのテキストエディターで行います。本記事ではファイルを修正する場合、基本的にviコマンドの利用を前提として記載しております。
設定ファイルをviコマンドで開きます。

 command
# vi /etc/selinux/config

configファイルの修正点は

 code
SELINUX=enforcing

になります。このパラメーターを

 code
SELINUX=disabled

に変更して保存します。
この記載を間違えると(例えばスペルミスなど)CentOSが起動しなくなる場合がありますので、スペルミスなどが無いように気を付けて下さい。

CentOSが起動しなくなった場合はインストールメディアを使ってリカバリモードで起動後、configファイルを修正することで起動できるようになります。

ファイルの修正後、サーバーを再起動して、ログインできる状態になったら、再度、getenforceコマンドでselinuxの設定状況を確認します。以下のように実行結果としてDisabledと表示されれば、selinuxは正常に無効化されています。

 command
$ getenforce
Disabled

これでselinuxの無効化は完了です。

3. bash-completion パッケージの導入

CentOS7系からはサービス管理としてsystemctlというコマンドが用意されています。このコマンドは複数のオプションやサービスを指定する必要がありますが、デフォルトの状態だとtabキーを押した補完が利用できません。これだと不便なので、systemctlでtab補完が利用できるようにbash-completionパッケージをインストールします。

3-1. bash-completionパッケージのインストール

bash-completionは、CentOSのパッケージ管理用コマンドであるyumでインストールできます。パッケージをインストールするにはyum installコマンドを以下のように実行します。

 command
# yum install bash-completion

コマンドを実行するとパッケージのインストールが開始されます。

 log
読み込んだプラグイン:fastestmirror
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/6): base/7/x86_64/group_gz | 156 kB 00:00:00
(2/6): extras/7/x86_64/primary_db | 145 kB 00:00:00
(4/6): base/7/x86_64/primary_db | 5.7 MB 00:00:00
(6/6): updates/7/x86_64/primary_db | 5.3 MB 00:00:00
Determining fastest mirrors
* base: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ bash-completion.noarch 1:2.1-6.el7 を インストール
--> 依存性解決を終了しました。依存性を解決しましたインストール中:
bash-completion noarch 1:2.1-6.el7 base 85 kトランザクションの要約
インストール 1 パッケージ
総ダウンロード容量: 85 k
インストール容量: 259 k
Is this ok [y/d/N]: y
Downloading packages:
bash-completion-2.1-6.el7.noarch.rpm | 85 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : 1:bash-completion-2.1-6.el7.noarch 1/1
検証中 : 1:bash-completion-2.1-6.el7.noarch 1/1
インストール:
bash-completion.noarch 1:2.1-6.el7
完了しました!

結果に「完了しました!」と表示されれば、パッケージのインストールは完了しています。

3-2. bash-completionパッケージの確認

bash-completionパッケージがインストールされているかを確認するには、以下のようにyumコマンドを実行します。

 command
# yum list installed | grep bash-completion

正常にインストールされている場合、コマンドの結果として、以下のように表示されます。

bash-completion.noarch 1:2.1-6.el7 @base

これでbash-completionパッケージの導入は完了です。

[st_af id="20510"]

4. firewalldの停止とiptablesへの入れ替え

ファイヤウォール設定の注意点

※2019年9月3日追記 iptablesは時期バージョンのCentOS 8でサポートされなくなる可能性が高いため、iptablesを利用したい場合を除いて、本章の内容は実施しないで下さい。firewalldを利用したファイアウォールの設定を項目7.に記載しています。

CentOS7からはfirewallとして、6まで利用されてきたiptablesに変わって、firewalldが採用されています。iptablesを長く利用してきたユーザーとしては、中々、firewalldに慣れることができません。
そこで手っ取り早く、ここではfirewalldをCentOS6まで利用されていたファイアウォールであるiptablesに入れ替る方法を紹介します。
※2018年4月11日追記 firewalldを利用したフィルタの設定手順を追加しました。本設定はfirewalldを利用している場合には不要となります。
CentOS6まではサービスの自動起動を無効に設定するために init.dファイルを利用していましたが、CentOS7からはsystemctlコマンドで設定を行います。本記事ではsystemctlコマンドの詳細な使い方は割愛しております。実際の利用例についてフォーカスして紹介しております。

4-1. firewalldサービスの無効化

firewallをiptablesに入れ替える前に、デフォルトで有効になっているfirewalldを無効化します。
firewalldの無効化は

 command
# systemctl disable firewalld.service

で行います。

firewalldが無効になっているかを確認するコマンドは以下になります。

 command
# systemctl list-unit-files | grep firewall
firewalld.service disabled

サービス名に続いて、状態が表示されます。"disabled"と表示されればfirewalldサービスの自動起動は無効化されています。

4-2. iptablesパッケージのインストール

iptablesはyumコマンドでインストールを行います。(yumコマンドはソフトウェアパッケージを管理するコマンド)インターネットへ接続できる環境である前提になりますので、その場合はyumコマンドを以下のように実行します。

 command
# yum install iptables-services

正常にインストールされた場合、コマンドの出力結果にSuccessful と表示されます。
インストールされたことを確認するには、"yum list installed"コマンドを実行します。

 command
# yum list installed | grep iptables
iptables.x86_64
iptables-services.x86_64

上記のように、実行結果に"iptables"が含まれていれば、iptablesインストールの確認は完了です。

5. ネットワークの設定

CentOS 7系では、ネットワーク管理をネットワークマネージャーで行います。ネットワークマネージャーはnmcliというコマンドで操作できます。CentOS6系までのネットワーク関連ファイルを直接編集(/etc/sysconfig/network-interface/ifcfg-eth*ファイル)する方法でも、設定は可能ですが、今後はネットワーク周りの設定をnmcliで行うことが主流になると想定されますので、本記事でもnmcliを利用をします。

5-1. ホスト名の設定

CentOS のインストール時にホスト名を設定していて、そのままのホスト名で運用する場合には、本手順は不要です。

まずはシステムに対して、任意のホスト名を設定します。ホスト名の設定には nmcliを以下のように実行します。ここではホスト名としてwwwを設定します。(実際には、環境に合わせたホスト名を指定してください。)

 command
# nmcli general hostname www

尚、nmcliコマンドのオプションは、オプションの頭文字だけでも指定が可能です。
例えば

 command
# nmcli g h www

と実行することで同じオプションを指定したことになります。

本記事ではコマンド表記を分かりやすくするため、出来るだけオプションを全て指定する形にしています。

設定の結果は /etc/hostname ファイルを参照することで確認できます。
catコマンドで /etc/hostnameファイルを参照して、以下のように設定値である「www」が表示されればホスト名の確認は完了です。

 command
# cat /etc/hostname
www

5-2. ネットワークインターフェイスへのIPアドレス設定

IPアドレスについても、OSインストール時に指定したものから変更がなければ、本手順は不要です。

インストール時のIPアドレスはDHCPに設定されていますので、固定IPに振り直します。IPアドレスの設定についても、ホスト名と同じくnmcliコマンドを使用します。
nmcliコマンドではコネクション名の指定が必要です。コネクション名はセットアップを行った環境によって変わりますので、先ずはコネクション名を確認します。

 command
$ nmcli connection show
NAME UUID TYPE DEVICE
ens33 5eaf4605-0a1d-45dd-8c21-4aebfeea03b6 ethernet ens33

NAMEの部分に表示されているものがコネクション名になります。上記の場合は"ens33"です。
コネクション名が分かったところで、nmcliコマンドを実行します。IPアドレスとして192.168.241.216/24、ゲートウェイとDNSサーバとして192.168.241.254を設定する場合は以下のように実行します。

 command
# nmcli connection modify ens33 ipv4.method manual connection.autoconnect yes ipv4.addresses 192.168.241.216/24 ipv4.gateway 192.168.241.254 ipv4.dns 192.168.241.254
# nmcli connection up ens33

参考

※参照するDNSサーバーを複数指定する場合は ipv4.dnsのパラメーターを "192.168.241.253 192.168.241.254"という形で、複数DNSサーバーのIPアドレスを""で囲み、半角スペースを入れて保存します。

エラーが出力されなければ、設定は変更されています。"ip addr show"コマンドでIPを表示させて、設定を確認します。

 command
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:40:91:3d brd ff:ff:ff:ff:ff:ff
inet 192.168.241.216/24 brd 192.168.241.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::1643:79fc:9a09:abac/64 scope link noprefixroute
valid_lft forever preferred_lft forever

5-3. ipv6設定を無効にする

ipv6の無効化については、任意で行います。
ipv6についての無効化は必要がない場合も多いと思いますが、ここでは手順だけを記載しておきます。

5-3-1. sysctlファイルの設定

viエディタで設定ファイル /etc/sysctl.conf ファイルを変更します。

 command
# vi /etc/sysctl.conf

設定ファイルが開きますので

 code
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

設定ファイルの一番下に、以下の二行を追加します。

 code
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

設定を反映するために、再起動を行い、ipv6の無効化は完了です。

6. iptablesでパケットフィルタの設定

ファイヤウォール設定の注意点

※2019年9月3日追記 iptablesは時期バージョンのCentOS 8でサポートされなくなる可能性が高いため、iptablesを利用したい場合を除いて、本章の内容は実施しないで下さい。firewalldを利用したファイアウォールの設定を項目7.に記載しています。

グローバルに公開されているサーバーは、secureログ (var/log/secureファイル、認証に関する記録を行うファイル)を参照するとわかりますが、外部からの攻撃(多くはsshやftpを狙った辞書攻撃)に晒されることになります。攻撃を回避するために、最低限のパケットフィルタを設定します。

6-1. iptablesで設定するポリシー

iptablesで初期に設定するポリシーの内容は以下を想定します。

iptablesで設定するフィルタポリシー

  • サーバーに入ってくるパケットは一部を除いて拒否
  • icmpは全て許可する
  • 許可するポートはFTP/SSH
  • SSH/FTPは管理用のIP(例:111.8.21.167)からのみ許可
  • サーバーに転送されるパケットは全て拒否
  • サーバーから外部へ送信されるパケットは全て許可

設定完了後には、このポリシーをベースにして、許可するポートを追加していきます。
sshについては、固定IPが無い場合、接続時の認証方式を鍵認証に変更して、接続は全てのIPアドレスから許可するように変更することでセキュリティを担保することが可能です。ssh鍵認証の設定方法については、本記事では割愛しております。

[st_af id="20510"]

6-2. iptablesでのフィルタ設定

iptablesでフィルタを設定するためには、iptablesコマンドを利用します。項目4-1. で記載した条件のフィルタを設定するためには、以下のコマンドを実行します。

6-2-1. 転送と送信チェインの設定

まずはサーバーでの転送パケットと、送信パケットを全て拒否します。

 command
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT

6-2-2. ローカルとicmp通信の許可

次にicmpとローカルループバックの通信を全て許可します。

 command
# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT

6-2-3. 通信を許可するフィルタの設定

それ以外の許可するポートを記載します。
ここでは111.8.21.167/32 からのftp/sshを許可しています。

 command
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -s 111.8.21.167 -p tcp -m tcp --dport 20 -j ACCEPT
# iptables -A INPUT -s 111.8.21.167 -p tcp -m tcp --dport 21 -j ACCEPT
# iptables -A INPUT -s 111.8.21.167 -p tcp -m tcp --dport 22 -j ACCEPT

※111.8.21.167/32のような管理用となる固定IPをお持ちでない場合は、この設定は不要です。
ローカル環境の場合は問題ありません。

6-2-4. 受信チェインの拒否設定

最後にサーバーへ入ってくるパケットを全て拒否します。

 command
# iptables -P INPUT DROP

※この設定を行うと、111.8.21.167/32のような特定のIPから以外、サーバーへ接続できなくなります。
必要については十分、注意してください。

iptablesによるフィルタ設定が完了したら、確認を行います。

 command
# iptables -L -n --line-number

コマンドで、設定した内容が一覧で表示できます。本記事ではIPアドレスの名前引きを行わないように
"-n"オプションを付けています。
設定内容としては、下記のように表示されるかと思います。(順番はコマンドの実行順で変化します。)

 log
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 111.8.21.167 0.0.0.0/0 tcp dpt:20
5 ACCEPT tcp -- 111.8.21.167 0.0.0.0/0 tcp dpt:21
6 ACCEPT tcp -- 111.8.21.167 0.0.0.0/0 tcp dpt:22Chain FORWARD (policy DROP)
num target prot opt source destinationChain OUTPUT (policy ACCEPT)
num target prot opt source destination

もし設定を誤った場合や、修正したい場合は適宜、修正を行います。設定が問題なく完了していれば

 command
# service iptables save

で設定した内容を保存します。

7. firewalldでパケットフィルタの設定

CentOSはバージョン7からファイアウォールとしてfirewalldが採用されています。項目6. と同じ条件でfirewalldの設定手順を紹介します。※iptablesで設定している場合は、本設定は不要です。
firewalldはfirewall-cmdというコマンドで管理を行います。OSの導入時に有効になっていますので、サービスの起動や、自動起動の設定は必要ありません。
firewalldで設定する内容はiptablesと同じく、以下の条件になります。

firewalldで設定するフィルタポリシー

  • サーバーに入ってくるパケットは一部を除いて拒否
  • icmpは全て許可する
  • 許可するポートはFTP/SSH
  • SSH/FTPは管理用IPアドレス(例:111.8.21.167)からのみ許可
  • サーバーに転送されるパケットは全て拒否
  • サーバーから外部へ送信されるパケットは全て許可

7-1. 現状の確認

firewalldではゾーンという条件の組み合わせを作成して、フィルタを設定します。
ゾーンはデフォルトで予め作成されているものが自動的にインターフェイスに対して適用されています。適用されているゾーンとその設定を確認するには、以下のようにfirewall-cmdコマンドを実行します。

 command
# firewall-cmd --get-default-zone
public

publicゾーンがデフォルトで割り当てられていることがコマンドの結果から確認できます。publicゾーンの設定を確認します。確認にはfirewallcmdに--list-allオプションを付けてコマンドを実行します。

 command
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

上記の出力結果で注目するポイントは”interfaces”と”services”の項目になります。これはインターフェイスens33(CentOSがデフォルトで作成したインターフェイス名)に対してdhcpv6-clientとsshの接続を許可するという内容になります。
上記はインターフェイス全体に掛かる設定になりますので、ここでsshを許可すると、どのIPからでもssh接続できるという設定内容になってしまいます。この設定を上記で記載した内容に変更を行います。

7-2. 管理用ゾーンの追加とfirewalldのIPアドレス制限

publicのゾーンはインターフェイスに割り当てられていますので、個々のサービスを異なるIPアドレスで制限することが困難です。その為、新しいゾーンを作成して、許可するサービスと許可する接続元のIPアドレスを設定します。

7-2-1. 新しいゾーンの作成

firewall-cmdコマンドに ”--new-zone”オプションを付けて、新しいゾーンを作成します。ゾーン名は"manage"としています。”--permanent”オプションは、設定を恒久的に行うというものになります。このオプションが付いてないと、firewalldサービスを再起動したときに、設定内容がクリアされます。

 command
# firewall-cmd --new-zone=manage --permanent
success

設定が正常に完了すると、”success”と応答メッセージが表示されます。

7-2-2. ゾーンへのサービス追加

作成したゾーンに対して、通信の接続許可を設定します。 ”--set-taget”オプションに”ACCEPT”を指定することで、接続許可を”manage”ゾーンに与えます。

 command
# firewall-cmd --zone=manage --set-target=ACCEPT --permanent
success

successと表示されれば、設定は完了です。続いて、ゾーンに登録するサービスを設定します。ここで設定したサービスのみ接続できるようになります。
firewall-cmdコマンドに”--add-service”オプションを付けることで、ゾーンに許可したいサービスを追加します。ここではsshとftpを追加しました。

 command
# firewall-cmd --zone=manage --add-service=ssh --permanent
success
# firewall-cmd --zone=manage --add-service=ftp --permanent
success

※登録できるサービスの一覧は

 command
# firewall-cmd --get-services

で確認できます。実行すると、以下のようにサービス名のリストが表示されます。

 log
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

追加したいサービス名が不明な場合は、このコマンドで確認して下さい。

7-2-3. 接続元のIPアドレス追加

項目7-2-2. で登録したサービスに対して接続できる、接続元IPアドレスを追加します。IPアドレスの追加は”--add-source”オプションで指定します。

 command
# firewall-cmd --zone=manage --add-source=111.8.21.167/32 --permanent
success

接続元のIPアドレス追加が完了したら、ゾーンの設定は完了です。設定した内容を反映するためにfirewalldサービスの設定再読み込みオプションを実行します。

 command
# firewall-cmd --reload
success

”Success”が表示されれば、設定の再読み込みは正常に完了しています。
設定した内容の確認を行います。現状でアクティブになっているゾーンを表示します。以下のように”manage”が表示されれば、設定の確認は完了です。

 command
# firewall-cmd --get-active-zones
public
interfaces: ens33
manage
sources: 111.8.21.167/32

7-2-4. publicゾーンからsshサービスの削除

続いてpublicゾーンからsshサービスを削除します。publicゾーンにsshが入っていると、全てのIPから接続を受け付けてしまいますので、ここで削除してmanageゾーンの設定を反映します。削除は”--remove-service”オプションにサービス名を指定して実行します。

 command
# firewall-cmd --remove-service=ssh --zone=public --permanent
success

これでサービスの削除は完了です。設定内容の反映を行います。

 command
# firewall-cmd --reload
success

sshサービスがpublicゾーンから削除されていることを確認します。”--list-all”オプションを付けてfirewall-cmdを実行すると、デフォルトのゾーンについての情報が表示されます。

 command
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

上記のようにservicesから”ssh”が消えていれば、削除の確認は完了です。
これでiptablesと同様の条件で設定が完了しました。

8. 不要サービスの無効化

サーバーを運用する上で明らかに利用しないサービスは無効化(自動起動の停止)しておきます。不要なポートのオープンや、サーバーリソースの無駄遣いを防ぐことを目的として行います。本記事では停止するサービスの一例を紹介しますが、実際の環境に合わせて無効化するサービスを選択する必要があります。

サービスの無効化は項目2-1. で紹介した管理用コマンド systemctlを利用します。systemctlにオプションとしてdisableを付与することでサービスを無効化できます。ここでは以下のサービスを無効化します。

CentOSのインストール時に選択したパッケージグループの状況により、パッケージがインストールされていないエラーが表示される場合があります。

 command
# systemctl disable auditd.service
# systemctl disable abrt-ccpp.service
# systemctl disable abrt-oops.service
# systemctl disable abrt-xorg.service
# systemctl disable abrt-vmcore.service
# systemctl disable abrtd.service
# systemctl disable libstoragemgmt.service
# systemctl disable smartd.service
# systemctl disable libvirtd.service
# systemctl disable qemu-guest-agent.service
# systemctl disable dmraid-activation.service
# systemctl disable mdmonitor.service
# systemctl disable avahi-daemon.service
# systemctl disable kdump

サービスの無効化を完了後に、サーバーの再起動を行います。

[st_af id="20510"]

9. サーバーの時刻同期を設定する

サーバーはサービスを提供するという性質から、正確な時間で運用されている必要があります。ここではサーバーの時刻を自動的に合わせるサービスであるchronydを設定していきます。

9-1. chronydサービスの設定

chronydサービスの設定は、/etc/chrony.confファイルで行います。
viエディタで設定ファイルを開きます。

 command
# vi /etc/chrony.conf

設定ファイルは、デフォルトで時刻同期先のサーバーがいくつか記載してありますので、こちらをコメントアウトしていきます。

 code
#server 0.CentOS.pool.ntp.org iburst
#server 1.CentOS.pool.ntp.org iburst
#server 2.CentOS.pool.ntp.org iburst
#server 3.CentOS.pool.ntp.org iburst

設定ファイルのコメントアウト後、参照したい時刻同期用サーバーを同じ形で記載していきます。
因みに最後に記載した、iburstオプションは起動直後に同期先のサーバーに4回連続的に問い合わせを行い、時刻同期が早く行うことが
できるオプションになります。本記事ではインターネット上にあるタイムサーバーである ntp2.jst.mfeed.ad.jp をタイムサーバーとして
指定します。

 code
server ntp2.jst.mfeed.ad.jp iburst

追記と編集が終わったら、ファイルを保存します。

9-2. chronydサービスの再起動

設定を有効にするためにchronydサービスを再起動します。

 command
# systemctl restart chronyd

でchronydサービスの再起動を行うことが可能です。

9-3. 時刻同期の確認

設定した内容が正常に反映、また時刻同期先のサーバーと同期が出来ていることを確認します。
確認用のコマンドは chronyc になります。このコマンドに sources オプションを指定することで
同期の状態を確認することができます。

 command
# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
=================================================================
^* ntp2.jst.mfeed.ad.jp 2 10 377 222 -22us[ -35us] +/- 71ms

正常に同期できている場合、同期先のサーバー名に*(アスタリスク)が付きます。
*が付かない場合は以下のような原因が考えられます。設定内容や環境を確認してみて下さい。

NTPサーバーと同期できない場合のチェックリスト

  • chrony.conf 設定ファイルに誤りがある
  • chronydサービスの再起動が出来ていない
  • サーバーがインターネットへ接続できていない
  • サーバーのDNS設定が行われていないなどが原因で名前引きに問題がある

10. SSHサービスのセキュリティ設定

SSHはサーバーへリモートで接続するためのサービスになります。基本的にはOSインストール直後に動作していますが、デフォルトの設定ではややセキュリティに難があります。
ここではデフォルトの設定を変更してssh接続のセキュリティを高める設定を紹介します。SSHサービスには複数のセキュリティ設定(例えば鍵認証や、ポート番号の変更など)がありますので、更にセキュリティを高めたい方は調べてみて下さい。

SSHサービスはデフォルトでrootユーザーのログインを許可しています。rootユーザーはユーザー名が既に判明しているためパスワードが判明すると、管理者権限でサーバーへログイン出来るため、これを拒否する設定を行います。

10-1. 一般ユーザーの作成

CentOSのインストール時に一般ユーザーを作成している場合は、本手順は不要です。

サーバーに作成されているユーザーがrootのみの場合、SSHによるリモートログインが出来なくなりますので、OSのインストール時にユーザーを作成していない場合、事前にユーザーを作成する必要があります。OSのインストール時にユーザーを作成している場合は、本手順は不要です。

ユーザーの作成はuseraddコマンドで行います。-pオプションでパスワードを指定します。
例えばユーザー名としてtest1をパスワードとして123456を設定する場合は

 command
# useradd -p 123456 test1

と実行します。エラーが表示されなければ、ユーザーは作成されています。

10-2. SSHサービスの設定ファイル変更

続いて、SSHサービスの設定を変更するために設定ファイルを変更します。SSHサービスの設定ファイルは"/etc/ssh/sshd_config"になります。設定ファイルをエディターで開きます。

 command
# vi /etc/ssh/sshd_config

開いた設定ファイルの35行目付近に記載がある、以下の部分を次のように変更します。

 code
# Authentication:
#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

の # PermitRootLogin yes からコメント (#の部分)を外して、yesを no に変更します。変更後のファイルは以下のようになります。

 code
# Authentication:
#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

該当する部分の変更が完了したら、ファイルを保存します。

10-3. SSHサービスの再起動

変更した設定を反映するためにSSHサービスの再起動を行います。サービスの再起動はsystemctlコマンドで行います。
再起動は以下のように実行します。

 command
# systemctl restart sshd

エラーが出力しなければ、再起動は完了しています。SSHクライアントで、サーバーへリモート接続を行い、接続が拒否されることを確認してください。LinuxのSSHコマンドでは以下のような結果になります。

 command
# ssh -l root 10.20.30.40 (IPアドレスは例になります)
root@localhost's password:
Permission denied, please try again.

接続が拒否されたことが確認できます。
teratermでは以下のように接続を拒否されることが確認できます。

linux-setting-9-3

これでSSHサービスの設定は完了です。

11. suできるユーザーを制限する

デフォルトの状態ではsuコマンドでrootユーザーに、どのユーザーでも移行することができます。複数のユーザーがサーバーに作成されている場合、どれか一つでもユーザーのログイン情報が分かってしまうと不正アクセス後にsuコマンドでrootユーザー権限を奪取されてしまうため、できる限りsuコマンドを実行できるユーザーを制限することをお勧めします。

suコマンドは設定を変更することで、wheelグループに属するユーザーのみにsuを実行できる権限を与えることができるようになります。本章では設定手順を紹介します。

11-1. wheelグループへのユーザー追加

事前準備としてsuコマンドの実行を許可したいユーザーをwheelグループへ追加します。
wheelグループへのユーザー追加はusermodコマンドを利用する方法と、groupファイルを直接、編集する方法の何れかがあります。ここではusermodコマンドを利用した手順を紹介します。

usermodコマンドを実行してwheelグループへユーザーを追加します。追加したいユーザーがtest1という名前の場合以下のように実行します。

 command
# usermod -g wheel test1

コマンドを実行して、エラーが表示されなければ設定は完了しています。wheelグループへ追加されていることを確認するにはidコマンドを利用します。ユーザー名を指定して実行すると、以下のようにuidやgidの情報が表示されます。

 command
# id test1
uid=1002(test1) gid=10(wheel) groups=10(wheel)

上記からグループがwheelグループへ変更されていることが確認できます。これでグループへの追加と確認は完了です。

11-2. suコマンドの設定ファイルを変更

続いてsuコマンドに関する設定ファイルを変更します。suコマンドの設定ファイルは/etc/pam.d/suになります。このファイルをエディターで開きます。

 command
# vi /etc/pam.d/su

設定ファイルは以下のようになります。

 code
#%PAM-1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid

上記部分の #auth required pam_wheel.so use_uid からコメント(#)を外します。変更後の設定ファイルは

 code
#%PAM-1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth required pam_wheel.so use_uid

となります。
これでsuを実行してrootになることができるユーザーが制限されました。確認で、wheelグループ以外のユーザーでsuコマンドを実行してみます。

 command
$ su -
パスワード:
su: 拒否されたパーミッション

このように拒否されることから、設定が正常に動作していることが確認できます。

[st_af id="20510"]

12. locateコマンドを利用できるようにする

Linuxシステム全体を対象として、特定のファイルを検索するのにはfindコマンドを利用する場合が多いと思いますが、findはオプションの指定がやや分かりにくいところがあります。そんなときはlocateコマンドが利用できると便利です。locateコマンドは指定したファイル名をもつファイルを全て抽出することが可能です。

事前にファイルとフォルダ名のデータベースを作成して、その中から検索を行いますので、リアルタイムではありませんが、高速にファイルが検索出来て、使い勝手が良いというメリットがあります。ここではlocateコマンドを利用できるようにmlocateパッケージのインストール手順を紹介します。

11-1. mlocateパッケージのインストール

locateはmlocateパッケージをyumコマンドでインストールを行います。(yumコマンドはソフトウェアパッケージを管理するコマンド)インターネットへ接続できる環境になりますので、その場合はyumコマンドを以下のように実行します。

 command
# yum -y install mlocate

コマンドを実行すると、mlocateパッケージのインストールが開始されます。

 log
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/2): extras/7/x86_64/primary_db | 185 kB 00:00:00
(2/2): updates/7/x86_64/primary_db | 6.9 MB 00:00:01
Determining fastest mirrors
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ mlocate.x86_64 0:0.26-6.el7 を インストール
--> 依存性解決を終了しました。依存性を解決しましたインストール中:
mlocate x86_64 0.26-6.el7 base 113 kトランザクションの要約
インストール 1 パッケージ
総ダウンロード容量: 113 k
インストール容量: 378 k
Downloading packages:
mlocate-0.26-6.el7.x86_64.rpm | 113 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : mlocate-0.26-6.el7.x86_64 1/1
検証中 : mlocate-0.26-6.el7.x86_64 1/1
インストール:
mlocate.x86_64 0:0.26-6.el7
完了しました!

エラーが出力されず、出力メッセージの最後に”完了しました!”と表示されれば、mlocateパッケージのインストールは完了です。インストールされたパッケージを確認するには、yum listコマンドを実行します。

 command
# yum list installed | grep mlocate
mlocate-0.26-6.el7.x86_64

上記のように実行結果にmlocateが表示されれば、mlocateはインストールされています。

11-2. updatedbコマンドの実行

項目11-1. でmlocateはインストールされましたが、このままではファイルを検索することができません。初回、直ぐに利用をする場合は、データベースを作成するためのコマンド”updatedb”を実行します。以下のようにupdatedbコマンドを実行します。

 command
# updatedb

初回の実行時にはやや時間が掛かりますが、エラーが表示されなければコマンドは正常に完了しています。

updatedbはcronで定期的に実行されるため、次回以降の実行は任意となります。

11-3. locateコマンドの実行例

ここまででlocateコマンドを利用するための環境は整いました。locateコマンドは以下のように実行します。参考としてvsftpd.confを検索した場合の実行例と応答を記載します。
locateコマンドは、コマンドに続いて検索したいファイル名を入力します。ここでは以下のように実行します。

 command
# locate vsftpd.conf

実行結果は以下のようになります。

 log
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd.conf.org
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.conf
/usr/share/man/man5/vsftpd.conf.5.gz

上記のようにvsftpd.confを含むパスのリストが表示されました。このようにfindコマンドよりも利便性が高い部分もありますので、インストールしておくと便利だと思います。

13. ロケールの設定

Linuxシステムの言語設定ですが、日本語の環境に変更する手順を紹介します。CentOS6系とは設定方法が変更されており、専用のコマンドが用意されています。本設定ですが、元々が日本語環境の場合もあると思います。(セットアップ状況によっては)もしご利用の環境で”英語ロケール”で、尚且つ、日本語の方が良いという場合には実施してください。(人によっては英語のほうが良いという場合もあると思いますので。。)

13-1. 現在のロケール確認

利用しているロケールを確認します。ロケールを確認するには”localectl status”コマンドを利用します。
以下のように実行します。

 command
$ localectl status

以下が実行結果です。この場合は、en_US.UTF-8がロケールになりますので、英語ロケールということになります。

 log
System Locale: LANG=en_US.UTF-8
VC Keymap: jp
X11 Layout: jp

13-2. 日本語ロケールの表示

CentOSでは日本語ロケールとして幾つかのロケールが用意されています。ロケールのリストは"localectl list-locales"コマンドで確認できます。そのまま実行すると大量のロケールが表示されてしますので、grepを利用して日本語ロケールのみを表示させます。

 command
$ localectl list-locales | grep -i jp

grepの"-i"オプションは抽出結果について、大文字と小文字を区別しないというものになります。以下が実行結果です。

 log
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8

上記のように4つのロケールが表示されました。設定する環境としてはeucかutf8が多いと思います。ここでは利用することが多いutf8で設定を行います

13-3. 日本語ロケールの設定と反映

ロケールを設定するためには"localectl set-locale"コマンドを利用します。以下のように実行します。

 command
# localectl set-locale LANG=ja_JP.utf8

エラーが表示されなければ正常に設定は完了しています。再度"localectl status"コマンドを実行してロケールを確認します。

 command
$ localectl status
System Locale: LANG=ja_JP.utf8
VC Keymap: jp
X11 Layout: jp

上記のように設定されていることが確認できました。この状態では設定は出来ていますが、システムへの反映がされていません。
設定を反映するためには再起動を行うか、"source"コマンドを利用します。以下のように実行します。

 command
# source /etc/locale.conf

エラーが出力されなければ、設定は正常に反映されています。これで日本語ロケールの設定は完了です。
必要に応じて設定を行って下さい。

14. パッケージのアップデート

メディアからインストールされたCentOSは含まれているパッケージが古いことがあります。基本的な設定が完了した時点でシステムに含まれているパッケージを全て、新しいものに更新することをお勧めします。CentOSでは全てのパッケージを更新するためにも"yum"を利用します。
更新を実行しないで、更新されるパッケージだけを確認するには

 command
# yum check-update

を実行します。コマンドを実行すると以下のように更新されるパッケージの一覧が表示されます。

 log
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: d2lzkl7pfhq30w.cloudfront.net
* extras: ftp.iij.ad.jp
* remi-safe: ftp.riken.jp
* updates: ftp.iij.ad.jpNetworkManager.x86_64 1:1.12.0-10.el7_6 updates
NetworkManager-libnm.x86_64 1:1.12.0-10.el7_6 updates
NetworkManager-team.x86_64 1:1.12.0-10.el7_6 updates
NetworkManager-tui.x86_64 1:1.12.0-10.el7_6 updates
bind-libs.x86_64 32:9.9.4-74.el7_6.1 updates
bind-libs-lite.x86_64 32:9.9.4-74.el7_6.1 updates
bind-license.noarch 32:9.9.4-74.el7_6.1 updates
bind-utils.x86_64 32:9.9.4-74.el7_6.1 updates
bpftool.x86_64 3.10.0-957.21.3.el7【略】systemd-libs.x86_64 219-62.el7_6.6 updates
systemd-python.x86_64 219-62.el7_6.6 updates
systemd-sysv.x86_64 219-62.el7_6.6 updates
tuned.noarch 2.10.0-6.el7_6.3 updates
tzdata.noarch 2019a-1.el7 updates
util-linux.x86_64 2.23.2-59.el7_6.1 updates
wget.x86_64 1.14-18.el7_6.1 updates
xfsprogs.x86_64 4.5.0-19.el7_6 updates

事前にどのようなパッケージが更新されるかを確認しておくことをお勧めします。パッケージのアップデートには"yum update"コマンドを実行します。以下のように実行します。

 command
# yum update

コマンドを実行すると、パッケージのダウンロードが開始されます。

 log
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: d2lzkl7pfhq30w.cloudfront.net
* extras: ftp.iij.ad.jp
* remi-safe: ftp.riken.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ MariaDB-client.x86_64 0:10.3.12-1.el7.centos を 更新
---> パッケージ MariaDB-client.x86_64 0:10.3.16-1.el7.centos を アップデート
---> パッケージ MariaDB-common.x86_64 0:10.3.12-1.el7.centos を 更新
---> パッケージ MariaDB-common.x86_64 0:10.3.16-1.el7.centos を アップデート
---> パッケージ MariaDB-compat.x86_64 0:10.3.12-1.el7.centos を 更新
---> パッケージ MariaDB-compat.x86_64 0:10.3.16-1.el7.centos を アップデート
---> パッケージ MariaDB-devel.x86_64 0:10.3.12-1.el7.centos を 更新
【略】
systemd-libs x86_64 219-62.el7_6.6 updates 407 k
systemd-python x86_64 219-62.el7_6.6 updates 133 k
systemd-sysv x86_64 219-62.el7_6.6 updates 84 k
tuned noarch 2.10.0-6.el7_6.3 updates 254 k
tzdata noarch 2019a-1.el7 updates 494 k
util-linux x86_64 2.23.2-59.el7_6.1 updates 2.0 M
wget x86_64 1.14-18.el7_6.1 updates 547 k
xfsprogs x86_64 4.5.0-19.el7_6 updates 897 k
依存性関連でのインストールをします:トランザクションの要約
インストール 1 パッケージ (+1 個の依存関係のパッケージ)
更新 85 パッケージ
合計容量: 203 M
Is this ok [y/d/N]: <= yを入力する

ダウンロードしたパッケージの容量と更新を実行するかの確認があります。"y"を入力すると、パッケージのアップデートが実行されます。

 log
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
更新します : libgcc-4.8.5-36.el7_6.2.x86_64 1/172
更新します : 32:bind-license-9.9.4-74.el7_6.1.noarch 2/172
更新します : selinux-policy-3.13.1-229.el7_6.12.noarch 3/172
更新します : tzdata-2019a-1.el7.noarch 4/172
更新します : glibc-2.17-260.el7_6.5.x86_64 5/172
更新します : glibc-common-2.17-260.el7_6.5.x86_64 6/172
tuned.noarch 0:2.10.0-6.el7_6.3 tzdata.noarch 0:2019a-1.el7
util-linux.x86_64 0:2.23.2-59.el7_6.1 wget.x86_64 0:1.14-18.el7_6.1
完了しました!

最終的に「完了しました!」と表示されればパッケージの更新は完了しています。カーネルや重要なライブラリが更新された場合には、念のためにシステムの再起動を行っておくほうが良いかと思います。尚、パッケージ更新についての確認が不要な場合には

 command
# yum -y update

と実行します。

[st_af id="20510"]

15. まとめ

CentOSインストール後、そのままの状態で利用することはセキュリティ面でもリスクが高い構成になります。今回はオススメの設定を13点紹介(2019年6月、13点に変更)してみました。

この設定を元に、ご自身やお客様のニーズに合わせてカスタマイズを行っていただけると良いかと思います。勿論、足りない部分や、もっと良い方法もあると思いますが、最低限の設定ということで了承いただければ幸いです。

  • この記事を書いた人
rem-profile-photo

レムシステム

レムシステムはPC・サーバー・ネットワークでの業務効率化を主な業務としている会社です。全国に対応しています。

-CentOS