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

【概要】 Ubuntu 24.04 LTS における Apache SSL サーバ構築ガイド.snap による certbot インストールで Let's Encrypt 証明書を取得し自動更新する.apt 更新,ufw 設定,Apache のバーチャルホスト設定に加え,MPM event,TLSv1.2/TLSv1.3,ServerTokens Prod,ServerSignature Off,AllowOverride None 等の設定を示す.HTTP/2,HSTS,設定確認コマンドの利用方法も示す.

Ubuntu の基本設定

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

Web サーバの URL を決めておく必要がある.このWebページでは,www.hoge.jpを使用する.ドメイン名は,サーバのグローバルIPアドレスを指すように DNS に登録しておく.証明書の取得にはこの登録が必要である.

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

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

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

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

    既存の Apache 関連パッケージを設定ごと削除してから始める場合は,次のコマンドを実行する(必要な場合のみ実行する).

    sudo apt --purge remove apache2 apache2-bin apache2-data
    sudo apt autoremove
    sudo apt autoclean
    

    Apache2 本体をインストールする.Ubuntu 24.04 では MPM の既定が event であり,mod_sslmod_headersapache2 パッケージに含まれるので,個別のパッケージをインストールする必要はない.

    sudo apt install apache2
    
    sudo a2enmod ssl        # SSL/TLS通信に必要なモジュールを有効化する
    sudo a2enmod headers    # HTTPヘッダを操作するモジュールを有効化する
    # sudo a2enmod http2    # HTTP/2 を使う場合に有効化する(MPM event が必要)
    
    sudo systemctl restart apache2 # モジュール有効化を反映するため再起動する
    

    Python アプリケーションを動かす場合は,libapache2-mod-wsgi-py3 をインストールして有効化する.

    # sudo apt install libapache2-mod-wsgi-py3
    # sudo a2enmod wsgi
    
  2. Apache の初期動作確認を行う

    Web ブラウザで「localhost」を開き,Apache の初期画面("Apache2 Ubuntu Default Page")が表示されることを確認する.

  3. サーバ情報の隠蔽を設定する

    ServerTokens はサーバ全体(server config)でのみ指定できるため,VirtualHost の中には書かない.Ubuntu では /etc/apache2/conf-available/security.conf が既定で有効になっているので,このファイルを編集する.

    sudo nano /etc/apache2/conf-available/security.conf
    

    次の2行の値に変更する.

    ServerTokens Prod    # レスポンスヘッダにプロダクト名のみを表示する
    ServerSignature Off  # エラーページ等にサーバ情報を表示しない
    
  4. /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>
         # .htaccess による設定の上書きを禁止する
         AllowOverride None
         # -Indexes によりディレクトリ一覧の表示を無効にする
         Options -Indexes FollowSymLinks MultiViews
         Require all granted
         
    
         ErrorLog ${APACHE_LOG_DIR}/error.log
         CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    

    設定変更後,構文チェックと再起動を行う.構文チェックには apachectl configtest を使用する.バーチャルホスト設定の一覧確認には apache2ctl -S を使用する.

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

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

    設定変更後のApache動作確認画面例
  6. 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) を編集し,次の設定を追加または修正する.ServerName, ServerAdmin, DocumentRoot, Directory の設定は 000-default.conf と揃える.

    設定例を次に示す.証明書のパスは 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
    
         SSLEngine on
         # 証明書のパスは certbot が追加・更新する
         # SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
         # SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    
         # TLS の設定例(Ubuntu 24.04 の OpenSSL は TLSv1.3 に対応する)
         SSLProtocol -all +TLSv1.2 +TLSv1.3   # TLSv1.2 と TLSv1.3 のみを許可する
         SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
         # 暗号スイートの選択をクライアントに委ねる(TLSv1.3 では本設定は使われない)
         SSLHonorCipherOrder off
    
         # HTTP/2 を使う場合(a2enmod http2 が必要)
         # Protocols h2 http/1.1
    
         # HSTS の設定例(HTTPS で正常にアクセスできることを確認してから有効にする)
         # Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
         # CSP の設定例(サイトの構成に合わせて調整する)
         # Header always set Content-Security-Policy "default-src 'self';"
    
    
    
    SSL設定ファイル編集のイメージ
  7. SSL 設定を有効化する

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

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

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

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

SSL 証明書の取得

Let's Encrypt の SSL 証明書を certbot を使用して取得する.Ubuntu 24.04 LTS では snap によるインストールが公式手順である.

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

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

    snapd の core を最新にする.

    sudo snap install core; sudo snap refresh core
    

    certbot をインストールする.

    sudo snap install --classic certbot
    

    certbot コマンドにパスを通す.

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

    certbot を実行して証明書を取得する.Apache プラグインを使用すると,Apache の設定ファイルが自動的に更新される.証明書の発行には,指定したドメイン名で外部から 80 番ポートにアクセスできることが必要である.

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

    certbot 実行中,メールアドレス,利用規約への同意,そしてHTTP (80番ポート) へのアクセスを HTTPS (443番ポート) へリダイレクトするかが質問される.リダイレクトを行う場合は「2: Redirect」を選択する.certbot は証明書を取得し,SSL 用の設定ファイル(例: www.hoge.jp-le-ssl.conf)に証明書のパスを書き込む.

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

    certbot の snap パッケージには,証明書を自動更新する systemd timer が含まれる.そのため,cron 等を手動で設定する必要はない.

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

    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 に強制する.SSL 用の設定ファイル(例: www.hoge.jp-le-ssl.conf)に次の1行を追加し,Apache を再起動する.

    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
    

    レスポンスヘッダは curl -I https://www.hoge.jp で確認する.Apache のログは journalctl -u apache2 および /var/log/apache2/error.log で確認する.