セキュアなApacheウェブサーバ(SSL 使用)構築ガイド(Ubuntu 上)

【概要】 Ubuntu 24.04 LTSにおけるApache SSLサーバ構築ガイド.snapdによるcertbotインストールでLet's Encrypt証明書を取得し自動更新する.apt更新,ufw設定,Apache設定に加え,Ubuntu 24.04で推奨されるMPM event,TLSv1.3,ServerTokens Prod,ServerSignature Off,AllowOverride None等のセキュリティ設定に言及する.HTTP/2,HSTS,セキュリティ関連モジュールや,設定確認コマンドの利用方法も示す.

Ubuntu の基本設定

本手順は,基本的なネットワーク設定(IPアドレス,ゲートウェイ,ネットマスク,DNSサーバ)が完了していることを前提とする.

Web サーバの URL を決めておく必要がある.このWebページでは,www.hoge.jpを使用する.

端末で次のコマンドを実行する.

Apache 及び関連ソフトウェアのインストール,基本設定

端末で次のコマンドを実行する.

  1. Apache をインストールする

    既存のApache関連パッケージがある場合,以下のコマンドで完全に削除し,クリーンな状態からインストールを開始する(必要に応じて実行する).

    sudo apt --purge remove apache2 apache2-bin apache2-data apache2-mpm-* libapache2-mod-*
    sudo apt autoremove
    sudo apt autoclean
    

    Apache2本体とセキュアな通信に必要なモジュールをインストールする.Ubuntu 24.04ではMPMのデフォルト設定がeventとなり,効率的なリソース使用が可能である.

    sudo apt install apache2
    sudo apt install libapache2-mod-headers # HTTPヘッダ関連の設定に必要
    # libapache2-mod-wsgi はPythonアプリケーションが必要な場合のみインストールする
    # sudo apt install libapache2-mod-wsgi
    
    sudo a2enmod ssl    # SSL/TLS通信に必須のモジュールを有効化する
    sudo a2enmod headers
    # sudo a2enmod wsgi # libapache2-mod-wsgiをインストールした場合に必要
    # sudo a2enmod http2 # HTTP/2プロトコルを有効化する場合
    
    sudo systemctl reload apache2 # Apacheの設定を再読み込みする
    
  2. Apache の初期動作確認を行う

    Web ブラウザで「localhost」を開き,Apache の初期画面("Apache2 Ubuntu Default Page"など)が表示されることを確認する.表示されればインストールは成功である.

  3. /etc/apache2/sites-available/000-default.conf を設定する

    デフォルトのバーチャルホスト設定ファイルを編集する.

    sudo nano /etc/apache2/sites-available/000-default.conf
    

    設定例を次に示す.

    
         ServerName www.hoge.jp
         ServerAdmin hoge@hoge.ac.jp
         DocumentRoot /var/www/html
    
         /var/www/html>
         # ルートディレクトリ外へのアクセスを防ぐため、AllowOverride None がよりセキュアである
         AllowOverride None
         # Indexes が有効だとディレクトリ一覧が表示されるため、無効にするのが推奨される
         # FollowSymLinks は必要に応じて有効にするが、-FollowSymLinks +SymLinksIfOwnerMatch の方が安全な場合がある
         Options -Indexes FollowSymLinks MultiViews
         Require all granted
         
    
         ErrorLog ${APACHE_LOG_DIR}/error.log
         CustomLog ${APACHE_LOG_DIR}/access.log combined
    
         # サーバー情報隠蔽のための推奨設定
         ServerTokens Prod # プロダクト名のみを表示
         ServerSignature Off # エラーページ等にサーバー情報を表示しない
    
    

    設定変更後,Apache の設定確認と再起動を行う.設定ファイルの構文チェックにはapachectl configtestを使用する.バーチャルホスト設定の概要確認にはapache2ctl -Sコマンドも有用である.

    sudo apachectl configtest
    sudo apache2ctl -S # オプション: バーチャルホスト設定の確認
    sudo systemctl restart apache2
    
    apachectl configtest の実行結果例
  4. 設定変更後の動作確認を行う

    Web ブラウザで「localhost」を開き,変更した設定(例: DocumentRoot)が反映されたApache の画面が正常に表示されることを確認する.

    設定変更後のApache動作確認画面例
  5. SSL 設定ファイル /etc/apache2/sites-available/www.hoge.jp.conf を作成する

    デフォルトのSSL設定ファイルをコピーし,編集する.

    sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/www.hoge.jp.conf
    sudo nano /etc/apache2/sites-available/www.hoge.jp.conf
    

    コピーしたファイル (www.hoge.jp.conf) を編集し,次の設定を追加または修正する.設定内容は 000-default.conf と整合性を保つ必要がある(ServerName, ServerAdmin, DocumentRoot, Directory 設定等).

    設定例を次に示す.(証明書関連の設定はcertbotが自動で行うため,ここではコメントアウトまたはデフォルト設定のままとしておく)

    
    
         ServerName www.hoge.jp
         ServerAdmin hoge@hoge.ac.jp
         DocumentRoot /var/www/html # 000-default.conf と同じパスにする
    
         /var/www/html> # 000-default.conf と同じパスにする
         AllowOverride None
         Options -Indexes FollowSymLinks MultiViews
         Require all granted
         
    
         ErrorLog ${APACHE_LOG_DIR}/error.log
         CustomLog ${APACHE_LOG_DIR}/access.log combined
    
         # SSL Certificate/Key settings will be added or updated by certbot
         # SSLEngine on
         # SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
         # SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    
         # 推奨される強固なSSL/TLS設定例 (Ubuntu 24.04ではTLSv1.3がデフォルトでサポートされる)
         SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 # 古いTLSバージョンを無効化する
         SSLCipherSuite HIGH:!aNULL:!MD5:!3DES # 強固な暗号スイートを使用する
         SSLHonorCipherOrder on
         # Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" # HSTS有効化の推奨例
         # Header always set Content-Security-Policy "default-src 'self';" # CSP有効化の推奨例 (具体的な内容は環境に合わせて調整)
    
    
    
    SSL設定ファイル編集のイメージ
  6. SSL 設定を有効化する

    作成したSSL設定ファイルを有効にし,Apacheを再起動する.

    sudo a2ensite www.hoge.jp
    sudo systemctl restart apache2
    
  7. SSL 設定の初期動作確認を行う

    Web ブラウザで「https://localhost」を開き,SSL 設定の動作確認を行う.この時点では証明書が設定されていないため,セキュリティ警告が発生する.動作確認では警告を無視して進める.証明書取得後に再度確認を行う.

    SSL設定後の初期動作確認画面例(セキュリティ警告あり)

SSL 証明書の取得

Let's Encrypt の SSL 証明書を certbot を使用して取得する.Ubuntu 24.04 LTSではsnapdを介したインストールが公式に推奨されており,最も安定した方法である.

参考Webページ:Certbot Instructions (Ubuntu Apache)

  1. certbot をインストールし,証明書を取得する

    snapd がインストールされていない場合は,インストールする.

    sudo snap install core; sudo snap refresh core
    

    certbot をインストールする.

    sudo snap install --classic certbot
    

    snap の certbot コマンドにパスを通す(通常は自動で行われるが念のため).

    sudo ln -s /snap/bin/certbot /usr/bin/certbot
    

    certbot を実行して証明書を取得する.Apache プラグインを使用すると,Apacheの設定ファイルが自動的に更新される.

    sudo certbot --apache -d www.hoge.jp
    

    certbot 実行中,メールアドレスや利用規約への同意,そしてHTTP (80番ポート) へのアクセスを HTTPS (443番ポート) へ自動的にリダイレクトするかなど,設定に関するいくつかの質問が表示される.推奨される設定であり,通常は「2: Redirect」を選択する.表示内容を慎重に確認し,選択を進める.certbot が証明書を取得し,Apache の設定ファイル (例: www.hoge.jp.conf) に証明書パスなどを自動的に追加・更新する.

  2. 証明書の自動更新設定と確認

    certbot の snap パッケージには,証明書を自動的に更新するための systemd timer が標準で含まれている.これにより,通常は手動で自動更新を設定する必要はない.Ubuntu 24.04では,このsystemd timer がデフォルトで毎日2回実行される設定になっている.

    自動更新タイマーの状況は次のコマンドで確認できる.

    sudo systemctl status snap.certbot.renew.timer
    

    手動での自動更新テストは次のコマンドで行う.これにより,更新が必要な証明書があれば更新処理がシミュレーションされる.

    sudo certbot renew --dry-run
    

    取得した証明書の有効期限(Let's Encryptの証明書は90日間有効)や詳細を確認するには,次のコマンドが便利である.

    sudo certbot certificates
    
  3. セキュアな接続を確認する

    Web ブラウザで「https://www.hoge.jp」(設定したドメイン名)を開き,セキュリティ警告が表示されないこと,ブラウザのアドレスバーに鍵アイコンが表示されていることを確認する.

    追加のセキュリティ対策として,HSTS (HTTP Strict Transport Security) ヘッダを設定することも推奨される.これにより,ブラウザは以後そのサイトへのアクセスを強制的に HTTPS にする.これは Apache の設定ファイル (例: www.hoge.jp.conf) に HSTS ヘッダを追加することで実現できる.

    Apache のログを確認するには,journalctl -u apache2 コマンドが有効である.