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