Ubuntu / Debian サーバーで Logjam 攻撃から保護する手順
重要: すべてのコマンドは root または同等の権限で実行してください。既存構成のバックアップを必ず取ってから変更を加えてください。
はじめに
このチュートリアルは、最近発見された Logjam 脆弱性から Ubuntu / Debian ベースの Linux サーバー(ISPConfig 3 構成を含む)を保護するための手順を説明します。Logjam は Diffie-Hellman(DH)鍵交換の弱点を悪用する攻撃で、HTTPS/TLS/SMTPS/SSH などのプロトコルに影響します。詳しい背景は https://weakdh.org/ を参照してください。
定義(1行): Diffie-Hellman(DH) — 安全な鍵共有を行うための公開鍵暗号手法。脆弱な DH パラメータは中間者攻撃を可能にします。
TL;DR(手順の概略)
- /etc/ssl/private に dhparams.pem を生成(2048 ビット推奨)
- 各サービスの暗号設定(CipherSuite)を強化
- Apache(可能なら SSLOpenSSLConfCmd で DH を読み込む)
- Nginx は ssl_dhparam を参照するよう設定
- Postfix/Dovecot/Pure‑FTPd に DH/暗号リストを適用
- サービス再起動と接続テスト
1. 一意の DH グループを生成する
まずサーバーごとに一意な DH グループを作成します。/etc/ssl/private を使用します(存在しない場合は作成)。
mkdir -p /etc/ssl/private
chmod 710 /etc/ssl/private
DH パラメータを生成して権限を絞ります(2048 ビット以上を推奨):
cd /etc/ssl/private
openssl dhparam -out dhparams.pem 2048
chmod 600 dhparams.pem
注: 4096 ビットはより強固ですが生成に時間がかかります。運用ポリシーと CPU 負荷を考慮してください。
Important: dhparams.pem の生成は CPU インテンシブです。本番で実行する場合はメンテナンス時間を選んでください。
2. 共通の安全な暗号スイート(推奨)
多くのサービスで共有できる暗号スイートの例(weakdh.org の推奨を参考にしています)。各サービスの設定形式に合わせて使用してください。
暗号一覧(一行で扱うこと): ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:…:!KRB5-DES-CBC3-SHA
(実際の完全なリストは各セクションの該当箇所を参照)
3. Apache の設定
- /etc/apache2/mods-available/ssl.conf を編集します。
nano /etc/apache2/mods-available/ssl.conf
以下のように暗号とプロトコルを強制します(SSLCipherSuite は一行で記述):
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder on
注意: SSLCipherSuite は改行を入れないでください。
- Apache に DH パラメータを読み込ませる(可能な場合)
- 条件: Apache >= 2.4.8 かつ OpenSSL >= 1.0.2 の場合、SSLOpenSSLConfCmd が使えます。
バージョン確認:
apache2 -v
openssl version
対応している場合、ssl.conf に次を追加します:
SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams.pem"
その後 Apache を再起動します:
service apache2 restart
互換性がない場合でも、前述の SSLCipherSuite の設定だけでも弱い暗号を無効化できます。
4. Nginx の設定
/etc/nginx/nginx.conf の http セクションに次を追加または置換してください。
nano /etc/nginx/nginx.conf
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/private/dhparams.pem;
設定後 Nginx を再起動します:
service nginx restart
5. Postfix の設定
Postfix に対して安全な暗号と DH ファイルを指定します。
postconf -e "smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA"
postconf -e "smtpd_tls_dh1024_param_file = /etc/ssl/private/dhparams.pem"
設定後、Postfix を再起動します:
service postfix restart
注意: コマンド内のタイプミス(例: EDH-RSA-DES-CDC3-SHA のような)に注意し、既存の Postfix バージョンでサポートされるパラメータ名を確認してください。
6. Dovecot の設定
/etc/dovecot/dovecot.conf を編集し、ssl_cipher_list を追加します(ssl_protocols の直後に置きます)。
nano /etc/dovecot/dovecot.conf
ssl_cipher_list=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
Dovecot バージョンにより追加設定:
- dovecot –version でバージョンを確認
- バージョン >= 2.2.6 の場合: ssl_prefer_server_ciphers = yes を追加
- バージョン >= 2.2.7 の場合: ssl_dh_parameters_length = 2048 を追加
最後に再起動:
service dovecot restart
7. Pure‑FTPd の設定
Debian/Ubuntu の pure‑ftpd ではラッパースクリプトに -J オプションが無い場合があるため、ラッパーに対応を追加します。
nano /usr/sbin/pure-ftpd-wrapper
ファイル内の次の行を見つけます:
'TLS' => ['-Y %d', \&parse_number_1],
その直後に次を追加します:
'TLSCipherSuite' => ['-J %s', \&parse_string],
次に /etc/pure-ftpd/conf/TLSCipherSuite を作成または編集して暗号リストを入れます:
nano /etc/pure-ftpd/conf/TLSCipherSuite
(同様の一行暗号リストをペースト)
保存後、サービスを再起動します:
service pure-ftpd-mysql restart
注意: サービス名は環境により pure-ftpd または pure-ftpd-mysql など異なるため確認してください。
8. テストと受け入れ基準(Kритерии приёмки)
テスト手順例:
- openssl s_client -connect example.com:443 を使ってプロトコルと暗号を確認する
- SSL Labs のサーバーテストで A 以上を目指す(補助的)
- Postfix/Dovecot では各クライアントで接続確認(メール送受信)
受け入れ基準:
- サーバーが脆弱な DH 鍵交換を提供していないことを確認
- 弱い暗号(RC4, DES, MD5 等)が無効化されている
- サービスの機能に重大な互換性問題がないこと
9. 互換性と失敗する場合(カウンター例)
古いクライアント(古いブラウザや組み込みデバイス)は新しい ECDHE ベースの暗号をサポートしない場合があります。業務上どうしても古いクライアントをサポートする必要がある場合は、別途専用の後方互換用プロキシや段階的な移行計画を検討してください。
Apache / OpenSSL のバージョンが要件を満たさない場合、DHParameters を直接読み込めないことがあります。その場合は OpenSSL または Apache のアップグレード、あるいはロードバランサ/プロキシで終端を行う選択肢があります。
10. ミニ・メソドロジー(実施手順のチェックリスト)
- 設定ファイルのバックアップを取得
- dhparams.pem を生成(2048 以上)
- 各サービスに暗号リストを適用
- サービスを再起動
- 接続テストとログ監査
- 定期的に暗号設定を見直す(年1回以上推奨)
11. 役割別チェックリスト
- システム管理者: dhparams の生成、サービス設定変更、再起動
- セキュリティ担当: テスト計画作成、外部ツールでの脆弱性スキャン
- アプリケーションオーナー: 互換性問題の報告、旧クライアントサポート要件の提示
12. 意思決定フロー(Mermaid)
以下は簡易的な判断フローです。
flowchart TD
A[サーバーで TLS を提供している?] -->|No| B[作業不要]
A -->|Yes| C[dhparams.pem を生成済み?]
C -->|No| D[生成して適切な権限を設定]
C -->|Yes| E[各サービスに適用]
E --> F{Apache バージョン >= 2.4.8 && OpenSSL >= 1.0.2}
F -->|Yes| G[SSLOpenSSLConfCmd で読み込む]
F -->|No| H[CipherSuite を強化、可能なら OpenSSL/APache を更新]
G --> I[サービス再起動と接続テスト]
H --> I
I --> J[運用モニタリング]
13. セキュリティ強化の注意点
- 定期的に OpenSSL・サーバーソフトウェアのアップデートを行ってください。新たな脆弱性が発見される可能性があります。
- TLS 設定は互換性と安全性のトレードオフです。外部ステークホルダーと調整して変更を適用してください。
14. テストケース(サンプル)
- TC1: openssl s_client で TLS 接続を確立し、受け入れられる暗号が推奨リスト内であることを確認
- TC2: 古いクライアント(互換性テスト用)で接続が拒否されるかどうかを確認
- TC3: メール送受信(SMTP/IMAP/POP)で TLS 接続が確立することを確認
15. まとめ
Logjam のような DH 関連の脆弱性に対しては、サーバー固有の DH パラメータを生成し、各サービスで弱い暗号を無効化することが基本対策です。可能であれば最新の OpenSSL と Apache/Nginx を使用し、定期的に設定を見直してください。
重要: 変更を本番に反映する前にステージング環境で検証し、バックアップを必ず取ってください。