作成開始 : 令和2年(2020年) 11月07日(土) 最終更新 : 令和3年(2021年) 03月01日(月)

FreeBSD 12 + Apache + Samba で let's encrypt 使ってセキュアなWebサイトを構築してみた。


※コンテンツ紛失したため、Googleのキャッシュから復活させました。-> 令和3年(2021年) 01月26日(火)
    本当はもっと画像を多用して分かりやすかったと思うのですが、テキストだらけで申し訳ありません。

世の中は http からよりセキュアな https でのアクセスになっています。

ブラウザでも http だと・・・

保護されていません。

・・・なんて表示されていかにも怪しい、危ないサイトであるように思われてしまいかねません。
そもそも、SSL使って自己認証局でない方法に仕上げるには高いお金払って証明書を取得しなければなりません。
そのため、このまま http でいいやー・・・と思っていました。
しかし、ある時に検索していたら無料で証明書を発行してくれる let's encrypt なるところがあるのを知りました。
利用しない手はないと思いさらに調べていくと「独自ドメイン」でないとダメ? みたいに書いているところがあったので「ダメかぁー」と諦めかけていました。
さらに検索していくと、サブドメインでも利用可能なようです。
また、自分とこのようにぷららのDDNS利用の方が XXX.plala.jp で証明書取得しサイト公開しているところを発見しました。
これらの事から、自分のサイトでも
let's encrypt で証明書を取得しセキュアなサイト構築してみようと思いました。

OS は FreeBSD 12.2 で Webサーバー は Apache 24-2、コンテンツ更新は Samba 4.13
で、クライアント は Windows 10 と Linux で更新できるようにと考えました。
環境は
VirtualBox 上の仮想マシンにします。


1.ホストマシン

先に構築した以下PCに作成します。
機種 : FMV BIBLO NF70Y

CPU : Core 2 Duo T7250 2.0GHz/2コア
周波数 : 2.0GHz
メモリ : 4GB
HDD : 160GB

2.FreeBSD 12.2 RELEASE のインストール

(1)仮想マシンの設計

GUIではなくCUIでのサーバーとします。

a.メモリ -> 1GB割当
b.CPU -> 2個割当
c.ディスク -> 以下のパーティション割当とします。
/ -> 512MB
/tmp -> 512MB
/usr ->  残り全部 (約19GB)
/usr3 -> 3GB
/var -> 768MB
/swap -> 2GB

よって、仮想ディスクとして 26GB 確保とします。/usr3 にはコンテンツを保存し Samba で共有します。
仮想ハードディスク名は freebsd122.vdi
d.コンピュータ名 -> freebsd122 とします。
e.IPアドレス/ネットマスク ->  192.168.1.20/24
f.DNSサーバーはLAN内のもの。
(2)インストール用イメージ(ISO)の準備
ダウンロードは「FreeBSD プロジェクト」 -> 「FreeBSD を入手する」からします。
「インストーライメージ -> amd64 」です。
(3)インストール(すいませんスクリーンショット無しでテキストのみです)
a.インストールディスクの起動
BIOS 画面で、CD/DVDドライブからの起動が有効になっていることを確認したら、ドライブにインストルディスクを挿入して、起動します。

少したつと起動画面が表示されます。

「default」で進めますので「Enter」押します。
b,起動モードの選択
ここではインストール作業を行いますので「Install」のまま「Enter」押します。
c.キーマップの選択
キーマップの変更画面が表示されます。
「↓」で「Japanese 106」「Japanese 106x」のうち使用しているものを選択し「Enter」押します。
キーボードが選択された状態で「Enter」押すと別画面でキーの入力を行い適切なエコーバックが行われることを確認できます。
問題がなければ最上位の「Continue with ... keymap」を選択して「Enter」押します。
d.ホスト名の入力
ホスト名の入力画面が表示されますのでホスト名を入力して「Enter」押します。
e.インストール対象の選択
ディフォルトで「kernel-dbg」「lib32」が選択されています。

pkg を使う予定であれば「ports」のチェックは必要ありませんが、わたしは使うので、チェックをしました。
よほどディスクが小さいのでなければ、後々のために「src」のチェックも入れておいた方がいいかと思います。

※以前、9.0 の時に OSインストール時に src を選択しなかったら VirtualBox を Portsからインストールしようとした時にエラーが出てsrc を追加でインストールした。
f.パーティション入力方法選択
ディフォルトで「Auto (UFS)」が選択されています。

他には・・・・

・Manual     Manual Disk Setup (experts)
・Shell      Open shell and partition by hand
・Auto (ZFS)  Guided Root-on-ZFS

特にこだわりがなければ最上位の「Auto (UFS)」でいいかと思います。

「Auto(UFS)」を選択した場合、実装メモリを判断して適切な swap 領域を作成し、あとは boot パーティションと root パーティションのみの構成となります。
ディスクが容量・早さとも十分であれば、これでいいと思います。

該当のを選択し「Enter」押します。

すると、これでいいかみたいな選択になるので「Entire Disk」をマークしてして「Enter」押します。

※今回は「Manual」でディスク構成しましたが、久しぶりなのでなかなか手ごわい動きで苦労しました。
g,フォーマットの選択
HDDが26GBなので「MBR」を選択しました。2TB超える場合は「GPT」だそうです。
該当形式選択で「Enter」押します。

ディスクの構成が表示されます。
構成を変更したい場合は<Create><Delete><Modify>等々で操作します。
OKであれば<Finish>をマークして「Enter」押します。

確認画面となりますので <Commit> マークし「Enter」押します。

フォーマットが開始され、その後ファイルのインストールが始まります。
h.パスワード入力
ひととおり、システムファイルのインストールが終わると、root パスワードの入力画面になります。
root パスワードを確認入力を含めて2回入力します。
i.ネットワーク設定
ネットワークインタフェースの設定画面が表示されます。
認識されたネットワークインタフェースが表示されますので、適切なインタフェースを選択して「Enter」押します。

IPv4 設定を行うかきいてきます。使用するのであれば [Yes] を選択して「Enter」押します。

DHCP を使用するかきいてきます。
自分は使用しないので <No> を選択し「Enter」押します。

※DHCP を使用する場合は、ネットワーク検索の画面が表示され、使用しない場合はネットワークアドレス入力画面が表示されますので、入力していきます。

IPv4 の設定が終わったら IPv6 設定を行うかきいてきます。IPv4 と同じ要領で設定します。(ここでは「No」を選んで進めていきます)

resolv(DNSサーバーのアドレス) の設定をきいてきます。
わからない場合はそのまま「OK」にカーソルを合わせて「Enter」押します。
j.タイムゾーンの設定
UTCでいいかきいてくるので <No> を選択し「Enter」押します。

「Asia」を選択して「Enter」押します。

「Japan」を選択して「Enter」押します。

'JST'でよいかきいてくるので <Yes> 選択し「Enter」押します。

日付設定画面が表示されるので、合ってなければ <Set Date> で設定します。
合っていれば <Skip> で「Enter」押します。

時間設定画面が表示されるので、合ってなければ <Set Time> で設定します。
合っていれば <Skip> で「Enter」押します。
k.初回起動サービスの選択
初回起動時に起動するサービスをきいてきます。
デフォルトで「sshd」「dumpdev」が選択されています。
自分はこれに加え「ntpdate」を選択しました。
よければ「Enter」押します。
l.システムセキュリティ強化オプションの選択
システムセキュリティ強化オプションの選択画面が表示されます。
とりあえずそのまま「Enter」押しました。
m.初期ユーザの作成
初期起動時にユーザを追加しておくかきいてきます。

adduser コマンドが起動されます。

自分は ssh で teraterm 使ってメンテとかする方が楽なので wheel グループで作成します。
n.最終確認
インストール時にやり残したことがないか、最終確認画面が表示されます。

問題がなければ「OK」を選択して「Enter」押します。
(大体のことはインストール後に変更できます)

再度、確認画面が現れるので <No> 選択で「Enter」押します。

reboot するかきいてくるので <Reboot> 選択で「Enter」押します。
インストールDVDを取り出しておきます。

reboot 後にログイン画面が表示されれば OS のインストールは完了です。
・・・とまぁ、こんな感じです。

2.SSHでリモートログインを許可する (sshd)

 Tera Term を使ってSSHでリモートログインしての操作が早いし慣れているのでその設定をします。
LAN内なのでプレインテキストでパスワード方式により接続します。
最初のインストールで SSH を有効にしているので /etc/rc.conf に 以下記載があります。
sshd_enable="YES"
次に、sshdの設定ファイルである「/etc/ssh/sshd_config」を編集します。
#PermitRootLogin no
↓変更(コメントアウト#を除き : ←root でのログインの不可 )
PermitRootLogin no
#PasswordAuthentication no
↓変更(コメントアウト#を除き no -> yesにする : ←パスワード認証の許可 )
PasswordAuthentication yes#PermitEmptyPasswords no
↓変更(コメントアウト#を除き : ←パスワード無しの不可 )
PermitEmptyPasswords no
sshdを再起動します。
# service sshd restart
SSHクライアント・ソフト使って接続します。


3.sendmailの設定

今 回はメールサーバーとしてのSMTP設定ではなく、LAN内にある別のメールサーバーへの送信に限定した動作です。
GUIなクライアントとしての利用であれば sendmail は使用しなくてもいいのですが、WebサーバーやDNSサーバーとかで利用した場合、root あての管理メールを別のメールアカウントに送信したり、CMS、ブログ、BBSなどの投稿情報をメールで送りたい場合などの設定です。

イ ンストール直後では、デフォルトでsendmailサービスが起動しています。ただし、127.0.0.1のみでLISTENしており、 内部での配信専用として使用されます。

いかなる sendmail(8) デーモンも起動しないようにするには、/etc/rc.conf で次の変数を設定します:
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
起動ファイル(rc.conf)の話し

最初に/etc/defaults/rc.conf を読み込み、その後に/etc/rc.confを読み込むようになっている。
このことによって、ユーザーが独自に加えた変更/etc/rc.confに書き込むことによって、環境変数が上書きさ れ、システムに反映される訳で、必要のない(デフォルトのままで良い)設定は何もしなくとも /etc/defaults/rc.confの設定が生きるようになっているようである。
さらに、必要なくなった場合は/etc/rc.confのモジュールセクションの内容を消す"NO"を書く。

各 種設定

/etc/mail で作業します。

a.aliases を編集してroot からのメールを特定のメールアドレスへ送信します。
# root: me@my.domain
   ↓
root: webmaster@dns12.takaq.jp

dns12.takaq.jp は、LAN内に設置してあるメールサーバーです。

編集したら、make aliases でデータベースに反映されます。(aliases.db が更新されます)

これで、dailyやweekly、monthly、security 等のメールが webmaster@dns12.takaq.jp に配信されます。
b.access を編集して中継を LAN内 のみ有効にします。
ディフォルトでは、access.sample があるのでこれを access としてコピーします。
そして、以下を追記します。
Connect:192.168       RELAY

※192.168.0.0/16 は中継許可するの意味です。

編集したら、make access.db でデータベースに反映されます。(access.db が作成・更新されます)
c. 中継サーバーの指定
外部へのメール中継を LAN内メールサーバー(dns12.takaq.jp) -> ぷららの中継サーバー にしているためです。
これは、WebサーバーのCMSやBBSで外部のメールサーバー宛送信することがあるためです。
・まず、既にある freebsd.mc を 自分用のmcとするため takaq.mc と してコピーしました。(cp freebsd.mc takaq.mc)
・viでtakaq.mc 内にある以下を次ぎのようにコ メントを外し有効にしました。
dnl define(`SMART_HOST', `your.isp.mail.server')
        ↓
define(`SMART_HOST', `dns12.takaq.jp')
・自分用のmc (takaq.mc) から sendmail.cf を 生成するため viで /etc/make.conf に 次を追記しました。
SENDMAIL_MC=/etc/mail/takaq.mc
・make します。
freebsd122# make
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 /etc/mail/takaq.mc > /etc/mail/takaq.cf
cp freebsd.submit.mc freebsd122.submit.mc
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 freebsd122.submit.mc > ffreebsd122.submit.cf
・make install します。
freebsd122# make install
install -m 444 /etc/mail/takaq.cf /etc/mail/sendmail.cf
install -m 444 freebsd122.submit.cf /etc/mail/submit.cf
・sendmail を再起動します。
freebsd122# make restart
Restarting: sendmail sendmail-clientmqueue.
・ テスト
・mailコマンドでLAN内にある メールサーバーへのテストします。

同様にして、プロバイダのアカウントや携帯電話のアカウントへ送信し てみます。
これでOKならひとまず終わりです。


4.パッケージとPortsのアップグレード
(1)パッケージのアップデート
各種インストール前にパッケージのアップデートをします。
# pkg update
初回の pkg インストールになりますので、パッケージマネージャからのインストールが始まります。
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: -> yを入力して Enter押します。
パッケージの更新が始まります。
(2)portsの更新
pkgでは提供されていないものもあるので、ここではとりあえずportsの最新を反映して更新しておきます。
portsnap は最初だけ全ての ports ツリー全体を portsnap.conf ファイルで指定したサイト (デフォルトでは portsnap.FreeBSD.org)から取得し、ディスク上に展開します。
# portsnap fetch
# portsnap extract
2回目以降は・・・
# portsnap fetch
# portsnap update
portsを厳密に管理する場合、もう少し細かい設定とか順序あります。


5.Samba 4.13 のインストールと設定
(1)設定条件
Webコンテンツ用なので、LAN内であれば誰でも読み書きできる最低限の設定とします。
(2)libiconv のビルド
samba 4.xでも、samba 3.xと同じくファイル名等に日本語を扱う際に、iconvと呼ばれる外部機能を利用します。
インストールはportsを利用して行います。
# cd /usr/ports/converters/libiconv
# make config-recursive
# make install clean
設定画面が表示されるので、とりあえずディフォルトでOKを選択します。
Samba 4.xでは、ファイルシステムの文字コード変換にlibiconvを利用しています、上記のようにすることにより、Windows上での日本語フォルダ/ ファイル名が正しく表示されるようになります。

完了後、下記方法で「libiconv」が正しくインストールされているか確認します。
# iconv -l | grep EUCJP-MS
「EUCJP-MS」が表示されれば、libiconvは正しくmake、インストールされています。

(3)Samba 4.13 ビルド
次に、samba 本体をportsからmakeします。
# cd /usr/ports/net/samba413
# make config-recursive

オプションを選択する画面が表示されますので、必要なものを適宜チェックします。
自分は ディフォルトでチェックされていた ADS, ADDC, LDAP はチェック外しました。
以外のオプション画面はすべてそのままとしました。・・・というか良く分からないので!!

# make install clean

やたらと時間かかりました。仮想マシンの設定スペックのせいなのでしょうか!?
ここだけで「32時間30分」かかりました。(回しっぱなしで寝ました)
途中、TeraTerm でログインし、シェルでディスク使用状況(df)を見ていたら、コンパイルの最後の方で /usrが -102% とかなっていました。
どうやら、make では多くの中間ファイルが作られるようです。
clean 実行とともに使用状況が変化し終了時には /usr が 38% でした。

$ while
> df
> do
> sleep 10
> echo
> done

・・・ってすると、10秒間隔で df を実行します。
終了は Ctrl + c です。
(4) smb4.conf の設定
「smb4.conf」を「/usr/local/etc/」に、条件に合わせエディタで新規に作成します。ここは 状況に応じて色々あります。
Samba4.x から Webベースの管理ツール : swat がなくなったとのことです。
[global]
   workgroup = sendai
   server string = freebsd122
   security = user
   hosts allow = 192.168.
   interfaces = 192.168.1.20/24
   map to guest = Bad User
   guest ok = yes
   guest only = yes
   guest account = nobody
   load printers = no
   log file = /var/log/samba4/log.%m
   max log size = 50
   dns proxy = no 
   unix charset = CP932
   dos charset = EUCJP-MS
   create mask = 600
   directory mask = 700
   printing = bsd

[share]
   comment = Shared Directories
   path = /usr3/httpd/html
   browseable = yes
   writable = yes

[global]セッションでは、すべてのセッションで共有される設定を記載します。
「workgroup」はこのsamba 4.xサーバが参加するワークグループを、「server string」はWindowsのネットワークコンピュータ上で表示されるsamba 4.xサーバの説明を記述します。

「security」は、samba 4.xのファイルの共有方法についての設定です。
samba 4.xでは、誰でもパスワード認証なしにアクセスできる「security=share」の設定がなくなっています。

「security=share」の代替としては、「security=user」で、かつ「map to guest=Bad User」の組み合わせがあります。
この設定では、ユーザ認証で却下されたユーザは、guestにマップされるようになります。
このため、ユーザやsambaユーザの設定をしなくとも、従来の「security=share」の設定時と同じ使用感でsamba を利用可能になります。

guestにマップするにはゲストアカウントを有効にする設定「guest ok=yes」が必要です。

smb4.confの設定が正しいかどうかを検証するツールとして「testparm」があります。
引数等は特に不要ですので、起動時にエラーが出る場合に使ってみてください。

root@freebsd122:/usr/local/etc # testparm
Load smb config files from /usr/local/etc/smb4.conf
Loaded services file OK.
Weak crypto is allowed
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

# Global parameters
[global]
        dns proxy = No
        dos charset = EUCJP-MS
        interfaces = 192.168.1.20/24
        load printers = No
        log file = /var/log/samba4/log.%m
        map to guest = Bad User
        max log size = 50
        security = USER
        server string = freebsd122
        unix charset = CP932
        workgroup = SENDAI
        idmap config * : backend = tdb
        create mask = 0600
        directory mask = 0700
        guest ok = Yes
        guest only = Yes
        hosts allow = 192.168.


[share]
        comment = Shared Directories
        path = /usr3/httpd/html
        read only = No
いいみたいです。

ここで、共有ディレクトリを作成しておきましょう。
(5)起動に必要なディレクトリの作成
samba4では、動作時にユーザ管理DBやログなどをいくつかのディレクトリに保存します。
portsからインストールした直後の状態では、これらのディレクトリは存在せず、ディレクトリがないままsamba4を起動しようとす るとエラーで終了するため、以下の通り必要なディレクトリを作成します。
# mkdir -p /var/db/samba4/private
# mkdir -p /var/log/samba4
(6)rc.conf の設定
システムの起動時にsamba 4.xが自動的に起動するよう /etc/rc.conf に以下を記述します。
samba_server_enable="YES"
これでOS起動時に自動で起動してきます。

では、テストのため手動で起動してみましょう。

# /usr/local/etc/rc.d/samba_server start

 エラー無く起動できたらよしです。

LAN内の他のPCからネットワーク共有が見えることを確認します。

 ファイルが保存できることを確認します。

なお、停止は # /usr/local/etc/rc.d/samba_server stop です。

最後にOS再起動して前記を確認します。


6.Apacheのインストール・設定
portsからインストールします。インストールバージョンは「apache24-2.4.46」です。

(1)インストール
# cd /usr/ports/www/apache24
# make config-recursive

多くのオプションがありますが、ディフォルトのままにしときます。
後からでも調整できます。

# make install clean
(2)設定
インストール後の設定です。

■まずは、ディフォルトの設定をします。

# vi /usr/local/etc/apache24/extra/httpd-default.conf

# ServerTokens Full
ServerTokens ProductOnly
    ↓
「ProductOnly」に変更します。
「ProductOnly」にすることで、クライアントに送信するヘッダの apache の情報を最小限にします。
バージョン等により、セキュリティホールがある場合でも、バージョン情報が送信されないので、クライアント側では判断できません。

ServerSignature Off
    ↓
デフォルトのままですが、意味を記述しておきます。
「Off」を設定しておくことで、サーバエラー発生時にブラウザにサーバアドレス・ポート番号を表示しません。

# HostnameLookups Off
HostnameLookups On
    ↓
「On」にすることでウェブサーバのログにクライアント側のドメイン名を記録します。

■次にベースとなるファイルを設定します。
    旧サーバーでの動作を引き継ぐための設定にしています。

# vi /usr/local/etc/apache24/httpd.conf

ServerAdmin webmaster@takaq1.plala.jp
    ↓
ウェブサーバ管理者のメールアドレス

#ServerName www.example.com:80
ServerName takaq1.plala.jp:80
    ↓
サーバのドメイン名と待ち受けポート番号の定義

# DocumentRoot "/usr/local/www/apache24/data"
DocumentRoot "/usr3/httpd/html"
# <Directory "/usr/local/www/apache24/data">
<Directory "/usr3/httpd/html">
    ↓
ドキュメントルート。変更する場合は書き換えます。
ドキュメントルートの動作を定義。ドキュメントルートを書き換えている場合は同様に変更します。

# Options Indexes FollowSymLinks
# Options FollowSymLinks
Options Includes FollowSymLinks ExecCGI
    ↓
Options は、ディレクトリに対して使用可能な機能を設定・制限します。
Includes は、 SSI の利用を許可します。
FollowSymLinks は、シンボリックリンクによるファイル参照を許可します。
ExecCGI は CGI スクリプトの実行を許可します。
このオプションが設定されていない場合は、CGI スクリプトは実行できません。
サーバーはシンボリックリンクを追跡します。 また SSI の利用を許可します。
  
# AllowOverride None
AllowOverride FileInfo AuthConfig
    ↓
AllowOverride は、.htaccess による上書きを許可するディレクティブを指定します。
<Directory> ブロック内でのみ使用可能です。
FileInfo は、ドキュメント タイプに関するディレクティブ等の上書きを許可します。
AuthConfig は、パスワード認証に関するディレクティブの上書きを許可します。

 Require all granted
    ↓
アクセス許可についての記述、この設定はすべてを許可します。

#Include etc/apache24/extra/httpd-default.conf
Include etc/apache24/extra/httpd-default.conf
    ↓
前項で設定した、「/usr/local/etc/apache24/extra/httpd-default.conf」への設定を有 効にするために、「Include」を有効にします。
(3)apacheの起動
/etc/rc.conf に以下追記します。
apache24_enable="YES"
apache の起動を有効化します。
# service apache24 enable
設定ファイルのチェックをします。
# service apache24 configtest

Syntax OK と出力されれば良好です。
# service apache24 start    ← 起動
# service apache24 stop    ← 停止
# service apache24 restart    ← 再起動

# service apache24 graceful ← 再起動
    ↓
現在のセッションは前の設定を保持したまま、接続が維持され、切断中のプロセスのみ新規の設定で起動することになりますので、運用中の サーバは graceful オプションを使用すると良いです。
(4)ブラウザから確認
ドキュメントルートあたりに適当なHTMLファイルを起き、クライアントからブラウザでアクセスして期待通りに表示 されたらOKです。
(5)ログのローテート
apacheのログは結構大量で黙っているとかなりの大きさになってシステムに異常をきたすことがあります。
そこで、一定条件でログをローテートさせてやります。

自分は、1週間に1回ローテートさせています。
ログ解析などしたい場合は期間長めにすると良いでしょう。

# vi /usr/local/etc/newsyslog.conf.d/apache_l.conf

・・・として、以下のように記述しました。

# logfilename                [owner:group]    mode   count  size  when    flags  [/pid_file]           [sig_num]
/var/log/httpd-access.log    root:wheel         644      6       *     $W6D0   B     /var/run/httpd.pid    30
/var/log/httpd-error.log     root:wheel         644      6       *     $W6D0   B     /var/run/httpd.pid    30
/var/log/httpd-ssl_request.log    root:wheel         644      6       *     $W6D0   B     /var/run/httpd.pid    30

シグナルを送って apache を再起動させています。


7.cgiのインストールと設定
(1)インストール

# cd /usr/ports/www/p5-CGI
# make config-recursive
※オプションはディフォルトのままとしました。
#  make install clean
(2)設定
Apache httpd.conf を編集します。

# vi /usr/local/etc/apache24/httpd.conf
<IfModule !mpm_prefork_module>
        #LoadModule cgid_module libexec/apache24/mod_cgid.so
        LoadModule cgid_module libexec/apache24/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module>
        # LoadModule cgi_module libexec/apache24/mod_cgi.so
        LoadModule cgi_module libexec/apache24/mod_cgi.so
</IfModule>
  ↑
やり方なんでしょうけど、ディフォルトリマークだったのを残したかったので、行コピーしてリマーク外し有効にします。

<IfModule mime_module>  から始まる行の以下を編集します。

    #AddHandler cgi-script .cgi
    AddHandler cgi-script .cgi .pl

・・・として、拡張子 .cgi .pl のcgiスクリプト実行可とします。
「/usr/local/etc/apache24/httpd.conf」とその派生ファイル (「Includes/*.conf」や「Includes/*.conf」)のうち・・・
<Directory "ディレクトリ名">
 ・・・で定義しているディレクトリのうち、「cgi」を動作させたいディレクトリの Options ・・・ の行に ExecCGI を追加します。

Apache を再起動します。
# service apache24 graceful
(3)テスト
cgi実行可能なディレクトリに以下を記述したファイルを例えば test.cgi とかして保存します。
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "Hello CGI\n";
# chmod 705 test.cgi

・・・として実行権を付与します。

そして、http://サーバー名もしくはIPアドレス/cgi実行可能ディレクトリ/test.cgi を実行します。
ブラウザに Hello CGI と表示されたらOKです。


8.PHPのインストールと設定
(1)php74のインストール
# cd /usr/ports/lang/php74
# make config-recursive

※スレッドセーフに動作させるには「ZTS」のオプションが必須になるとのことなので、「ZTS」のオプションにチェックをいれます。
 後は、デフォルトのままとしました。

# make install clean
(2)php74-extensions のインストール
# cd /usr/ports/lang/php74-extensions
# make config-recursive

データベースソフトと連携する場合はphpより先にデータベースソフトをインストールしておきます。
デフォルトでチェックされているものはチェックをそのままにしておきます。
WordPress をインストールする予定があれば、更新のために「CURL」「OPENSSL」「ZLIB」は、必須でチェックとのことです。
「GD」「GETTEXT」も他のモジュールで使うことがあるのでチェックしておいた方がいいでしょうとのことです。
日本語を使用するのであれば「MBSTRING」は、チェックします。
「MySQL」を使用するのであれば「MYSQLI」をチェックします。
「postgreSQL」を使用するのであれば「PGSQL」をチェックします。

# make install clean

「mbstring」について今後、「ports」のインストール時に設定を反映するように以下の1行を追加しておきます。

# vi /etc/make.conf

OPTIONS_SET+=MBSTRING
(3)mod_php74 のインストール
# cd /usr/ports/www/mod_php74
# make config-recursive

スレッドセーフを考慮して「APZFILTER」「PHPDBG」「DEBUG」(上の3件)以外のものすべてをチェックします。

# make install clean
(4)php.ini の設定
最低限 /usr/local/etc/php.ini への設定が必要になります。

# cd /usr/local/etc/
# cp php.ini-production php.ini
# vi /usr/local/etc/php.ini

; Default Value: On
; Development Value: Off
; Production Value: Off
; http://php.net/short-open-tag
short_open_tag = Off
    ↑
「php5」以降は、<?php ... ?> というのが正式な書式なのですが、「php4」の形式で <? 〜 ?>という書き方が許されていました。
旧来の形式のままのソースがまだ残されていて、「php4」記述形式を許可するには、これを「On」に変更します。
私のサイトで該当するので「On」にしました。

 ; Default Value: On
; Development Value: On
; Production Value: Off
; http://php.net/display-errors
display_errors = Off
    ↑
異常発生時にブラウザにエラーを表示するかどうかのオプションです。
デフォルトは「Off」になっています。
アプリなどの動作確認を行う際は「On」にすると便利です。
通常運用時は、「Off」に戻します。

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
date.timezone = "Asia/Tokyo"
    ↑
日本の時刻を設定しました。
(5)apache httpd.conf の設定
# vi /usr/local/etc/apache24/httpd.conf

<IfModule dir_module>
    # DirectoryIndex index.html
    DirectoryIndex index.html index.htm index.php index.cgi
</IfModule>
   ↑
ディレクトリのインデックスとして「index.php」を使うために上記のようにします。
ここまでの設定で記述しておりませんが、index.htm, index.cgi も追加しております。

<IfModule mime_module>
    ・
    ・
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    ・
    ・
</IfModule>
    ↑
2行を追加します。

# service apache24 configtest
    ↑
設定内容をチェックします。Syntax OK なら良好です。

# service apache24 restart
    ↑
apache を再起動します。
「service apache24 graceful」では、「apache」がこけるそうなので、全体を再起動します。

(6)テスト
ルートディレクトリあたりに以下を記述したファイルを例えば test.php とかして保存します。

<?php
phpinfo();
?>

そして、http://サーバー名もしくはIPアドレス/test.php を実行します。
ブラウザに phpの情報( 「php」のバージョン情報や設定状態が表示されれば、設定は完了です。)が表示されたらOKです。
・・・とここまでのインストールと設定で http:80 でのサイト公開はできるようになりました。
この時点で、当サイトは delegate というリバースプロキシで http:80 で複数サーバーや複数ドメインでのWebサーバーを公開していました。
次項での説明にもあるとおり、Let's Encrypt で無料証明書を取得するには、該当のサーバーにインターネットから http:80 で到達できなければなりません。
そこで、delegate は http:8080 で稼働させ、検索エンジンから本サーバーに http:80 でアクセスしてきたものについては、http:8080 にリダイレクトすることにしました。
そして、以降のSSL化に臨むこととしました。
リダレクトの設定は、ドキュメントルートに .htaccess を設置、次のような記述をしました。
RewriteEngine on
RewriteCond %{SERVER_PORT} 80 [NC]
RewriteRule ^(.*) http://takaq1.plala.jp:8080/$1 [R=301,L]

※http:80 でアクセスしてきたものは、http://takaq1.plala.jp:8080/ 以下の該当ページへリダイレクトする。
もちろん、ルータで http:80 は本サーバーへ、http:8080 は旧サーバーへ向かうよう設定しました。


9.Let's Encrypt で無料証明書を取得する。
やっときました。
certbot 公式サイトでOSとhttpdごとの設定方法が載ってるので参考にします。
Let's Encrypt 総合ポータルの方が分かりやすいかも しれません。
先達のサイトが沢山あるので色々参考にしました。

(1)certbotのインストール
certbotをpkgでインストールします。証明書取得時にapacheの停止が要らないwebrootモードで 更新したいの でapache用のプラグインも入れます。
※certbotにはStandaloneとWebrootの2つのモードがあり、前者はその名の通りcertbot単体で、後者は他の サービスと連携して証明書の取得&更新を行うモードとのことです。

# pkg install py37-certbot py37-certbot-apache

依存関係でかなりのモジュールがインストールされます。
(2)証明書の取得
証明書の取得では、指定のドメインでDNSの正引き(Aレコード)ができることと、該当のサーバー機に対しインター ネットから http:80 が到達できるようルータ設定しておく必要があります。
証明書取得時は Let's Encrypt 側からhttp:80で該当サーバー機に対してアクセスがあります。
-wにApacheのドキュメントルート、-dに証明を受けるドメインのFQDNを指定します。初回のみメールアド レス関連のあれこれが聞かれますが、適切に回答します。

証明書は/usr/local/etc/letsencrypt/live/指定したFQDN/の下に置かれます。
# certbot certonly --webroot -w /usr3/httpd/html/ -d takaq1.plala.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): takaq@takaq1.plala.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: a

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for takaq1.plala.jp
Using the webroot path /usr3/httpd/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /usr/local/etc/letsencrypt/live/takaq1.plala.jp/fullchain.pem
   Your key file has been saved at:
   /usr/local/etc/letsencrypt/live/takaq1.plala.jp/privkey.pem
   Your cert will expire on 2019-11-15. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /usr/local/etc/letsencrypt. You should
   make a secure backup of this folder now. This configuration
   directory will also contain certificates and private keys obtained
   by Certbot so making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

root@freebsd122:/usr/local/etc/letsencrypt/live/takaq1.plala.jp # ll
total 4
-rw-r--r--  1 root  wheel  692 Dec  9 23:17 README
lrwxr-xr-x  1 root  wheel   39 Dec  9 23:17 cert.pem@ -> ../../archive/takaq1.plala.jp/cert1.pem
lrwxr-xr-x  1 root  wheel   40 Dec  9 23:17 chain.pem@ -> ../../archive/takaq1.plala.jp/chain1.pem
lrwxr-xr-x  1 root  wheel   44 Dec  9 23:17 fullchain.pem@ -> ../../archive/takaq1.plala.jp/fullchain1.pem
lrwxr-xr-x  1 root  wheel   42 Dec  9 23:17 privkey.pem@ -> ../../archive/takaq1.plala.jp/privkey1.pem
    ↑
取得されましたね。


10.apache の SSL設定
(1)confファイルの準備
# vi /usr/local/etc/apache24/httpd.conf で以下編集します。

以下の箇所の先頭の「#」を削除してコメント解除します。
# LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
# LoadModule ssl_module libexec/apache24/mod_ssl.so
# Include etc/apache24/extra/httpd-ssl.conf
# vi /usr/local/etc/apache24/extra/httpd-ssl.conf で以下編集します。
<VirtualHost _default_:443>

#   General setup for the virtual host
#DocumentRoot "/usr/local/www/apache24/data"
DocumentRoot "/usr3/httpd/ssl"
#ServerName www.example.com:443
ServerName takaq1.plala.jp:443
#ServerAdmin you@example.com
ServerAdmin takaq@takaq1.plala.jp
ErrorLog "/var/log/httpd-error.log"
TransferLog "/var/log/httpd-access.log"
    ↑
ちょっと見づらいですが、サーバーの環境に合わせて変更します。

#   Server Certificate:
#   Point SSLCertificateFile at a PEM encoded certificate.  If
#   the certificate is encrypted, then you will be prompted for a
#   pass phrase.  Note that a kill -HUP 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 "/usr/local/etc/letsencrypt/live/takaq1.plala.jp/fullchain.pem"
#SSLCertificateFile "/usr/local/etc/apache24/server.crt"
#SSLCertificateFile "/usr/local/etc/apache24/server-dsa.crt"
#SSLCertificateFile "/usr/local/etc/apache24/server-ecc.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 "/usr/local/etc/letsencrypt/live/takaq1.plala.jp/privkey.pem"
#SSLCertificateKeyFile "/usr/local/etc/apache24/server.key"
#SSLCertificateKeyFile "/usr/local/etc/apache24/server-dsa.key"
#SSLCertificateKeyFile "/usr/local/etc/apache24/server-ecc.key"

#   Certificate Authority (CA):
#   Set the CA certificate verification path where to find CA
#   certificates for client authentication or alternatively one
#   huge file containing all of them (file must be PEM encoded)
#   Note: Inside SSLCACertificatePath you need hash symlinks
#         to point to the certificate files. Use the provided
#         Makefile to update the hash symlinks after changes.
#SSLCACertificatePath "/usr/local/etc/apache24/ssl.crt"
#SSLCACertificateFile "/usr/local/etc/apache24/ssl.crt/ca-bundle.crt"
SSLCACertificateFile "/usr/local/etc/letsencrypt/live/takaq1.plala.jp/chain.pem"
    ↑
各々認証キーを設定します。

/usr/local/etc/apache24/Includes/ 配下に適切な名前のコンフィグレーションファイルを作成して、https でアクセスさせたいディレクトリを以下のように記述します。
ちなみに自分は takaq_ssl.conf としました。
旧サーバーでの http:80 環境に合わせるため以下のようにしました。

<Directory /usr3/httpd/ssl>  -> ここは、/usr/local/etc/apache24/extra/httpd-ssl.conf  の DocumentRoot と同じにします。
    SSLRequireSSL
    AllowOverride All
    Options Includes FollowSymLinks ExecCGI
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
    Require all granted
</Directory>
(2)apacheの再起動
# service apache24 restart

そして、適当なindex.htmlファイルを置いてブラウザから https://サーバー名もしくはIPアドレス/ を実行します。
鍵マークがあったらOKですね。
認証情報を見てみます。

    ↑
こんな感じ。

    ↑
こんな感じです。
さて、後はコンテンツの移行です。全面リニューアルなら容易だったかもしれませんが、ほぼそのまま移行なので時間かかりました。

まずは、ルータで http:443 (https) を本サーバーへ向かうよう設定します。

そんで、今まで http:8080 に向けていたリダイレクトを 移行先 http:443(https) へ向かうようリダレクトを変更しました。(2021/01/25)
RewriteEngine on
RewriteCond %{SERVER_PORT} 80 [NC]
RewriteRule ^(.*) https://takaq1.plala.jp/$1 [R=301,L]
さらに、http:8080 へのアクセスを移行先 http:443(https) へ向かうようリダレクトを変更しました。(2021/01/30)
delegate配下のWebサーバーに以下リダイレクトを記述しました。
<ifModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{SERVER_PORT} 80 [NC]
RewriteRule ^(.*) https://takaq1.plala.jp/$1 [R=301,L]
</ifModule>
internet -> delegate : 8080 -> web:80 のため http:80 でアクセスがあったらという意味です。
書き方が違うのは、本サーバーより古い、ソースからコンパイルした apache2 のためです。
これで、しばらくすれば、検索エンジンに https で登録されます。


11.証明書の更新
From: "Let's Encrypt Expiry Bot" <expiry@letsencrypt.org>
To: takaq@takaq1.plala.jp
Subject: Let's Encrypt certificate expiration notice for domain "takaq1.plala.jp"
Date: Wed, 17 Feb 2021 13:26:31 +0000

Hello,

Your certificate (or certificates) for the names listed below will expire in 19 days (on 09 Mar 21 13:17 +0000). Please make sure to renew your certificate before then, or visitors to your website will encounter errors.

We recommend renewing certificates automatically when they have a third of their
total lifetime left. For Let's Encrypt's current 90-day certificates, that means
renewing 30 days before expiration. See
https://letsencrypt.org/docs/integration-guide/ for details.

takaq1.plala.jp

For any questions or support, please visit https://community.letsencrypt.org/. Unfortunately, we can't provide support by email.

For details about when we send these emails, please visit https://letsencrypt.org/docs/expiration-emails/. In particular, note that this reminder email is still sent if you've obtained a slightly different certificate by adding or removing names. If you've replaced this certificate with a newer one that covers more or fewer names than the list above, you may be able to ignore this message.

If you are receiving this email in error, unsubscribe at http://delivery.letsencrypt.org/track/unsub.php?u=30850198&id=7f7cac8b3c114196a085fa854b114383.v%2BQ9AH7ClEM18aHfRfxccA2G07Q%3D&r=https%3A%2F%2Fmandrillapp.com%2Funsub%3Fmd_email%3Dt%252A%252A%252A%252A%2540t%252A%252A%252A%252A.%252A%252A%252A

Regards,
The Let's Encrypt Team
    ↑
2021年02月17日(水) 上のようなメールが来ました。有効期限まで残り19日ですよと言ってます。
では、証明書更新をしてみます。

(1)旧サーバー、本サーバー上にあるリダイレクト用の .htaccess を .htaccess.org とかにしてリダイレクトしないようにします。(2021/02/18)
# mv .htaccess .htaccess.org
リダイレクト設定してから一定期間経過したので、そろそろ大丈夫かと思います。
これで、本サーバーの証明書更新ができるようになります。
(2)証明書更新のテスト
コマンドとしては、# certbot renew  これだけで更新できます。

まぁ、いきなり更新するのもなんですから、更新できるかどうか試してみます。

# certbot renew --dry-run

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /usr/local/etc/letsencrypt/renewal/takaq1.plala.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for takaq1.plala.jp
Using the webroot path /usr3/httpd/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/usr/local/etc/letsencrypt/live/takaq1.plala.jp/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /usr/local/etc/letsencrypt/live/takaq1.plala.jp/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /usr/local/etc/letsencrypt. You should
   make a secure backup of this folder now. This configuration
   directory will also contain certificates and private keys obtained
   by Certbot so making regular backups of this folder is ideal.
    ↑
Congratulations, all renewals succeeded.とか出ているので、どうやらOKのようです。
(2)証明書の更新
自動取得の設定をする前に、先のコマンドで更新してみます。
証明書更新で即反映されるのか、apacheの再起動が要るのか確かめたいためです。

# certbot renew

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /usr/local/etc/letsencrypt/renewal/takaq1.plala.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for takaq1.plala.jp
Using the webroot path /usr3/httpd/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/usr/local/etc/letsencrypt/live/takaq1.plala.jp/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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

Congratulations, all renewals succeeded. The following certs have been renewed:
  /usr/local/etc/letsencrypt/live/takaq1.plala.jp/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ↑
Congratulations, all renewals succeeded.とか出ているので、どうやらOKのようです。

root@freebsd122:~ # cd /usr/local/etc/letsencrypt/live/takaq1.plala.jp
root@freebsd122:/usr/local/etc/letsencrypt/live/takaq1.plala.jp # ll
total 4
-rw-r--r--  1 root  wheel  692 Dec  9 23:17 README
lrwxr-xr-x  1 root  wheel   39 Feb 21 20:15 cert.pem@ -> ../../archive/takaq1.plala.jp/cert2.pem
lrwxr-xr-x  1 root  wheel   40 Feb 21 20:15 chain.pem@ -> ../../archive/takaq1.plala.jp/chain2.pem
lrwxr-xr-x  1 root  wheel   44 Feb 21 20:15 fullchain.pem@ -> ../../archive/takaq1.plala.jp/fullchain2.pem
lrwxr-xr-x  1 root  wheel   42 Feb 21 20:15 privkey.pem@ -> ../../archive/takaq1.plala.jp/privkey2.pem
     ↑
更新されていますね。

反映するためには、やはり apache の再起動が必要でした。

# service apache24 restart

これで、有効期限が三ヶ月延長されました。

[注意]
有効期限が近くない状態で certbot renew しても以下メッセージで更新されません。

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /usr/local/etc/letsencrypt/renewal/takaq1.plala.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

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

The following certs are not due for renewal yet:
  /usr/local/etc/letsencrypt/live/takaq1.plala.jp/fullchain.pem expires on 2021-05-22 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

なので、Let's Encrypt Expiry Bot から有効期限切れが近いですよのメールが来てからコマンドで更新しapacheを再起動して反映させます。
※ /etc/crontab に --force-renewal で強制更新させる手もあるけど止めときます。
今日はここまで・・・・2021年03月01日(月)


サイトトップへ