CentOS 8 が2019年9月25日にリリースされたので、現在構築中の新しい自宅サーバーへのセットアップ手順を自分のメモとして書いておく。

(ところで、この記事を書き始めたのは2019年12月で、その時点ではまだ CentOS 8 がリリースされて数ヶ月程度だったので、こういう書き出しになってたんだけど、やっと公開しようとこの記事の最終調整している今が2020年7月末日なので、 CentOS 8 がリリースされてからもうすぐ1年ですね…。自宅サーバーのセットアップは概ね終わっているので、早くこの記事を公開してしまいたい…。)

いつもお世話になるCentOSで自宅サーバー構築さんにはまだ CentOS 8 の情報はないですが、 CentOS 7 と多分そんなに変わらないと思うので、 CentOS 7 の情報を参照しながら、サーバー構築を進めていくことにする。

CentOS 8 のバージョン

  • CentOS Linux release 8.0.1905 (Core) 

※この記事を書き始めたときは上記のバージョンだったけど、記事をまとめている途中で CentOS Linux release 8.2.2004 (Core) になっていた。

サーバーマシン

  • FUJITSU Server PRIMERGY TX1310 M3 ( CPU が Celeron プロセッサー G3930 のモデル)

詳しくはタワーサーバー「FUJITSU Server PRIMERGY TX1310 M3」とそのパーツをいくつか買ったを参照。

初期設定

CentOS 7初期設定を参考に進める。

ユーザーを作る

$ useradd username
$ passwd username

root になれるユーザーを管理者のみにする

$ usermod -G wheel username
$ vi /etc/pam.d/su
# 行頭のコメントを削除
auth       required     pam_wheel.so use_uid

sudo コマンドの設定

$ visudo
# 行頭のコメントを削除
%wheel        ALL=(ALL)       NOPASSWD: ALL

一旦、シェルログインしている状態からログアウトして、再度、シェルログインしたら sudo コマンドが実行できるようになった。

以降の作業は username でシェルログインして行う。

パッケージ管理システムの設定

CentOS 8 では yumdnf へのシンボリックリンクになっているので、 yum は使わず dnf を利用することにする。

とりあえず dnf upgrade を実行しておく。

$ sudo dnf upgrade -y

yum-cron の dnf 版は dnf-automatic らしいので、 dnf-automatic をインストールする。

$ sudo dnf install -y dnf-automatic

設定ファイルは /etc/dnf/automatic.conf

$ sudo vi /etc/dnf/automatic.conf
# yes に変更する
apply_updates = yes

dnf-automatic を起動する。(なんで .timer なのかはよくわかってない。)

$ sudo systemctl start dnf-automatic.timer
$ sudo systemctl enable dnf-automatic.timer

root 宛メールを転送する

CentOS 8 を最小構成でインストールしたせいか、 sendmail コマンドが入っていなかったので、 postfix をインストールする。

$ sudo dnf install -y postfix
$ sudo systemctl start postfix
$ sudo systemctl enable postfix
$ which sendmail
/usr/sbin/sendmail

sendmail コマンドが入った。

続いて、 root 宛のメールを転送設定する。

$ sudo sed -i '/^root:/d' /etc/aliases
$ sudo sh -c "echo 'root: username@example.com' >> /etc/aliases"
$ sudo newaliases

mail コマンドでテストメールを送ろうと思ったら mail コマンドがないと言われて、 mailx というパッケージを入れろと言われた。

$ echo test | mail root
bash: mail: コマンドが見つかりませんでした...
コマンド mail' を提供するためにパッケージ 'mailx' をインストールしますか? [N/y]

ので、 mailx パッケージをインストールする。

$ sudo dnf install -y mailx

mail コマンドが入って、テストメールの受信も確認できた。

$ echo test | mail root

SELinux の無効化

$ getenforce
Enforcing

SELinux が有効になっているので、下記のコマンドで無効にして、

$ sudo setenforce 0

無効になったことを確認して、

$ getenforce
Permissive

SELinux の設定を変更して、 OS 起動時にも無効にする。

$ vi /etc/sysconfig/selinux
# disabled にする
#SELINUX=enforcing
SELINUX=disabled

ホスト名の変更

$ sudo nmcli g h {hostname}

ネットワークの設定

インストール時はとりあえず DHCP でインストールしたけど、 IP アドレスを固定にしたいので、固定の IP アドレスを設定する。

$ sudo nmcli c m eno2 ipv4.method manual ipv4.addresses 192.168.1.104/24 ipv4.gateway 192.168.1.1 connection.autoconnect yes

下記のコマンドでネットワークの再起動。

$ sudo nmcli connection up eno2

IP アドレスを変更すると、 SSH 接続が切れるので、新しい IP アドレスで SSH 接続し直す。

サーバー公開前のセキュリティ強化

CentOSで自宅サーバー構築さんの「6. サーバー公開前のセキュリティ強化」あたりは状況に応じて導入する。

システム時刻を自動的に合わせる

CentOSで自宅サーバーさんの「NTPサーバー構築(chrony)」を参考に chrony の設定を進める。

chrony ははじめからインストールされていたので、同期先サーバーの追加を行う。

$ sudo vi /etc/chrony.conf
# 以下の二行を追加
server ntp.nict.jp iburst
server ntp.jst.mfeed.ad.jp iburst

手動で時刻を合わせて、

$ chronyc makestep
506 Cannot talk to daemon

chrony を起動して、

$ sudo systemctl restart chronyd
$ sudo systemctl enable chronyd

時刻の同期状態を確認して、

$ chronyc sources
210 Number of sources = 6
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^- 2001:2c0:cf08:4800::123       2   6    17    16  +7608us[+8125us] +/-  131ms
^- x.ns.gin.ntt.net              2   6    17    16  +1105us[+1621us] +/-   80ms
^+ ntp-b2.nict.go.jp             1   6    17    16   +270us[ +786us] +/- 9558us
^- 122x215x240x51.ap122.ftt>     2   6    17    17   -799us[ -283us] +/-   50ms
^* ntp-a3.nict.go.jp             1   6    17    16  +1802ns[ +518us] +/- 9682us
^- ntp2.jst.mfeed.ad.jp          2   6    17    16  +1574us[+1574us] +/-   98ms

NTPサーバー名の前に * または + が表示されれば時刻同期中の状態になっている。

sshd の設定

下記のように設定を変更して、

$ sudo vi /etc/ssh/sshd_config
# root ユーザーでのログインを無効化( yes から no に変更)
PermitRootLogin no
# パスワードでの認証を無効化( yes を no に変更する)
PasswordAuthentication no

sshd を再読み込みする

$ sudo systemctl reload sshd

DNS サーバーの構築

DNS はローカルエリアネットワーク用に構築したい(ローカルエリアネットワークからドメイン名でサーバーにアクセスしたい)ので、CentOSで自宅サーバーさんの「DNSサーバー構築(BIND)」を参考に構築を進める。

といっても、特別変わったことはしてないので、CentOSで自宅サーバーさんの「DNSサーバー構築(BIND)」の内部向けのみを順番に設定していくだけだった。( yumdnf に読み替える。)

ルートゾーンの最新化のワンライナーだけ、 sudoecho したかったので、下記サイトを参考にして、

sudo で書き込みをしたい – Qiita

下記のように実行した。

$ sudo sh -c "dig . ns @198.41.0.4 +bufsize=1024 > /var/named/chroot/var/named/named.ca"

ウェブサーバーの構築

CentOSで自宅サーバーさんの「14. Webサーバーを公開する」を参考に、ウェブサーバーに Apache を利用しようと思ってインストールしてみたり、いろいろ設定を触ってみたりしたけど、 Apache + php-fpm がうまくできなかったので、諦めて、というか、 Apache はそろそろやめたいと思っていたので、 Nginx を利用することにした。

Nginx のインストールと設定

まずは Nginx をインストールする。

下記のオフィシャルサイトを参考に yum のリポジトリ設定を追加する。

nginx: Linux packages

$ sudo vi /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

dnf のキャッシュをクリアして、

$ sudo dnf clean all

nginx をインストールする。

$ sudo dnf install -y nginx

インストールされたバージョンは下記の通り。

$ nginx -v
nginx version: nginx/1.18.0

nginx の設定はいろいろ試行錯誤中なので、また改めてまとめたい。

Certbot と SSL 認証書のインストール

SSL 認証書は Let’s Encrypt で入れたいので、 Certbot をインストールする。

Certbot のインストールは、オフィシャルサイトのトップページでウェブサーバーの種類と OS を選択して、インストール手順に沿って進めていく。

epel-release はすでにインストール済みだったので、その部分は飛ばして、 certbot をインストールする。

$ sudo dnf install -y certbot python3-certbot-nginx

あとは、 sudo certbot でコマンドを実行したり、 sudo certbot --help でヘルプを見たりしながら SSL 認証書のインストールを進める。(詳しくはオフィシャルサイトのマニュアル通り。)

Let’s Encrypt の SSL 認証書の有効期限は90日なので、有効期限が切れる前に自動で更新するように、下記のように cron を設定する。(これもオフィシャルサイトのマニュアル通り。)

echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

PHP のインストール

PHP は Remi’s RPM repository でインストールする。

Remi’s RPM repository の Configuration wizard で OS を選択して、利用したい PHP のバージョンを選択して、私は複数バージョンの PHP をインストールしたかったので、「Type of installation」は「Multiple versions simultaneously」を選択して、表示された手順に従ってインストールを進めていく。

epel-release はすでにインストール済みだったので、その部分は飛ばして、 remi-release-8 をインストールする。

$ sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm

yum-utils のインストールをおすすめされるけど、 dnf を使っているので、 dnf-utils をインストールする。

$ sudo dnf install -f dnf-utils

そしてまずは PHP 7.4 をインストールする。

$ sudo dnf install -y php74 php74-php-fpm php74-php-gd php74-php-pdo php74-php-mbstring php74-php-mysqlnd php74-php-pecl-imagick php74-php-pecl-zip php74-php-xml

php74-php-mysqlnd は MySQL との接続に必要で、 php74-php-pecl-imagickphp74-php-pecl-zipphp74-php-xml は WordPress に必要だったのでインストールした。

PHP は php-fpm で利用したいので、 php-fpm の設定をする。

元の php-fpm の設定ファイルを別名に移動しておいて、

$ sudo mv /etc/opt/remi/php74/php-fpm.d/www.conf /etc/opt/remi/php74/php-fpm.d/www.conf.org

オリジナルの php-fpm の設定ファイルをコピーして新しい設定ファイルを作って、

$ sudo cp /etc/opt/remi/php74/php-fpm.d/www.conf.org /etc/opt/remi/php74/php-fpm.d/www.conf

新しく作った設定ファイルを下記のように編集する。

$ sudo vi /etc/opt/remi/php74/php-fpm.d/www.conf
# 以下、修正箇所とメモしておきたい項目のみ記述する
user = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

# この辺りはさしあたりは初期値のまま
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

# 下記の設定はコメントアウトされているので、コメントを削除して有効にする
pm.max_requests = 500

# 末尾に追加(レスポンスヘッダに PHP の利用とそのバージョンをを含めない)
php_value[expose_php] = off

他にもいくつか設定があるけど、さしあたりは初期値のままにしておく。

続いて、 php-fpm を起動する。

$ sudo systemctl start php74-php-fpm
$ sudo systemctl enable php74-php-fpm

Nginx の設定は前述の通り試行錯誤中なので、また改めてまとめたい。

FTP サーバーの構築

CentOSで自宅サーバー構築さんには FTP 構築手順は載っていなくて、Fedoraで自宅サーバー構築さんには載っているので、こちらを参考にインストールを進める。

FTPサーバー構築(vsftpd) – Fedoraで自宅サーバー構築

また、 SSL の設定周りは下記のサイトを参考にさせてもらった。

なんでも情報局 CentOS7にFTP(Vsftpd)のインストール

まずは vsftpd をインストールする。

$ sudo dnf install -y vsftpd

続いてvsftpd の設定を修正していく。

$ sudo vi /etc/vsftpd/vsftpd.conf
# 修正箇所のみ記述していく
# 下記のように修正(ログ出力の設定)
#xferlog_file=/var/log/xferlog
xferlog_file=/var/log/vsftpd.log

# 下記のように修正(ログ出力の設定)
#xferlog_std_format=YES
xferlog_std_format=NO

# 下記のように修正(アスキーモードを利用できるようにする)
#ascii_upload_enable=YES
#ascii_download_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES

# 下記のように修正( FTP サーバーのバージョンを表示しないようにする)
#ftpd_banner=Welcome to blah FTP service.
ftpd_banner=Welcome to blah FTP service.

# 下記のように修正( chroot 機能を有効にする)
#chroot_local_user=YES
#chroot_list_enable=YES
chroot_local_user=YES
chroot_list_enable=YES

# 下記のように修正(ホームディレクトリより上層にアクセスできるユーザーのリスト)
#chroot_list_file=/etc/vsftpd/chroot_list
chroot_list_file=/etc/vsftpd/chroot_list

# 下記のように修正(ディレクトリごと削除できるようにする)
#ls_recurse_enable=YES
ls_recurse_enable=YES

# 下記のように修正( IPv4 で待ち受ける)
#listen=NO
listen=YES

# 下記をコメントアウト( IPv6 での待ち受けを利用しない)
#listen_ipv6=YES

#以下を最下行へ追加
allow_writeable_chroot=YES

use_localtime=YES
pasv_addr_resolve=YES
pasv_address=example.com
pasv_min_port=60000
pasv_max_port=60030
ssl_enable=YES
rsa_cert_file=/etc/letsencrypt/live/example.com/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/example.com/privkey.pem
require_ssl_reuse=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES

ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=NO
ssl_tlsv1_1=NO
ssl_tlsv1_2=YES
ssl_ciphers=HIGH

続いて、ホームディレクトリより上層にアクセスできるユーザーリストファイルを作成する。中身は空で OK 。

$ sudo touch /etc/vsftpd/chroot_list

「ホームディレクトリより上層へのアクセスができないユーザのタイムスタンプを日本時間にする」はFedoraで自宅サーバー構築さんの「FTPサーバー構築(vsftpd)」の通りに設定する。

Fedoraで自宅サーバー構築さんの「FTPサーバー構築(vsftpd)」の「(5)サーバー証明書作成」に関しては、 SSL 認証書は Let’s Encrypt で作成したものを設定するので、 vsftpd 用には作成しない。

私はCentOSで自宅サーバー構築さんの「6. サーバー公開前のセキュリティ強化」でファイアウォールとして iptables を導入したので、 FTP 用にポートを開ける。

$ sudo vi /root/iptables.sh
# 適当な箇所に下記行を追加する
# 外部からのTCP21番ポート(FTP)へのアクセスを日本からのみ許可
# ※FTPサーバーを公開する場合のみ
echo "-A INPUT -p tcp --dport 21 -j ACCEPT_COUNTRY" >> $IPTABLES_CONFIG

# 外部からのPASV用ポート(FTP-DATA)へのアクセスを日本からのみ許可
# ※FTPサーバーを公開する場合のみ
# ※PASV用ポート60000:60030は当サイトの設定例
echo "-A INPUT -p tcp --dport 60000:60030 -j ACCEPT_COUNTRY" >> $IPTABLES_CONFIG

最後に vsftpd を起動して完了。

$ sudo systemctl start vsftpd
$ sudo systemctl enable vsftpd

MySQL サーバーの構築

まずは dnfmysql-server をインストールする。

$ sudo dnf install -y mysql-server

続いて MySQL の設定を変更する。

$ sudo vi /etc/my.cnf.d/mysql-server.cnf
# 下記行を追加
collation-server=utf8mb4_bin

# 下記行を追加( MySQL の標準のパスワードポリシーが厳しいので)
validate_password.policy=LOW

ちなみに、インストールされた MySQL は v8.0.17 で、 v8 から標準の認証方式が変わったらしい、という情報があったけど、 dnf コマンドでインストールした MySQL v8.0.17 には /etc/my.cnf.d/mysql-default-authentication-plugin.cnf というファイルが作られていて、 mysql_native_password が初期として設定されていた。

$ cat /etc/my.cnf.d/mysql-default-authentication-plugin.cnf 
[mysqld]
default_authentication_plugin=mysql_native_password

続いて mysqld を起動する。

$ sudo systemctl start mysqld
$ sudo systemctl enable mysqld

続いて mysql_secure_installation を実行する。

$ mysql_secure_installation
# MySQL をセキュアに運用するための設定をいろいろ聞かれるので、よしなに設定する

以上で MySQL サーバーのインストールと設定が完了した。


長くなったけど、以上で、 CentOS 8 をインストールして、いくつかの初期設定をして、 Nginx と PHP と FTP と MySQL が 動く環境が構築できた。