セキュアな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を使用する.
端末で次のコマンドを実行する.
- システムの更新を行う
Ubuntuシステムを最新の状態にする.Ubuntu 24.04 LTSではApache 2.4.58以降が採用されている.
sudo apt update # パッケージリストを更新する sudo apt upgrade # インストール済みのパッケージを更新する sudo apt dist-upgrade # 依存関係を解決しながらパッケージを更新する(カーnel更新も含む場合がある) sudo apt autoremove # 不要になったパッケージを削除する sudo apt autoclean # ダウンロードしたパッケージファイルを削除する
システム(特にカーnel)の更新後は再起動が推奨される.
sudo shutdown -r now
- ファイアウォールを設定する
ufw(Uncomplicated Firewall)を有効化し,ウェブサーバに必要なポートを開放する.
sudo ufw enable sudo ufw allow 22 # SSHポート sudo ufw allow 80 # HTTPポート sudo ufw allow 443 # HTTPSポート
Apache Fullプロファイルを使用すると,HTTP(80)とHTTPS(443)の両方のポートを同時に開放できる.必要に応じて,ポートを個別に設定することでセキュリティを向上することも検討できる.
sudo ufw allow 'Apache Full'
ufw の設定状況を確認する.
sudo ufw status
オプションとしてnmapをインストールすることで,ポートスキャンによる確認が可能となる.
sudo apt install nmap nmap localhost
Apache 及び関連ソフトウェアのインストール,基本設定
端末で次のコマンドを実行する.
- 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の設定を再読み込みする
- Apache の初期動作確認を行う
Web ブラウザで「localhost」を開き,Apache の初期画面("Apache2 Ubuntu Default Page"など)が表示されることを確認する.表示されればインストールは成功である.
- /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
- 設定変更後の動作確認を行う
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) を編集し,次の設定を追加または修正する.設定内容は 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 設定を有効化する
作成したSSL設定ファイルを有効にし,Apacheを再起動する.
sudo a2ensite www.hoge.jp sudo systemctl restart apache2
- SSL 設定の初期動作確認を行う
Web ブラウザで「https://localhost」を開き,SSL 設定の動作確認を行う.この時点では証明書が設定されていないため,セキュリティ警告が発生する.動作確認では警告を無視して進める.証明書取得後に再度確認を行う.
SSL 証明書の取得
Let's Encrypt の SSL 証明書を certbot を使用して取得する.Ubuntu 24.04 LTSではsnapdを介したインストールが公式に推奨されており,最も安定した方法である.
参考Webページ:Certbot Instructions (Ubuntu Apache)
- 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) に証明書パスなどを自動的に追加・更新する.
- 証明書の自動更新設定と確認
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
- セキュアな接続を確認する
Web ブラウザで「https://www.hoge.jp」(設定したドメイン名)を開き,セキュリティ警告が表示されないこと,ブラウザのアドレスバーに鍵アイコンが表示されていることを確認する.
追加のセキュリティ対策として,HSTS (HTTP Strict Transport Security) ヘッダを設定することも推奨される.これにより,ブラウザは以後そのサイトへのアクセスを強制的に HTTPS にする.これは Apache の設定ファイル (例: www.hoge.jp.conf) に HSTS ヘッダを追加することで実現できる.
Apache のログを確認するには,journalctl -u apache2 コマンドが有効である.