⚖️

ALBのセキュリティポリシーをアップデートする

2023/12/30に公開

Application Load Balancer(ALB)のセキュリティポリシーのアップデートについて、簡単にまとめた記事です。

はじめに

ALBにはセキュリティポリシーと呼ばれるものがあります。
公式ドキュメントを参照するとSSLネゴシエーション設定とも書かれており、通信を許可する 「プロトコル」「暗号化方式」 の組み合わせ(ポリシー)です。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/create-https-listener.html#describe-ssl-policies

数あるセキュリティポリシーの中で、現時点(2023年末の時点)で最新のものは、ELBSecurityPolicy-TLS13-1-2-2021-06であり、こちらを設定することが推奨とされています。
もしこれより古いバージョンのセキュリティポリシーが設定されている場合には、アップデートを検討しても良いかもしれません。

アップデートによって何が変わるのか?

プロトコル

まず、アップデート前のセキュリティポリシーがELBSecurityPolicy-TLS-hogeの場合、つまりTLS1.2の場合には、それに加えて新たにTLS1.3による通信がサポートされます。新しいTLS1.3ではハンドシェイクの方式が従来の1.2から変更されており、レイテンシーを削減することでより高速なレスポンスが実現できます。具体的には1回の通信プロセスで数ミリ秒短縮されるそうです。
https://www.cloudflare.com/ja-jp/learning/ssl/why-use-tls-1.3/
また、現在多くのブラウザでサポートされています。

暗号化方式

また、許容される暗号化方式が変更となります。
仮に、従来ELBSecurityPolicy-TTLS-1-2-2017-01を設定しており、このセキュリティポリシーを前述のELBSecurityPolicy-TLS13-1-2-2021-06にアップデートしたとすると、以下の暗号スイートがサポートされなくなります。

  • AES128-GCM-SHA256
  • AES128-SHA256
  • AES256-GCM-SHA384
  • AES256-SHA256

これらの(比較的)安全性のレベルが低い、あるいは危殆化した暗号スイートが利用できなくなることで、APIのセキュリティを底上げさせることができる、というわけです。ここで改めて暗号スイートについて補足すると、SSL/TLSで用いられる 暗号化・鍵交換・認証・メッセージ認証コードの4要素の暗号化プロトコル(e.g. RSA)の組み合わせを指しています。

アップデート手順

AWSマネージメントコンソール

特に難しい手順は何もなく、ALBのセキュリティタブを開き、セキュアリスナーの設定を編集 をクリックします。

続いて、セキュリティポリシーの箇所でポリシー名から任意のものを選択し、保存します。

Terraform

参考までに、Terraformの設定例も記載しておきます。

alb.tf
resource "aws_lb_listener" "test" {
  load_balancer_arn = aws_lb.test.arn
  port              = 443
  protocol          = "HTTPS"
-  ssl_policy        = "ELBSecurityPolicy-TLS-1-2-2017-01"
+  ssl_policy        = "ELBSecurityPolicy-TLS13-1-2-2021-06"

... snip ...

}

確認

セキュリティポリシーのアップデートにより、実際にどう変わったかをcurlで確認してみます。

アップデート前

$ curl -s -v https://${URL} > /dev/null

... snip ...
* [CONN-0-0][CF-SSL] (304) (OUT), TLS handshake, Client hello (1):
} [314 bytes data]
* [CONN-0-0][CF-SSL] (304) (IN), TLS handshake, Server hello (2):
{ [100 bytes data]
* [CONN-0-0][CF-SSL] TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [4958 bytes data]
* [CONN-0-0][CF-SSL] TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [333 bytes data]
... snip ...

アップデート後

$ curl -s -v https://${URL} > /dev/null

... snip ...
* (304) (IN), TLS handshake, Finished (20):
{ [36 bytes data]
* (304) (OUT), TLS handshake, Finished (20):
} [36 bytes data]
* SSL connection using TLSv1.3
... snip ...

おわりに

そういえば今年の7月に以下のブログがでて、周りで少しTLSが話題になっていました。
https://aws.amazon.com/jp/blogs/news/tls-1-2-required-for-aws-endpoints/
必ずしも必要な作業というわけではありませんが、気になる方は検討してみてください。
どなたかの参考になれば幸いです。

Discussion