Rocky Linux 9 一覧へ戻る トップRocky Linux 9 / Webサーバー(Apache)構築&セキュリティ
Rocky Linux 9 ・ Web Server

Webサーバー(Apache)構築&セキュア化

HTTPS化・セキュリティヘッダー・SELinux調整まで、商用環境に耐えうる構築手順を網羅

httpd Let's Encrypt / Certbot SELinux

本ガイドは、Rocky Linux 9においてWebサーバー(Apache)をゼロから構築し、商用環境に耐えうるセキュリティ設定(HTTPS化、セキュリティヘッダーの付与、SELinuxの調整など)を施すための手順を網羅したものです。コマンドの実行手順だけでなく、「なぜその作業を行うのか」「各設定値が何を意味するのか」について、図解や詳細な解説を交えて解説します。

目次

  1. システム構成・処理フロー(図解)
  2. STEP 1:Apacheのインストールと自動起動
  3. STEP 2:ファイアウォール(Firewalld)の設定
  4. STEP 3:ドメイン(ServerName)の設定
  5. STEP 4:HTTPS化(Let's Encrypt / Certbot)
  6. STEP 5:プロレベルの防御設定
  7. STEP 6:SELinuxの調整
  8. STEP 7:最終確認チェックリスト
  9. 補足:証明書の自動更新確認
  10. 実機で確認した設定状況

1. システム構成・処理フロー(図解)

構築作業を進める前に、サーバーがネットワーク内でどのように位置し、クライアント(ブラウザ)からのリクエストがどのように処理されるか、全体像を把握します。

1-1. システム構成図(インフラ構成)

ユーザーがインターネット経由でWebサーバーにアクセスし、各種セキュリティレイヤーを通過してコンテンツが返されるまでの構造です。

[ インターネット ] │ (HTTP: 80番 / HTTPS: 443番ポートでアクセス) ▼ [ ルーター / NAT ] ── (ポートフォワーディング) ──▶ [ Rocky Linux 9 サーバー ] │ ┌───────────────────────────────┘ ▼ 【 1. 防火壁: Firewalld 】 (許可されたポートのみ通過) │ ▼ 【 2. Webサーバー: Apache (httpd) 】 │ ├───▶ ドメイン制御 (yama.conf) ├───▶ 証明書制御 (Let's Encrypt / SSL) └───▶ 防御設定 (security.conf) │ ▼ 【 3. 制御・保護: SELinux 】 (プロセスの異常動作を監視・制限) │ ▼ 【 4. ディレクトリ領域 】 (/var/www/html)

1-2. 処理シーケンス図(リクエストから応答まで)

HTTPS接続が確立され、安全な通信としてレスポンスが返却されるまでのシーケンスです。

sequenceDiagram autonumber actor User as クライアント (ブラウザ) participant FW as Firewalld (ファイヤーウォール) participant Apache as Apache (httpd) participant SELinux as SELinux (強制アクセス制御) participant Content as Webコンテンツ (/var/www/html) User->>FW: HTTPSリクエスト (Port: 443) Note over FW: 443ポートが許可されているかチェック FW->>Apache: パケットをApacheへ転送 Apache->>SELinux: ファイル読み込み要求を発行 Note over SELinux: Apacheプロセスが対象ディレクトリに
アクセスしてよいかチェック SELinux->>Content: アクセス許可 Content-->>Apache: ファイルデータを返却 Note over Apache: security.confに基づき、
セキュリティヘッダーを付与 Apache-->>User: セキュリティヘッダー付きでHTMLを応答 Note over User: ブラウザ側でヘッダーを解析し、
クリックジャッキングやXSSを防ぐ

2. 構築およびセキュリティ設定手順

各ステップのコマンドと、詳細な仕様解説です。

STEP 1

Apacheのインストールと自動起動

Linux上でWebサーバーとして動作するソフトウェア「Apache(パッケージ名: httpd)」を導入します。

# Apacheパッケージをインストール(-y はすべての確認に「yes」と自動応答するオプション)
sudo dnf install httpd -y
# サービスの有効化と即時起動(--now をつけることで、起動と自動起動設定を同時に行う)
sudo systemctl enable --now httpd
# 起動状態の確認(Active: active (running) と表示されれば正常)
systemctl status httpd

💡 用語解説

dnf とは?
Rocky Linux 9 で採用されている標準のパッケージ管理システムです。必要なソフトウェアをインターネット上のリポジトリから依存関係を含めて自動ダウンロード・インストールします。

systemctl とは?
OS上で動くサービス(バックグラウンドプログラム)を管理するコマンドです。enable は「OS起動時に自動で立ち上げる設定」、start は「今すぐ起動する設定」を意味し、--now はこれらを1行で実行します。

STEP 2

ファイアウォール(Firewalld)の設定

デフォルト状態のLinuxは外部からの通信をほぼすべて遮断しています。Webサーバーへの接続に必要なHTTP(80番)およびHTTPS(443番)ポートを明示的に開放します。

# HTTP(80番ポート)の通信許可を恒久設定として追加
sudo firewall-cmd --permanent --add-service=http
# HTTPS(443番ポート)の通信許可を恒久設定として追加
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マスカレード設定)」作業が必要です。

STEP 3

ドメイン(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)でアクセスしてきた通信に対して、この枠内のルールを適用する」という意味の記述です。

STEP 4

HTTPS化(Let's Encrypt / Certbot)

現在のインターネット標準である常時SSL/TLS(HTTPS)通信を導入します。無料のSSL証明書発行機関「Let's Encrypt」とその自動化ツール「Certbot」を利用します。

# 1. 外部拡張パッケージリポジトリ(EPEL)を導入
sudo dnf install epel-release -y
# 2. Certbot本体と、Apacheに証明書を自動適用するためのプラグインをインストール
sudo dnf install certbot python3-certbot-apache -y
# 3. 証明書の取得およびApacheへの適用を開始
sudo certbot --apache

② 対話式プロンプトの進め方

コマンド実行後、画面に英語で指示が表示されます。以下の手順に沿って入力します。

  1. Email Address:緊急の通知を受け取るメールアドレスを入力して Enter。
  2. Terms of Service:規約への同意を求められるため、A(Agree)を入力して Enter。
  3. Newsletter:ニュースレターの受信確認。不要であれば N(No)を入力して Enter。
  4. Domain Selection:証明書を適用したいドメイン(例:www.your-domain.mydns.jp, your-domain.mydns.jp)の番号が表示されます。そのまま Enter を押すとすべてのドメインが選択されます。
  5. Congratulations! というメッセージが表示されれば、証明書の適用および、HTTPからHTTPSへのリダイレクト(自動転送)設定が自動完了します。
STEP 5

プロレベルの防御設定(セキュリティの厳格化)

初期状態の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
STEP 6

SELinuxの調整

Rocky Linuxに搭載されている強力な保護機構「SELinux」の調整を行います。標準設定のままでは、Webサーバーが外部ネットワークと連携する通信(外部APIの呼び出しやデータベース連携など)が全てブロックされます。安全性を確保したまま、この通信を許可します。

# Apache(httpdプロセス)がネットワーク通信を行うことを永続的に許可する (-P は永続的適用の意味)
sudo setsebool -P httpd_can_network_connect 1
# 現在のSELinuxの状態を確認 (Enforcing であれば有効化されており最高レベルの安全性が確保されています)
getenforce
STEP 7

最終確認チェックリスト

設定が正しく機能しているか、実機で動作確認を行います。

確認項目テスト方法期待される結果
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分前)
Rocky Linux 9 一覧へ戻る