kakakakakku blog

Weekly Tech Blog: Keep on Learning!

ALB の設定項目 routing.http.drop_invalid_header_fields.enabled を有効化する

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」になっている.

docs.aws.amazon.com

検証環境

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 便利〜

github.com

routing.http.drop_invalid_header_fields.enabled: OFF

まずはデフォルト設定として routing.http.drop_invalid_header_fields.enabled OFF の動作確認をする.curl で ALB に GET リクエストを投げるときに HTTP ヘッダーとして my-headermy_header を指定して,jq を使って Amazon ECS Task(ターゲット)に転送された HTTP ヘッダーを確認する.

期待通り my-headermy_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👌もちろん動作確認は慎重に〜

aquasecurity.github.io

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