本ガイドは、Rocky Linux 9においてWebサーバー(Apache)をゼロから構築し、商用環境に耐えうるセキュリティ設定(HTTPS化、セキュリティヘッダーの付与、SELinuxの調整など)を施すための手順を網羅したものです。コマンドの実行手順だけでなく、「なぜその作業を行うのか」「各設定値が何を意味するのか」について、図解や詳細な解説を交えて解説します。
目次
1. システム構成・処理フロー(図解)
構築作業を進める前に、サーバーがネットワーク内でどのように位置し、クライアント(ブラウザ)からのリクエストがどのように処理されるか、全体像を把握します。
1-1. システム構成図(インフラ構成)
ユーザーがインターネット経由でWebサーバーにアクセスし、各種セキュリティレイヤーを通過してコンテンツが返されるまでの構造です。
1-2. 処理シーケンス図(リクエストから応答まで)
HTTPS接続が確立され、安全な通信としてレスポンスが返却されるまでのシーケンスです。
アクセスしてよいかチェック SELinux->>Content: アクセス許可 Content-->>Apache: ファイルデータを返却 Note over Apache: security.confに基づき、
セキュリティヘッダーを付与 Apache-->>User: セキュリティヘッダー付きでHTMLを応答 Note over User: ブラウザ側でヘッダーを解析し、
クリックジャッキングやXSSを防ぐ
2. 構築およびセキュリティ設定手順
各ステップのコマンドと、詳細な仕様解説です。
Apacheのインストールと自動起動
Linux上でWebサーバーとして動作するソフトウェア「Apache(パッケージ名: httpd)」を導入します。
sudo dnf install httpd -y
sudo systemctl enable --now httpd
systemctl status httpd
💡 用語解説
dnf とは?
Rocky Linux 9 で採用されている標準のパッケージ管理システムです。必要なソフトウェアをインターネット上のリポジトリから依存関係を含めて自動ダウンロード・インストールします。
systemctl とは?
OS上で動くサービス(バックグラウンドプログラム)を管理するコマンドです。enable は「OS起動時に自動で立ち上げる設定」、start は「今すぐ起動する設定」を意味し、--now はこれらを1行で実行します。
ファイアウォール(Firewalld)の設定
デフォルト状態のLinuxは外部からの通信をほぼすべて遮断しています。Webサーバーへの接続に必要なHTTP(80番)およびHTTPS(443番)ポートを明示的に開放します。
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
期待される出力例:http https ssh(これらが含まれていれば正常)
⚠️ 自宅サーバー環境等の注意:ルーターの設定(ポートフォワーディング)
外部インターネットからサーバーに接続するためには、自宅のルーターやプロバイダーのモデム側で、「ポート80番および443番へのアクセスを、このRocky Linuxが稼働しているローカルIPアドレスに転送する(NAT/静的IPマスカレード設定)」作業が必要です。
ドメイン(ServerName)の設定
複数のWebサイトを同一のサーバーで運用する、あるいは特定のドメイン名でアクセスを処理するために、バーチャルホスト設定を行います。
sudo vi /etc/httpd/conf.d/yama.conf
以下の設定をすべて記述します。
<VirtualHost *:80>
# サーバーの正式なドメイン名
ServerName www.your-domain.mydns.jp
# 複数ドメイン名でのアクセスを許容する別名(wwwなしなど)
ServerAlias your-domain.mydns.jp
# Webコンテンツ(HTML等)が配置されているルートディレクトリ
DocumentRoot /var/www/html
</VirtualHost>
※ファイルの保存は、キーボードの Esc を押した後、:wq と入力して Enter を押します。
💡 用語解説
/etc/httpd/conf.d/ とは?
Apacheが起動時に自動的に読み込む追加設定ファイル(.conf)を配置するディレクトリです。ファイルを分割して配置することで、管理が格段に容易になります。
<VirtualHost *:80> とは?
「IPアドレスに関わらず、ポート80(通常のHTTP)でアクセスしてきた通信に対して、この枠内のルールを適用する」という意味の記述です。
HTTPS化(Let's Encrypt / Certbot)
現在のインターネット標準である常時SSL/TLS(HTTPS)通信を導入します。無料のSSL証明書発行機関「Let's Encrypt」とその自動化ツール「Certbot」を利用します。
sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-apache -y
sudo certbot --apache
② 対話式プロンプトの進め方
コマンド実行後、画面に英語で指示が表示されます。以下の手順に沿って入力します。
- Email Address:緊急の通知を受け取るメールアドレスを入力して Enter。
- Terms of Service:規約への同意を求められるため、
A(Agree)を入力して Enter。 - Newsletter:ニュースレターの受信確認。不要であれば
N(No)を入力して Enter。 - Domain Selection:証明書を適用したいドメイン(例:
www.your-domain.mydns.jp,your-domain.mydns.jp)の番号が表示されます。そのまま Enter を押すとすべてのドメインが選択されます。 - Congratulations! というメッセージが表示されれば、証明書の適用および、HTTPからHTTPSへのリダイレクト(自動転送)設定が自動完了します。
プロレベルの防御設定(セキュリティの厳格化)
初期状態のApacheは、サーバーのバージョンやOS名などの機密情報を外部に開示してしまいます。また、不正な表示(クリックジャッキングなど)への対策が不足しています。これらを補う防御設定を追加します。
sudo vi /etc/httpd/conf.d/security.conf
以下のテキストを全てコピー&ペーストして保存します。
# ------------------------------------------------------------------------------
# 1. サーバー情報を隠蔽する (攻撃者への情報提供を遮断)
# ------------------------------------------------------------------------------
# レスポンスヘッダーに含めるサーバー情報を最小限(Apacheという名称のみ)にする
ServerTokens Prod
# エラーページ等にApacheのバージョン番号やOS情報を表示させない
ServerSignature Off
# ------------------------------------------------------------------------------
# 2. ディレクトリ一覧を表示させない (中身の覗き見防止)
# ------------------------------------------------------------------------------
<Directory /var/www/html>
# 「Indexes」を無効化(-Indexes)し、index.htmlがない場合にファイル一覧が表示されるのを防ぐ。
# 「+FollowSymLinks」はシンボリックリンクの追跡を許可する設定。
Options -Indexes +FollowSymLinks
</Directory>
# ------------------------------------------------------------------------------
# 3. HTTPセキュリティヘッダーの適用 (ブラウザの脆弱性悪化防止・防御強制)
# ------------------------------------------------------------------------------
# MIMEタイプの誤判定(スニッフィング)による脆弱性を防ぐ
Header always set X-Content-Type-Options "nosniff"
# 他のサイトのiframe等に自サイトが表示されるのを防ぐ(クリックジャッキング対策)
Header always set X-Frame-Options "sameorigin"
# ブラウザが搭載するXSS(クロスサイトスクリプティング)フィルターを強制有効にする
Header always set X-XSS-Protection "1; mode=block"
# ページ内のすべての「http://」リンクを、ブラウザ側で「https://」に自動昇格させてリクエストさせる
Header always set Content-Security-Policy "upgrade-insecure-requests"
記述ミスがないか構文チェックを行い、問題がなければ設定を適用します。
# 構文チェックの実行
sudo apachectl configtest
# ※ 「Syntax OK」と表示されれば記述エラーはありません。
# 設定を反映させるため、Apacheを再起動
sudo systemctl restart httpd
SELinuxの調整
Rocky Linuxに搭載されている強力な保護機構「SELinux」の調整を行います。標準設定のままでは、Webサーバーが外部ネットワークと連携する通信(外部APIの呼び出しやデータベース連携など)が全てブロックされます。安全性を確保したまま、この通信を許可します。
sudo setsebool -P httpd_can_network_connect 1
getenforce
最終確認チェックリスト
設定が正しく機能しているか、実機で動作確認を行います。
| 確認項目 | テスト方法 | 期待される結果 |
|---|---|---|
| 1. SSL/TLS確認 | スマートフォンなどの外部ネットワーク(Wi-Fiオフ)から、https://www.your-domain.mydns.jp にアクセスする。 | アドレスバーに「鍵マーク」が表示され、警告なしで閲覧できること。 |
| 2. 情報隠蔽テスト | 存在しない適当なURL(例:https://www.your-domain.mydns.jp/non-existent-page)にアクセスする。 | 404エラー画面に、Apacheのバージョン番号や「Rocky Linux」などのOS情報が表示されていないこと。 |
| 3. ファイル一覧表示防止テスト | index.html が存在しない空のフォルダを作成してアクセスする。 | フォルダ内のファイル一覧が表示されず、「403 Forbidden(閲覧権限なし)」のエラー画面になること。 |
補足:証明書の自動更新確認
Let's Encryptで発行されたSSL証明書の有効期限は90日間です。Rocky Linux 9では、インストール時に証明書更新のバックグラウンドタスクが自動登録されますが、これが機能するか事前にシミュレーション確認を行います。
sudo certbot renew --dry-run
確認ポイント:エラーが出力されず、「Congratulations, all simulated renews succeeded」等のメッセージが表示されれば、期限が切れる前にバックグラウンドで自動的に更新処理が行われます。管理者が手動で更新を繰り返す必要はありません。
実機で確認した設定状況
2026年8月4日時点で、本サイトのRocky Linux 9サーバーの実際の設定を確認しました。
$ getsebool httpd_can_network_connect
httpd_can_network_connect --> on
$ systemctl is-active certbot-renew.timer
active
(次回実行まで11時間、最終実行は3時間22分前)
- httpd_can_network_connect が有効化されている 証跡あり
- security.conf の内容(ServerTokens Prod、セキュリティヘッダー4種)が実機と完全一致 証跡あり
- certbot-renew.timer が稼働中で、定期的に自動更新が実行されている 証跡あり