戻る

CentOS 8インストールしたサーバを公開するために設定するセキュリティ

こんにちは、ITエンジニアの徳田(@tuk2ku.com)です。

CentOS 8のサポートが今年末、つまり2021年12月で終了すると公式サイトで発表されました。CentOSの開発チームは今後、CentOS Streamと呼ばれる別のLinuxディストリビューションに注力するとのことです。只、サポート終了後もCentOS 8のバグフィクスやセキュリティパッチを含むサポートを受け続けることで、CentOS 8を使い続けることが可能になる、サイバートラスト株式会社が提供するサービス「CentOS 8救済サービス」が発生されましたので、私はこれを利用するつもりです。

目次

1. selinuxの無効化はしてはならない

selinuxはLinuxの監査やセキュリティを向上させる機能です、よほどの理由ないかぎり無効にしてはいけません。

2-1. selinuxの状態を確認

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

$ getenforce
Enforcing

2-2. selinuxの有効/無効の永続的な切り替え

selinuxを無効にするには「/etc/selinux/config」ファイルを修正します。 まずはバックアップを作成します。

sudo cp -piv /etc/selinux/config /etc/selinux/config.`date "+%Y%m%d"`

/etc/selinux/configを編集します。

sudo vi /etc/selinux/config

「enforcing」になっている箇所をコメントアウトして「disabled」を追加します。

#SELINUX=enforcing
SELINUX=disabled

設定を反映させるには再起動(下記のコマンド)が必要です。 この記載スペルミスなどで間違えると**CentOSが起動しなくなる場合があります。スペルミスなどが無いように気を付けて下さい。

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

3. ネットワークの設定

CentOS 8では、ネットワーク管理をネットワークマネージャー(“nmcli”コマンド)で行います。ネットワーク関連ファイルを直接編集(/etc/sysconfig/network-interface/ifcfg-eth*ファイル)する方法でも設定は可能です。

3-1. ホスト名の設定

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

$nmcli general hostname www

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

$ cat /etc/hostname
www

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

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

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

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

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アドレスを表示します。

変更した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コマンド”を実行します。

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

上記の出力結果で注目するポイントは「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サービスを再起動したとき(サーバーの再起動を含む)に、行った設定内容が全てクリアされます。

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

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

作成したゾーンに対して接続の許可を設定します。firewall-cmdコマンドの “—set-taget”オプションに”ACCEPT”を指定することで、接続の許可を「manage」ゾーンに与えます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SELinuxのAVC拒否 システムログイン アカウント変更 sudoなどを使った認証結果

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

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

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

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

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

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

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

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

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

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

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

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

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

7-3. 時刻同期の確認

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

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

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

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

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を設定する場合は

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

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

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

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

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

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

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

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

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

接続が拒否されたことが確認できます。
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という名前の場合以下のように実行します。

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

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

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

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

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

上記部分の「 #auth required pamwheel.so useuid」行からコメントの「#」を外します。変更後の設定ファイルは

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

11. ロケールの設定

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

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

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

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

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

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

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

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

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

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

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

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

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

12. タイムゾーンの設定

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

14. その他

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

systemctlでtabキーによる補完ができるように「bash-completion」パッケージをインストールします。

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

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

$ dnf install bash-completion

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

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