インフラエンジニアの羅針盤

インフラエンジニア1〜3年目のための技術ガイド

Apache Webサーバー構築とTLS/HTTPSセキュリティ【202試験 主題2.09】

公開
,
LinuC Level 2 第11回 主題2.09 Webサービス



LinuCレベル2(202試験)の主題2.09「Webサービスとプロキシ(Apache)」では、オープンソースのWebサーバーとして世界中で採用されている Apache HTTP Server(httpd) の内部アーキテクチャ、基本ディレクティブの構文規則、アクセス制御、バーチャルホスト、およびTLS/HTTPSによる暗号化通信の構築技術が出題範囲に指定されています。

特にLinuC試験では、Apache 2.2系からApache 2.4系への移行に伴って刷新された「アクセス制御構文(Order/Allow/Deny から Require への変更)」や、公開鍵暗号基盤(OpenSSL)を用いた証明書・秘密鍵の生成手順、mod_ssl ディレクティブの割り当てが最頻出ポイントです。本記事では、AlmaLinux 9.8の実機環境に Apache 2.4.62 および OpenSSL 3.5.5 を導入し、設定ファイルのスコープ制御からHTTPS通信の確立までを実機検証ログとともに体系的に解説します。

実機検証環境
ホストOS
AlmaLinux 9.8 (Kernel 5.14.0-503.40.1.el9_5.x86_64)
ホスト名 / IP
linuc-node01 / 192.168.2.138
Webサーバー
Apache 2.4.62 (httpd)
暗号化ライブラリ
OpenSSL 3.5.5 / mod_ssl 2.4.62
制御コマンド
apachectl / httpd
本記事の学習スコープと位置づけ
公式試験の必須出題範囲 主題2.09.1(Apache HTTPサーバーの設定と管理・VirtualHost・アクセス制御)、主題2.09.2(OpenSSLとHTTPSの設定・CSR生成・SSLディレクティブ)
現場で役立つ実務拡張 中間CA証明書チェーンの構築手順、Let’s Encrypt導入を想定したモダンTLSプロファイル設定
目次
  1. 1. Apache HTTP Serverのアーキテクチャと基本設定
    1. 1.1 Webサーバーの役割とMPM(Multi-Processing Module)
    2. 1.2 httpd.conf の基本構造と主要グローバルディレクティブ
    3. 1.3 ディレクティブスコープ(<Directory>, <Files>, <Location>)
    4. 1.4 apachectl による設定構文検査とサービス制御
  2. 2. Apache 2.4におけるアクセス制御と認証
    1. 2.1 AllowOverride ディレクティブと .htaccess の制御
    2. 2.2 mod_authz_core による Require ディレクティブ構文
    3. 2.3 htpasswd によるBasic認証の実装
  3. 3. バーチャルホストによる複数Webサイトの集約
    1. 3.1 名前ベース(Name-based)バーチャルホスト
    2. 3.2 IPベース(IP-based)バーチャルホスト
  4. 4. OpenSSLとmod_sslによるTLS/HTTPS通信の構築
    1. 4.1 公開鍵暗号基盤(PKI)とTLSハンドシェイクの流れ
    2. 4.2 OpenSSLコマンドによる秘密鍵・CSR・自己署名証明書の生成
    3. 4.3 mod_ssl の設定とディレクティブ
  5. 5. ログ管理とパフォーマンスチューニング
    1. 5.1 LogFormat と CustomLog によるアクセスログ設計
    2. 5.2 KeepAlive による持続的接続の最適化
  6. 6. LinuC 202試験(主題2.09)重要ポイント総整理
    1. 6.1 記述式(コマ問)頻出コマンド・ディレクティブ一覧
    2. 6.2 Apache 2.2系と2.4系のアクセス制御構文対比
  7. 7. まとめと次回予告(第12回:Nginx & Squidプロキシ)

1. Apache HTTP Serverのアーキテクチャと基本設定

Apache HTTP Serverは、モジュール構造を採用した高機能なWebサーバーです。基本機能に加えて必要な拡張モジュール(mod_*.so)を動的ロード(DSO: Dynamic Shared Object)することで、柔軟なサーバー構成を実現します。

Apache 2.4 ディレクティブスコープとアクセス制御の評価順序

図1: Apache 2.4 ディレクティブスコープとアクセス制御の評価順序

1.1 Webサーバーの役割とMPM(Multi-Processing Module)

クライアント(ブラウザ)から送信されるHTTPリクエスト(GET, POST等)を並行処理する基盤エンジンが MPM(Multi-Processing Module) です。LinuC 202試験では以下の3大MPMの特性比較が出題されます。

MPM名 動作モデル 主な特徴と適用シーン
event(現代の標準) マルチプロセス + マルチスレッド + イベント駆動(非同期I/O) Keep-Alive接続の待機処理を専用リスナースレッドに分離。リソース消費を最小限に抑え、C10K問題(大量同時接続)に強い。Apache 2.4のデフォルト。
worker マルチプロセス + マルチスレッド 複数の子プロセス内で多数のスレッドを起動してリクエストを分担処理。preforkに比べてメモリ消費が少なく高スループット。
prefork(旧式モデル) シングルスレッドのマルチプロセス(スレッド非使用) 1つのプロセスが1つの接続を専有処理。メモリ消費量が大きいが、スレッドセーフでない古いPHP拡張モジュール(mod_php等)との互換性に優れる。

1.2 httpd.conf の基本構造と主要グローバルディレクティブ

AlmaLinuxやRHEL系における主設定ファイルは /etc/httpd/conf/httpd.conf です(Debian/Ubuntu系では /etc/apache2/apache2.conf)。サーバー全体の動作を決定する主要ディレクティブは以下の通りです。

ディレクティブ名 機能説明 典型的な設定値
ServerRoot 設定ファイルやログが配置される基準トップディレクトリ ServerRoot "/etc/httpd"
DocumentRoot Web公開する静的HTMLファイル群の物理ルートディレクトリ DocumentRoot "/var/www/html"
Listen HTTPリクエストを待ち受けるIPアドレスおよびポート番号 Listen 80 または Listen 192.168.2.138:80
ServerName サーバー自身のホスト名およびポート番号(リダイレクト等に使用) ServerName linuc-node01.example.com:80
DirectoryIndex ディレクトリURL(/)にアクセスされた際の優先表示ファイル DirectoryIndex index.html index.php
ErrorLog サーバーエラーや警告メッセージの出力先ファイルパス ErrorLog "logs/error_log"
CustomLog アクセスログの出力先と適用フォーマット名の指定 CustomLog "logs/access_log" combined
User / Group リクエストを処理する子プロセスが動作する実行ユーザー/グループ User apache / Group apache

1.3 ディレクティブスコープ(<Directory>, <Files>, <Location>)

特定のリソースに対して個別のアクセス権限やオプションを適用する「コンテナディレクティブ(スコープ)」の使い分けは試験の頻出分野です。

  1. <Directory <物理パス>>
    サーバー上の 物理ファイルシステムのディレクトリ を対象とします。サブディレクトリにも再帰的に設定が継承されます(例: <Directory "/var/www/html">)。
  2. <Files <ファイル名>>
    ディレクトリの場所に依存せず、特定のファイル名パターン を対象とします。ワイルドカードや正規表現が使用可能です(例: <Files ".ht*"> で.htaccess等の不可視ファイルを保護)。
  3. <Location <URLパス>>
    物理ファイル構造とは無関係に、ブラウザが要求するURLパス を対象とします。動的スクリプトやリバースプロキシ設定、サーバー内部ステータス表示(/server-status)等に多用されます。

1.4 apachectl による設定構文検査とサービス制御

Apacheの制御および構文検査には、管理用CLIツール apachectl(または httpd コマンド)を使用します。

  • apachectl configtest(または apachectl -t): httpd.conf および conf.d/*.conf の構文エラーを検査します。
  • apachectl graceful: 処理中の接続を切断することなく、安全に設定ファイルを再読み込みします(無停止リロード)。
  • apachectl status: mod_status が有効な場合、稼働ワーカー数やリクエスト処理状況を表示します。

2. Apache 2.4におけるアクセス制御と認証

Apache 2.4系では、アクセス制御の記述方式が抜本的に変更されました。LinuC 202試験の合否を左右する重要ポイントです。

2.1 AllowOverride ディレクティブと .htaccess の制御

各ディレクトリに配置された分散設定ファイル .htaccess による設定の上書きを許可するか否かを指定するのが AllowOverride です。

  • AllowOverride None: .htaccess を完全に無視します。ディスクI/Oを抑制してWebサーバーの性能を最大化する本番環境の推奨設定です。
  • AllowOverride All: .htaccess 内のすべてのディレクティブ記述を許可します。
  • AllowOverride AuthConfig: ユーザー認証関連ディレクティブ(AuthType, Require 等)の上書きのみを許可します。
  • AllowOverride Indexes: ディレクトリ一覧表示の制御(Options +Indexes 等)のみを許可します。

2.2 mod_authz_core による Require ディレクティブ構文

Apache 2.2系で使用されていた Order allow,deny および Allow from all / Deny from all は非推奨となり、Apache 2.4系では mod_authz_core が提供する Require ディレクティブに一本化されました。

制御内容 Apache 2.2系(旧構文) Apache 2.4系(新構文・出題対象)
全クライアントを許可 Order allow,deny
Allow from all
Require all granted
全クライアントを拒否 Order deny,allow
Deny from all
Require all denied
特定IP/CIDRのみ許可 Order deny,allow
Deny from all
Allow from 192.168.2.0/24
Require ip 192.168.2.0/24
特定ホスト名のみ許可 Allow from .example.com Require host example.com

さらに複合的な条件判定を行う場合、論理コンテナディレクティブを使用します。

  • <RequireAll> ... </RequireAll>: 内部に記述された条件の「すべて」に一致する場合のみアクセスを許可(AND条件)。
  • <RequireAny> ... </RequireAny>: 内部に記述された条件の「いずれか1つ」に一致すればアクセスを許可(OR条件・既定の挙動)。

2.3 htpasswd によるBasic認証の実装

特定ディレクトリに対してID・パスワードによる認証を要求するBasic認証は、htpasswd コマンドと以下のディレクティブで構築します。

Basic認証の設定記述例
# パスワードファイルの初期作成(-c オプションで新規生成)
[user01@linuc-node01 ~]$ sudo htpasswd -c /etc/httpd/.htpasswd webadmin
New password:
Re-type new password:
Adding password for user webadmin

# httpd.conf 内のディレクティブ記述
<Directory "/var/www/html/admin">
    AuthType Basic
    AuthName "Restricted Admin Area"
    AuthUserFile "/etc/httpd/.htpasswd"
    Require valid-user
</Directory>

3. バーチャルホストによる複数Webサイトの集約

1台のサーバーハードウェア(単一のhttpdデーモン)上で、複数の異なるドメイン名やWebサイトを並行稼働させる技術が バーチャルホスト(VirtualHost) です。

3.1 名前ベース(Name-based)バーチャルホスト

単一のIPアドレスとポート番号(80番)を共有しながら、ブラウザから送信されるHTTPリクエストヘッダ内の Host: ヘッダ情報を識別してコンテンツを振り分ける方式です。IPv4アドレスを浪費しないため、現代のWeb運用の主流となっています。

名前ベースバーチャルホストの定義例(conf.d/vhosts.conf)
<VirtualHost *:80>
    ServerName siteA.example.com
    ServerAlias www.siteA.example.com
    DocumentRoot "/var/www/siteA"
    ErrorLog "logs/siteA_error_log"
    CustomLog "logs/siteA_access_log" combined
</VirtualHost>

<VirtualHost *:80>
    ServerName siteB.example.com
    DocumentRoot "/var/www/siteB"
    ErrorLog "logs/siteB_error_log"
    CustomLog "logs/siteB_access_log" combined
</VirtualHost>
試験対策の要点: デフォルトバーチャルホストの決定ルール
DNSに登録されていないホスト名やIPアドレス直打ちでアクセスされた場合、設定ファイル内で 最初に記述されている(またはファイル名順で最初に読み込まれる)<VirtualHost> ブロック がデフォルトのバーチャルホストとして自動選択されます。

3.2 IPベース(IP-based)バーチャルホスト

ホストOSに複数のネットワークインターフェース(またはIPエイリアス)を割り当て、接続先IPアドレスごとにサイトを分離する方式です。<VirtualHost 192.168.2.10:80> のように特定のIPアドレスを明示します。

4. OpenSSLとmod_sslによるTLS/HTTPS通信の構築

Web通信の盗聴や改ざん、なりすましを防ぐため、TLS(Transport Layer Security)による通信暗号化をApacheに組み込む手順を整理します。

OpenSSLによるTLSサーバー証明書の発行フローとmod_ssl設定

図2: OpenSSLによるTLSサーバー証明書の発行フローとmod_ssl設定

4.1 公開鍵暗号基盤(PKI)とTLSハンドシェイクの流れ

HTTPS通信の確立(TLSハンドシェイク)では、ハイブリッド暗号方式が採用されています。

  1. サーバー認証と公開鍵の受取
    クライアントが接続すると、Webサーバーは自身のデジタル証明書(X.509証明書: 公開鍵を含む)を提示します。クライアントは信頼された認証局(CA)のルート証明書を基にサーバーの身元を検証します。
  2. 共通鍵(セッションキー)の安全な交換
    公開鍵暗号(またはDiffie-Hellman鍵交換)を用いて、その通信セッション専用の一時的な共通鍵を安全に共有します。
  3. 高速な暗号化通信の実施
    ハンドシェイク完了後は、処理負荷の軽い共通鍵暗号(AES-GCM等)を用いてHTTPデータの送受信を行います。

4.2 OpenSSLコマンドによる秘密鍵・CSR・自己署名証明書の生成

LinuC 202試験では、暗号化通信に必要なファイル群を生成する OpenSSLコマンド の構文が頻出します。

  1. 1. 秘密鍵の生成(openssl genrsa)
    サーバー側の秘密鍵を作成します(例: openssl genrsa -out server.key 2048)。このファイルは第三者に漏洩してはならないため、パーミッションを 600 に厳格制限します。
  2. 2. 証明書署名要求の作成(openssl req -new)
    秘密鍵と公開鍵、および組織情報(国名/C、組織名/O、FQDNであるコモンネーム/CN)を含むCSRを作成します(例: openssl req -new -key server.key -out server.csr)。
  3. 3. 証明書の発行(openssl x509 -req)
    認証局(CA)にCSRを提出して署名を受けるか、テスト環境では自身の秘密鍵で自己署名(オレオレ証明書)を発行します。

実機環境において、秘密鍵と自己署名証明書を一括生成した検証ログです。

OpenSSLによる自己署名証明書の発行と構文検査実機ログ
[user01@linuc-node01 ~]$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/pki/tls/private/localhost.key \
  -out /etc/pki/tls/certs/localhost.crt \
  -subj "/C=JP/ST=Tokyo/L=Chiyoda/O=ExampleCorp/CN=linuc-node01.example.com"

[user01@linuc-node01 ~]$ sudo apachectl configtest
Syntax OK

4.3 mod_ssl の設定とディレクティブ

ApacheでTLSを有効化するには mod_ssl モジュールを導入し、/etc/httpd/conf.d/ssl.conf にて以下のディレクティブを定義します。

ディレクティブ名 機能説明 設定例
SSLEngine 該当バーチャルホストにおけるSSL/TLS暗号化の有効化 SSLEngine on
SSLCertificateFile サーバー証明書(公開鍵)ファイルのパス SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile サーバー証明書に対応する秘密鍵ファイルのパス SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateChainFile 中間認証局(中間CA)証明書ファイルのパス SSLCertificateChainFile /etc/pki/tls/certs/chain.crt
SSLProtocol 利用を許可するTLSプロトコルバージョンの指定 SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite 暗号化スイート(暗号化アルゴリズムの優先順)の指定 SSLCipherSuite HIGH:!aNULL:!MD5

実機環境で起動したApacheに対して curl でHTTPS通信テストを実行したログです(自己署名証明書のため -k オプションで証明書検証をスキップ)。

curl コマンドによる HTTPS 応答確認実機ログ
[user01@linuc-node01 ~]$ curl -k -I https://localhost/
HTTP/1.1 403 Forbidden
Date: Mon, 07 Sep 2026 00:45:17 GMT
Server: Apache/2.4.62 (AlmaLinux) OpenSSL/3.5.5
Last-Modified: Mon, 24 Mar 2025 16:15:24 GMT
ETag: "1680-63118e9567f00"
Accept-Ranges: bytes
Content-Length: 5760
Content-Type: text/html; charset=UTF-8

5. ログ管理とパフォーマンスチューニング

Webサーバーのアクセス傾向分析やトラブルシューティング、高負荷耐性の向上のためのログ設計および持続的接続制御を整理します。

5.1 LogFormat と CustomLog によるアクセスログ設計

Apacheのアクセスログは、LogFormat ディレクティブで定義された書式文字列に従って記録されます。標準フォーマットである combined 形式の指定子を整理します。

フォーマット指定子 記録されるデータ内容
%h 接続元クライアントのリモートホスト名またはIPアドレス
%l クライアントのリモートログ名(identdによる。通常はハイフン -
%u HTTP認証(Basic認証等)で認証されたユーザー名
%t リクエストを受領した時刻([日/月/年:時:分:秒 タイムゾーン]
\"%r\" クライアントからのリクエスト行(例: "GET /index.html HTTP/1.1"
%>s クライアントへ返却した最終HTTPステータスコード(例: 200, 404
%b HTTPヘッダを除く送信バイト数(レスポンスボディサイズ)
\"%{Referer}i\" リンク元のRefererヘッダ文字列(combined形式で追加)
\"%{User-Agent}i\" クライアントのWebブラウザ・OS識別文字列(combined形式で追加)

5.2 KeepAlive による持続的接続の最適化

Webページを表示する際、HTML本体だけでなく多数の画像やCSS、JavaScriptファイルが読み込まれます。リソースごとに毎回TCP 3ウェイハンドシェイクを繰り返すオーバーヘッドを抑制する機構が KeepAlive(持続的接続) です。

  • KeepAlive On: 単一のTCP接続上で複数のHTTPリクエストを連続処理することを許可します。
  • MaxKeepAliveRequests <回数>: 1回の持続的接続で処理を許可する最大リクエスト数(例: 100)。0 を指定すると無制限となります。
  • KeepAliveTimeout <秒数>: 同一接続上で次のリクエストが到着するまでの待機時間(秒)。値を大きくしすぎるとアイドル状態の接続がプロセス・スレッドを占有し、新規接続を受け付けられなくなるリスクがあります。

6. LinuC 202試験(主題2.09)重要ポイント総整理

主題2.09「Webサービスとプロキシ(Apache)」における記述式問題(コマ問)頻出コマンドおよび新旧構文の対比を整理します。

6.1 記述式(コマ問)頻出コマンド・ディレクティブ一覧

設問対象・操作内容 入力すべきコマンド/設定値 注意点・失点防止ポイント
Apacheの設定構文を検証するコマンド apachectl configtest(または -t httpd -t でも正解となる場合あり
無停止で設定を再読み込みするコマンド apachectl graceful reload ではなく graceful が定番
Apache 2.4で全アクセスを許可するディレクティブ Require all granted 3単語のスペルと空白に注意
Apache 2.4で全アクセスを拒否するディレクティブ Require all denied deny ではなく過去分詞の denied
Basic認証のパスワードファイルを新規作成するコマンド htpasswd -c <file> <user> 新規作成時は -c(create)オプション必須
mod_sslでサーバー証明書を指定するディレクティブ SSLCertificateFile <path> 秘密鍵指定の SSLCertificateKeyFile と区別
URLパスを対象とするコンテナディレクティブ <Location> 物理パス対象の <Directory> と混同防止

6.2 Apache 2.2系と2.4系のアクセス制御構文対比

過去問や古い解説書を解く際に混乱しやすい変更点を整理します。

  1. Orderディレクティブの完全撤廃
    Apache 2.2では Order allow,deny のように評価順序を宣言していましたが、2.4系ではこのディレクティブ自体が不要(非推奨)となり、Require のみでアクセス制御を完結させます。
  2. IP制限におけるRequire構文の簡素化
    2.2系の Allow from 192.168.1.0/24 は、2.4系では直感的に Require ip 192.168.1.0/24 と記述します。

7. まとめと次回予告(第12回:Nginx & Squidプロキシ)

本記事では、LinuCレベル2(202試験)におけるWebサービスの基盤であるApache HTTP Serverについて、MPMアーキテクチャ、基本ディレクティブ、ディレクティブスコープ、Apache 2.4のRequireアクセス制御、名前ベースバーチャルホスト、およびOpenSSLとmod_sslによるセキュアなTLS/HTTPS環境の構築手順を実機ログとともに体系的に整理しました。

Webサーバーの構築は、設定構文の正確さに加えて、証明書発行やパーミッション管理など総合的なLinuxインフラ運用スキルが求められます。実機でコマンドラインから秘密鍵を生成し、ブラウザやcurlで検証した実体験が、試験本番のコマ問記述において迷いのない回答を可能にします。

次回(第12回)は、近年の高負荷Webサービスでデファクトスタンダードとなっているイベント駆動型軽量Webサーバー Nginx と、企業ネットワークの帯域節約・アクセス制御を担うプロキシサーバー Squid を取り上げます。リバースプロキシによる負荷分散やキャッシュ制御、クライアントプロキシのアクセスフィルタリングを実機検証していきます。

前の記事
次の記事