
Application Load Balancer (ALB) の設定項目 routing.http.drop_invalid_header_fields.enabled を有効化すると不正な HTTP ヘッダーをターゲットに転送せず ALB で自動的に削除できるようになる💡 HTTP ヘッダー名は正規表現 [-A-Za-z0-9]+ で表現する必要があって,例えば _ を HTTP ヘッダー名に使うと不正と見なされて削除対象になる.試してみる❗️
ちなみに設定項目 routing.http.drop_invalid_header_fields.enabled のコンソールでの日本語表記は 無効なヘッダーフィールドを削除 で,英語表記だと Drop invalid header fields となる📝 デフォルトでは「OFF」になっている.
検証環境
routing.http.drop_invalid_header_fields.enabled の動作確認をするため,ALB と Amazon ECS (AWS Fargate) で検証環境を構築した.Amazon ECS Task で動かすコンテナとしては mendhak/http-https-echo を使う.このコンテナは HTTP リクエスト内容をそのまま JSON で返してくれる仕組みになっていて,デバッグ用途に相性抜群👏 今回は HTTP ヘッダーの動作確認をするため mendhak/http-https-echo を使おうと思った❗️
\( 'ω')/ mendhak/http-https-echo 便利〜
routing.http.drop_invalid_header_fields.enabled: OFF
まずはデフォルト設定として routing.http.drop_invalid_header_fields.enabled OFF の動作確認をする.curl で ALB に GET リクエストを投げるときに HTTP ヘッダーとして my-header と my_header を指定して,jq を使って Amazon ECS Task(ターゲット)に転送された HTTP ヘッダーを確認する.
期待通り my-header と my_header どちらも転送されている💡
$ curl -s \ -H my-header:my-header \ -H my_header:my_header \ http://xxx.ap-northeast-1.elb.amazonaws.com/ | jq '.headers | with_entries(select(.key | startswith("my")))' { "my-header": "my-header", "my_header": "my_header" }
routing.http.drop_invalid_header_fields.enabled: ON
次は routing.http.drop_invalid_header_fields.enabled ON の動作確認をする.ALB の設定変更をして,同じく GET リクエストを投げて Amazon ECS Task(ターゲット)に転送された HTTP ヘッダーを確認する.
期待通り my_header は削除されて my-header のみ転送されている💡
$ curl -s \ -H my-header:my-header \ -H my_header:my_header \ http://xxx.ap-northeast-1.elb.amazonaws.com/ | jq '.headers | with_entries(select(.key | startswith("my")))' { "my-header": "my-header" }
Terraform x tfsec
ちなみに ALB をデフォルト設定のまま実装した Terraform コードを tfsec でチェックすると Load balancers should drop invalid headers として検出される👀 その場合は
aws_alb リソースに drop_invalid_header_fields = true を追加すれば OK👌もちろん動作確認は慎重に〜
Result #1 HIGH Application load balancer is not set to drop invalid headers.
(中略)
ID aws-elb-drop-invalid-headers
Impact Invalid headers being passed through to the target of the load balance may exploit vulnerabilities
Resolution Set drop_invalid_header_fields to true
More Information
- https://aquasecurity.github.io/tfsec/v1.28.1/checks/aws/elb/drop-invalid-headers/
- https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb#drop_invalid_header_fields