Apacheでhttpサーバをhttpsサーバにする
はじめに
Apache でwebサーバを構築すると、何もしなければ「http 80/tcp」の通信になり、セキュリティ的に推奨されていないものになってしまう。
そこてで、今回はあらかじめ作成されている「httpサーバ」に「自己証明書」を作成し、「httpsサーバ」にする。
※「httpサーバ」は作成されているものとする。
https化に必要なモジュールをインストールする。
Apache で httpsサーバを構築するには、「mod_ssl」モジュールが必要になる。
[root@web01 ~]# dnf -y install mod_ssl
メタデータの期限切れの最終確認: 1:39:30 時間前の 2020年11月15日 10時57分53秒 に実施しました。
依存関係が解決しました。
======================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
======================================================================================================================
インストール中:
mod_ssl x86_64 1:2.4.37-21.module_el8.2.0+494+1df74eae AppStream 132 k
完了しました!
サーバの秘密鍵を作る
秘密鍵を作成。
[root@web01 ~]# openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
....+++++
.......................................................................+++++
e is 65537 (0x010001)
Enter pass phrase: #パスフレーズを入力
Verifying - Enter pass phrase: #パスフレーズを再入力
証明書署名要求(CSR)を作成する
基本的にすべての項目を[Enterキー]でスキップする。
[root@web01 ~]# openssl req -utf8 -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
ーーーー
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
サーバ証明書を発行する
今回は、無料で証明書を発行したいため自分自身で証明書を作る。
先ほど作成した証明書署名要求「server.csr」をもとに、サーバ証明書「server.crt」を有効期限:10年間で作成する。
[root@web01 ~]# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650
Signature ok
subject=C = XX, L = Default City, O = Default Company Ltd
Getting Private key
SSLモジュールの設定
証明書・鍵の移動
先ほど作成したサーバ証明書「server.crt」とサーバ秘密鍵「server.key」を管理しやすいように移動させる。
[root@web01 ~]# mkdir /etc/httpd/conf/ssl
[root@web01 ~]# mv server.key /etc/httpd/conf/ssl/
[root@web01 ~]# mv server.crt /etc/httpd/conf/ssl/
SSLモジュールの設定変更
証明書と鍵の場所を加える
[root@web01 ~]# vi /etc/httpd/conf.d/ssl.conf
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that restarting httpd will prompt again. Keep
# in mind that if you have both an RSA and a DSA certificate you
# can configure both in parallel (to also allow the use of DSA
# ciphers, etc.)
# Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt)
# require an ECC certificate which can also be configured in
# parallel.
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt #コメントアウト
SSLCertificateFile /etc/httpd/conf/ssl/server.crt# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
# ECC keys, when in use, can also be configured in parallel
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key #コメントアウト
SSLCertificateKeyFile /etc/httpd/conf/ssl/server.key
NTPサーバの構築
はじめに
NTPサーバを構築するためには、「chrony」をインストールする必要がある。
(centos8 サーバ用でインストールした際は、デフォルトでインストールされていた。)
「chrony」とは
深くは書かない。長くなりそうだから。
PCをNTPサーバ兼クライアントソフトとして動作させるための
「NTP用のソフトウェアスイート」。
- chronyd(chronyデーモン)
- chronyc
「chronyd」は、「chronyc」というコマンドラインユーティリティを使用して、管理及び監視をしている。
NTPサーバを構築
「chrony」のインストール。
主は、「centos8」を使用しているがデフォルトでインストールされていた。
一応、インストールする。
[root@ntp ~]# dnf install -y chrony
CentOS-8 - AppStream 1.5 MB/s | 5.8 MB 00:03
CentOS-8 - Base 1.8 MB/s | 2.2 MB 00:01
CentOS-8 - Extras 5.5 kB/s | 8.6 kB 00:01
パッケージ chrony-3.5-1.el8.x86_64 はすでにインストールされています。
依存関係が解決しました。
行うべきことはありません。
完了しました!
確認方法(最初にこれやればよかった?)
[root@ntp ~]# dnf list installed | grep chrony
chrony.x86_64 3.5-1.el8 @anaconda
設定を変更
念のためオリジナルファイルをコピーしておく。
[root@ntp ~]# cp /etc/chrony.conf /etc/chrony.conf.orig
設定ファイルを編集
[root@ntp ~]# vi /etc/chrony.conf# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.centos.pool.ntp.org iburst
/////////////////
# Allow NTP client access from local network.
#allow 192.168.0.0/16
↓
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#日本の標準時間を提供しているNTPサーバ(stratum 1)
server ntp.nict.jp iburst
/////////////////
# Allow NTP client access from local network.
#allow 192.168.0.0/16
allow 192.168.0.0/24
サービスの起動
「chronyデーモン」を起動
[root@ntp ~]# systemctl start chronyd
[root@ntp ~]# systemctl enable chronyd
「chronyデーモン」のステータスを確認
[root@ntp ~]# systemctl status chronyd
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-11-20 22:24:41 JST; 37min ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Main PID: 866 (chronyd)
Tasks: 1 (limit: 6041)
Memory: 1.7M
CGroup: /system.slice/chronyd.service
mq866 /usr/sbin/chronyd
正常に動作している。NTPサーバの時刻同期状態の確認
[root@ntp ~]# chronyc sources
210 Number of sources = 4
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^+ vpn.ms.mff.cuni.cz 2 8 377 94 +1062us[+1062us] +/- 176ms
^- ns2.vedur.is 3 8 377 34 -8573us[-8573us] +/- 211ms
^* ott130.hkcable.com.hk 3 7 377 103 +1567us[+1776us] +/- 79ms
^+ ntpool0.603.newcontinuum> 2 8 377 37 +57us[ +57us] +/- 107ms
NTPサーバ名の前に「^+」「^*」があれば時刻を同期している。
NetworkManagerでインタフェースの設定をする
virtual box を使って、アダプタをブリッジにして追加したが、
下記のコマンドを実行したところ、インタフェースが反映されていなかった。
[root@lb01 ~]# nmcli device
DEVICE TYPE STATE CONNECTION
enp0s3 ethernet 接続済み enp0s3
enp0s8 ethernet 切断済み --
enp0s9 ethernet 切断済み --
lo loopback 管理無し --
そもそもインタフェースの設定ファイルが存在していなかった。
[root@lb01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s9
cat: /etc/sysconfig/network-scripts/ifcfg-enp0s9: そのようなファイルやディレクトリはありません
まずは、インタフェースの設定ファイルを作成する。
[root@lb01 ~]# nmcli connection add type ethernet con-name enp0s9 ifname enp0s9
接続 'enp0s9' (36e6beb5-80c7-49b1-a18a-b49b30f76187) が正常に追加されました。
- 接続タイプは、「ethernet」
- インタフェースの接続名、「enp0s8」
※「/etc/sysconfig/network-scripts/ifcfg-xxx」←「xxx」の部分にも使われる
- インタフェース名は、「enp0s8」
上記コマンドにより、
/etc/sysconfig/network-scripts/ifcfg-enp0s9
が作成される。作成した後は、
# nmcli connection up enp0s8
により、「DHCP」で ipアドレス・NWアドレス・デフォルトゲートウェイ等が自動設定される。
設定後に確認してみる。
[root@lb01 ~]# nmcli device
DEVICE TYPE STATE CONNECTION
enp0s3 ethernet 接続済み enp0s3
enp0s9 ethernet 接続済み enp0s9
enp0s8 ethernet 接続済み enp0s8
lo loopback 管理無し --
接続されたことが確認できた。インタフェースの設定を変更する。
変更点としては、
の2点とする。
- IPアドレスを変更する。
[root@lb01 ~]# nmcli connection modify enp0s9 ipv4.addresses 192.168.1.100/24
- インタフェースのデフォルトゲートウェイを変更する。
[root@lb01 ~]# nmcli connection modify enp0s9 ipv4.gateway 192.168.1.1
- 「DHCP」->「Manual(手動)」に切り替える。
[root@lb01 ~]# nmcli connection modify enp0s9 ipv4.method manual
- インタフェースを再起動し、設定を反映させる。
[root@lb01 ~]# nmcli connection down enp0s9
接続 'enp0s9' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@lb01 ~]# nmcli connection up enp0s9
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/4)
- IPアドレスが変更されたか確認する。
[root@lb01 ~]# ip addr show | grep "enp0s9"
4: enp0s9: mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute enp0s9
LVS+keepalivedを使ってwebサーバを負荷分散
今回作るvirual box上のネットワーク構成図。
仮想サーバを作成
上記のネットワーク図に記載した分の仮想マシンを作成する
- 踏み台サーバ×2台
- Load Balancer×2台
- webサーバ×2台
踏み台サーバを作成
- 踏み台サーバは、冗長化してアクティブ機に障害が発生してもサーバが停止しない構成とする。
- 上記を実現するため、keepalivedをインストールする。1号機をアクティブ、2号機をスタンバイとする。
- keepalivedの設定
1. keepalived をインストール [root@bastin01 ~]# dnf -y install keepalived CentOS-8 - AppStream 3.3 MB/s | 5.8 MB 00:01 CentOS-8 - Base 2.0 MB/s | 2.2 MB 00:01 CentOS-8 - Extras 9.1 kB/s | 8.1 kB 00:00 依存関係が解決しました。 | 完了しました! 2. 設定ファイルをコピー [root@bastin01 ~]# cd /etc/keepalived/ [root@bastin01 keepalived]# cp keepalived.conf keepalived.conf.orig [root@bastin01 keepalived]# vi keepalived.conf #################################### ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER #MASTER/BACKUP(1号機:MASTER 2号機:BACKUP) interface enp0s3 virtual_router_id 51 #1、2号機で合わせる priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { #virtual IPアドレスの設定 192.168.1.50/24 dev enp0s3 10.0.0.50/24 dev enp0s8 } } #################################### 3. firewalld で「VRRP」パケットを許可する [root@bastin01 ~]# firewall-cmd --permanent --add-protocol=vrrp success [root@bastin01 ~]# firewall-cmd --reload success [root@bastin01 ~]# systemctl start keepalived.service [root@bastin01 ~]# systemctl enable keepalived.service Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service. 4. 1号機に設定した virtual IPアドレスが振り分けられていることを確認する [root@bastin01 ~]# ip a 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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:1c:f5:08 brd ff:ff:ff:ff:ff:ff inet 192.168.1.51/24 brd 192.168.1.255 scope global noprefixroute enp0s3 valid_lft forever preferred_lft forever inet 192.168.1.50/24 scope global secondary enp0s3 valid_lft forever preferred_lft forever inet6 240d:1e:149:a400:661b:ec36:d833:f7b4/64 scope global dynamic noprefixroute valid_lft 10411sec preferred_lft 10411sec inet6 fe80::460c:3b21:de30:5f13/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:28:af:5d brd ff:ff:ff:ff:ff:ff inet 10.0.0.51/24 brd 10.0.0.255 scope global noprefixroute enp0s8 valid_lft forever preferred_lft forever inet 10.0.0.50/24 scope global secondary enp0s8 valid_lft forever preferred_lft forever inet6 fe80::f556:a17a:a07:3543/64 scope link noprefixroute valid_lft forever preferred_lft forever
Load Balancerを作成
- webサーバへのアクセスを集中させないため負荷分散装置を作成。
- 踏み台サーバと同じくkeepalivedをインストールし、冗長化構成にする。ただ、今回はkeepalivedを使ってリアルサーバ(バックエンドサーバ)の稼働状況の監視をさせる設定を組み込む。
! Configuration File for keepalived global_defs { router_id LVS_server } vrrp_instance VI_1 { state MASTER interface enp0s3 virtual_router_id 100 priority 100 advert_int 1 authentication { auth_type PASS auth_pass password } virtual_ipaddress { 10.0.0.10 dev enp0s3 172.16.0.10 dev enp0s8 } } #リアルサーバの稼働状況を監視する設定を追加 virtual_server 10.0.0.10 80 { delay_loop 6 lb_algo rr #負荷分散アルゴリズム lb_kind NAT #負荷分散方式 persistence_timeout 50 protocol TCP real_server 172.16.0.100 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 } } real_server 172.16.0.101 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 } } }
- 負荷分散装置として動作させるため、LVS(Linux Virtual Server)をインストール。(LVSの管理ユーティリティであるipvsadmをインストール)
- LVSの設定
1. ipvsadm をインストール [root@LB01 ~]# dnf install -y ipvsadm メタデータの期限切れの最終確認: 0:22:38 時間前の 2020年10月29日 21時45分41秒 に実施しました。 依存関係が解決しました。 | | | 完了しました! 2. ipvsのシステム設定ファイルを作成 [root@LB01 ~]# touch /etc/sysconfig/ipvsadm 3. ipフォワーディングを設定 [root@LB01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 4. Load Balanceの設定(-A:virtual server -a:VSに振り分け先のリアルサーバを追加 -r:リアルサーバ -m:転送方法の設定(mはNAT方式)) [root@LB01 ~]# ipvsadm -C [root@LB01 ~]# ipvsadm -A -t 10.0.0.10:80 -s wlc [root@LB01 ~]# ipvsadm -a -t 10.0.0.10:80 -r 172.16.0.100:80 -m [root@LB01 ~]# ipvsadm -a -t 10.0.0.10:80 -r 172.16.0.101:80 -m [root@LB01 ~]# ipvsadm -l IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.10:http wlc -> 172.16.0.100:http Masq 1 0 0 -> 172.16.0.101:http Masq 1 0 0
webサーバを作成
routingの設定
踏み台サーバ→webサーバへの通信はLBを経由するようにする。 [root@bastin01 ~]# ip route add 172.16.0.0/24 via 10.0.0.10 dev enp0s8
追記
上記設定では、
踏み台サーバ→ロードバランサ→webサーバ
の通信は成功するが、帰りの通信が成功しなかった。
パケットキャプチャをしたが、踏み台サーバにwebサーバからの「SYN+ACKパケット」が到達していなかった。
恐らく「firewalld」でIPマスカレード設定をしていないのが原因。
今回は、ローカルだし設定めんどくさいし...ってことで、「firewalld」自体を停止させた。
[root@LB01 ~]# systemctl stop firewalld.service
「firewalld」を停止させたら成功した。
centos8を冗長構成にする
Linuxサーバを冗長化するには、keepalivedを使用する。
冗長化する目的
- NW機器やサーバに障害が発生してとしてもサービスを提供できるようにする。
- 構成変更時、スタンバイ系の1台ずつ変更できる。結果、サービスを停止しないで作業ができる。
今回、冗長化するための構成図↓
負荷分散装置(LVS:Linux Virtual Server)については、
前回の記事を参照。
keepalivedの設定をしていく。
keepalived のインストール
dnf install -y keepalived
以下に設定ファイルが置かれる
/etc/keepalived/keepalived.conf
設定ファイルをコピー
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.org
設定ファイルを編集
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_server
}
vrrp_instance VI_1 { #HAクラスタ(冗長化クラスタ)の設定
state MASTER #1号機と2号機で変える(MASTER/BACKUP)
interface enp0s3 #冗長化するインタフェース
virtual_router_id 51 #1号機と2号機で合わせる
priority 100
advert_int 3 #1号機と2号機で合わせる
authentication {
auth_type PASS
auth_pass password
}
virtual_ipaddress {#パケットを送受信する仮想サーバ(1号機と2号機で合わせる)
192.168.1.202/24
}
}
firewalldの設定
vrrpの許可
firewall-cmd --permanent --add-protocol=vrrp
firewall-cmd --reload
設定を保存して、serviceの起動
systemctl start keepalived.service
systemctl enable keepalived.service
負荷分散の設定
Linuxサーバをロードバランサとして使用するためのソフトウェア。
クライアントからの複数のリクエストをリアルサーバ(バックエンドサーバ)に
振り分ける機能を提供する。
※リアルサーバ:実際のサービス(http)などを提供するサーバ
※ロードバランサ:仮想サーバともいう。クライアントからのリクエストを
代わりに受け付けて、リアルサーバに処理を割り振る。
IPVS:カーネルモジュールの【ip_vs】として実装。
lvsd:デーモン。
ipvsadm:LVSの管理ユーティリティ。コマンド。
実際の設定方法
設定する前に、
リアルサーバのデフォルトゲートウェイを仮想サーバの内側(リアルサーバ側)に設定しておくこと。
これを設定しないとリアルサーバ -> クライアントへのパケットが配送されない
#LVSのインストール
dnf -y install ipvsadm
#ipフォワードを設定
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p
#ipvsサービスの起動
touch /etc/sysconfig/ipvsadm
systemctl start ipvs.service
systemctl enable ipvs.service
#テーブルのクリア
ipvsadm -C
#-A:仮想サーバの追加 -t:TCPの指定 -s:負荷分散のスケジューリングアルゴリズムの指定
ipvsadm -A -t 192.168.1.50:80 -s wlc
#-a:仮想サーバにリアルサーバを追加 -r:リアルサーバの指定 -m:フォワーディング方式にマスカレーディング(NAT)を指定
ipvsadm -a -t 192.168.1.50:80 -r 10.0.2.11:80 -m
ipvsadm -a -t 192.168.1.50:80 -r 10.0.2.12:80 -m
#テーブルの確認
ipvsadm -l
エラー発生時
systemctl restart ipvsadm.service
Job for ipvsadm.service failed because the control process exited with error code.
See "systemctl status ipvsadm.service" and "journalctl -xe" for details.
● ipvsadm.service - Initialise the Linux Virtual Server
Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Sat 2020-08-22 07:55:50 JST; 13s ago
Process: 28426 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm (code=exited
Main PID: 28426 (code=exited, status=1/FAILURE)
8月 22 07:55:50 centos8-LB02 systemd[1]: Starting Initialise the Linux Virtual Server...
8月 22 07:55:50 centos8-LB02 bash[28426]: /bin/bash: /etc/sysconfig/ipvsadm: そのようなファイルやディレ
8月 22 07:55:50 centos8-LB02 systemd[1]: ipvsadm.service: Main process exited, code=exited, status=1/FA
8月 22 07:55:50 centos8-LB02 systemd[1]: ipvsadm.service: Failed with result 'exit-code'.
8月 22 07:55:50 centos8-LB02 systemd[1]: Failed to start Initialise the Linux Virtual Server.
要するに、
/etc/sysconfig/ipvsadm
上記のファイルを作成していなかった。
#ファイルを作成
touch /etc/sysconfig/ipvsadm
#サービスの起動
systemctl start ipvsadm.service
systemctl enable ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service →
/usr/lib/systemd/system/ipvsadm.service.
無事に起動できた。
centos にある「/etc/sysconfig」というディレクトリは、
通常の設定ファイルとは別のシステムの設定ファイルが置かれている。
今回の場合は、「/etc/sysconfig/ipvs」ファイルには「ipvsサービス」起動時に
「lvsdデーモン」に引き渡す引数を記述するために使用されている。
httpサーバの構築(Apache)
まずは、パッケージの確認
dnf list installed | grep httpd
centos-logos-httpd.noarch
httpd.x86_64
httpd-devel.x86_64
httpd-filesystem.noarch
httpd-manual.noarch
httpd-tools.x86_64
無ければ、インストール
httpd httpd-tools httpd-devel httpd-manual の4つをインストール
dnf -y install httpd httpd-tools httpd-devel httpd-manual
systemctl start httpd
systemctl enable httpd
firewalldの設定
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
ここまで設定できれば、IEやGoogle chromeでcentos8のIPアドレスで検索してみる
Apacheのテストページが表示されれば成功。
apacheの設定ファイルは、/etc/httpd/conf/httpd.conf
html等のindexファイルの置き場は、上記のファイルにて行う。
(デフォルトは、/vat/www/html/ 配下)
参考サイト
https://www.rem-system.com/centos8-apache-install/#1_Apache