ロードバランサーのTLS終端:その「暗号設定」がサイバー攻撃の入り口になる理由
現場でインフラを預かるエンジニア諸君、ご苦労様。
今日はクラウドネイティブな環境における「ロードバランサー(ALB/NLB)のTLS終端」という、地味だが極めて重要な要塞化の話をする。
多くのエンジニアが「AWSやGCPがマネージドでやってくれているから大丈夫だろう」と高を括っているが、それが一番の盲点だ。デフォルト設定のまま運用していると、攻撃者は「プロトコルダウングレード攻撃」という古くて新しい手法で、君たちの堅牢なはずのシステムを覗き見ようとする。
1. なぜ「古い暗号スイート」が放置されているのか?
攻撃者が狙うのは、常に「最も弱い輪」だ。
例えば、TLS 1.0や1.1、あるいはCBCモードの暗号スイート(AES-CBCなど)を許可している環境。これは現代のセキュリティ基準では「鍵がかかっていない玄関」に等しい。
攻撃者は、わざわざ高度なハッキング手法を使わなくても、パケットをキャプチャし、弱い暗号化を強引に解読(POODLEやBEASTといった攻撃手法の亜種)することで、セッションハイジャックや機密情報の窃取を試みる。特に、レガシーなクライアントとの互換性を気にして設定を甘くしている現場は、格好の餌食だ。
我々の使命は、「捨てる勇気を持つこと」だ。古いブラウザやレガシーなデバイスが繋がらなくなることを恐れるな。脆弱な通信を許可して情報漏洩を起こすことの方が、ビジネス上のリスクは圧倒的に高い。
2. ALB/NLBで実装すべき「鉄壁のセキュリティポリシー」
AWSのALBを例に取ろう。コンソールでポチポチ設定するのもいいが、IaC(Terraformなど)で定義を固定化するのがプロの作法だ。
ここでは、AWSで最も推奨されるセキュアなセキュリティポリシー ELBSecurityPolicy-TLS13-1-2-2021-06 を適用する。これは、TLS 1.2と1.3のみを許可し、脆弱な暗号スイートを完全に排除した設定だ。
Terraformによる実装例
# セキュリティポリシーを強固に設定したALBリスナー定義
resource "aws_lb_listener" "front_end" {
load_balancer_arn = aws_lb.main.arn
port = "443"
protocol = "HTTPS"
# 最新のTLS 1.3/1.2のみを許可するポリシーを選択
# TLS 1.0/1.1はここで完全に遮断される
ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06"
certificate_arn = aws_acm_certificate.cert.arn
default_action {
type = "fixed-response"
fixed_response {
content_type = "text/plain"
message_body = "Forbidden"
status_code = "403"
}
}
}
この設定により、古い RC4 や 3DES といった脆弱な暗号化アルゴリズムは、ロードバランサーの入り口で即座に拒絶される。
3. アプリケーション層での防衛(HSTSの徹底)
ロードバランサーでTLSを強制しても、ブラウザが「HTTPでアクセスしたい」と意地を張る場合がある。これを防ぐのが Strict-Transport-Security (HSTS) ヘッダーだ。これがないと、中間者攻撃(MITM)によって通信をHTTPに落とさせられ、そのまま暗号化されていないデータを盗まれる。
Nginxやアプリケーション側で、以下のようなヘッダーを必ず付与せよ。
Nginxの設定例
server {
listen 443 ssl;
# HSTSヘッダーの付与
# includeSubDomains: サブドメインにも強制
# preload: ブラウザのプリロードリストに追加
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# X-Frame-Optionsでクリックジャッキング対策
add_header X-Frame-Options DENY always;
# X-Content-Type-OptionsでMIMEタイプスニッフィング対策
add_header X-Content-Type-Options nosniff always;
}
4. まとめ:明日からやるべきこと
私の経験上、セキュリティは「一度設定したら終わり」というものではない。以下の手順で定期的に監査を行ってほしい。
1. 棚卸し: 現在のロードバランサーに適用されているセキュリティポリシーを確認せよ。もし TLS1.0 や 1.1 が含まれていたら、今すぐ排除する計画を立てろ。
2. スキャン: nmap や testssl.sh を使って、外側から自分のサーバーがどのような暗号スイートを提示しているか確認せよ。
- コマンド例:
testssl.sh --severity HIGH your-domain.com
3. 自動化: IaC(Terraform/CloudFormation)のコードレビュー時に、セキュリティポリシーのバージョンが最新であることをチェックリストに加えよ。
セキュリティは、派手なハッキングを防ぐことではなく、「当たり前のことを、当たり前にやり続けること」だ。君たちの手で、強固なインフラを構築してほしい。応援している。
コメント