セキュアなApacheウェブサーバ(SSL 使用)構築ガイド(Ubuntu 上)
Ubuntu の基本設定
本手順は,基本的なネットワーク設定(IPアドレス,ゲートウェイ,ネットマスク,DNSサーバ)が完了していることを前提とする.
Web サーバの URL を決めておく必要がある.このWebページでは,www.hoge.jpを使用する.ドメイン名は,サーバのグローバルIPアドレスを指すように DNS に登録しておく.証明書の取得にはこの登録が必要である.
端末で次のコマンドを実行する.
- システムの更新を行う
Ubuntu システムを最新の状態にする.Ubuntu 24.04 LTS では Apache 2.4.58 をベースとするパッケージが提供される.
sudo apt update # パッケージリストを更新する sudo apt upgrade # インストール済みのパッケージを更新する sudo apt dist-upgrade # 依存関係の変更を伴う更新を行う(カーネル更新を含む場合がある) sudo apt autoremove # 不要になったパッケージを削除する sudo apt autoclean # ダウンロードした古いパッケージファイルを削除するカーネルが更新された場合は再起動する.
sudo shutdown -r now - ファイアウォールを設定する
ufw(Uncomplicated Firewall)でウェブサーバに必要なポートを開放する.SSH で接続している場合は,接続が切れないように,先に SSH のポートを許可してから有効化する.
sudo ufw allow 22 # SSHポート sudo ufw allow 80 # HTTPポート sudo ufw allow 443 # HTTPSポート sudo ufw enableApache Full プロファイルを使用すると,HTTP(80)と HTTPS(443)の両方のポートをまとめて開放できる.
sudo ufw allow 'Apache Full'ufw の設定状況を確認する.
sudo ufw statusnmap をインストールすると,ポートスキャンによる確認ができる.
sudo apt install nmap nmap localhost
Apache 及び関連ソフトウェアのインストール,基本設定
端末で次のコマンドを実行する.
- Apache をインストールする
既存の Apache 関連パッケージを設定ごと削除してから始める場合は,次のコマンドを実行する(必要な場合のみ実行する).
sudo apt --purge remove apache2 apache2-bin apache2-data sudo apt autoremove sudo apt autocleanApache2 本体をインストールする.Ubuntu 24.04 では MPM の既定が event であり,
mod_sslやmod_headersはapache2パッケージに含まれるので,個別のパッケージをインストールする必要はない.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 - Apache の初期動作確認を行う
Web ブラウザで「localhost」を開き,Apache の初期画面("Apache2 Ubuntu Default Page")が表示されることを確認する.
- サーバ情報の隠蔽を設定する
ServerTokensはサーバ全体(server config)でのみ指定できるため,VirtualHostの中には書かない.Ubuntu では/etc/apache2/conf-available/security.confが既定で有効になっているので,このファイルを編集する.sudo nano /etc/apache2/conf-available/security.conf次の2行の値に変更する.
ServerTokens Prod # レスポンスヘッダにプロダクト名のみを表示する ServerSignature Off # エラーページ等にサーバ情報を表示しない - /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
- 設定変更後の動作確認を行う
Web ブラウザで「localhost」を開き,変更した設定(例: DocumentRoot)が反映された Apache の画面が表示されることを確認する.
- 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 設定を有効化する
作成した SSL 設定ファイルを有効にし,Apache を再起動する.
sudo a2ensite www.hoge.jp.conf sudo apachectl configtest sudo systemctl restart apache2 - SSL 設定の初期動作確認を行う
Web ブラウザで「https://localhost」を開き,SSL 設定の動作確認を行う.この時点ではドメイン名に対応した証明書がないため,セキュリティ警告が表示される.ここでは警告を無視して進め,証明書取得後に再度確認する.
SSL 証明書の取得
Let's Encrypt の SSL 証明書を certbot を使用して取得する.Ubuntu 24.04 LTS では snap によるインストールが公式手順である.
参考Webページ:Certbot Instructions (Ubuntu Apache)
- certbot をインストールし,証明書を取得する
snapd の core を最新にする.
sudo snap install core; sudo snap refresh corecertbot をインストールする.
sudo snap install --classic certbotcertbot コマンドにパスを通す.
sudo ln -s /snap/bin/certbot /usr/bin/certbotcertbot を実行して証明書を取得する.Apache プラグインを使用すると,Apache の設定ファイルが自動的に更新される.証明書の発行には,指定したドメイン名で外部から 80 番ポートにアクセスできることが必要である.
sudo certbot --apache -d www.hoge.jpcertbot 実行中,メールアドレス,利用規約への同意,そしてHTTP (80番ポート) へのアクセスを HTTPS (443番ポート) へリダイレクトするかが質問される.リダイレクトを行う場合は「2: Redirect」を選択する.certbot は証明書を取得し,SSL 用の設定ファイル(例: www.hoge.jp-le-ssl.conf)に証明書のパスを書き込む.
- 証明書の自動更新設定と確認
certbot の snap パッケージには,証明書を自動更新する systemd timer が含まれる.そのため,cron 等を手動で設定する必要はない.
自動更新タイマーの状況は次のコマンドで確認する.
sudo systemctl status snap.certbot.renew.timer更新処理の動作確認は次のコマンドで行う.実際の更新は行わず,更新手順だけが実行される.
sudo certbot renew --dry-run取得した証明書の有効期限(Let's Encrypt の証明書は90日間有効)や詳細は次のコマンドで確認する.
sudo certbot certificates - セキュアな接続を確認する
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 で確認する.