サーバー構築の基本 CentOS Linux 8のインストール後に設定する12の項目

centos8-first-settings-top

こんにちは、ITインフラエンジニアのKomura(@system_kom)です。

前回の記事でCentOS Linux 8インストールする手順を紹介しました。うまくインストールできましたでしょうか。インストールはサーバー構築の基本ですが、大事なスキルです。しっかり覚えて身に付けることをオススメします。

Linuxのインストールができた方は、これから何をしたら良いのか、設定や運用など、どこから手を付けてよいか分からない場合も多いと思います。本記事ではCentOS 8をサーバーとして利用するうえで必要だと思われる基本的な設定ついて紹介していきます。

サーバー構築として押さえおきたい基本的なポイントについて12点をまとめてみました。まずはLinuxの設定について慣れる意味でも実際に設定を行ってみて、ある程度理解を深めたうえで、ご自身のベストな設定手順や構成を探してみてはいかがでしょうか。

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

centos-linux8-install-top
サーバー構築の基本 CentOS Linux 8をインストールしてベース環境を構築する

こんにちは、ITインフラエンジニアのKomura(@system_kom)です。 Linuxのインストールはサーバー構築の基本です。インフラエンジニアを目指している場合やLinux初心者にはOSのインストールから始めることをオススメします。 ...

CentOS Linux 8のインストールを行っていない場合に参考にしてみてください。

1. 設定を行うCentOS 8の環境とユーザーの操作

「CentOS 8を使ってサーバーを構築するための基本的な環境を作成する」という観点で考えています。本記事で紹介する手順は一例となり、記載した手順以外にもサーバーを構築するためには複数の手順が必要になります。

また、OS自体に用意されたセキュリティ機能を無効にする設定も一部含まれますが、ここでは利便性を天秤にかけて運用面から、より有用だと思われる手順を記載しています。
今回、設定を行うCentOS 8の環境は以下のようになります。

CentOS 8.0.1905. インストール後の環境

  • CentOSのバージョンは 8.0.1905. 64bit
  • CentOSのアプリケーショングループとして「サーバー」を選択
  • IPアドレスは、初期セットアップ用で設定したDHCP(IPアドレスの動的設定)で自動取得
  • インターネットへ接続できるネットワーク環境

注意ポイント

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

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が有効化されていることが原因だったりします。その為、インストール後に忘れずに無効化します。

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 パッケージの導入

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

CentOS 8のインストール時にアプリケーショングループとして「サーバー」を選択している場合には「bash-completion」パッケージはインストールされていますので、本作業は不要です。

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

bash-completionは、CentOSのパッケージ管理用コマンドである"dnf"でインストールできます。
CentOS 7まではパッケージ管理に"yum"コマンドを利用していましたが、CentOS 8から"dnf"コマンドを利用します。yumコマンドも利用できますがdnfコマンドへのシンボリックリンクになっているため、dnfコマンドとyumコマンドは同じ結果になります。

ポイント

DNFはPython 2で動作するYUMの後継になるパッケージ管理システムで、Python 3を利用しています。CentOS 7のyumと比較してパフォーマンスアップと追加された機能があります。

DNFでパッケージをインストールするには"dnf install"コマンドを利用します。コマンドを実行するとパッケージのインストールが開始されます。

 command
# dnf install bash-completion
読み込んだプラグイン: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        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 list"コマンドを実行します。パッケージがインストールされている場合、コマンドの結果として、以下のように表示されます。

 command
# dnf list installed | grep bash-completion
bash-completion.noarch 1:2.7-5.el8 @base

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

4. ネットワークの設定

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

4-1. ホスト名の設定

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

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

 command
# nmcli general hostname www

参考

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

 command
# nmcli g h www

と実行することで"nmcli general hostname www"を実行した場合と同じ結果になります。

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

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

 command
# cat /etc/hostname
www

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

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

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

 command
$ nmcli connection show
NAME UUID TYPE DEVICE
ens33 5e38edfb-9016-43e7-a5f4-b2a437050868 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

SSHを使ってネットワーク経由で接続している場合には「nmcli connection up」を実行するとIPアドレスの変更に伴い、SSH接続が切断されます。その場合には新しく設定したIPアドレスで再度、SSH接続をして下さい。

参考

※参照するDNSサーバーを複数指定する場合は ipv4.dnsのパラメーターを "192.168.241.253 192.168.241.254"という形で、複数DNSサーバーのIPアドレスを""(ダブルクォーテーション)で囲みます。

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

 command
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 fq_codel state UP group default qlen 1000
link/ether 00:0c:29:bd:48:c6 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::d50e:b9b8:31da:f990/64 scope link noprefixroute
valid_lft forever preferred_lft forever

変更したIPアドレスが表示されれば、IPアドレスの確認は完了です。

5. firewalldの基本的な設定

CentOSはバージョン8からファイアウォールとしてfirewalldとnftablesが採用されています。
firewalldは"firewall-cmd"というコマンドで管理を行います。OSの導入時に有効になっていますのでサービスの起動や、自動起動の設定は必要ありません。本章ではfirewalldを使ってサーバーに基本的なフィルタ設定を行います。
firewalldで設定する内容は以下のフィルタルールになります。

firewalldで設定するフィルタルール

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

5-1. 現状の確認

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

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

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

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

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

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

publicのゾーンはインターフェイスに割り当てられていますので、個々のサービスを異なるIPアドレスで制限することが難しくなっています。ここでは管理用として新しいゾーン「manage」を作成して、許可するサービスと許可する接続元のIPアドレスを「manage」ゾーンに追加します。

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

firewall-cmdコマンドに "--new-zone"オプションを付けて新しいゾーンを作成します。ゾーン名は「manage」としています。"--permanent"オプションは、コマンドで追加したルール設定を恒久的に有効にします。このオプションが付いてないとfirewalldサービスを再起動したとき(サーバーの再起動を含む)に、行った設定内容が全てクリアされます。

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

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

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

作成したゾーンに対して接続の許可を設定します。firewall-cmdコマンドの "--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

※「--add-service」オプションで指定できるサービスの一覧は"firewall-cmd --get-services"で確認できます。
実行すると、以下のようにサービス名が表示されます。(CentOS 7より追加できるサービスが増えています)

 command
# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

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

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

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

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

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

 command
# firewall-cmd --reload
success

「success」が表示されれば、firewalldに追加したルール設定の再読み込みと有効化は正常に完了しています。
設定した内容の確認を行います。現状でアクティブになっているゾーンを"firewall-cmd --get-active-zones"で表示します。

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

「manage」が表示されれば、firewalldのルール確認は完了です。

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

続いて「public」ゾーンから「ssh」サービスを削除します。publicゾーンにsshが入っていると、全てのIPアドレスからSSHへの接続を許可してしまいますので、削除して設定を反映します。削除は"--remove-service"オプションにサービス名を指定して実行します。

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

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

 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: cockpit dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

表示された項目「services」から「ssh」が消えていれば、サービス削除の確認は完了です。
これでfirewalldの設定が完了しました。

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

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

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

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

 command
# systemctl disable auditd.service
# systemctl disable abrt-vmcore.service
# systemctl disable smartd.service
# systemctl disable mdmonitor.service

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

サーバーの再起動は"reboot"コマンドで実行できます。

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

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

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

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

 command
# vi /etc/chrony.conf

chrony.confファイルには、初期状態で時刻同期先のサーバーが記載してありますので、こちらをコメントアウトしていきます。

 code
#pool 2.centos.pool.ntp.org iburst

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

 code
pool ntp.jst.mfeed.ad.jp iburst

ntp.jst.mfeed.ad.jpは3台のNTPサーバーをラウンドロビンするためserverではなくpoolを指定します。

chrony.confファイルへの追記と編集が終わったら、保存します。

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

設定を有効にするためにchronydサービスを再起動します。以下のように実行します。

 command
# systemctl restart chronyd

エラーが出力されなければ再起動は完了です。

7-3. 時刻同期の確認

設定した内容が正常に反映されて、指定したNTPサーバーと時刻の同期が出来ていることを確認します。確認用のコマンドは"chronyc tracking"になります。実行すると以下のように同期情報が表示されます。

 command
# chronyc tracking
Reference ID : D2ADA01B (ntp1.jst.mfeed.ad.jp)
Stratum : 3
Ref time (UTC) : Mon Oct 07 08:40:43 2019
System time : 0.000001127 seconds slow of NTP time
Last offset : +0.001049626 seconds
RMS offset : 0.001049626 seconds
Frequency : 45.073 ppm slow
Residual freq : -97.184 ppm
Skew : 36.780 ppm
Root delay : 0.100828283 seconds
Root dispersion : 0.048853952 seconds
Update interval : 1.7 seconds
Leap status : Normal

「Leap status」「Normal」なら正常に時刻同期ができています。時刻同期ができてない場合には「Not synchronized」と表示されます。

NTPサーバーの同期先候補を確認する場合には"chronyc sources"コマンドを利用します。実行することで以下のように同期の候補となるNTPサーバーの一覧が表示されます。

 command
# chronyc sources
210 Number of sources = 3
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^+ ntp2.jst.mfeed.ad.jp 2 6 177 60 -5702us[-5702us] +/- 100ms
^+ ntp3.jst.mfeed.ad.jp 2 6 177 59 -4781us[-4781us] +/- 126ms
^* ntp1.jst.mfeed.ad.jp 2 6 177 60 -4140us[-6337us] +/- 90ms

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

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

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

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

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

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

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

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

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

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

 command
# useradd -p 123456 test1

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

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

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

 command
# vi /etc/ssh/sshd_config

設定ファイルの46行目付近に記載がある"PermitRootLogin"パラメータを変更します。

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

設定値を「yes」から「no」 に変更します。変更後のファイルは以下のようになります。

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

該当するパラメータの変更が完了したら、ファイルを保存します。

8-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.

接続が拒否されたことが確認できます。
SSHクライアントソフトの「teraterm」では以下のように接続を拒否されることが確認できます。

linux-setting-9-3

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

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

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

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

9-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グループへ変更されていることが確認できます。これでグループへの追加と確認は完了です。

9-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 substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so

上記部分の「 #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
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so

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

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

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

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

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

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

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

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

mlocateパッケージはCentOS 8のセットアップ時に「サーバー」を選択した場合、インストールされていますので本作業は不要です。

 command
# dnf -y install mlocate

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

 log
=======================================================================================
パッケージ アーキテクチャー バージョン リポジトリ
=======================================================================================
Installing:
mlocate x86_64 0.26-20.el8 BaseOS
トランザクションの概要
=======================================================================================
インストール 1 パッケージ
ダウンロードサイズの合計: 121 k
インストール済みのサイズ: 393 k
パッケージのダウンロード中です:
mlocate-0.26-20.el8.x86_64.rpm 89 kB/s | 121 kB
----------------------------------------------------------------------------
合計 44 kB/s | 121 kB
警告: /var/cache/dnf/BaseOS-929b586ef1f72f69/packages/mlocate-0.26-20.el8.x86_64.rpm: ヘッダー V3 RSA/S 、鍵 ID 8483c65d: NOKEY
CentOS-8 - Base 1.6 MB/s | 1.6 kB
GPG 鍵 0x8483C65D をインポート中:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
鍵のインポートに成功しました
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
準備 :
scriptletの実行中: mlocate-0.26-20.el8.x86_64
Installing : mlocate-0.26-20.el8.x86_64
scriptletの実行中: mlocate-0.26-20.el8.x86_64
検証 : mlocate-0.26-20.el8.x86_64
インストール済み:
mlocate-0.26-20.el8.x86_64
完了しました!

メッセージの最後に「完了しました!」と表示されれば、mlocateパッケージのインストールは完了です。インストールされたパッケージを確認するには"dnf list"コマンドを実行します。

 command
# dnf list installed | grep mlocate
mlocate.x86_64 0.26-20.el8 @BaseOS

上記のように実行結果にmlocateパッケージ名が表示されれば、インストールの確認は完了です。

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

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

 command
# updatedb

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

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

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

ここまででlocateコマンドを利用するための環境は整いました。locateコマンドの使い方は、コマンドに続いて検索したいファイル名を入力します。ここでは「chrony.conf」を検索するため以下のように実行してみました。

 command
# locate chrony.conf
/etc/chrony.conf
/usr/share/man/man5/chrony.conf.5.gz

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

11. ロケールの設定

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

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

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

 command
$ localectl status

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

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

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

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

 command
$ localectl list-locales | grep -i jp

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

 log
ja_JP.eucjp
ja_JP.utf8

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

11-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

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

12. タイムゾーンの設定

サーバーのタイムゾーンはインストール時に設定されている場合がほとんどだと思いますが、もし日本のタイムゾーンである「JST」が指定されていない場合には"timedatectl"コマンドで変更できます。

12-1. タイムゾーンの表示

サーバーに設定されているタイムゾーンを確認するには"timedatectl status"コマンドを実行します。

 command
# timedatectl status
Local time: 月 2019-10-07 04:46:54 EDT
Universal time: 月 2019-10-07 08:46:54 UTC
RTC time: 月 2019-10-07 08:46:53
Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

表示された内容からタイムゾーンがアメリカに設定されていることがわかります。

12-2. タイムゾーンを日本に変更

上記のように日本以外のタイムゾーンが設定されている場合には"timedatectl set-timezone"コマンドでタイムゾーンを変更できます。日本のタイムゾーンはAsia/Tokyoになりますので、以下のように実行します。

 command
# timedatectl set-timezone Asia/Tokyo

"timedatectl set-timezone"コマンドの実行後にタイムゾーンを確認して日本に変更されていることを確認します。

 command
# timedatectl status
Local time: 月 2019-10-07 17:47:28 JST
Universal time: 月 2019-10-07 08:47:28 UTC
RTC time: 月 2019-10-07 08:47:28
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

タイムゾーンの項目「Time zone:」が「 Asia/Tokyo (JST, +0900)」と表示されていれば、変更は完了です。

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

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

更新を実行しないで、更新されるパッケージだけを確認するには"dnf check-update"を実行します。

 command
# dnf check-update

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

 log
bind-export-libs.x86_64 32:9.11.4-17.P2.el8_0.1 BaseOS
bind-libs.x86_64 32:9.11.4-17.P2.el8_0.1 AppStream
bind-libs-lite.x86_64 32:9.11.4-17.P2.el8_0.1 AppStream
bind-license.noarch 32:9.11.4-17.P2.el8_0.1 AppStream
bind-utils.x86_64 32:9.11.4-17.P2.el8_0.1 AppStream
bpftool.x86_64 4.18.0-80.7.1.el8_0 BaseOS
【略】
valgrind-devel.x86_64 1:3.14.0-10.el8 AppStream
vdo.x86_64 6.2.0.298-10.el8_0 BaseOS
wget.x86_64 1.19.5-7.el8_0.1 AppStream

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

 command
# dnf update
CentOS-8 - AppStream 1.7 kB/s | 4.3 kB 00:02
CentOS-8 - Base 2.5 kB/s | 3.8 kB 00:01
CentOS-8 - Extras 1.0 kB/s | 1.5 kB 00:01
依存関係が解決しました。
=============================================================================================
パッケージ   アーキテクチャー  バージョン リポジトリ サイズ
=============================================================================================
Installing:
kernel x86_64 4.18.0-80.7.1.el8_0 BaseOS 415 k
kernel-core x86_64 4.18.0-80.7.1.el8_0 BaseOS 24 M
kernel-debug-devel x86_64 4.18.0-80.7.1.el8_0 BaseOS 12 M
kernel-devel x86_64 4.18.0-80.7.1.el8_0 BaseOS 12 M
kernel-modules x86_64 4.18.0-80.7.1.el8_0 BaseOS 20 M
Upgrading:
bind-libs x86_64 32:9.11.4-17.P2.el8_0.1 AppStream 169 k
bind-libs-lite x86_64 32:9.11.4-17.P2.el8_0.1 AppStream 1.1 M
bind-license noarch 32:9.11.4-17.P2.el8_0.1 AppStream 98 k
bind-utils x86_64 32:9.11.4-17.P2.el8_0.1 AppStream 433 k
【略】
sssd-ldap x86_64 2.0.0-43.el8_0.3 BaseOS 179 k
sssd-nfs-idmap x86_64 2.0.0-43.el8_0.3 BaseOS 94 k
sssd-proxy x86_64 2.0.0-43.el8_0.3 BaseOS 123 k
systemd x86_64 239-13.el8_0.5 BaseOS 3.4 M
systemd-libs x86_64 239-13.el8_0.5 BaseOS 551 k
systemd-pam x86_64 239-13.el8_0.5 BaseOS 222 k
systemd-udev x86_64 239-13.el8_0.5 BaseOS 1.3 M
vdo x86_64 6.2.0.298-10.el8_0 BaseOS 682 k
トランザクションの概要
=============================================================================================
インストール 5 パッケージ
アップグレード 63 パッケージ
ダウンロードサイズの合計: 136 M
これでよろしいですか? [y/N]: yを入力

「これでよろしいですか? [y/N]:」の質問に「y」を入力するとパッケージのダウンロードと更新が開始されます。

 log
パッケージのダウンロード中です:
(1/68): kernel-4.18.0-80.7.1.el8_0.x86_64.rpm 428 kB/s | 415 kB 00:00
(2/68): kernel-devel-4.18.0-80.7.1.el8_0.x86_64.rpm 186 kB/s | 12 MB 01:07
(3/68): kernel-debug-devel-4.18.0-80.7.1.el8_0.x86_64.rpm 178 kB/s | 12 MB 01:10
(4/68): bind-libs-9.11.4-17.P2.el8_0.1.x86_64.rpm 239 kB/s | 169 kB 00:00
(5/68): bind-libs-lite-9.11.4-17.P2.el8_0.1.x86_64.rpm 220 kB/s | 1.1 MB 00:05
(6/68): bind-license-9.11.4-17.P2.el8_0.1.noarch.rpm 227 kB/s | 98 kB 00:00
(7/68): bind-utils-9.11.4-17.P2.el8_0.1.x86_64.rpm 293 kB/s | 433 kB 00:01
(8/68): gdb-8.2-6.el8_0.x86_64.rpm 260 kB/s | 296 kB 00:01
【略】
(57/68): sssd-krb5-2.0.0-43.el8_0.3.x86_64.rpm 187 kB/s | 129 kB 00:00
(58/68): sssd-krb5-common-2.0.0-43.el8_0.3.x86_64.rpm 125 kB/s | 167 kB 00:01
(59/68): sssd-ldap-2.0.0-43.el8_0.3.x86_64.rpm 111 kB/s | 179 kB 00:01
(60/68): sssd-nfs-idmap-2.0.0-43.el8_0.3.x86_64.rpm 99 kB/s | 94 kB 00:00
(61/68): sssd-proxy-2.0.0-43.el8_0.3.x86_64.rpm 99 kB/s | 123 kB 00:01
(62/68): python3-libs-3.6.8-2.el8_0.0.1.x86_64.rpm 229 kB/s | 7.9 MB 00:35
(63/68): systemd-libs-239-13.el8_0.5.x86_64.rpm 227 kB/s | 551 kB 00:02
(64/68): systemd-pam-239-13.el8_0.5.x86_64.rpm 246 kB/s | 222 kB 00:00
(65/68): systemd-239-13.el8_0.5.x86_64.rpm 233 kB/s | 3.4 MB 00:15
(66/68): systemd-udev-239-13.el8_0.5.x86_64.rpm 231 kB/s | 1.3 MB 00:05
(67/68): vdo-6.2.0.298-10.el8_0.x86_64.rpm 299 kB/s | 682 kB 00:02
(68/68): selinux-policy-targeted-3.14.1-61.el8_0.1.noarch.rp 210 kB/s | 15 MB 01:11
---------------------------------------------------------------------------------------------
合計 575 kB/s | 136 MB 04:01
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
【略】
アップグレード済み:
bind-libs-32:9.11.4-17.P2.el8_0.1.x86_64
bind-libs-lite-32:9.11.4-17.P2.el8_0.1.x86_64
bind-license-32:9.11.4-17.P2.el8_0.1.noarch
bind-utils-32:9.11.4-17.P2.el8_0.1.x86_64
systemd-pam-239-13.el8_0.5.x86_64
systemd-udev-239-13.el8_0.5.x86_64
vdo-6.2.0.298-10.el8_0.x86_64
インストール済み:
kernel-4.18.0-80.7.1.el8_0.x86_64 kernel-core-4.18.0-80.7.1.el8_0.x86_64
kernel-debug-devel-4.18.0-80.7.1.el8_0.x86_64 kernel-devel-4.18.0-80.7.1.el8_0.x86_64
kernel-modules-4.18.0-80.7.1.el8_0.x86_64
完了しました!

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

パッケージ更新についての確認が不要な場合には"-y"オプションを付けて以下のようにdnfコマンドを実行します。

 command
# dnf -y update

14. まとめ

CentOS 8のインストール後、そのままの状態で利用することはセキュリティ面でリスクが高く、運用にも影響がある構成になります。今回はオススメの設定を12点紹介してみました。この設定を元に、利用する環境や導入先のお客様のニーズに合わせてカスタマイズを行っていただけると良いかと思います。

足りない部分や、もっと良い方法もあると思いますが、サーバーのベース環境を作成するための基本的な設定ということで了承いただければ幸いです。

[st_af id="9037"]

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

レムシステム

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

-CentOS, Linux, サーバー構築