www.smiyasaka.com は、 2022 年 11月から Oracle LInux 8.X にOSを変更しました。

● Oracle Linux 8.10  64bit  ●
●   httpd-2.4.68 のインストールと自宅サーバ構築  ●

アクセス数 昨日 4 今日 4
  累計 4,831   

Oracle Linux R8-U9-x86_64-dvd.iso を使用し、自宅サーバを構築しました。

インストールは、openssl 3.0.XX + nghttp2 + Brotli + httpd-2.4.68 +
mod_dosdetector(DoS 攻撃対策) の構成で行います。


サーバ構築は、ファイアウォール・SELinux とも 有効 の設定で行っています。

( Oracle Linux 8.XX のサポート期間は2029年7月までです。)

※ 注 意 事 項 ※ を見る[ここをクリック]

目    次
[○○○○]のクリックで、その内容が目次の下に表示、再度クリックで非表示になります。


0.  現在稼働中のサーバ機のスペック


このウェブサイトは、
下記のシステム仕様で小型パソコンを使用して私の自宅から発信しています。


サーバ機の OS は、 Oracle Linux 8.10  64bit
  Web サーバは、 httpd-2.4.68  を使用して運用しています。
SELinux mode : Enforcing ( 有効 )
SSL 認証鍵の証明書 = Let's Encrypt を使用・SSL プロトコル HTTP/2 に対応
( Let's Encrypt は、一か月毎更新しています。 )
カーネルのバージョンは、2026.09.17 に更新された
  Kernel 5.15.0-324.217.5.3.el8uek.x86_64 です。

[ サーバ機 連続稼働時間 9 日と 10 時間 44 分 SSD 機器温度 34 度 ]
[ SSD 稼動時間 1,191 時間 ( 49 日 15 時間 ) ]
[ CPU 利用率 0.52 % CPU 温度 +40 度 ]

稼 働 中 サ ー バ 機 の ス ペ ッ ク
-------------------------------------------------------------------------
私の自宅サーバ機のスペック
型   式 :
Mouse Pro-M591F-WA CPU : Intel i3-7100U 2コア/4スレッド 2.40GHz
消費電力 : 約 10W   メ モ リ : 8GB   SSD : 128GB
インターネット回線 : STNet 光回線(ギガビット対応)
USBカメラ : Logicool UVC対応 C270sCW 120万画素(固定焦点)
-------------------------------------------------------------------------

1. OracleLinux-R8-U9-x86_64.iso のインストール

OracleLinux-R8-U10-x86_64-dvd.iso (13.2GB) でのインストール・動作確認を本ページでの手順で行いました。
( カーネルのバージョンは、
2026.09.17 付で更新されて Kernel 5.15.0-324.217.5.3.el8uek.x86_64,
Oracle Linux Server release 8.10 に成っています。)

インストール媒体の作成で容量が約 13 GB 以上あるため USB(16GB 以上) メモリが必要になります。

ダウンロードは、[ OracleLinux-R8-U10 は、ここをクリック] してください。

ソフトウエアの選択は、「最小限のインストール」+ 「開発ツール」を選択して行っています。

[ Oracle Linux 8.Xの USB からのインストール手順 ] の詳細は、

             [ここをクリック]してください。


2. Oracle Linux 8.X再起動後のコンソールからの各種設定(SELinux を含む)


ここの設定だけは、サーバ機のコンソールから、GNOME(テキスト入力モード)で行ってください。

○ ログインは、[ root ]と[ root のパスワード ]で行います。

① 日本語コードの変更 ( tara Term の日本語文字化け対策 )

日本語コード UTF-8 を使用するので、ここはパスします。

日本語コードの確認は、
echo $LANG

日本語コードの変更は、ロケール( locale )の値を編集します。

vi /etc/locale.conf

言語 国 文字コード
↓ ↓ ↓
ja_JP.
UTF-8 ---> ja_JP.eucJP

または、localectl set-locale LANG="ja_JP.eucJP" で変更する。

②  
SELinux を無効にしてサーバ機を構築する時は、④ に進んでください。

   
SELinux を有効にしてサーバ機を構築する時は、③ に進んでください。

③ SELinux を有効にしてサーバ機を構築する時は、下記をクリックして各種設定を行ってください。

[ SELinux のアクセス制限を有効にした時の設定手順 ] の詳細は、

            [ここをクリック]してください。

④ Windows側から、Tera Term でアクセスするポート番号を設定する。

下記コマンドで sshd の設定ファイルを編集します。

vi /etc/ssh/sshd_config

#Port 22の前の # を削除して、「 Port 2222 」に変更します。


ポート番号 22 のままで良い場合は、設定なし、SELinux 有効のままで Tera Term でログインが可能です。


④-1 Port 2222 を有効化( 追加 )する。

( --permanent は、再起動後も設定を有効にする指定。忘れない様にしてください。)

firewall-cmd --zone=public --add-port=2222/tcp --permanent

success が表示すれば OK


firewall のコマンドで --zone=public は、省略してもデフォルトで zone は、public になっているで zone=public で設定されます。


④-2 設定を読込みこませて、有効にします。

firewall-cmd --reload

success が表示すれば OK

※※ 参考情報 ※※

〇 キーボードから長いコマンドを入力するのが面倒な方へのアドバイス。
 ポート番号を「 2222 」に変更しないで初期値のまま( 22 ) Tera Term にログインします。
 後は、各設定をコピペですれば良いのです。 SELinux 有効のままで Tera Term には、ログインが可能です。
 ポート番号を「 2222 」に変更したい時には、変更後、再起動・再ログインするだけでOKです。


⑤ sshdの再起動

再起動するので、sshd の再起動は、不要です。また、デフォルトでサービスが有効になっています。

⑥ SELinux を無効にする設定。

この変更を忘れると Tera Term から接続できなくなってしまいますから、注意してください。

vi /etc/sysconfig/selinux

SELINUX=
enforcing ----> SELINUX=disabled に変更する。

※※ 参考情報 ※※

後から、SELinux を有効にしたくなり、ここを permissive または、enforcing に設定し直して 再起動すると SELinux のポリシー情報が無いためにエラーになり再起動できなくなります。
注意してください。


⑦ 不足パッケージのインストール

「ベース」と「その他の開発」を groupinstall でインストールします。


dnf -y groupinstall "Base" "Additional Development"

groupinstall は、時間がかかるので、シャットダウンするコマンドを追加します。

dnf -y groupinstall "Base" "Additional Development" && poweroff

⑧ ファイアウォール( firewalld )の動作状況の確認

下記コマンドで、ファイアウォールが有効な状態か確認しておきます。

systemctl status firewalld

下記の様に表示すればファイアウォールは、有効になっています。

firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since 月 2014-09-** 06:01:06 JST; 5min ago
Main PID: 567 (firewalld)
以下省略

⑨ 再起動後、セキュリティ強化の為、sshd のアクセス制限を設定します。
  この設定は、必要と感じたら行ってください。

( TCP Wrapper による SSH 接続のアクセス制御 )

この設定は、必要とする方のみ行ってけてた下さい。

私の場合、サーバ機の管理・設定は、ローカルの PC 以外しないので設定しています。


hosts.allowとhosts.denyの設定( IPアドレスの制限 )

この設定は、hosts.allow が優先されます。つまり、全てを拒否し、hosts.allow で指定された IP アドレスは、許可になります。

⑨-1 /etc/hosts.deny に、 sshd:ALL ( すべての接続を拒否 )と書込みます。

vi /etc/hosts.deny で sshd:ALL または、

echo "sshd:ALL" >> /etc/hosts.deny

⑨-2 /etc/hosts.allow で接続を許可するIPアドレスを指定します。

vi /etc/hosts.allow で sshd:192.168.0. または、

echo "sshd:192.168.0." >> /etc/hosts.allow

192.168.0. は、私の環境下ですべてのローカルIPアドレスを許可する設定です。

⑩ 一度再起動をします。

reboot

停止したい時は、
poweroff にしてください。


各種コマンドの設定を連続で実行させてみました。
以下が、その設定コマンドの一部ですが、サーバ構築が簡単に済むようになります。

簡単なプログラムの書込みは、ヒアドキュメント( cat << EOF > )で行っています。




○○○○は、貴方のユーザー名です。

〇 ポート番号の変更から、public.bak.xml への https,ntp,ftp 追加設定
------------------------------------------------------

sed -i 's/#Port 22/ Port 2222/g' /etc/ssh/sshd_config;\ 
#
firewall-cmd --zone=public --add-port=2222/tcp --permanent;\ 
#
semanage port -a -t ssh_port_t -p tcp 2222;\ 
#
# Oracle Linux 8.X の場合 semanage 等のコマンドパッケージのインストールが必要
dnf -y install policycoreutils-python-utils;\ 
#
semanage port -l| grep ssh;\ 
#
cp /etc/firewalld/zones/public.xml /home/○○○○/public.bak.xml;\ 
sed -i -e"s/<service name=\"dhcpv6-client\"\/>/<service name=\"http\"\/>\n\ 
  <service name=\"https\"\/>\n\ 
  <service name=\"ntp\"\/>\n\ 
  <service name=\"ftp\"\/>/g" /etc/firewalld/zones/public.xml; \ 
cat /etc/firewalld/zones/public.xml

-----------------------------------------------------------
〇 ここまでで 次回のログインは、ポート番号 2222 でOKです。
-----------------------------------------------------------

ここで、vsftpd-3.0.3-35.el8.x86_64.rpm をドラッグする
~/ を消去 か /home/○○○○ を書き込む

-------------------------------------------------------
〇 vsftpd のインストールから、各種設定まで
-------------------------------------------------------

cp /home/○○○○/vsftpd-3.0.3-35.el8.x86_64.rpm /usr/local/src/; \ 
cd /usr/local/src/; \ 
rpm -ivh vsftpd-3.0.3-35.el8.x86_64.rpm;\ 
#
cp /etc/vsftpd/vsftpd.conf /home/○○○○/vsftpd.conf.bak; \ 
sed -i -e "/anonymous_enable=/s/YES/NO/
/xferlog_enable=/s/YES/NO/
#   先頭の # を削除
/#ascii_upload_enable/s/^#// 
/#ascii_download_enable/s/^#// 
/#chroot_local_user/s/^#//
/#chroot_list_enable/s/^#//
/#chroot_list_file/s/^#//
/#ls_recurse_enable/s/^#//
/listen=/s/NO/YES/
/listen_ipv6=/s/YES/NO/
# ここからは、最終行後に追加です。
\$a\local_root=public_html\n\ 
use_localtime=YES\n\ 
text_userdb_names=Yes\n\ 
force_dot_files=YES\n\ 
pasv_min_port=50010\n\ 
pasv_max_port=50012" /etc/vsftpd/vsftpd.conf;\ 
#
firewall-cmd --zone=public --add-port=50010-50012/tcp --permanent; \ 
firewall-cmd --reload;\ 
#
echo "○○○○" >> /etc/vsftpd/chroot_list; \ 
echo "vsftpd : ALL" >> /etc/hosts.deny; \ 
echo "vsftpd : 192.168.0.0/24" >> /etc/hosts.allow; \ 
systemctl start vsftpd; \ 
systemctl enable vsftpd;\ 
#
setsebool -P ftpd_full_access 1;\ 
setsebool -P httpd_enable_ftp_server 1;\ 
setsebool -P httpd_enable_homedirs 1;\ 
firewall-cmd --reload

-----------------------------------------------------------
〇 ここで 各ソースプログラムを ffftp で転送できます。
-----------------------------------------------------------

# インストールプログラムの転送を実行
chmod 777 -R /home/○○○○/root_program/;\ 
/home/○○○○/root_program/tensou.sh;\ 
#
# chrony.conf;\
cp /etc/chrony.conf /home/○○○○/chrony.conf.bak; \ 
sed -i -e "s/pool 2\.centos/#pool 2\.centos/
/pool 2\.centos\.pool\.ntp\.org iburst/aserver ntp\.nict\.jp\n\ 
server ntp1\.jst\.mfeed\.ad\.jp\n\ 
server ntp2.\jst.mfeed\.ad\.jp" /etc/chrony.conf;\ 
systemctl restart chronyd;\ 
#
# service_stop プログラムの書込み
cat <<EOF > /home/○○○○/service_stop.sh
#!/usr/bin/sh
systemctl stop atd.service
systemctl disable atd.service
#systemctl stop auditd.service
systemctl disable auditd.service
systemctl stop kdump.service
systemctl disable kdump.service
systemctl stop lvm2-monitor.service
systemctl disable lvm2-monitor.service
systemctl stop mdmonitor.service
systemctl disable mdmonitor.service
systemctl stop rngd.service
systemctl disable rngd.service
systemctl stop smartd.service
systemctl disable smartd.service
systemctl stop tuned.service
systemctl disable tuned.service
systemctl stop dm-event.socket
systemctl disable dm-event.socket
echo "サービス_STOP 完了"
EOF
 && \ 
chmod 755 /home/○○○○/service_stop.sh;sh /home/○○○○/service_stop.sh

------------------------------------------------
〇 ここからは、 httpd-2.4.68 のインストールです。
------------------------------------------------

# perl-core のインストール
cd /usr/local/src/;\ 
dnf install -y perl-core;\ 
#
# openssl-3.0.13.tar.gz のインストール
  cd /usr/local/src/;\ 
tar zxvf openssl-3.0.13.tar.gz;\ 
cd ./openssl-3.0.13;\ 
./Configure \ 
 --prefix=/usr/local/openssl-3.0 shared zlib;\ 
make && make install;\ 
# パスを通しておきます。
echo /usr/local/openssl-3.0/lib64 > /etc/ld.so.conf.d/openssl.conf;\ 
ldconfig;\ 
#
# nghttp2-1.59.0.tar.gz のインストール
cd /usr/local/src;\ 
dnf -y install jansson-devel libev-devel python3-devel;\ 
#  
cd /usr/local/src; \ 
tar xvzf nghttp2-1.59.0.tar.gz; \ 
cd nghttp2-1.59.0/; \ 
env OPENSSL_CFLAGS="-I/usr/local/openssl111/include" \ 
OPENSSL_LIBS="-L/usr/local/openssl111/lib -lssl -lcrypto" \ 
./configure \  
 --with-ssl=/usr/local/openssl-3.0 \ 
 --disable-static  \ 
 -enable-app;\ 
make && make install;\ 
#
# cmake のインストール
cd /usr/local/src;\ 
dnf -y install cmake;\ 
#
# brotli-1.1.0.tar.gz のインストール
cd /usr/local/src;\ 
tar xvzf brotli-1.1.0.tar.gz; \ 
cd brotli-1.1.0/; \ 
mkdir out && cd out; \ 
cmake -DCMAKE_BUILD_TYPE=Release\ 
      -DCMAKE_INSTALL_PREFIX=/usr/local ..;\ 
cmake --build . --config Release --target install;\ 
# パスを通しておきます。
echo /usr/local/lib64 > /etc/ld.so.conf.d/usr-local-lib64.conf;\ 
ldconfig


---------------------
〇 チョット休憩です。
---------------------

# apr-1.7.0.tar.gz のインストール
cd /usr/local/src; \ 
tar xzvf /usr/local/src/apr-1.7.0.tar.gz; \ 
cd ./apr-1.7.0; \ 
./configure; \ 
make && make install;\ 
cd /usr/local/src;\ 
#
# apr-util-1.6.1.tar.gz のインストール
tar xzvf /usr/local/src/apr-util-1.6.1.tar.gz; \ 
cd ./apr-util-1.6.1; \ 
./configure\ 
--with-apr=/usr/local/apr; \ 
make && make install;\ 
#
#  httpd-2.4.68.tar.gz のインストール
cd /usr/local/src; \ 
tar xzvf  httpd-2.4.68.tar.gz; \ 
cd ./ httpd-2.4.68;\ 
./configure \ 
  --enable-http2 \ 
  --enable-brotli \ 
  --with-brotli=/usr/local/lib \ 
  --enable-ssl \ 
  --with-ssl=/usr/local/openssl111 \ 
  --with-apr=/usr/local/apr \ 
  --with-apr-util=/usr/local/apr \ 
  --enable-rewrite \ 
  --enable-so \ 
  --enable-mods-shared=all \ 
  --enable-mpms-shared=all;\ 
make && make install 

-------------------------------------
〇 連続コマンド紹介は、ここまでです。
-------------------------------------


Tera Term の文字化けを防ぐため、漢字コードをサーバ機側と同じ漢字コード UTF-8 に必ず設定し、 「設定の保存」をしてください。 接続すTCPポートは、私の場合 2222 に変更しています。


※※ 参考情報 ※※
サーバ機の文字コード( 漢字コード )を UTF-8 にした時 javascripts のソースプログラムを web で表示すると文字化けします。
これは、javascripts のソースプログラムには、文字コード指定が無い為文字化けが発生するのです。
この対策は、javascripts のプログラムだけは、KanjiTranslator 等の漢字コード変換アプリで UTF-8 + BOM付 の文字コードに変換してやると治ります。
[ HTML , css のプログラムには、文字コード指定 HTML --> (charset="UTF-8"), css --> (@charset "UTF-8") が入るので不要です。
但し、perl のプログラムソースは、BOM付にすると動作しなくなります。]


3. 事前にダウンロードするファイル一覧と探し方

rpm パッケージのダウンロードは、このサイト[ RPM Search ]で検索するとほとんどのパーケージが 入手できます。

下記のパッケージ名をクリックするとダウロード出来るサイトへジャンプします。


Oracle Linux 8.Xの rpm パッケージは、el8.x86_64.rpm の名前が付きます。

ftp
vsftpd-3.0.3-35.el8.x86_64.rpm
ftp-0.17-78.el8.x86_64.rpm
---------------------------------------------------------------
httpd
httpd-2.4.XX.tar.gz
旧バージョン(httpd-2.4.XX)から最新バージョンhttpd-2.4.58)の httpd ダウンロード
apr-1.7.X.tar.gz
apr-util-1.6.X.tar.gz
openssl-3.0.XX.tar.gz
nghttp2-1.XX.X.tar.gz
brotli-1.X.X.tar.gz
---------------------------------------------------------------
fswebcam
fswebcam-20100622.tar.gz
fswebcam-20200725.tar.gz
---------------------------------------------------------------
sendmail
procmail-3.22-47.el8.x86_64.rpm.html
sendmail-8.15.2-31.el8.x86_64.rpm
---------------------------------------------------------------
logwatch
logwatch-7.4.3-11.el8.noarch.rpm
mailx-12.5-29.el8.x86_64.rpm
perl-Date-Manip-6.60-2.el8.noarch.rpm
perl-Sys-CPU-0.61-14.el8.x86_64.rpm
perl-Sys-MemInfo-0.99-6.el8.x86_64.rpm
---------------------------------------------------------------
clamav Fedora のパッケージを使用します。
libprelude-5.2.0-1.el8.x86_64.rpm
clamav-0.103.4-1.el8.x86_64.rpm
clamav-update-0.103.4-1.el8.x86_64.rpm
clamav-lib-0.103.4-1.el8.x86_64.rpm
clamav-data-0.103.3-81.el8.noarch.rpm
clamav-filesystem-0.103.4-1.el8.noarch.rpm
---------------------------------------------------------------
chkrootkit
chkrootkit.tar.gz
---------------------------------------------------------------
nkf-2.1.5.tar.gz
---------------------------------------------------------------
sensors
lm_sensors-3.4.0-21.20180522git70f7e08.el8.x86_64.rpm


4. セキュリティ対策のため停止したサービス

暫定的に停止したサービスは、下記のとおりです。
( 試しに、不要と思われるサービスを停止 及び 再起動後も停止にしています。)

サービス名
atd
kdump

lvm2-monitor
mdmonitor
rngd
smartd
tuned

   機 能
# 単発的にスケジュール化した コマンド を実行させるデーモンです。
# 監査メッセージのログファイルを出力するデーモン
# システムがクラッシュした時、原因を特定するためのdumpファイルを
  保存してくれるサービス。
# 論理ボリュームマネージャー(LVM) 利用時の障害監視のためのデーモン
# ソフトウェアRAID 監視サービ
# ハードウェア を元に乱数を発生させるためのデーモンです。
# ハードディクスのS.M.A.R.T.による自己診断機能情報を取得する。
# CPUガバナーを利用して強制的にCPUを最大パフォーマンスで動作させる。



下記は、サービスを一括停止するプログラムです。
------------------------------------------------------------
vi service_stop.sh

#!/usr/bin/sh
systemctl stop atd.service
systemctl disable atd.service
systemctl stop kdump.service
systemctl disable kdump.service
systemctl stop lvm2-monitor.service
systemctl disable lvm2-monitor.service
systemctl stop mdmonitor.service
systemctl disable mdmonitor.service
systemctl stop rngd.service
systemctl disable rngd.service
systemctl stop smartd.service
systemctl disable smartd.service
systemctl stop tuned.service
systemctl disable tuned.service
systemctl stop dm-event.socket
systemctl disable dm-event.socket
echo "サービス_STOP 完了"
-------------------------------------------------------------
属性を変更して、実行します。

chmod 755 service_stop.sh;sh service_stop.sh

5. ファイアウォール( firewalld )と Systemd

私が設定したファイアウォール( firewalld )の内容は、下記の通りです。
( zone public ( public.xml ) のファイアウォール設定項目を直接編集します。)

システム起動時に設定されるファイアウォールの設定は、zone public ( public.xml ) のファイルの 内容で設定されるので、このファイルを直接編集すれば、個別に設定することが不要になります。

( このファイル( public.xml )は、--add-service, --add-port で --permanent を指定した時に設 定内容が反映されます。)

public のファイアウォールの設定データは、/etc/firewalld/zones/public.xmlに保存されています。
この内容を修正して dhcpv6-client, ssh の削除と ntp, http, ftp, httpsの追加をするように編集してみます。

public.xml のオリジナルデータは、下記の通りです。


  vi /etc/firewalld/zones/public.xml
------------------------------------------------------------------
 <?xml version="1.0" encoding="utf-8"?>
  <zone>
   <short>Public</short>
    <description>For use in public areas. You do not………
    computers on networks to not harm your computer. Only ………
    connections are accepted.</description>
    <service name="ssh"/>
    <service name="dhcpv6-client"/>     <----- ここを修正
    <port protocol="tcp" port="2222"/>   <----- 追加したポート
  </zone>
------------------------------------------------------------------
 
  下記の様に編集します。
 
<service name="dhcpv6-client"/>
       ↓  ↓  ↓
<service name="ntp"/>   <---- 123/tcp の有効化
<service name="http"/>  <----  80/tcp の有効化
<service name="ftp"/>   <----  21/tcp の有効化
<service name="https"/> <---- 443/tcp の有効化

上記の操作を sed コマンドで一括処理してみました。
          (必ず、バックアップを取ってから実行します。)


cp /etc/firewalld/zones/public.xml\ 
 /etc/firewalld/zones/public_bak.xml;\ 
sed -i -e"s/ssh/http/g
s/<service name=\"dhcpv6-client\"\/>/<service\ 
 name=\"https\"\/>\n\ 
<service name=\"ntp\"\/>\n\ 
<service name=\"ftp\"\/>/g" /etc/firewalld/zones/public.xml

編集保存したら、firewall-cmd --reload で設定を反映します。

下記コマンドで変更内容を確認します。

cat /etc/firewalld/zones/public.xml

<?xml version="1.0" encoding="utf-8"?>
<zone>
 <short>Public</short>
 <description>For use in public areas. You do not trust ………
 <service name="http"/>
 <service name="https"/>
 <service name="ntp"/>
 <service name="ftp"/>
 <service name="cockpit"/>
 <port port="2222" protocol="tcp"/>
</zone>

ファイアウォール( firewalld )の設定内容を確認する。

 
firewall-cmd --list-all

上記設定で ファイアウォールの設定は、下記の様になります。
----------------------------------------------------------
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp2s0
 sources:
 services:
ftp http https ntp
 ports:
2222/tcp
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:
-----------------------------------------------------------


             ※※ 準備中 ※※


6. Tera Termでvsftpd( FTPサーバ )を転送しインストール

ここでは、先人の知恵を借りて、vsftpd のインストールと設定に挑戦してみました。
設定は、管理者のみ・LAN 内のみの接続にしています。また、個人使用の為、ログは取りません。


※ 役に立つ情報 ※

ffftp が使えないので、vsftpd の rpm の転送は、Tera Term の転送機能を利用して行います。
その方法は、実に簡単です。
 下記にその手順を説明します

----------------------------------------------
Tera Term が、表示している状態で vsftp の
rpm が保存されているフォルダを開きます。
開いたら、書込みたい vsftp を Tera Term の
画面上にドラッグします。
そうすると右に表示している画面が表示します。
矢印に示すように書き込み先のパスを
書き込むか、
送信先(T)の内容 " ~/ " を削除します。
最後に[OK]をクリックして終了です。
----------------------------------------------

写真vsftp_SSH

① vsftpd のインストールと設定

vsftpd-3.0.3-35.el8.x86_64.rpm は、Tera Term の転送機能を利用してホームディレクトリに読込み
  cp コマンドで /usr/local/src/ へ コピーします。


  cp /home/miyasaka/vsftpd-3.0.3-35.el8.x86_64.rpm /usr/local/src/

cd /usr/local/src/;\
rpm -ivh vsftpd-3.0.3-35.el8.x86_64.rpm


  dnf でのインストールは、下記の通りです。

 
dnf -y install vsftpd

② vsftpd の設定

  編集前の vsftpd.conf を .bak を付けて保存しておきます。

  cp /etc/vsftpd/vsftpd.conf /home/miyasaka/vsftpd.conf.bak

編集済の vsftpd.conf が有る場合には、Tera Term の転送機能を利用してホームディレクトリに読込み
cp コマンドで上書きします。

  cp /home/miyasaka/vsftpd.conf /etc/vsftpd/

下記の操作を sed コマンドで一括処理してみました。下記を実行します。
( sed -i は、上書き編集、/○○○/s/^#// は、文字列○○○がある行の先頭の # を削除、\$a\ は、 最終行[\$]の行末[a]に \ 以降の文字列を追加・\ は、先頭の改行、\n は、文字列中の改行
\n\ の \ は、継続行の指示です。)

cp /etc/vsftpd/vsftpd.conf /home/miyasaka/vsftpd.conf.bak; \ 
sed -i -e "/anonymous_enable=/s/YES/NO/ 
/xferlog_enable=/s/YES/NO/ 
#   先頭の # を削除
/#ascii_upload_enable/s/^#//
/#ascii_download_enable/s/^#//
/#chroot_local_user/s/^#//
/#chroot_list_enable/s/^#//
/#chroot_list_file/s/^#//
/#ls_recurse_enable/s/^#//
/listen=/s/NO/YES/
/listen_ipv6=/s/YES/NO/
##### ここからは、最終行後に追加です。
\$a\local_root=public_html\n\ 
use_localtime=YES\n\ 
text_userdb_names=Yes\n\ 
force_dot_files=YES\n\ 
pasv_min_port=50010\n\ 
pasv_max_port=50020" /etc/vsftpd/vsftpd.conf

  vi /etc/vsftpd/vsftpd.conf


12行目 匿名ログイン禁止

  anonymous_enable=NO

40行目:転送記録をログに残す

  xferlog_enable=NO

82,83行目 コメント解除 ( アスキーモードでの転送を許可 )

  ascii_upload_enable=YES
  ascii_download_enable=YES

100,101行目:コメント解除 ( chroot有効 )

  chroot_local_user=YES
  chroot_list_enable=YES

103行目 コメント解除 ( chroot リストファイル指定 )

  chroot_list_file=/etc/vsftpd/chroot_list

109行目 コメント解除 ( ディレクトリごと一括での転送有効 )

  ls_recurse_enable=YES

114行目 変更 ( IPv4を有効にする )

  listen=YES

123行目 変更 ( IPv6 は、無視させる )

  listen_ipv6=NO

### 最終行へ追記 ###

# PAM認証のサービス名指定 ( これを設定しないと接続できない為、設定しておく。)

  pam_service_name=vsftpd

# アクセスユーザーリストファイルの使用
# NO : 「/etc/vsftpd/user_list」内の指定ユーザに関わらず接続が許可される。

  userlist_enable=NO

# tcp_wrappers( IPアドレスの制限 )を使用する

  tcp_wrappers=YES

# ルートディレクトリ指定 (指定しない場合はホームディレクトリがルートディレクトリとなる)

  local_root=public_html

# ローカルタイムを使う

  use_localtime=YES

# Windows( ffftp )側で所有者名の表示

  text_userdb_names=Yes

# Windows( ffftp )側で . ファイルの表示

  force_dot_files=YES

# PASVモードでの接続のためのポート番号を設定します。
# PASVモードは、デフォルトで有効になっています。
# ポート番号の設定は、任意の番号で良いと思います。

  pasv_min_port=50010    ←   pasvモード通信用 任意のポート番号
  pasv_max_port=50020   ←   pasvモード通信用 任意のポート番号

③ ③-1 Port 50010 ~ 50020 を有効化( 追加 )する。

  ( --permanent は、再起動後も設定を有効にする指定。忘れない様にしてください。)

 
firewall-cmd --zone=public --add-port=50010-50020/tcp --permanent

  success が表示すれば OK

③-2 設定を読込みこませて、有効にします。

 
firewall-cmd --reload

  success が表示すれば OK

④ 上層への ディレクトリへのアクセスを許可するユーザーを追加

 
vi /etc/vsftpd/chroot_list または、

 
echo "miyasaka" >> /etc/vsftpd/chroot_list

  私の場合 miyasaka を書込みました。

⑤ hosts.allowとhosts.denyの設定( IPアドレスの制限 )

この設定は、hosts.allow が優先されます。つまり、全てを拒否し、hosts.allow で指定された   IPアドレスは、許可になります。

⑤-1 /etc/hosts.deny に、 vsftpd:ALL ( すべての接続を拒否 )と書込みます。

 
vi /etc/hosts.deny

 
vsftpd:ALL

  または、

 
echo "vsftpd:ALL" >> /etc/hosts.deny

⑤-2 /etc/hosts.allow で接続を許可するIPアドレスを指定します。

 
vi /etc/hosts.allow

 
vsftpd:192.168.0.

  または、

 
echo "vsftpd:192.168.0." >> /etc/hosts.allow

  192.168.0.0/24 は、私の環境下ですべてのローカルIPアドレスを許可する設定です。

⑥ vsftpd を自動起動を有効にし、起動する。

 
systemctl enable vsftpd; \
  systemctl start vsftpd


  # が表示すれば OK です。

⑦ ③ ~ ⑥ のコマンドをまとめて実行させると下記の様になります。

echo "○○○○" >> /etc/vsftpd/chroot_list; \ 
echo "vsftpd:ALL" >> /etc/hosts.deny; \ 
echo "vsftpd:192.168.0." >> /etc/hosts.allow; \ 
systemctl start vsftpd; \ 
systemctl enable vsftpd

ユーザー名 ○○○○・接続を許可するIPアドレスは、あなたの環境に合わせてください。

⑧
SELinux 有効化では、下記を設定しないと FFFTP での読み書きができません。

setsebool -P ftpd_full_access 1;\
firewall-cmd --reload


⑨ ここで、windows 側から、ffftp で接続できるか確認をしておきます。


7. ファイルの転送プログラムの作成

             ※※ 準備中 ※※

8. サーバの時刻を日本標準時に同期させるル

(設定方法等は、先人の知恵を借りて行いました。)

①
vi /etc/chrony.conf を入力して、設定ファイルを下記の様に変更します。
3行目あたり 以下のように変更します。


pool 2.centos.pool.ntp.org iburst
↓ ↓
server ntp.nict.jp
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp

※ 参考 ※ 1行毎直すのが面倒な時には、sed コマンドで下記の様にすると同じ事ができます。

sed -i -e "s/pool 2\.centos/#pool 2\.centos/
/pool 2\.centos\.pool\.ntp\.org iburst/aserver ntp\.nict\.jp\n\ 
server ntp1\.jst\.mfeed\.ad\.jp\n\ 
server ntp2.\jst.mfeed\.ad\.jp" /etc/chrony.conf

② chrony を再起動します。 ( chrony のサービス名は、chronyd です。)

systemctl restart chronyd.service

# が表示すば、OKです。

③ 再起動後も chrony を有効にします。

systemctl enable chronyd.service

# が表示すば、OKです。

④ chronyd のステータス( 動作 )の確認。

chronyc sources

下記の様に表示します。

MS Name/IP address         Stratum Poll Reach LastRx Last sample
========================================
^+ ntp1.jst.mfeed.ad.jp  2  9  377 125 -462us[ ……
^* ntp2.jst.mfeed.ad.jp  2 10 377 1019 +140us[ ……


以下のように*印がついていたら同期ができています。
                (起動してから同期までに10分ぐらいかかります。)


9. リポジトリを導入する

サードパーティ( 外部 )リポジトリの導入方法

dnf でインストールします。

 
dnf -y install epel-release


10-1. apache2( httpd-2.4.68 )のインストールと設定

 2022年  3月  14日付けで httpd-2.4.53
 2022年  6月    8日付けで httpd-2.4.54
 2023年  1月  17日付けで httpd-2.4.55
 2023年  3月    7日付けで httpd-2.4.56
 2023年  4月    6日付けで httpd-2.4.57
 2023年 10月 19日付けで httpd-2.4.58
 2024年  4月    4日付けで httpd-2.4.59
 2024年  7月    1日付けで httpd-2.4.60
 2024年  7月    3日付けで httpd-2.4.61
 2024年  7月  17日付けで httpd-2.4.62
 2025年  1月  23日付けで httpd-2.4.63
 2025年  7月  10日付けで httpd-2.4.64
 2025年  7月  23日付けで httpd-2.4.65
 2025年  12月    4日付けで httpd-2.4.66
 2026年  5月    4日付けで httpd-2.4.67
 2026年  6月    8日付けで httpd-2.4.68
 がリリースされています。
① httpd-2.4.68 を展開して フォルダ ./ httpd-2.4.68/srclib/ へ apr , apr-util を展開して書き込む。


1. httpd-2.4.68 を展開する。

   cd /usr/local/src; \ 
   tar xzvf  httpd-2.4.68.tar.gz; \ 
   chown -R root.  httpd-2.4.68; \ 
   cd ./ httpd-2.4.68/srclib

2. apr を展開する。

   tar xzvf /usr/local/src/apr-1.7.6.tar.gz; \ 
   chown -R root. apr-1.7.6/; \ 
   mv apr-1.7.6 apr; \ 
   tar xzvf /usr/local/src/apr-util-1.6.3.tar.gz; \ 
   chown -R root. apr-util-1.6.3/; \ 
   mv apr-util-1.6.3/ apr-util

② configure( make 用にソースファイルの配置をする ) の実行

   cd /usr/local/src/ httpd-2.4.68; \ 
   ./configure \ 
   --with-included-apr \ 
   --enable-rewrite \        <---- リクエストされた URL の
                                       動的書き換えを行うモジュール
   --enable-so \              <---- モジュールの有効化
   --enable-deflate=shared   <---- 圧縮する処理を追加

  SSL を有効にしたい時には、[./configure \]の後に[--enable-ssl \]を追加します。
  mod_ssl.so が追加されます。

  ・enable-rewrite     : Rewriteサポート(mod_rewrite)
  Apache側で要求されたURLを書き換えたり、リダイレクトしたりしてくれるモジュール
  ・enable-so        : mod_soモジュールを静的に組み込む
  ・enable-deflate=shared : データの転送を圧縮するモジュールを組み込む

  以下で、終われば、OK

------------------------------------------------------------------
config.status: creating support/split-logfile
config.status: creating build/rules.mk
config.status: creating build/pkg/pkginfo
config.status: creating build/config_vars.sh
config.status: creating include/ap_config_auto.h
config.status: executing default commands
configure: summary of build options:

    Server Version: 2.4.68
    Install prefix: /usr/local/apache2
    C compiler:     gcc -std=gnu99
    CFLAGS:          -g -O2 -pthread
    CPPFLAGS:        -DLINUX -D_REENTRANT -D_GNU_SOURCE
    LDFLAGS:
    LIBS:
    C preprocessor: gcc -E

③ make( コンパイル ) & install

   make && make install

以下で、終われば、OK

------------------------------------------------------------------
Installing CGIs
mkdir /usr/local/apache2/cgi-bin
Installing header files
Installing build system files
Installing man pages and online manual
mkdir /usr/local/apache2/man
mkdir /usr/local/apache2/man/man1
mkdir /usr/local/apache2/man/man8
mkdir /usr/local/apache2/manual
make[1]: ディレクトリ `/usr/local/src/ httpd-2.4.68' から出ます
-------------------------------------------------------------------

④ 私のサーバの環境でした、httpd.confの設定は、下記のとおりです。

※ 注意 ※

○○○○.conf ファイルは、編集前にバックアップを取るようにしましょう。

ex, httpd.confの場合( 私のサーバ機の場合 )

 cp /usr/local/apache2/conf/httpd.conf /home/miyasaka/httpd.conf.bak


下記は、修正箇所の一覧ですが、ディレクトリは、私のサーバ機の環境での設定値です。

機能は、「cgi, SSI, が、.htmlで使用可能・cgi, SSI のファイルは、ホームページファイルと同一 ディレクトリで可能にする・png, jpg ファイル以外は、圧縮して転送する」を設定しています。
なお、ドメインは一つしか使用しないのでバーチャルドホストの設定は、していません。

圧縮設定は、最後に追加していますが、圧縮ログの出力は、コメントアウトしていませんのでローカ ルで確認後コメントアウトしてください。Al1as を使用して定点カメラ関係のデータとプログラムを 別ドキュメントルート上で実行させています。不要な方は、削除してください。

sed 文を簡略化するために、アクセスログの設定と圧縮処理の設定を conf ファイルとして作成し、 本文の conf から、Include conf/extra/○○○○.conf で読み込ませるようにしています。

conf ファイルの作成方法は、少し下に表示 している「 httpd-2.4.68 httpd.conf の編集項目 」の中で解 説しています。

下記は、httpd.conf の編集を sed コマンドで一括編集をした時の sed コマンドのリストです。
( sed コマンドをより理解するため無駄ですが挑戦してみました。)
Linux の正規表現等が良く理解できました。( 自己満足 )


[ sed コマンドによる httpd-2.4.68 の httpd.conf の一括編集 ] の詳細は、


             [ここをクリック]してください。

[ httpd-2.4.68 httpd.conf の編集項目 ] の詳細は、

             [ここをクリック]してください。

Alias を使用して、別 DocumentRoot を作り CGI, SSI, html を動作させる方法を下記に紹介します。

この方法は、当ホームページのトップページ内の指定した「日」および「月」の保存した定点カメラ
の映像表示で使用しています。

[ Alias で別 DocumentRoot を作り CGI, SSI, html を動かす ] の詳細は、


             [ここをクリック]してください。

編集済の httpd.conf は、再構築時使用すると便利なので windows PC へ保存します。
なお、ファイルの属性・所有者を変更しないと windows PC へ保存できないので変更します。
( ディレクトリ・ユーザ名は、私のサーバ機の場合の設定です。)

  cp /usr/local/apache2/conf/httpd.conf /home/miyasaka/; \ 
  chown -R miyasaka:miyasaka /home/miyasaka/httpd.conf; \ 
  chmod 644 /home/miyasaka/httpd.conf

⑦ホームページの書き込み先のフォルダを作成・所有者の変更・属性変更をします。
  ( /var/www/html/www.smiyasaka.com は、私の場合の DocumentRoot です。)
  ( /home/miyasaka/www/ は、私の場合の別 DocumentRoot [Alias 用]です。)

   mkdir -p /var/www/html/www.smiyasaka.com;\ 
   chown -R miyasaka:miyasaka /var/www/;\ 
   chmod 777 /var/www/html/www.smiyasaka.com;\ 
   mkdir -p /home/miyasaka/www/;\ 
   chown -R miyasaka:miyasaka /home/miyasaka/www/;\ 
   chmod 777 /home/miyasaka/www/

⑧ httpd.confの設定に間違いが無いか確認します。

   /usr/local/apache2/bin/apachectl configtest

 「 Syntax OK 」と表示されればOKです。

※※ 注意 ※※

configtest を実行する時に、DocumentRoot で指定したディレクトリが無いと下記エラーが出ますの でディレクトリを作成してから、configtest を実行してください。


  DocumentRoot must be a directory

⑨ apache2を systemctl start で起動する。

デフォルトで httpd.servce が用意されていますが httpd.servce では、apache の実行ファイルの パスが /usr/sbin/httpd に成っている為使用できませんので新規に作成します。

  systemctl start apache2 のコマンドが使えるように設定する。

  以下に、新規にサービス( systemctl ○○○○.servce )を作成登録する方法を紹介します。

  apache2 の起動をサービスとして登録し、起動・システム再起動時の自動起動に使用しています。


  [ systemctl service の新規作成 ] の詳細は、


             [ここをクリック]してください。


 〇 apache2 ( httpd ) の起動確認

現在実行されているプロセスをツリー表示するコマンド pstree で確認します。

下記の様に表示すれば、OKです。


   systemd-+-NetworkManager---2*[{NetworkManager}]
      ( 省略 )
       |-firewalld---{firewalld}
       |-httpd-+-httpd
       |     |-3*[httpd---63*[{httpd}]]
       |     `-3*[rotatelogs]

⑩
アクセスログ・エラーログ・圧縮の確認用ログは、/usr/local/apache2/logs のディレクトリに書込まれます。

⑪ ここで、 httpd.conf へ設定したドキュメントのルート( DocumentRoot と 別ディレクトリ)へ   ホームページのファイルデータを書き込みます。

下記は、ホームページ表示テスト用のプログラムです。 SSI・CGI もテストするようにしています。

  [ ホームページテストプログラム ] の詳細は、

             [ここをクリック]してください。

※※ 注意事項 ※※
SELinux 有効の時には、下記のポリシーを設定します。
下記ポリシーを設定しないと Apache から、ホームディレクトリ( 別ドキュメントルート )での 公開が出来なくなります。

setsebool -P httpd_enable_homedirs 1;\
firewall-cmd --reload



私の場合は、自宅サーバの現用機で、毎日下記のファイルを圧縮してバックアップファイルとし

   
1.ホームページのhtml・cgi・SSI・写真のファイルとデータ
    2.システム管理用に作成した perl・sh等の各種プログラム
    3.webalizerが解析した apacheのアクセスデータ(htmlデータ)
    4.apache のログデータ(1週間分)
    5.root宛てメールデータ(10日分)
    6.SSL 用の認証鍵データ

作成しているので、専用の転送プログラムと展開プログラムで簡単に、前日の24時の時点に数分で

復元できるようにシステムを構築しています。


⑫
動作確認は、予備機のローカルIPアドレスを別の PC から入力して確認します。
予備機を現用機とした時には、[
ホームページが外部へ公開 ] されているかの確認が出来るサイ
トで行います。下記をクリックするとそのサイトへジャンプします。
[サーバー監視/ネットワーク監視サービス]



10-2. SELinux を有効にした時の apache2 のポリシー設定

※※※ 参考情報 ※※※
以下の設定が面倒な時は、ブール値 httpd_unified を on してみてください。
[ httpd_t に対して httpd の全タイプへの完全アクセスが許可されます (実行、 読み込み、 書き込み)。]
私のこのホームページで試したら、ほぼ動作しました。
動作しない SSI・CGI プログラムは、ポリシーを httpd_unconfined_script_exec_t に設定したら 動作しました。
ちなみに動作しないプログラムには、OS のコマンドが入っていました。 [ 私のサーバ機で検証 ]


○ httpd に設定したポリシー値


  ホームページ本体     ---> httpd_sys_content_t

  SSI・CGI プログラム    ---> httpd_sys_script_exec_t
  Read・Write するデータ   ---> httpd_sys_rw_content_t
  sh プログラム        ---> httpd_unconfined_script_exec_t

  特に ファイルの書込み や Linux コマンド を使用している perl のプログラム・ Alias でのジャンプ先きにある perl のプログラムや  
SSI・CGI プログラム等で動作しないプログラム
                ---> 
httpd_unconfined_script_exec_t

○ .html のプログラムファイルは、初期設定値 httpd_sys_content_t のままにしています。

○ httpd のブール値は、下記を on にしています。

   設定コマンドは、
setsebool -P httpd_×××× 1 又は、on で行います。

   httpd_enable_cgi  --> on       ← cgi の動作を有効にする。
   httpd_enable_homedirs  --> on   ← ホームディレクトリへのアクセスを有効にする。
   httpd_sys_script_anon_write  --> on ← pubuic_content_rw_t タイプのラベルが付いた
   ファイルへの書き込みアクセスを HTTPスクリプトに許可するかどうかを定義
   httpd_enable_ftp_server  --> on   ← FTP サーバーとして動作することを許可します。


  
httpd_ssi_exec  --> off   ← Web ページ内の SSI (server side include) 要素を 実行可能にするかどうかを定義。
   これを on するかは、動作結果を見て決めて見てださい。

httpd-2.4.XX でも off のままで OK です。
httpd-2.4.6 の場合は、off しないと動作しない SSI プログラムがありました。

私のホームページでは、SELinux を有効にするにあたってプログラムの配置を変更しました。
理由は、SELinux のポリシーの設定を明確にし、一括設定をできるようにする為です。
変更設定は、コマンド semanage fcontext でポリシーを宣言してコマンド restorecon でポリシーを 恒久的に設定しています。


変更点 1. perl のブログラムをすべて1つのホルダー内に格納。


プログラムは、すべて CGI 及び SSI実行可能なポリシー httpd_sys_script_exec_t に設定。
一部プログラム内で Linux のコマンドを実行しているプログラムは、SELinux 保護無効の ポリシー httpd_unconfined_script_exec_t に設定。


設定例

semanage fcontext -a -t httpd_sys_script_exec_t\
"/var/www/html/www.smiyasaka.com/SSI(/.*)?"
restorecon -R -vF /var/www/html/www.smiyasaka.com/SSI/
semanage fcontext -a -t httpd_unconfined_script_exec_t\
/var/www/html/www.smiyasaka.com/SSI/cgi_test.cgi
restorecon -vF /var/www/html/www.smiyasaka.com/SSI/cgi_test.cgi


変更点 2. テキストファイル(.txt)を> すべて1つのホルダー内に格納。


ファイルは、すべてホームページからの読み書き有効なポリシー httpd_sys_rw_content_t に設定。


設定例

semanage fcontext -a -t httpd_sys_rw_content_t\
"/var/www/html/www.smiyasaka.com/TXT(/.*)?"
restorecon -R -vF /var/www/html/www.smiyasaka.com/TXT/


※※ 参考情報 1 ※※ semanage fcontext でのポリシーの設定について。

ポリシーは、パスの上位から、下位に向かって行いましょう。 つまり、上位のディレクトリを まとめて設定し、次に下位のファイル単位でポリシーを設定します。

※※ 参考情報 2 ※※ SELinux 有効化でのバックアップの作成について。


バックアップは、コマンド tar で圧縮ファイルを作成しますが、その時、下記の様にオプション --selinux を付けるとバックアップの各ファイルに設定されている SELinux のコンテキスト( SELinux ポリシー )も一緒にバックアップされるので復元先でも各ファイルは、バックアップ元と 同じ SELinux のコンテキストになります。
なお、解凍先でコマンド semanage fcontext -l -C でポリシーの設定内容を見ても何の表示もあ りません。このサーバ機では、何も設定して無い為です。但し、httpd-2.4.XX でバックアップし た HTMLファイルを httpd-2.4.6 の HTMLファイルとして解凍しても SELinux のコンテキスト等は、 引継ぎされませんので再設定が必要です。


/bin/tar --selinux -zcvf ○○○○.tar.gz △△△△

△△△△ : バックアップとして、まとめたいファイルを指定。複数ある時には、半角スペ ースを入れて続けて指定します。具体的には、下記のようにします。

例 BackUP_Dir="/var/html/www/home_page"
  BackUP_Dir="${BackUP_Dir} /home/miyasaka/home_page_date"
    ・           
↑ 半角スペースを入れる事
    ・
○○○○ : 圧縮後のファイル名を指定。○○○○の前に保存先ディレクトリを指定します。
例 /home/BackUP_Dir/back_www_data20180225.tar.gz ${BackUP_Dir} バックア ップは、毎日行うので日付を入れておくと良いと思います。
Let's Encrypt の認証鍵データもバックアップを取るようにしています。

※ semanage fcontext と restorecon オプションの説明 ※

semanage fcontext -a -t    <----- ポリシーの宣言

「-a」オプションを指定して、コンテキストの設定の追加を行うようにしています。

「-t」オプションで、タイプ「httpd_sys_script_exec_t」のコンテキストを設定するようにしています。
ディレクトリの指定は、正規表現を用いる。例 "/www(/.*)?" : ディレクトリ /www を指定
「-d」オプションで、ポリシーの削除を指定します。


restorecon -vF    <----- 強制的にポリシーを恒久的に設定する。

  「-R」オプションを指定して、ディレクトリの下層にもコンテキストの設定が行われるように

   します。単独ファイル時には、宣言しない。
  「-v」オプションを指定して、コンテキストの変更内容がコマンド実行結果に表示されるように
   します。
  「/var/www/……/」は、設定対象のディレクトリになります。
  「-F」オプションを指定して、強制的に変更を適用します。指定しないと変わらない時があるの
   で指定します。


semanage fcontext -l -C    <----- 自分で設定したポリシーの設定内容を見る



10-3. nghttp2 を使用して SSL プロトコル
HTTP/1.1, HTTP/2 対応の設定

※※※ 設定の前提条件 ※※※

デフォルトでインストール済のパッケージ nghttp2 のバージョンは、httpd の configure の時点で バージョンが、古いと怒られるので 、最新バージョンをダウンロードして使用します。

※※※ 注意事項 ※※※
下記の設定で使用している www.smiyasaka.com ・ smiyasaka.com ・ miyasaka は、私のサーバ機環境の固有名称です。
コマンドをコピーする時には、あなたのサーバ機環境に合わせて変更して使用してください。

※※ 編集済みの各種 conf ファイルのバックアップを取り、再構築の時に利用しましょう。 ※※

1. CentOS Strem 8.X で取得している Let's Encrypt の認証鍵データを Oracle Linux 8.X への移設

ここでは、私のサーバ機 CentOS Strem 8.X で取得ている「 認証鍵の証明書」データを移設して動作確認をします。

Let's Encrypt の認証鍵データ保存ディレクトリ( /etc/letsencrypt )ごと、下記のようにして圧縮保存し、移行先で解凍し使用しています。
ファイルの場所は、読み書きができるユーザーディレクトリーにしています。
( コマンドのフルパスは、which ○○○○で確認してください。)

#!/usr/bin/bash
#-------- CentOS Strem 8.X 側の保存処理 -------------
BACKUP_IN="/etc/letsencrypt"       # バックアップ元ディレクトリ
BACKUP_TO="/home/miyasaka/Lets_backup"    # バックアップファイル出力先
# 圧縮・保存し、属性変更をします。
/bin/tar --selinux -zcvf ${BACKUP_TO}.tar.gz ${BACKUP_IN}
/bin/chmod 644 ${BACKUP_TO}.tar.gz

ここで、ffftp を使用して移行先のサーバ機へ圧縮ファイルを windows PC 経由で転送します。
コピー元 : /home/miyasaka
転送先  : /home/miyasaka
圧縮ファイルの名称 : Lets_backupt.tar.gz

#!/usr/bin/bash
#-------- Oracle Linux 8.X 側の復元処理 ------------
# 一度 /rootへ移動する。
\cp -f /home/miyasaka/Lets_backup.tar.gz /
cd /
# ファイルを展開する。
/usr/bin/tar zxvf Lets_backup.tar.gz
# バックアップファイルを削除する。
rm Lets_backup.tar.gz

2. Oracle Linux 8.X での certbot のインストールと認証鍵データの継続確認

下記コマンドで Let's Encrypt の認証鍵データ更新に必要なパッケージをインストールします。


dnf -y install epel-release;\
<---- これを忘れるとインストールできません
dnf -y install certbot python3-certbot-apache

CentOS Stream 8.X で取得した認証鍵データを Oracle Linux 8.X へ、上記記載の方法でコピーして認証鍵データのアップデートを下記のコマンドで行いました。

/bin/certbot certonly --webroot -w /var/www/html/www.smiyasaka.com -d smiyasaka.com -d www.smiyasaka.com --renew-by-default && /bin/systemctl reload apache2

その結果、「 Successfully received certificate.・・・・・・ 」( 証明書を正常に受信しました。)のメッセージが表示し、無事に成功しました。
CentOS Stream 8.X で取得した認証鍵データの上に Oracle Linux 8.X で取得した認証鍵データが書き込まれ、無事に継続も確認できました。
更に、CentOS Stream 8.X から、Oracle Linux 8.Xへバージョンアップした状態でも、認証鍵データの自動更新が無事にできました。
( 確認方法は、ホームページの証明書の有効期限で行いました。)

※※ 参考情報 ※※

サーバーが対応しているSSL/TLSプロトコルを確認する方法
TLS checker というサイトです。
左記クリックでジャンプできます。 ---> TLS checker
openssl から httpd-2.4.58 までをインストール後、私のサーバ機を確認してみました。
その結果が下記で httpd-ssl.conf の設定どおり TLS1.2, TLS1.3 が有効になっていました。

  B

3. openssl を 新規にインストールします。

ソースパッケージは、下記 URL から、最新バージョンをダウンロードします。


    https://www.openssl.org/source/

   openssl-1.1.1X は、2023年 9 月で、サポートが終了になりました。
   openssl-3.0.XX は、2026年 9 月で、サポートが終了になりました。

   2026年 09 月 現在、

   opensslのパージョンは、3.5.8 に成っています。

make install で 
sh: pod2html: command not found のエラーが出ますので下記をインストールします。

perl-core をインストール。

dnf install -y perl-core

openssl-3.5.8 のインストール

  cd /usr/local/src/;\ 
  tar zxf openssl-3.5.8.tar.gz; \ 
  cd ./openssl-3.5.8; \ 
  ./Configure \ 
  --prefix=/usr/local/openssl-3.5 shared zlib

  make && make install


openssl-3.5 は、openssl のインストールディレクトリフォルダ名です。

ライブラリへのパス通しをしておきます。
  ここは、忘れないようにしてください。 エラーになります。

echo /usr/local/openssl-3.0/lib64 > /etc/ld.so.conf.d/openssl.conf;\ 
ldconfig 

OpenSSL 3.5 の確認

/usr/local/openssl-3.5/bin/openssl version

openSSL のバージョンが、下記のように表示すれば動作OKです。

OpenSSL 3.5.8 25 Aug 2026 (Library: OpenSSL 3.5.8 25 Aug 2026)

4. HTTP/2 のパッケージ nghttp2 をインストールする。

ソースパッケージは、下記 URL から、最新バージョンをダウンロードします。


    https://github.com/tatsuhiro-t/nghttp2/releases/

   2026年 07月 現在、

nghttp2 のパージョンは、1.70.0 に成っていますが、nghttp2-1.59.0 と同じ方法でインストールすると make でエラーが出ます。

〇 nghttp2 のソースからのインストール

nghttp2 のコンパイルに必要なパッケージをインストールします。
パッケージ c-ares-devel は既にインストールされていますので "jansson-devel" と "libev-devel", "python3-devel"を dnf でインストールします。

 
dnf -y install jansson-devel libev-devel python3-devel

  cd /usr/local/src; \ 
  tar xvzf nghttp2-1.59.0.tar.gz; \ 
  cd ./nghttp2-1.59.0; \ 
    ./configure \ 
    --with-ssl=/usr/local/openssl-3.0 \ 
    --disable-static \ 
    --enable-app
  
    nghttp2-1.68.0 の時は、下記方法でインストールします。
    但し、コンパイル結果は、yes の項目が減ってしまいます。

  tar xvzf nghttp2-1.70.0.tar.gz; \ 
 cd nghttp2-1.70.0/; \ 
   ./configure \ 
    --with-ssl=/usr/local/openssl-3.5 \ 
    --enable-lib-only 


コンパイル後下記の様に表示するか確認してください。
nghttp2-1.45.1 から、表示項目が増えています。


 =====================================
  nghttp2-1.70.0 の コンパイル結果
  =====================================

       ( 上部省略 )
  
Library:
      Shared:         yes
      Static:         yes
    Libtool:
      LIBTOOL_LDFLAGS:
    Python:
      Python:         /usr/bin/python3.11
      PYTHON_VERSION: 3.11
    Test:
      Failmalloc:     yes
    Libs:
      wolfSSL:        no (CFLAGS='' LIBS='')
      OpenSSL:        no (CFLAGS='' LIBS='')
      Libxml2:        no (CFLAGS='' LIBS='')
      Libev:          no (CFLAGS='' LIBS='')
      Libc-ares:      no (CFLAGS='' LIBS='')
      libngtcp2:      no (CFLAGS='' LIBS='')
      libngtcp2_crypto_quictls: no (CFLAGS='' LIBS='')
      libngtcp2_crypto_boringssl: no (CFLAGS='' LIBS='')
      libngtcp2_crypto_ossl: no (CFLAGS='' LIBS='')
      libnghttp3:     no (CFLAGS='' LIBS='')
      libbpf:         no (CFLAGS='' LIBS='')
      Libevent(SSL):  no (CFLAGS='' LIBS='')
      Jansson:        no (CFLAGS='' LIBS='')
      Jemalloc:       no (CFLAGS='' LIBS='')
      Zlib:           no (CFLAGS='' LIBS='')
      Systemd:        no (CFLAGS='' LIBS='')
      Libbrotlienc:   no (CFLAGS="' LIBS='')
      Libbrotlidec:   no (CFLAGS="' LIBS='')
    Third-party:
      http-parser:    no
      MRuby:          no (CFLAGS='' LIBS='')
      Neverbleed:     no
    Features:
      Applications:   no
      HPACK tools:    no
      Examples:       no
      Threading:      yes
      HTTP/3 (EXPERIMENTAL): no

  =====================================
    nghttp2-1.59.0 の コンパイル結果
  =====================================
       ( 上部省略 )

  Library:
      Shared:         yes
      Static:         no
    Libtool:
      LIBTOOL_LDFLAGS:
    Python:
      Python:         /usr/bin/python3.11
      PYTHON_VERSION: 3.11
    Test:
      CUnit:          no (CFLAGS='' LIBS='')
      Failmalloc:     yes
    Libs:
      OpenSSL:        yes (CFLAGS='' LIBS='-lssl -lcrypto ')
      Libxml2:        yes (CFLAGS='-I/usr/include/libxml2 ' LIBS='-lxml2 ')
      Libev:          yes (CFLAGS='' LIBS='-lev')
      Libc-ares:      yes (CFLAGS='' LIBS='-lcares ')
      libngtcp2:      no (CFLAGS='' LIBS='')
      libngtcp2_crypto_quictls: no (CFLAGS='' LIBS='')
      libngtcp2_crypto_boringssl: no (CFLAGS='' LIBS='')
      libnghttp3:     no (CFLAGS='' LIBS='')
      libbpf:         no (CFLAGS='' LIBS='')
      Libevent(SSL):  no (CFLAGS='' LIBS='')
      Jansson:        yes (CFLAGS='' LIBS='-ljansson ')
      Jemalloc:       no (CFLAGS='' LIBS='')
      Zlib:           yes (CFLAGS='' LIBS='-lz ')
      Systemd:        yes (CFLAGS='' LIBS='-lsystemd ')
    Third-party:
      http-parser:    yes
      MRuby:          no (CFLAGS='' LIBS='')
      Neverbleed:     no
    Features:
      Applications:   yes
      HPACK tools:    yes
      Examples:       no
      Threading:      yes
      HTTP/3 (EXPERIMENTAL): no


OK なら、インストールします。

  
make && make install

nghttp2-1.70.0 の時は、ライブラリへのパス通しを行ってください。

echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf;\ 
ldconfig

5. httpd-2.4.68 の再インストール

apr-1.7.6.tar.gz と apr-util-1.6.3.tar.gz をインストールします。

 APR のソースコードをインストール

  cd /usr/local/src; \ 
  tar xzvf /usr/local/src/apr-1.7.6.tar.gz; \ 
  cd ./apr-1.7.6; \ 
  ./configure; \ 
  make && make install

 APR-Util のソースコードをインストール

  cd /usr/local/src; \ 
  tar xzvf /usr/local/src/apr-util-1.6.3.tar.gz; \ 
  cd ./apr-util-1.6.3; \ 
  ./configure \ 
  --with-apr=/usr/local/apr; \ 
  make && make install

プロトコル HTTP/2 対応化のための mod_http2.so の組込は、個別のインストールでなく、再インストールで対応します。

 ① 下記コマンドでインストールしている apache2 を削除します。

  systemctl stop apache2; \ 
  systemctl disable apache2; \ 
  rm -rf /usr/local/apache2; \ 
  rm -rf /usr/local/src/ httpd-2.4.68

 ② mod_http2.so を追加する為の再インストール

    [省略]  詳細は、10-1 項を参照してください。

    cd /usr/local/src/;\ 
    tar xzvf  httpd-2.4.68.tar.gz; \ 
    cd ./ httpd-2.4.68;\ 
    ./configure \ 
    --enable-ssl \ 
    --with-ssl=/usr/local/openssl-3.5 \        <-------  openssl のパス
    --enable-http2 \            <-------  mod_http2.so の追加
    --with-apr=/usr/local/apr \            <-------  apr-1.7.0 のパス
    --with-apr-util=/usr/local/apr \       <-------  apr-util-1.6.1 のパス
    --enable-rewrite \ 
    --enable-so \ 
    --enable-deflate=shared \ 
    --enable-mods-shared=all \ 
    --enable-mpms-shared=all    
    

-----------------------------------------------------------------
--enable-mpms-shared
マルチプロセッシングモジュールを動的モジュールとしてインストールする。
(all を指定することで、prefork、worker、eventのすべてをインストールする)
--enable-mods-shared
モジュールを動的モジュールとしてインストールする
(all を指定することで、ほとんどのモジュールがインストールされる)
-----------------------------------------------------------------
  以下の様に、SSL, http2 がビルドされます。
-----------------------------------------------------------------


         ( 途中省略 )
    creating modules/slotmem/Makefile
    creating modules/ssl/Makefile
    creating modules/test/Makefile
    creating os/unix/Makefile
    creating modules/http2/Makefile
    creating modules/md/Makefile

          ( 途中省略 )

    config.status: creating docs/conf/extra/httpd-multilang-……
    config.status: creating docs/conf/extra/……
    config.status: creating docs/conf/extra/httpd-userdir.conf
    config.status: creating docs/conf/extra/httpd-vhosts.conf

          ( 途中省略 )

    configure: summary of build options:

        Server Version: 2.4.66
        Install prefix: /usr/local/apache2
        C compiler:     gcc -std=gnu99
        CFLAGS:          -g -O2 -pthread
        CPPFLAGS:        -DLINUX -D_REENTRANT -D_GNU_SOURCE
        LDFLAGS:
        LIBS:
        C preprocessor: gcc -E

-----------------------------------------------------------------
   〇  httpd-2.4.68 の make と install を実行する。

   make && make install


※ 注意事項 ※
make の時、警告が出ますが、無視します。
(現在の私のスキルでは、解決方法???です。)

6. httpd-2.4.68 の SSL の設定 httpd-ssl.conf ファイルの編集
  ( httpd-2.4.59 から、最新のバージョン httpd-2.4.68 に変わっても conf ファイルの内容は変わっていません。)

DocumentRoot、ServerName、ErrorLog、CustomLog 等は、httpd.conf と 同じ設定をします。

原本は、保存しておきます。 以下設定で SSL プロトコル TLS1.3 が、 有効になりました。

([ SSL Server Test ]のサイトで確認できました。下記 11 項の 写真)

   cp /usr/local/apache2/conf/extra/httpd-ssl.conf\ 
 /home/miyasaka/httpd-ssl.conf.bak

   vi /usr/local/apache2/conf/extra/httpd-ssl.conf

-----------------------------------------------------------------

    52  SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
           ↓   ↓
        SSLCipherSuite "TLS_AES_256_GCM_SHA384 \ 
        TLS_CHACHA20_POLY1305_SHA256 \    <-------  \ マークは、
        ECDHE-RSA-AES128-GCM-SHA256 \  行の継続指示記号です。
        ECDHE-RSA-AES256-GCM-SHA384 \ 
        ECDHE-RSA-AES256-SHA \ 
        ECDHE-RSA-AES256-SHA384 \ 
        DHE-RSA-AES256-GCM-SHA384 \ 
        DHE-RSA-AES256-SHA \ 
        DHE-RSA-AES256-SHA256"

    53  SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
            ↓   ↓
        SSLProxyCipherSuite "TLS_AES_256_GCM_SHA384 \ 
        TLS_CHACHA20_POLY1305_SHA256 \ 
        ECDHE-RSA-AES128-GCM-SHA256 \ 
        ECDHE-RSA-AES256-GCM-SHA384 \ 
        ECDHE-RSA-AES256-SHA \ 
        ECDHE-RSA-AES256-SHA384 \ 
        DHE-RSA-AES256-GCM-SHA384 \ 
        DHE-RSA-AES256-SHA \ 
        DHE-RSA-AES256-SHA256"

    79  SSLProtocol all -SSLv3
          ↓   ↓
        SSLProtocol -all +TLSv1.2 +TLSv1.3

        SSL プロトコル のすべてを無効にして、
                              TLSv1.2 ・TLS1.3 を有効にする。

    80  SSLProxyProtocol all -SSLv3
          ↓   ↓↓
        SSLProxyProtocol -all +TLSv1.2 +TLSv1.3

        SSL プロトコル のすべてを無効にして、
                              TLSv1.2 ・TLS1.3 を有効にする。

   124  DocumentRoot "/usr/local/apache2/htdocs"
          ↓   ↓
        DocumentRoot "/var/www/html/www.smiyasaka.com"

   125  ServerName www.example.com:443
          ↓   ↓
        ServerName (サーバ機のホスト名):443 

   126  ServerAdmin you@example.com
          ↓   ↓↓
        ServerAdmin (メールアドレス)

   127  ErrorLog "/usr/local/apache2/logs/error_log"
          ↓   ↓
        ErrorLog "| /usr/local/apache2/bin/rotatelogs\ 
 /usr/local/apache2/logs/www.smiyasaka.com_error_log_\ 
%Y%m%d 86400 540"

    132行目 SSLEngine on の次の行に下記を追加

    #----  HTTP/1.1 HTTP/2 add ----
    <IfModule http2_module>
          ProtocolsHonorOrder On
          Protocols h2 http/1.1
    </IfModule>

h2 とは、TLS暗号化接続によるHTTP/2プロトコル http/1.1 とは、従来のHTTP/1.1プロトコル。
非暗号化接続および、TLS(SSL)暗号化接続の両方で利用可


   133行目に以下を追加する

      Header set Strict-Transport-Security\ 
 "max-age=315360000;includeSubDomains"
      Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
      Header always set X-Frame-Options SAMEORIGIN

上記の設定は、HSTS (HTTP Strict Transport Security) の導入・常時 SSL 化になります。
これは、HTTPで接続した際に、強制的にHTTPSへリダイレクトし、 そのドメインへの接続はすべてHTTPSとする機能です。

         315,360,000 秒 というのは 3,650 日間 (10年間)

 144  SSLCertificateFile "/usr/local/apache2/conf/server.crt"
          ↓   ↓
      # 証明書を指定する
        SSLCertificateFile\ 
 "/etc/letsencrypt/live/www.smiyasaka.com/cert.pem"

 154  SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"
          ↓   ↓
      # 秘密鍵を指定する
        SSLCertificateKeyFile\ 
 "/etc/letsencrypt/live/www.smiyasaka.com/privkey.pem"

 165  #SSLCertificateChainFile "/usr/local/apache2/
           ↓    ↓                        conf/server-ca.crt"
      # 取得した中間証明書を指定
        SSLCertificateChainFile\ 
 /etc/letsencrypt/live/www.smiyasaka.com/chain.pem

   249  <Files ~ "\.(cgi|shtml|phtml|php)$">
          ↓   ↓
        <FilesMatch "\.(cgi|shtml|html)$"$gt;

   252  <Directory "/var/www/cgi-bin"> ~ <Directory>
                                       までコメントアウトします。

   287  #CustomLog "/usr/local/apache2/logs/ssl_request_log" \ 
   288  #     "%t %h %{SSL_……L}x %{SSL_……R}x \"%r\" %b"
          ↓   ↓↓
        Include conf/extra/httpd-log.conf <--- ログ条件設定用 conf
        標準のログローテーション( Apache logrotate )を使用する時には、
        コメントアウトしないでください。
        私の場合、自前でログローテーションをしています。

  ( httpd-log.conf の作成方法は、[ここをクリック]してください。)

   最終行の後に下記を追加します。

        #
        Include conf/extra/httpd-zgip.conf   <---- 新規に作成します。
        #--------------------------------------------------
        # セキュリティ対策のため、最終行に追加しておきます。
        # サーバ署名(バージョンとサーバ名)のOFF
        ServerSignature Off
        #

※※ ここからは、SSL でも圧縮処理をしたい時に追加してください。※※

  〇 httpd-zgip.conf の新規作成
    ( 設定が長いので別 conf ファイルにしています。)

    空の httpd-zgip.conf ファイルを作成します。

       touch /usr/local/apache2/conf/extra/httpd-zgip.conf

    vi コマンドで下記モジュール( mod_deflate )の設定条件を書き込みます。

       vi /usr/local/apache2/conf/extra/httpd-zgip.conf

    <IfModule mod_deflate.c>
    #------------------------------------------------------------
    # 転送データの圧縮設定(画像以外全て圧縮する)
    #            実際の圧縮率は、1 も 3 も大差ありません
    #------------------------------------------------------------
    # 圧縮レベル 1 に設定
         DeflateCompressionLevel 1
    #
        # 全てを圧縮する設定
        SetOutputFilter DEFLATE
        #
        # gzip圧縮に対応していない古いブラウザを除外
        # Netscape 4.x has some problems...
    # 送信先ブラウザがNetscape 4.xの場合はtext/htmlのみ圧縮
        BrowserMatch ^Mozilla/4 gzip-only-text/html
    # Netscape 4.06-4.08 have some more problems
    # 送信先ブラウザがNetscape 4.06-4.08の場合は圧縮しない
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
    # MSIE masquerades as Netscape, but it is fine
    # 送信先ブラウザがMSIEの場合は全て圧縮する
        BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    #
        # 画像以外全て圧縮する
        # Don't compress images
 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$\ 
 no-gzip dont-vary
        #
        # Make sure proxies don't deliver the wrong content
    # プロキシサーバーが圧縮未対応ブラウザへ圧縮ファイルを
    # 送信しないようにする
        Header append Vary User-Agent env=!dont-vary
    # html や css, js, javescript などは個別指定
        AddOutputFilterByType DEFLATE text/plain
        AddOutputFilterByType DEFLATE text/html
        AddOutputFilterByType DEFLATE text/xml
        AddOutputFilterByType DEFLATE text/css
        AddOutputFilterByType DEFLATE text/js
        AddOutputFilterByType DEFLATE text/javascript
        AddOutputFilterByType DEFLATE application/xhtml+xml
        AddOutputFilterByType DEFLATE application/xml
        AddOutputFilterByType DEFLATE application/rss+xml
        AddOutputFilterByType DEFLATE application/atom_xml
        AddOutputFilterByType DEFLATE application/js
        AddOutputFilterByType DEFLATE application/javascript
        AddOutputFilterByType DEFLATE application/x-javascript
        AddOutputFilterByType DEFLATE application/x-httpd-php
    #
      # 圧縮率の確認用ログ設定
      # 不要になったら、# で無効にしておく事。
      # Deflateが有効になっているか確認するログの出力
      #
      DeflateFilterNote Input instream
      DeflateFilterNote Output outstream
      DeflateFilterNote Ratio ratio
      LogFormat '"%r" %{outstream}n/%{instream}n\ 
 (%{ratio}n%%) %{User-agent}i' deflate
      CustomLog logs/deflate_log deflate
      </IfModule>

httpd-SSL.conf の編集を sed コマンドで一括編集をした時の sed コマンドのリスを公開しています。

興味のある方は、[ここをクリック]してください。別ページで表示します。

   ( sed コマンドをより理解するため無駄ですが挑戦してみました。)
    Linux の正規表現等が良く理解できました。( 自己満足 )

7. httpd-2.4.58 httpd.conf 設定ファイルの SSL( h2 ) 追加設定

なお、mod_deflate での圧縮設定部分は、削除して設定してください。

下記4ヶ所の # を削除してコメント文解除する。

   vi /usr/local/apache2/conf/httpd.conf

   〇 mod_socache_shmcbを有効化する。

    88 #LoadModule socache_shmcb_module……d_socache_shmcb.so
     ↓   ↓
    LoadModule socache_shmcb_module mod……_shmcb.so

      尚、mod_socache_shmcb.soは、httpdに含まれています。

   〇 mod_ssl.so の読み込みを行う。

   145 #LoadModule ssl_module modules/mod_ssl.so

     ↓   ↓
       LoadModule ssl_module modules/mod_ssl.so

   〇 mod_http2.so を有効化するため、コメントアウトを解除します。

   147 #LoadModule http2_module modules/mod_http2.so
     ↓   ↓
        LoadModule http2_module modules/mod_http2.so

   〇 https:// のアクセスを https:// に変換させる処理の追加。

   171 #LoadModule rewrite_module modules/mod_rewrite.so
     ↓   ↓
        LoadModule rewrite_module modules/mod_rewrite.so

   〇 「httpd-ssl.conf」の読み込みを行う。

   513 #Include conf/extra/httpd-ssl.conf
     ↓   ↓
        Include conf/extra/httpd-ssl.conf

    上記の操作を sed コマンドで一括処理してみました。

sed -i -e "/mod_socache_shmcb\.so/s/^#//
/mod_ssl\.so/s/^#//
/mod_http2\.so/s/^#//
/mod_rewrite\.so/s/^#//
/httpd-ssl\.conf/s/^#//" /usr/local/apache2/conf/httpd.conf

8. URL の正規化をします。

 http:// のアクセスを https:// に自動変換させる処理( 301リダイレクト )の追加と index.html 無し・ www ありに統一する設定をします。

 www ありに統一したのは、Google Search Console のサイトマップ作成時、ドメインを www ありにしているからです。
.htaccess ファイルを作成し、下記コマンドを書込み、ドキュメントルート上に書込みます。
 ( ローカル LAN からのアクセスを考慮しています。 )

vi ( ドキュメントルートのパス )/.htaccess

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
#
###  301リダイレクト http ---> htpps  ###
#
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#
###  index.htmlあり  →  index.html無し  ###
###  %{HTTP_HOST} にしているのは、ローカルLAN からの
###  アクセスを有効にする為。
#
  RewriteCond %{REQUEST_URI} ^.*/index\.html$
  RewriteRule ^(.*)index.html$ https://%{HTTP_HOST}/$1 [R=301,L]
#
###  www ありのドメインに統一する  ###
###  [NC] は、大文字、小文字の区別なしの指定
#
  RewriteCond %{HTTP_HOST} ^smiyasaka\.com$ [NC]
  RewriteRule ^(.*) https://www.smiyasaka.com/$1 [R=301,L]
#
</IfModule>

# エラーの時、表示するページの設定
ErrorDocument 401 /error401.html
ErrorDocument 403 /error403.html
ErrorDocument 404 /error404.html
ErrorDocument 500 /error500.html

※※※ 参考情報 ※※※
上記の設定をしなかった時には、http:// と https:// 共用になります。
リダイレクトの確認サイトは、「リダイレクトチェッカー」で検索するとヒットします。

9. SELinux 対策 httpd からの秘密鍵の Read / Write を有効にする。

semanage fcontext -a -t httpd_sys_rw_content_t\
"/etc/letsencrypt/live/www.smiyasaka.com(/.*)?"; \
restorecon -R -vF /etc/letsencrypt/live/www.smiyasaka.com/


上記設定の確認

ls -Z /etc/letsencrypt/live/www.smiyasaka.com/

10. エラーのチェック

   /usr/local/apache2/bin/apachectl configtest

「 Syntax OK 」と表示されればOKです。

-----------------------------------------------------------------

11. apache2.service の変更して reload を追加します。

   vi /usr/lib/systemd/system/apache2.service 
 ------------------------------------------------------
  [Unit]
  Description= httpd-2.4.68 daemon
  After=network.target

  [Service]
  Type=forking
  ExecStart=/usr/local/apache2/bin/apachectl start
  ExecReload=/usr/local/apache2/bin/apachectl graceful <--- 安全な
                                               再起動を追加します。
  ExecStop=/usr/local/apache2/bin/apachectl stop

  [Install]
  WantedBy=multi-user.target
 -------------------------------------------------------

   systemctl start apache2    <-------  起動
   systemctl reload apache2   <-------  安全な再起動
   systemctl stop apache2     <-------  停止

12. apache2 を起動して https://(サーバ機の LAN 内 IP アドレス)でアクセス

systemctl start apache2

Windows PC の Web で、サーバ機の LAN 内 IP アドレスを使いアクセスする。

(サーバ機の LAN 内 IP アドレス)

この結果、セキュリティの警告が表示すれば OK です。
アクセス先の URL が、 https://(サーバ機の LAN 内 IP アドレス)に成っている事を確認してください。


自分のホームページの表示は、セキュリティの警告画面で [ リスクを理解して続行 ]等をクリック して表示させます。

13. Apache を DoS 攻撃から守る処理の導入

apxs が、無いので、dnf で httpd-devel をインストールします。

dnf -y install httpd-devel

① mod_dosdetector のダウンロード

cd /usr/local/src/;\
git clone https://github.com/stanaka/mod_dosdetector.git


② mod_dosdetector のインストール( コンパイルは、不要です。)

インストールする前に apxs コマンドのパスを確認し、Makefile を修正してから、[ make install ] を実行します。
apxs コマンドパスの確認は、which apxs で行います。
Oracle Linux 8.X の場合は、/usr/bin/apxs のはずです。


Makefile の apxs コマンドのパス修正を修正します。

vi /usr/local/src/mod_dosdetector/Makefile

APXS=/usr/sbin/apxs
   ↓
APXS=/usr/bin/apxs

ここでインストールします。

cd mod_dosdetector/;\
make install


③ mod_dosdetector.so のコピー

モジュールは、httpd-2.4.37 のモジュールとして作成されるので httpd-2.4.68 のモジュールエリヤにコピーします。

cp /usr/lib64/httpd/modules/mod_dosdetector.so /usr/local/apache2/modules/

※※ 参考情報 ※※

次回の httpd のインストールの為、mod_dosdetector.so を保存しておきます。
次回からは、保存してた mod_dosdetector.so をディレクトリ /usr/local/apache2/modules/ へ保存し直し、
モジュールに実行権限を与えるだけ済みます。


chmod 755 /usr/local/apache2/modules/mod_dosdetector.so

④ httpd.conf への設定

④-1
LoadModule dosdetector_module modules/mod_dosdetector.so の 1行をモジュールエリヤの最後に追加します。

④-2 下記 IfModule mod_dosdetector.c を 最終行の近くに挿入します。

<IfModule mod_dosdetector.c>>
 # 30 秒間に 100回 アクセスで オンする
 DoSDetection on
 DoSThreshold 100
 DoSHardThreshold 100
 DoSPeriod 30
 # 解除する時間 60秒
 DoSBanPeriod 60
 DoSShmemName  DoSshm
 DoSTableSize 100
 DoSForwarded on
 DoSIgnoreContentType ^(image/|application/|text/javascript|text/css)
</IfModule>


上記の設定は、「 30秒間に 100回アクセスがあったら、DoS の環境変数 SuspectHardDoS を ON にします。
DoS の環境変数 SuspectHardDoS の解除は、60秒後に行う。」という内容です。


⑤ DoS攻撃を検知した時に表示させるエラーページの表示設定

⑤-1 設定は、.htaccess を開き、 RewriteBase / の後に以下を追加します。

# 有効化(DoS攻撃確定判定時)
RewriteCond %{ENV:SuspectHardDoS} =1
# 条件に合致する場合は503ステータスをレスポンス
# ( エラー警告ページ error503.html を表示させる。)
RewriteRule ^.*$ - [R=503,L]


⑤-2 エラーページ表示 HTML の設定

ErrorDocument 500 /error500.html の後に以下を追加します。

ErrorDocument 503 /error503.html

⑥ apache を再起動したら、終了です。

動作の確認は、一時的に 10回位にしてから、所定の 503 エラーのページが表示するかを試します。

14. エラーのチェック

/usr/local/apache2/bin/apachectl configtest


「 Syntax OK 」と表示されればOKです。


15. apache2 を起動して https://(サーバ機の LAN 内 IP アドレス)でアクセス

systemctl start apache2

Windows PC の Web で、サーバ機の LAN 内 IP アドレスを使いアクセスする。

https://(サーバ機の LAN 内 IP アドレス)

この結果、セキュリティの警告が表示すれば OK です。


プロトコルの検証は、Microsoft Edge で検証するとよくわかります。

ホームページが表示している状態で 画面上で[ 右クリック ] ---> [ 開発者ツールで調査する。(N) ] をクリック、 しばらくすると画面右側に開発者ツールが表示します。次に上部メニュー [ ネットワーク ]をクリックし、ホームページを再表示させます。
プロトコル の表示がない時には、[ 名前 ]の欄でマウスの右クリックで表示される一覧表の中のヘッダーオプションを開き プロトコル にチェックを入れて下さい。

名前・状態の次にプロトコルの欄があり、そこが h2 に成っていれば成功です。
なお、HTTPS は、プロトコル HTTP/1.1 です。

※ 追伸 ※
この方法での構築が良いのかの判定は、私のスキルでは出来ませんすが、まずは動作したので紹介しています。


10-4 圧縮パッケージ Brotli を使用しての圧縮処理の追加

圧縮パッケージ Brotli を使用しての圧縮処理の追加をしてみました。
この追加処理は、10-3 項までの構築が終了している事が前提となります。

① 圧縮アルゴリズムフォーマット( br )パッケージ Brotli のインストール

openssl・nghttp2 の最新版をインストール・ 設定ファイルの反映をさせてから、Brotli のインストールをしてください。

〇 Brotli のインストール
 Brotli は、2025年11月現在、バージョンが brotli-1.2.0 になっています。

  brotli のコンパイルには、cmake を使用しますので、dnf で一緒にインストールします。
 インストールは、brotli-1.0.9 と同じ方法ではエラーが出ますので下記のようにします。
 (先人の方法を参考にしました。)

        cd /usr/local/src; \ 
        dnf -y install cmake; \  
        tar xvzf brotli-1.2.0.tar.gz; \ 
        cd brotli-1.2.0/; \ 
        mkdir out && cd out; \ 
        cmake -DCMAKE_INSTALL_PREFIX=/usr/local \ 
        -DCMAKE_BUILD_TYPE=Release ..

上記終了したら、 
        cmake --build . --config Release --target install 
を実行します。

brotli-1.1.0 では、ライブラリへのパス通しを行います。

echo /usr/local/lib64 > /etc/ld.so.conf.d/usr-local-lib64.conf;\ 
ldconfig  

② インストール済の httpd-2.4.68 を削除します。

  systemctl stop apache2; \ 
  systemctl disable apache2; \ 
  rm -rf /usr/local/apache2; \ 
  rm -rf /usr/local/src/ httpd-2.4.68

③ httpd-2.4.68 の再インストール

  SSL と HTTP/2、Brotli モジュールを有効にしてインストールします。

        cd /usr/local/src; \ 
        tar xzvf  httpd-2.4.68.tar.gz; \ 
        cd ./ httpd-2.4.68;\ 
        ./configure \ 
        --enable-http2 \ 
        --enable-ssl \ 
        --with-ssl=/usr/local/openssl-3.5 \ 
        --with-apr=/usr/local/apr \ 
        --with-apr-util=/usr/local/apr \ 
        --enable-brotli       <-------  Brotli の組み込み
        --with-brotli=/usr/local/lib64 <-------  Brotli のパス
        --enable-rewrite \ 
        --enable-so \ 
        --enable-rewrite \ 
        --enable-mods-shared=all \ 
        --enable-mpms-shared=all

          上記終了したら、 make  ---> make install を実行します。

④ /usr/local/apache2/conf/httpd.conf への設定の追加
   httpd.conf 編集後の全文は、[ここをクリック]してください

   106行目のコメントを削除する。

   #LoadModule brotli_module modules/mod_brotli.so


⑤ /usr/local/apache2/conf/extra/httpd-ssl.conf への設定の追加

   httpd-ssl.conf 編集後の全文は、[ここをクリック]してください

   132行目 SSLEngine on の後に下記を追加する。

   Include conf/extra/httpd-Brotli.conf   
<------- 新規に作成します。

   Include conf/extra/httpd-zgip.conf は、コメントアウトしといてください。

〇 httpd-Brotli.conf の新規作成 ( 設定が長いので別 conf ファイルにしています。)

   空の httpd-Brotli.conf ファイルを作成します。

   touch /usr/local/apache2/conf/extra/httpd-Brotli.conf

   vi コマンドで下記モジュール( brotli_module )の設定条件を書き込みます。

   vi /usr/local/apache2/conf/extra/httpd-Brotli.conf

   下記の設定で html、js、css ファイルが圧縮アルゴリズムフォーマット( br )で圧縮されます。

<ifModule brotli_module>
      #---------------------------------------------------
      #                 Brotli 圧縮設定
      #---------------------------------------------------
      #
      ## 圧縮レベル: 0-11 (default: 11)
      BrotliCompressionQuality 5
      #
      ## BrotliWindowSize: 10-24 (default: 22)
      BrotliCompressionWindow 18
      #
      AddOutputFilterByType BROTLI_COMPRESS text/html text/plain\ 
        text/css text/xml text/javascript\ 
        application/json application/javascript\ 
        application/x-javascript\ 
        application/xml\ 
        application/xml+rss
      #
      SetOutputFilter BROTLI_COMPRESS
      SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-brotli
      #
      BrotliFilterNote Input instream
      BrotliFilterNote Output outstream
      BrotliFilterNote Ratio ratio
      #
      # 圧縮率の確認用ログ設定
      # 不要になったら、# で無効にしておく事。
      # BROTLI_COMPRESSが有効になっているか確認するログの出力
      #
      LogFormat '"%r" %{outstream}n/%{instream}n\ 
 (%{ratio}n%%) %{User-agent}i' brotli
      CustomLog "logs/Brotil_access_log" brotli
      #---------------------------------------------------
</ifModule brotli_module>

⑥ apache を起動します。

   systemctl start apache2


⑦ apache2 起動後、下記コマンドで組み込みモジュールを確認してみてください。

   /usr/local/apache2/bin/apachectl -M


  Loaded Modules:
   core_module (static)
   so_module (static)
   http_module (static)
   mpm_event_module (shared)  
<------- mpm モジュール
     (省略)
   deflate_module (shared)  
<------- zgip モジュール
   brotli_module (shared)  
<------- Brotli モジュール
   mime_module (shared)
     (省略)
   ssl_module (shared)    
<------- ssl モジュール
   http2_module (shared)  
<------- http2(h2) モジュール
     (省略)
   rewrite_module (shared)
   dosdetector_module (shared)  
<------- dosdetector モジュール
⑧ 圧縮ログでの圧縮率の確認


   圧縮結果のログデータは、管理者か゜root の為、ffftp でダウンロードできないので、ユーザー権限に変更します。


    chown -R miyasaka:miyasaka\ 
     /usr/local/apache2/logs/Brotil_access_log; \ 
    chmod -R 666 /usr/local/apache2/logs/Brotil_access_log

   保存場所 ----> /usr/local/apache2/logs/Brotil_access_log

   圧縮した時の圧縮ログデータは、このようになりました。( notepad 等で見ます。)

    (出力バイト数)↓ ↓(入力)↓( 元データに対するデータの大きさ[ % ] ) を意味します。
   "GET / HTTP/2.0" 5781/31172 (18%) Mozilla/5.0 (Windows NT 10.0) …………………………

   圧縮率の計算は、( BrotliCompressionQuality 5 の時 )
     {(入力バイト数)-(出力バイト数)}÷(入力バイト数)×100 %になるので
   上記1行目の場合、( 31172 - 5781 ) ÷ 31172 × 100 = 81.45 % になります。


   下記は、試しに圧縮レベルを 1 ~ 5 に変化した時の圧縮率の結果です。

  BrotliCompressionQuality 1 ----> "GET / HTTP/2.0" 12619/31172 (40%) ……………

  BrotliCompressionQuality 2 ----> "GET / HTTP/2.0" 6759/31172 (21%) ………………

  BrotliCompressionQuality 3 ----> "GET / HTTP/2.0" 6613/31172 (21%) ………………

  BrotliCompressionQuality 4 ----> "GET / HTTP/2.0" 6214/31172 (19%) ………………

  BrotliCompressionQuality 5 ----> "GET / HTTP/2.0" 5781/31172 (18%) ………………

⑨ web ( Microsoft Edge or Google Chrome )での圧縮処理の確認

web ページでホームページを表示し、画面上右クリックで[ 要素の検査 ]を選択 ---> 表示画面のメニューバーの[ ネットワーク ]を選択します。
[ ネットワーク ]を選択したら、一度、表示中のページを再更新して、ページ名をクリックしてください。
Google Chrome では、[その他のツール] ---> [デベロッパーツール]になります。
Microsoft Edge では、[その他のツール] ---> [開発者ツール]になります。
この時、ホームページが表示するようでしたら、[ヘッダー]をクリックしてください。
次にファイル一覧の jpg, png 以外の 〇〇〇〇.html, 〇〇〇〇.js, 〇〇〇〇.css 等のファイルの名前をクリックすると画面右側右の写真のような情報が取得できます。

-------------------------------------------
content-encoding:br

br は、Brotli の圧縮アルゴリズムフォーマット

content-type:text/html

圧縮対象ファイル html
-------------------------------------------

応答ヘッダーの情報
B


※ Brotliを使用時に圧縮されたかの確認ができるwebサイトが存在していましたので紹介します。
下記 URL をクリックしてあなたのホームページの URL を入れるだけです。
tools.paulcalvano.com

私のドメインでアクセスした結果は、下記の通りです。 入力するドメインには、必ず、https:// を付けてください。

      B

⑩ 私の Web サイトの安全性の評価を受けてみました。

 Qualys SSL LABS の提供する「 SSL Server Test 」という WebサイトにおけるSSL暗号化の安全性をチェックするための無料ツールで Oracle Linux 8.Xとして評価を受けてみました。
 2025年 12月に httpd-2.4.68 + openssl-3.0.18 + nghttp2-1.68.0 の構成での結果は、下記の通り[ A+ ]( 安全 )になりました。

A

11. fswebcom-20100622.tar.gz のインストールと定点カメラの設定

 Oracle Linux8.XX では、dnf でインストールすると fswebcam-20200725 のバージョンがインストールされます。
このバージョンでは、タイトル文字・タイムスタンプの半角数字が表示しない現象( 下記写真 )が出ています。

tenki and time

日本語の文字化け等の解消方法

文字化けを解消するために 日本語フォント( ゴシック )を dnf でインストールする必要があります。

〇 日本語フォントのインストール

EPELレポジトリをインストールしてから、日本語フォントをインストールします。
dnf では、ゴシック体だけしかインストール出来ません。

cd /usr/local/src;\
dnf -y install epel-release;\
dnf -y install vlgothic-*

日本語フォントは、/usr/share/fonts/vlgothic にインストールされます。

日本語フォントをインストール前のシステムフォントは、
DroidSansJapanese.ttf: "Droid Sans" "Regular"  ですが
インストール後は、
VL-Gothic-Regular.ttf: "VL Pゴシック" "regular"
に切り替わります。( システムフォントの確認コマンドは、fc-match で確認 )

fswebcomを使った定点カメラの設定方法・ダウンロードについては、「定点カメラの実現方法」のページで詳細に 解説していますので参考にしてください。

fswebcom-20100622.tar.gz のインストール手順

fswebcom-20100622 のバージョンでタイトル文字の日本語フォントを変更する方法は、上記に追記しています。

① fswebcom-20100622 の展開と configure

     tar zxvf fswebcam-20100622.tar.gz;\ 
     cd ./fswebcom-20100622; \ 
     ./configure --prefix=/usr

     以下で、終われば、OK 
   -------------------------------------------------------
     checking for working mmap... yes
     checking for gdImageCreateTrueColor in -lgd... yes
     checking for gdImageStringFT in -lgd... yes
     checking for gdImageJpeg in -lgd... yes
     checking for gdImagePngEx in -lgd... yes

        Buffer type ........... 16 bit
        PNG support ........... yes
        JPEG support .......... yes
        Freetype 2.x support .. yes
        V4L1 support .......... yes
        V4L2 support .......... yes

     configure: creating ./config.status
     config.status: creating Makefile
     config.status: creating config.h

② make と インストール

     make && make install

make では、下記の様なエラーがでますがそのままインストールします。

------------------------------------------------------
cc -g -O2 -DHAVE_CONFIG_H -c src_v4l2.c -o src_v4l2.o
src_v4l2.c: 関数 'src_v4l2_show_control' 内:
src_v4l2.c:338:32: 警告: 'strncat' specified bound 3 equals source length
   [-Wstringop-overflow=]
   if(m < queryctrl->maximum) strncat(t, " | ", 3);

以下で、終われば、インストールOK です。

   ------------------------------------------------------
   mkdir -p /usr/bin
   mkdir -p /usr/share/man/man1
   install -m 755 fswebcam /usr/bin
   install -m 644 fswebcam.1.gz /usr/share/man/man1

③
Logicool C270 の UVC 対応 USB カメラの輝度・明るさの調整は、下記の様に設定しています。
   -s Brightness=65%
   -s Contrast=15%   
<---- 明るさは、ここまで下げないと綺麗な画像になりません。
④
Logicool C270 のカメラが認識された時の認識データは、 Oracle Linux 8.Xでは

   cat /proc/bus/usb/devices ----> cat /sys/kernel/debug/usb/devices

に変わっていますので、変更する必要があります。

   cat /sys/kernel/debug/usb/devices で下記の様になります。

S: SerialNumber=E981E810 (E981E810 は、USBカメラのシリアル番号なので同一機種でも、カメラを入れ替えれば変わります。)

fswebcom-20100622 のバージョンで
タイトル文字の日本語フォントを 明朝体に強制的に変更する方法

1. 明朝体の日本語フォントのダウンロード

文字情報技術促進協議会のホームページ(https://moji.or.jp/ipafont/ipaex00401/)にアクセスして 明朝体の日本語フォント ipaexm00401.zip(5.3MB) をダウンロードします。
ダウンロード出来たら、解凍して フォントファイル ipaexm.ttf をサーバ機のホームディレクトリへ転送します。

2. フォントディレクトリに明朝体の日本語フォントを書込むディレクトリを作成します。
書込むディレクトリ名は、任意に決めてOKです。

mkdir -p /usr/share/fonts/ipaexfont-mincho/

3. 明朝体の日本語フォント ipaexm.ttf をフォント保存先へ転送します。

cp /home/miyasaka/ipaexm00401/ipaexm.ttf \
/usr/share/fonts/ipaexfont-mincho/ipaexm.ttf


4. CentOS 8の日本語環境用のデフォルトフォントである「VL ゴシック」の定義ファイルは、
「/etc/fonts/conf.d/」に保存されている 65-2-vlgothic-pgothic.conf なのでバックアップを取ります。

cp /etc/fonts/conf.d/65-2-vlgothic-pgothic.conf \
/home/miyasaka/65-2-vlgothic-pgothic.conf.bak


5. sed コマンドを使って日本語フォント定義を IPAex明朝 に変更します。

sed -i -e "s/VL PGothic/IPAexMincho/g" \
/etc/fonts/conf.d/65-2-vlgothic-pgothic.conf


これで fswebcam のタイトル文字・タイムスタンプのフォントが変わります。
システムフォントの確認コマンドは、fc-match で確認して見てください。
元に戻す時には、65-2-vlgothic-pgothic.conf.bak で保存した定義ファイルを元の場所に上書きするだけです。

6. 日本語フォント英語表記文字の確認方法

fc-list | nkf -e

下記は、抜粋です。日本語の次のフォント名が 英語 表記のフォント名です。

……VL Pゴシック,VL PGothic:style=regular
……VL ゴシック,VL Gothic:style=regular
……IPAex明朝,IPAexMincho:style=Regular

リストは、沢山表示されますが探してみてください。

7. 下記は、タイトルとタイムスタンプの文字の表示例
上が、ゴシック体・下が、明朝体の表示例です。
なお、fswebcam の制御コマンドのフォント指定は、どちらも同じ設定です。
( 制御コマンドでは、文字サイズは変えられますがフォント指定は無視されます。)

tenki and time
tenki and time

12. clamav ( アンチウィルスソフト )のインストール

○ clamav のインストール・設定手順

〇 dnf でのインストール

  cd /usr/local/src;\ 
dnf -y install clamav clamav-update

  2021年 12月時点では、下記バージョンがインストールされます。

インストール済み:
clamav-0.103.4-1.el8.x86_64     clamav-data-0.103.4-1.el8.noarch
clamav-filesystem-0.103.4-1.…… clamav-lib-0.103.4-1.el8.x86_64
clamav-update-0.103.4-1.el8.…… libprelude-5.2.0-1.el8.x86_64

完了しました!


②
ユーザ : clamupdate とグループ : clamupdate は、上記のインストールで作成されます。
更にユーザ(clamav)とグループ(clamav)が必要なので作成しておきます。???


   グループ名 clamav の作成

   
groupadd clamav   <---- グループ clamav 作成

   ユーザー clamav の作成

   ログインシェルは、/bin/false、コメントは、"Clamav AntiVirus"

   
useradd -g clamav -s /bin/false -c "Clamav AntiVirus" clamav

    -g : 所属するグループ名指定 -c : コメント設定( 任意設定 )
    -s : ユーザーのログインシェルを指定します。
    /bin/false : ログインされても何もせずに終了します。


③ clamav のグループ名とユーザ名を確認しておきます。

   グループの確認(私の場合の表示例です。)

   
grep clam /etc/group

   clamupdate:x:983:
   virusgroup:x:982:clamupdate
   clamav:x:1001:

   ユーザーの確認(私の場合の表示例です。)

   
grep clam /etc/passwd

   clamupdate:x:986:983:Clamav database update user:/var/lib/clamav:/sbin/nologin
   clamav:x:1001:1001:Clamav AntiVirus:/home/clamav:/bin/false

④ freshclam 設定ファイル編集

 sed コマンドによる一括変換

cp /etc/freshclam.conf /home/miyasaka/freshclam.conf.bak; \ 
sed -i -e "s/#DatabaseDirectory/DatabaseDirectory/
s/#UpdateLogFile/UpdateLogFile/
s/#LogFileMaxSize/LogFileMaxSize/
s/#LogTime/LogTime/
s/#LogRotate/LogRotate/
/instead\./aDatabaseMirror db.jp.clamav.net" /etc/freshclam.conf

  vi /etc/freshclam.conf

  :13 で13行目へジャンプ

   コメントを取る。

   13 DatabaseDirectory /var/lib/clamav   
<---- ウィルスデータベースの保存先

   17 UpdateLogFile /var/log/freshclam.log  
<---- ログデータの保存先

   26 LogFileMaxSize 2M

   30 LogTime yes

   47 LogRotate yes


72行目の DatabaseMirror database.clamav.net の前に日本のデータベースミラーサイトを追加します。

   DatabaseMirror db.jp.clamav.net

⑤ freshclam.log のディレクトリ・ファイルが無いので作成し、所有者・属性を変更します。

touch /var/log/freshclam.log;\
chown clamav:clamav /var/log/freshclam.log
chmod 666 /var/log/freshclam.log

※※ 参考情報 ※※

  freshclam のログファイルのパスに関して

本ページでは、ログファイルの書込み先パスを /var/log/freshclam.log にしていますが
Web 上には、ログファイルの書込み先パスが
/var/log/clamav/freshclam.logにしている場合もあります。
私が、色々試したところ、どちらのパスでも良いようです。
Logwatch は、clam-update のログファイルを検索する時は、
/var/log/freshclam.log を見に行って該当する日時が無いと
/var/log/clamav/freshclam.log を見に行くようです。
/var/log/ 上に freshclam.log を二か所作成するのまずいと思います。
どちらかにして下さい。
ちなみに書込み先パス /var/log/clamav/freshclam.log は、下記の様にして作成します。


mkdir /var/log/clamav/;\
touch /var/log/clamav/freshclam.log;\
chown clamav:clamav /var/log/clamav/freshclam.log;\
chmod 666 /var/log/clamav/freshclam.log

パスを /var/log/clamav/freshclam.log にしたばあいは、該当する箇所すべてを修正してください。

⑥ ウィルス定義ファイルの最新化
下記コマンドを実行。


   freshclam

※※ 参考情報 ※※ logwatch のリポート確認方法
  freshclam 実行後、下記コマンドで確認できます。
  ( -range today : 今日のリポート出力 )
  ( -service clam-update : clamav update を指定 )


  logwatch -range today  
<---- 初回は、こちらを実行
  logwatch -range today --service clam-update

⑦ ウイルスチェックの実行(テスト)
下記コマンドを実行。


   clamscan

   実行結果の表示例

   /root/.bash_logout: OK
   /root/.bash_profile: OK
   /root/.bashrc: OK
   /root/.cshrc: OK
   /root/.tcshrc: OK
   /root/anaconda-ks.cfg: OK
   /root/.bash_history: OK

   ----------- SCAN SUMMARY -----------
   Known viruses: 4830340
   Engine version: 0.99.2
   Scanned directories: 1
   Scanned files: 7
   Infected files: 0   
<---- 検知したウイルスの数。
   Data scanned: 0.00 MB
   Data read: 0.00 MB (ratio 0.00:1)
   Time: 38.824 sec (0 m 38 s)

⑧ ウィルススキャン定時実行スクリプト作成

作成方法は、下記リンクの「アンチウィルスソフト導入(Clam AntiVirus)」を参照してください。

   ※ 参考にしたサイト アンチウィルスソフト導入(Clam AntiVirus)

   上記サイトの例を参考にしてチョット手を入れて作成してみました。

[ ウィルススキャンを定期的に実行させるためのスクリプトの作成 ] の詳細


#!/usr/bin/bash
# clamscanのパス設定
PATH=/usr/bin:/bin

START_Messge=" 開始時間 `date +"%k時%M分%S秒"`"
START_TIME=`date +%s` # 秒で開始時刻を取得(計算用データ)


# 除外ファイル・ディレクトリーの文字列作成
# "--exclude=^/var/www/backup/www_bak --exclude-dir=^/proc" の様な文字列作成
# 変数名の { } は、分かり易くするために入れています。

excludelist=/root/clamscan.exclude

if [ -s ${excludelist} ]; then
  for i in `cat ${excludelist}`
<---- 一行毎取り出す。結果は、変数 ${i} に書込まれる。
  do
    if [ $(echo "$i"|grep \/$) ]; then # 行末に "/" があるか?

     # -n を付けなくとも string の文字列長が 0 より大ならば「真」となり
     # 実行されます。if [ -n $(echo "$i"|grep \/$) ]と同じです。
     # 削除対象 ディレクトリー 末尾の / を削除する処理
     # ^\([^ ]*\) スペース以外の先頭文字からを \1 に代入する
     # \/$ で末尾の / を削除して \1 に代入する
     # オリジナル i=`echo $i|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d`

     ii=`echo ${i}|sed -e 's/^\([^ ]*\)\/$/\1/'`
     excludeopt="${excludeopt} --exclude-dir=^${ii}"
    else
         # 削除対象 特定ファイル
         excludeopt="${excludeopt} --exclude=^$i"
    fi
  done
fi

# mktemp (適当なファイル名の空ファイルを作成するコマンド)

CLAMSCANTMP=`mktemp` # ウイルスに関するメッセージを入れる変数作成

# システム全体をサブディレクトリごと再帰的(--recursive)にスキャンし ウィルスを発
# 見次第削除(--remove)する
# --recursive ディレクトリ内に存在するものに一つ一つに対して処理をする
# スキャンサイズの設定 --max-filesize=200M --max-scansize=200M

/usr/bin/clamscan --max-filesize=200M --max-scansize=200M \
--recursive --remove ${excludeopt} / > ${CLAMSCANTMP}

#   ウィルスが発見された場合、FOUNDの文字列が付加される
#   FOUNDの文字列があるかのチェックをする

  M_swith=0 # 処理結果メッセージ切替スイッチ OFF
  Virus_FOUND="\n" # 初期値ウィルスなしメッセージにする

  if [ ! -z "$(grep FOUND$ ${CLAMSCANTMP})" ]; then
   # ウィルスに感染したファイル名を変数 Virus_FOUND に出力

   Virus_FOUND=$(grep FOUND$ ${CLAMSCANTMP})
<---- 行の終わりに FOUND の文字列のある行を取得

   # ウィルスに感染したファイルの個数の表示メッセージ行を取得
   Virus_FOUND_No=$(grep Infected ${CLAMSCANTMP})
<---- ウィルスに感染したファイルの個数の表示メッセージ行を取得

   M_swith=1 # 処理結果メッセージ切替スイッチ ON
  fi

rm -f ${CLAMSCANTMP} # -f 作成したファイル CLAMSCANTMP を確認なしで削除する

END_Messge=" 終了時間 `date +"%k時%M分%S秒"`"
#---------------------------------------------------------
END_TIME=`date +%s` # 秒で終了時刻を取得(計算用データ)

# 処理時間計算とその結果をメール本文として出力

SS=`expr ${END_TIME} - ${START_TIME}` # 経過時間を求める(秒)
# 時を求める時には、3600で割る
MM=`expr ${SS} / 60` # 分を求める
SS=`expr ${SS} % 60` # 秒を求める (1分で割ったあまり)

SYORI_Messge=" 処理時間 ${MM}分 ${SS}秒"

# 処理結果メッセージ切替スイッチ判定

if [ $M_swith -eq 1 ]; then
   # ウィルスの感染数のみを取得する
   i_CNT=`echo ${Virus_FOUND_No}|sed -e 's/Infected files://'`  
<---- ウィルスの感染数のみを取得する

   KETUKA__Messge=" *** Clamscan ${i_CNT} Virus Found ***\n"  
<---- ウィルスの感染数を付加する
else
   KETUKA__Messge=" *** Clamscan normal END ****"
fi

# 処理時間計算をメール本文として出力
# 開始時間 + 終了時間 + 処理時間 + 処理結果メッセージ + ウィルスに感染したファイル名 をメール本文として合成し出力

echo -e "${ START_Messge }\n${ END_Messge }\n${ SYORI_Messge }\n${ KETUKA__Messge }\n\
${ Virus_FOUND }" | mail -s "***}\n$ SYORI_KETSUKA_REPORT *** " root

〇 ウィルススキャン実行スクリプトへ実行権限付加とテスト

   chmod +x virusscan.sh  
<---- 実行権限を有効にします。

ウィルススキャンの実行テストをする時には、
clamscan --recursive --remove ${excludeopt}
/ > ………
の
/ を削除して行うと短時間で終了します。

〇 削除対象ファイルとディレクトリーの設定例

   echo "/var/www/backup/www_bak" >> clamscan.exclude
<--- ファイル www_bak をスキャン対象外にする

   echo "/home/miyasaka/www/" >> clamscan.exclude  
<--- ディレクトリ www をスキャン対象外にする
   echo "/var/www/system/" >> clamscan.exclude


   ※※ ディレクトリを除外する場合は末尾に「/」を付加すること

〇 clamdscanの定期自動実行設定

   一般的には、毎日実行させるので 下記の様に /etc/cron.daily に保存します。

   mv virusscan.sh /etc/cron.daily/

これで、毎日定期的に全ファイルのウィルススキャンが行われ、
   ウィルスを検知した場合は、 *** Virus Found ***
   ウィルスを未検知した場合は、*** Virus Not Found ***
が root 宛にメールとして送られてくるようになります。
しかし、cron.daily では、4時前後にウィルススキャンが行われるので Logwatch のレポート作成時間に間に合わず翌日のレポートとして報告されてしまうことが度々あ るので、私のサーバ機では、cron で 2時30分に実行するように設定し直しました。
しかし、スキャンの時間がかなりかかる為、時々、Logwatch の処理時間にかかってしま うという現象が出た為、現在では、2時5分にしています。


〇 root 宛メールの表示例( 実際に私のサーバ機で表示した内容です。)

  
apr-util-1.5.4.tar.gz は、故意に保存・スキャンさせています。

   ※  Logwatch の出力結果です  ※

   From root@○○○○ Sat Feb 10 02:31:55 2018
      (途中省略)

   Date: Sat, 10 Feb 2018 02:31:54 +0900
   To: root@○○○○
   Subject: *** SYORI_KETSUKA_REPORT ***
   User-Agent: Heirloom mailx 12.5 7/5/10
   MIME-Version: 1.0
   Content-Type: text/plain; charset=utf-8
   Content-Transfer-Encoding: 8bit

   開始時間 2時05分01秒
   終了時間 2時31分54秒
   処理時間 26分 53秒
   *** Clamscan 2 Virus Found ***

   /home/miyasaka/x86_64-src2/apr-util-1.5.4.tar.gz: Xml.Exploit.CVE_……
   /usr/local/src/apr-util-1.5.4.tar.gz: Xml.Exploit.CVE_2013_3860-3 FOUND


⑨ ClamAV のSELinuxのポリシーの設定

設定は、setsebool コマンドで下記の様に行います。
この設定で ClamAV は、ディスク上のすべてのファイルにアクセスし、データ定義ファイルの更新ができるようになります。

    setsebool -P antivirus_can_scan_system 1;\ 
    setsebool -P antivirus_use_jit 1

設定確認コマンド

  getsebool -a | grep antivirus

  antivirus_can_scan_system --> on
  antivirus_use_jit --> on

⑩ ログローティションの定義ファイルの作成
 ( 主な設定内容 毎日実行・5日分残す )


vi /etc/logrotate.d/clamav-update

/var/log/freshclam.log {  <---- ここのパスは、
          daily                  ⑤ 項で設定したパスを指定します。
          missingok
          rotate 5
          notifempty
          missingok
          postrotate
                  systemctl try-restart clamav-freshclam.service
          endscript
  }

⑪ freshclam の定時実行の設定

 設定は、下記の様に crontab で行います。
 私の場合、毎日 午前 1時に実行するようにしています。

 ※ 注意事項 ※
  ログローティションは、午前3時から4時の間に実行されるのでその前に実行する設定にして下さい。

0 1 * * * /usr/bin/freshclam > /var/log/freshclam.log


13. chkrootkitの導入

① chkrootkit のインストール

     cd /usr/local/src; \ 
     tar zxvf chkrootkit.tar.gz; \ 
     cd chkrootkit-0.53; \    <--- chkrootkit-0.5X の X は、
     mkdir -p /root/bin; \         確認する事
     mv ./chkrootkit-0.53/chkrootkit /root/bin

 ② 起動用シェルスクリプトの作成

     cd /usr/local/src; \ 
     vi rootkit.sh
-----------------------------------------------------------
#!/bin/sh
# コマンドパスの設定
PATH=/usr/bin:/bin:/root/bin  <--- 環境変数へ chkrootkit のパス設定
#
LOG='/var/log/chkrootkit.log'

# chkrootkit実行
chkrootkit > ${LOG}

if [ ! -z "$(grep INFECTED$ ${LOG})" ]; then  <--- 改ざんがあったか
                                                   チェック
  #  改ざんがあった時の root 宛メール
  #  upstartパッケージ更新時のSuckit誤検知対策
  if ! rpm -V `rpm -qf /sbin/init` >/dev/null 2>&1;
    then
      cat "$(grep INFECTED$ ${LOG})" | mail -s "rootkit discovery"\ 
       root
  fi
else
  echo "**** rootkit check OK ****"  <--- 手動実行時の確認メッセージ

  # 改ざんが無かった時の root 宛メールの出力の有
  echo "**** rootkit check OK ****" |\ 
   mail -s "*** rootkit check ***" root 
fi
#
chmod 600 ${LOG}

※ 参考情報 ※ if ! rpm -V `rpm -qf /sbin/init` > /dev/null 2>&1; とは、何か?

rpm -qf ○○○○は、

パッケージ名○○○○が、どのRPMパッケージでインストールされているかを調べるコマンドです。


私のサーバ機で rpm -qf /sbin/init 実行すると upstart-0.6.5-13.el6_5.3.x86_64 のパッケージ名がられました。

rpm -V ○○○○は、パッケージ名○○○○が、改ざんされていないかを検証するコマンドです。

改ざんがなかった時には、何の出力もありません。


if ! ○○○○は、○○○○の文字列が、0 の時に then 以下が実行されます。

つまり、「/sbin/init」のパッケージがアップデートされた時には、改ざんなしとする処理です。
> /dev/null 2>&1; で出力結果とエラーメッセージは、捨てられます。


なお、本当に改ざんがあり、かつ、「/sbin/init」のパッケージがアップデートされた時には、

改ざんなしになってしまいます。

③ rootkit.sh に属性設定

   chmod 700 rootkit.sh

④ 毎日2時に実行するよう cron に設定する。

   0 2 * * * /usr/local/src/rootkit.sh

⑤ ハッカーの攻撃にあったかの確認

root 宛てにメールが、来ているので確認する。

mail コマンドを入力して rootkit check OK が、表示すれば、ハッカーの攻撃は、なしです。


詳細の設定は、下記サイトを参考にしてください。

※ 参考にしたサイト rootkit検知ツール導入(chkrootkit)

⑥ 遊び心で上記オリジナルに処理時間の計算結果の表示や改ざんあった時には、chkrootkit が 検知した結果のしたした結果の表示機能を追加したスクリプトです。

[ chkrootkitを定期的に実行させるためのスクリプトの作成 ] の詳細は、

             [ここをクリック]してください。

⑦ 「 Searching for Suckit rootkit... Warning: /sbin/init INFECTED 」の誤検知対策

( 2018.09.16 追加 )
この誤検知は、必ず出るので、ウィルススキャン実行スクリプト rootkit.sh で chkrootkit を実行した時に誤検知情報をカットする方法にしました。
その改良点は、下記のの通りです。


   # chkrootkit実行 実行結果は、chkrootkit.log へ出力

   chkrootkit > ${LOG}

     ↓   ↓   ↓

   # chkrootkit実行 実行結果は、chkrootkit.log へ出力

   ## [Searching for Suckit rootkit... Warning: /sbin/init INFECTED] は、###
   ## 当然誤検知で出るので事前にカットしておく ###


   chkrootkit
| grep INFECTED | egrep -v "/sbin/init" > ${LOG}

  ##   説明   ##
   | grep INFECTED で "INFECTED" の有る行を抽出します。その中で "/sbin/init" のある行は、

   | egrep -v "/sbin/init" でカットします。


14. sendmail のインストール


○ root 宛てのメールは、sendmail が、無いと来ないみたいのでインストールします。

    cd /usr/local/src; \ 
    rpm -Uvh procmail-3.22-47.el8.x86_64.rpm; \ 
    rpm -Uvh sendmail-8.15.2-31.el8.x86_64.rpm

チョット時間がかかります。

   dnf でのインストールは、下記の通りです。

     dnf -y install sendmail

○ CentOS 8.X , Oracle Linux 8.X では、mail のコマンドが使えないので該当パッケージを dnf でインストールします。

     dnf install mailx

   インストール済み:
   mailx-12.5-29.el8.x86_64

○ sendmail を起動します。

    systemctl start sendmail

   # が表示するまで、結構時間がかかるので待ちます。

○ 再起動後も有効にする設定

    systemctl enable sendmail

   # が表示するば OK です。

○ Oracle Linux8.X で ホスト宛のメールが送れないエラーが出ました。

 エラー内容は、下記のとおりです。

Feb 17 13:41:43 ○○○○ sendmail[314368]: My unqualified host name ( ○○○○ ) unknown; sleeping for retry
( ホスト名 ○○○○ のドメイン名を Sendmail で解決できないことを意味します )


私のサーバ機では、 Sendmail を Logwatch で sendmail -t -f root@localhost として使用しています。

 ※※ 解決方法 ※※

1. 127.0.0.1 に 自分のホスト名 ○○○○ があるか確認する


  コマンド 
cat /etc/hosts を入力する。

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1    localhost localhost.localdomain localhost6 localhost6.localdomain6

2. 127.0.0.1 に 自分のホスト名がないのでホスト名 ○○○○ を 
vi で追加します。

  ホスト名 ○○○○ の前に半角のスペース入れて追加します。

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
○○○○
::1    localhost localhost.localdomain localhost6 localhost6.localdomain6

3. sendmail を再起動します。

systemctl restart sendmail


15. Logwatch のインストールと毎日のメールを簡単にチェックする方法

○ サーバー上のログを定期的にまとめ、集約してレポートを出してくれるソフトウェア

   Logwatch のインストールは、依存関係から、下記の順序で行ってください。

    cd /usr/local/src/; \
    rpm -ivh mailx-12.5-29.el8.x86_64.rpm; \
    rpm -ivh perl-Date-Manip-6.60-2.el8.noarch.rpm ; \
    rpm -ivh perl-Sys-CPU-0.61-14.el8.x86_64.rpm; \
    rpm -ivh perl-Sys-MemInfo-0.99-6.el8.x86_64.rpm; \
    rpm -ivh logwatch-7.4.3-11.el8.noarch.rpm

   dnf でのインストールは、下記の通りです。

    dnf -y install logwatch

   インストール済み:
   logwatch-7.4.3-11.el8.noarch
   mailx-12.5-29.el8.x86_64
   perl-Date-Manip-6.60-2.el8.noarch
   perl-Sys-CPU-0.61-14.el8.x86_64
   perl-Sys-MemInfo-0.99-6.el8.x86_64

完了しました!

○ logwatch.conf は、下記の箇所を変更して 実行させれば root宛てにメールがきます。


※ 参考 ※

1行毎直すのが面倒な時には、sed コマンドで下記の様にすると同じ事ができます。
念のため、バックアップを取ってから置換します。

cp /usr/share/logwatch/default.conf/logwatch.conf\
 /home/miyasaka/logwatch.conf.bak; \
sed -i -e "s/#Archives = No/Archives = YES/g
s/Detail = Low/Detail = Med/g
s/sendmail -t/sendmail -t -f root@localhost/g"\
 /usr/share/logwatch/default.conf/logwatch.conf

    vi /usr/share/logwatch/default.conf/logwatch.conf


   アーカイブされたログも含めるかどうかの指定。
   60行目 コメントアウトの解除
   #Archives = Yes
     ↓
   Archives = Yes

   ログの詳細度、Low (=0), Med (=5), High (=10) または 0から10までの数字。
   72行目 私の場合、Med にしました。
   Detail = Low
     ↓
   Detail = Med

   メールコマンドパスの変更
   109行目 rooo宛てにする。
   [ Can't execute sendmail -t: No such file or directory ]というエラーが出るので修正します。

   mailer = "sendmail -t"
   ↓   ↓   ↓
   mailer = "sendmail -t -f root@localhost"

○
Logwatch の定時実行は、cron.daily の設定で午前 3時から 4時頃の間のランダムな時刻に 毎日実行されるのでcrontab に設定する必要は、無いようです。

○ Logwatch の rooo宛てメールを毎日簡単にチェック出来るように下記のようなプログラムを 作ってみました。

1.
Logwatch の rooo宛てメールを前日の日付でユーザーエリヤに保存するとともに、パスワード のかかったヘージから、ホームページから日にちを指定して見られるようにしています。

2. 保存したLogwatch の rooo宛てメールは、10日間としそれ以前は、削除するようにした。

3. プログラムは、cron で毎日一回4時以降に実行させています。

4. /var/spool/mail/root のメールデータは、本プログラムで転送後肥大を防ぐため削除して います。

5. また、ついでに chkrootkit 実行結果も同時に見られるようにもし ています。

※※ 参考情報 ※※
corn で定時的に実行させている処理のコマンドの最後に [
> /dev/null 2>&1 ] を付け
ましょう。
これを付けないと実行結果が rooo宛てメールとして残ってしまいます。
( これは、実行結果を表示させない処理です。 メールデータの肥大化防止にもなります。)


6.
Logwatch の rooo宛てメールは、漢字があるので文字化けしない様に漢字コードをJcode で Shift_JIS 変換にしてユーザーエリヤに保存しています。

7.
rooo宛てメールをホームページエリヤに移動保存すると、不正に見られることがあるかもし れないので、移動保存は、ホームディレクトリにしていますが、perl では、cp( コピーコ マンド )使えないので、ユーザーエリヤに保存してあるメールデータを読みだすため、 open コマンドで変数 ( get_data )に書込む方法をとりました。
コピーコマンド( cp )の替りに open を使つてプログラムを組むとデータの読込みが簡単になり、便利です。
皆さんも是非マスターしてください。


open( get_data, "<ユーザーエリヤの保存先のパス+ファイル名");


下記がシェルスクリプト・cgi のプログラムと Logwatch の rooo宛てメールの内容です。
ユーザーエリヤ等のパスは、○表記にしていますが、使用するときには、あなたの環境に合わせてください。


※ 注意 ※
「rooo宛てメール」が見られる様になるのは、システムを起動後、翌日からになりますので注意してください。
直ぐに見たい時には、コマンド
logwatch -range today を入力します。

[ Logwatch の rooo宛てメールをホームページとして簡単にみられるプログラム ] の詳細は、
             [ここをクリック]してください。


16. 漢字コード変換用に nkf のインストール


○ apache のアクセスログの文字化けを修正するための漢字コード変換パッケージ nkf をインス トールします。
アクセスログの解析には、webalizer を使用していますが、出力される html の文字コードが、 Shift_JIS ( ANSI )コードなので UTF-8 に変換する為、必要になります。


○ nkf のインストール

    cd /usr/local/src; \
    tar zxvf nkf-2.1.5.tar.gz; \
    cd nkf-2.1.5; \
    make && make install

   以下で、終われば、OK
   -----------------------------------------------------------
   mkdir /usr/local/bin   
<---- ここが nkf のフルパスです。
   mkdir: ディレクトリ `/usr/local/bin' を作成できません: ファイルが存在します
   make: [install] エラー 1 (無視されました)
   mkdir /usr/local/man
   mkdir /usr/local/man/man1
   mkdir /usr/local/man/ja
   mkdir /usr/local/man/ja/man1
   cp -f nkf /usr/local/bin/
   cp -f nkf.1 /usr/local/man/man1/
   cp -f nkf.1j /usr/local/man/ja/man1/nkf.1
   -----------------------------------------------------------
○ nkf の使用方法

システムの文字コードが、EUC-JP の時 ホームページ表示コード Shift_JIS に変換す
るので下記の様な設定をします。なお、cronで自動実行させる時には、パスが通らないので フルパスで nkfコマンドを実行させてください。
システムの文字コードが、UTF-8 の時には、-w にしてください。


   1) 変換後上書き保存する時は、

   /usr/local/bin/nkf -s --overwrite ( 元ファイルのフルパス )

   -s : 変換コード Shift_JIS 指定
   -e : 変換コード EUC 指定
   -w : 変換コード UTF-8 指定

   ( オプション --overwrite を付けると変換後のテキストデータが上書きされます。)

   2) 変換後別ファイルへ保存する時は、

/usr/local/bin/nkf -s ( 元ファイルのフルパス ) > ( 保存先ファイルのフルパス )

   3) コマンド実行後の結果が文字化けする時 nkf の使用方法
   文字化けは、Tera Term の文字コードが EUC なので起こります。コマンドの後ろに    | nkf -e を付けるだけです。

   ex. cat -n ○○○○ | nkf -e

○ ファイルの文字コードの確認

   GMODE でのコマンド実行は、パス不要です。 結果は、Shift-JIS, EUC-JP の様に表示します

   nkf -g ( ファイルのフルパス )

○ コマンドのフルパスの確認

   Linux のコマンドのフルパスは、which コマンドで確認できます。

   例 nkf の場合

   which nkf ---> /usr/local/bin/nkf

○ perl,シェルスクリプト(sh)でnkfを使用する時にも、パスが通らないのでフルパスでコマンドを記述してください。

○ cron で起動させる perl, シェルスクリプト(sh)で日本語を使用する時の文字化け対策

1.
Tera Term 使用して遠隔管理しているサーバ機では、ユーザの文字コードを初期設定で eucJP( EUC )に変更しているので cron で起動させる perl, シェルスクリプト(sh)で nkf を使用する時には、root 権限の文字コード( ja_JP.UTF-8 )になるので下記の様に 文字コードを一時的に変更して実行させてください。

   11 */1 * * *
export LANG=ja_JP.eucJP; /(DocumentRoot)/ondo_○○○.pl

2.
日本語を含むデータをコマンド等で取得・解析する時には、nkf コマンドで EUC コードに 変換してから解析をして下さい。
Tera Term 等から実行した時には、上手く動くのに「 cron での実行時には、設計道理にな らない 」という現象が発生します。( cron での実行は、root 権限なので文字コードは、 UTF-8 になります。 )
( Tera Term の文字コードが EUC 、サーバ側のユーザー文字コードも EUC になっているか らです。)

※※ 参考情報 ※※ サーバ側のユーザー文字コードによる文字コード変換
サーバ側のユーザー文字コード EUC ---> -s
サーバ側のユーザー文字コード UTF-8 ---> -w
にする必要があります。


○ Tera Tarm で自作プログラム( perl, sh )等のデバック時に出力結果が文字化けする時の対策方法

例えば、perl SD_Card_Check.pl を実行したら出力結果が 「 <b>SD J[h }Eg nj </b> 」 の様になってしまいました。
これを nkf を使用して perl SD_Card_Check.pl | nkf -e と実行させると出力結果は、下記の様に正しく表示します。
つまり、Tera Term 側の文字コード EUC に変換して出力する指定を追加するだけです。


   perl SD_Card_Check.pl | nkf -e ----> 「 <b>SD カード マウント OK </b> 」

3.
cron で起動させた perl のプログラムで日本語を使用して無くとも、プログラム内から、 実行させるシェルスクリプト(sh)内で日本語を使用している時には、
    
export LANG=ja_JP.eucJP; を追加して実行させてください。


17. 自前プログラムでダイナミック DNS を定期更新させる。

 2020年10月10日 変更( DiCE の処理関係を削除し、下記を追加する。)
ダイナミック DNS サービスとは、動的( ダイナミック )に、変動するユーザーのグローバルIPアドレスに対して、固定のホスト名( ドメイン名 )でつないでくれるサービスのことです。 一般的に ネームサーバー( 別名 DNS サーバー ・ DNS とは Domain Name System と呼んでいます。)

長年ネームサーバーの更新は、DiCE に頼って行ってきましたが、最近、更新してもすべて 「 Error: エラー! 」になり、対策に思案してきました。

色々検証しましたが、解決することができないので、自前ですることにしました。
私のドメインのネームサーバーは、VALUE DOMAIN を使用しています。
VALUE DOMAIN のネームサーバーの更新は、下記の様なコマンドを送信することで出来ます。

https://dyn.value-domain.com/cgi-bin/dyn.fcg?d=[ドメイン]&p=[パスワード]&h=[ホスト名]&i=[IP アドレス]

なお、&i=[IP アドレス] を諸略した時には、アクセス時のグローバル IP アドレスが割り振られます。
このコマンドでは、a レコード( ホストのIPアドレス )のみの書き換えになります。

このコマンドを利用して sh (シェルスクリプト)で、下記の様なプログラムを作成して crontab で定期的に実行させネームサーバーの定期更新( 1日と15日 )を させる方法にしました。( たぶん、DiCE の処理もこのコマンドで処理していると思います。)
crontab で定期更新 1日と15日 の 23 時に実行させるのは、
* 23 1,15 * * /root/VALUE_DOMAIN_DNS_set.sh > /dev/null 2>&1
と設定しています。

  プログラムの説明

アクセス用のコマンドは、sh からは、wget を使用して行います。
実行結果は、DiCE のログと同じファイルに追加書き込みしています。
今まで、DiCE のログをチェックしてきたので、同じファイルにすることにより、DiCE のログとしてチェックできるようにする為です。

https://dyn.value-domain.com/cgi-bin/dyn.fcg?ip は、実行時のグローバルIPアドレスをログに残すために挿入しています。

sleep 2s は、同じサイトを連続してアクセスしないよう、待ち時間を入れてます。

vi VALUE_DOMAIN_DNS_set.sh

----------------------------------------------------------------------

#!/usr/bin/sh
#
# 
VALUE DOMAIN DNS サーバー 更新処理 IPアドレスは、省略
# 
省略時は、アクセス時のIPアドレスがセットされる。
#
#  
date コマンド %-d : 先頭の 0 カット
#  
%_H : 先頭の 0 をスペースにする H : 24時間表示
#  
mm/dd hh:mm 形式 日付データ作成
#
echo -ne "$(date +"%_m")/$(date +"%-d") $(date +"%_H"):$(date +"%M")\n" >> /usr/local/DiCE/log/events.log
#
#   
IPアドレス取得
#
wget -O - 'https://dyn.value-domain.com/cgi-bin/dyn.fcg?ip' >> /usr/local/DiCE/log/events.log
#
#   
改行 追加
#
echo -ne "\n" >> /usr/local/DiCE/log/events.log
#
sleep 2s     
# 2 秒待
#
#  
VALUE DOMAIN ネームサーバー登録IPアドレス更新
#
wget -O - 'https://dyn.value-domain.com/cgi-bin/dyn.fcg?d=XXXXXX.XXX&p=○○○○&h=*' >> /usr/local/DiCE/log/events.log
#

----------------------------------------------------------------------

※ wget -O - (大文字オー)で実行結果を書き出す。(引数に「-」を指定すると標準出力)
※ >> /usr/local/DiCE/log/events.log で出力結果を events.log へ追加する。
※ XXXXXX.XXXは、www 無しのドメイン名です。
※ 〇〇〇〇は、VALUE DOMAIN ログイン用のパスワードです。
※ echo -ne は、改行(\n)を echo コマンドで有効にさせるためのオプションです。
※ 他社のネームサーバーを利用したいときには、最終行の https:// の設定以下をそのネームサーバーの仕様に合わせて使用ください。


下記は、上記のプログラムを実行した時の出力結果です。

10/9 23:00
119.150.8.211
status=0
OK

   グローバルIPアドレスが、変化したときの対策

私のサーバ機の環境で グローバル IP アドレス が、変化する要因は、99% 停電によるモデム(ブロードバンドルータ)の再起動によるインターネットサービスプロバイダ(ISP)の グローバル IP アドレス 再割り当てです。
その他、光回線のメンテナンス等て、数年に一回ほどありました。( 事前に連絡ありました。)

私は、その都度 VALUE DOMAIN に直接アクセスして グローバル IP アドレス の変更を手作業で行ってきました。
この方法だと、10~20分でネームサーバーが反映してくれました。
( 2022年 1月現在、数分で反映されています。)

アクセス先は、https://www.value-domain.com/moddns.php?action=moddns2&domainname=[ドメイン] で直ぐログインできます。

私の場合 グローバル IP アドレス の変更の自動検知は、1時間毎にしています。

※※ 参考になりますか?。[ グローバル IP アドレス 変化チェックのプログラム ] ※※

下記の様な、グローバル IP アドレス 変化チェックのプログラムを作ってみました。

下記 crontab は、10分毎実行させる時の設定例です。

*/10 * * * * /root/IP_Check.sh > /dev/null 2>&1


   vi IP_Check.sh

#!/usr/bin/sh
#
#------------------------------------------------
#
モデム(ブロードバンドルータ)が、管理しているIPアドレスを取得
#
Atermip=$(wget -O - 'http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip')
#
#Atermip="000.000.000.000"   
# Test 用 IPアドレス
echo "Aterm G.IP $Atermip"      
# 確認用
#
#------------------------------------------------
#
dig コマンドでネームサーバが認識しているIPアドレスを取得
#
結果を get_data に格納する
#
;; ANSWER SECTION:行の次の行を取得する( grep -A 1 )
#
get_data=$(dig
[www 付きドメイン名]> | grep -A 1 ";; ANSWER SECTION:" | grep [www 付きドメイン名])
#
#
ドメインのある行のみが抽出されます
#
IP_file_Array=(`echo ${get_data}`) 
# 配列として代入
#
echo "dig G.IP ${IP_file_Array[4]}"   
# 5番目に IPアドレス 確認用
#
myip=$(echo -n ${IP_file_Array[4]})
# 改行削除
#
#echo "${myip} 改行削除"       
# 改行削除確認用
#---------------------------------------------------------
#
グローバルIPアドレス 判定  相違の時 更新処理をさせる。
#
if [ ${Atermip} != ${myip} ]; then
#
        echo "IPアドレス変更"
## ( ここに グローバルIPアドレス 更新の処理を記述する。)
#
else
        echo "変化無し"
fi
#
# 終了
#------------------------------------------------




18. 自宅サーバの管理・運用監視 等


1 ). apache のメンテナンス用に、httpd-2.4.XX と httpd-2.4.37 を常駐させ、
  コマンドで簡単に切り替えられる様にする。


数か月単位で httpd-2.4.XX、nghttp2、brotli のバージョンアップあり、その都度、サーバを停止するのは、まずいので バージョンアップに対するメンテナンスの時には、一時的に apache( httpd-2.4.XX ) を htppd-2.4.37 に切り替えて行えるように htppd-2.4.34 も 動作するよう設定しておきます。
なお、SELinux のポリシーは、htppd-2.4.37 用として新規に細かく設定をする必要があります。

httpd-2.4.XX と httpd-2.4.37 を切り替えは、sh でプログラムを作り root に登録してコマンドで簡単に切り替えられる様にしています。

下記は、その切り替え用のプログラム( sh プログラム )です。
動作確認の為に status 表示をするようにしています。


  apache2( httpd-2.4.XX ) ---->> httpd-2.4.37 への切り替え

#!/bin/bash
# apache2 ---->> httpd
#-----------------------------
# apache2 の 無効化
systemctl disable apache2
systemctl stop apache2

# httpd の有効化
systemctl enable httpd
systemctl start httpd
systemctl status httpd
#-----------------------------

  httpd-2.4.37 ---->> apache2 への切り替え

#!/bin/bash
# httpd ---->> apache2
#-----------------------------
# httpd の 無効化
systemctl disable httpd
systemctl stop httpd

# apache2 の有効化
systemctl enable apache2
systemctl start apache2
systemctl status apache2
#-----------------------------

※※ 表示の終了のさせ方 ※※

表示のが、" lines 1-15/15 (END) " 等で止まった時には、小文字 [ q ] を入力してください。
表示が終了し、コマンド待ちになります。

2 ). CPU 温度の監視

CPU 温度を取得するには、sensors のインストールが必要となります。
lm_sensors のrpm パッケージは、その時点での最新版をインストールしてください。
古いと依存性エラーが発生します。その時には、yum でインストールします。
下記は、2019年 9月 現在の最新バージョンのインストールです。


 cd /usr/local/src; \ 
 rpm -Uvh lm_sensors-3.4.0-17.20180522git70f7e08.el8.x86_64.rpm


Oracle Linux8.X での追加項目

rpm からのインストールでは、依存性のエラーが出るので dnf でインストールします。

   dnf でのインストールは、下記の通りです。

      dnf -y install lm_sensors


※※ CPU 温度を取得する SSI プログラム例の紹介 ※※

 -----------------------------------------------------------

    #!/usr/bin/perl
    #----------------------------------------------------
    #  lm_sensorsを使用して CPU の温度を抽出する。
    #----------------------------------------------------
    # 先頭に Core の文字列がある行のみ抽出する
    open(get_data, "/bin/sensors |");
    #   改行コードを削除
    chomp;
    #   スペースで分割して配列に代入
    @Data = split(" ", $_ );
    #
     if ( $Data[0] eq "Core" ) { 
       # 3番目の配列に温度データがある
       $temp = substr( $Data[2], 0,3 );
     }
    }
    # 温度データを HTML へ出力する
    print "CPU 温度 $temp 度\n";

 -----------------------------------------------------------
3 ). ftp のインストール

   ftp は、ホームページデータなどのバックアップの際、外部へ出力する際に必要となります。

      cd /usr/local/src; \ 
      rpm -Uvh ftp-0.17-78.el8.x86_64.rpm

   dnf でのインストールは、下記の通りです。

      dnf -y install ftp

※※ 参考情報 ※※

コマンド[ passive : パッシブモードを使用をOFFする ]は、CentOS 7.X では、 必要ですが、 CentOS 8.X、Oracle Linux 8.Xでは、エラー ( 425 Failed to establish connection. ) が出ます。


戻る