[アドカレ2024] ALBからHSTSヘッダーを挿入してみた。

はじめに

2024年11月21日にAWS Application Load Balancer がヘッダー変更機能を導入し、トラフィック制御とセキュリティを強化することが可能になりました。

Application Load Balancer (ALB) は、HTTP リクエストとレスポンスヘッダーの変更をサポートするようになりました。これにより、アプリケーションコードを変更することなく、アプリケーションのトラフィックとセキュリティをより詳細に管理できるようになりました。
https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-application-load-balancer-header-modification-enhanced-traffic-control-security/

この記事ではHSTS(HTTP Strict Transport Security)を有効化してみたいと思います。

HSTSを有効化することで初回以降(設定によって初回からも)のアクセスでクライアント側でHTTPSで接続を試みるため、セキュアな通信が可能になります。
また、リダイレクトを抑えることで処理が改善される可能性があります。

普通にアクセスする

設定前にALBにアクセスした状態を確認しておきます。

ヘッダーを変更する

現時点ではコンソールからの設定変更に対応していないためCLIで設定します。
まずは今設定されている値を確認します。
特に設定していないため、Valueは""になっています。

aws elbv2 describe-listener-attributes --listener-arn "arn:aws:elasticloadbalancing:ap-northeast-1:{aws-account-id}:listener/app/denet-blog-alb/hogehoge/fugafuga"
{
    "Attributes": [
        {
            "Key": "routing.http.response.strict_transport_security.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_expose_headers.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_allow_credentials.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_subject.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_issuer.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_serial_number.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.response.x_content_type_options.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.content_security_policy.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_allow_methods.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.x_frame_options.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_leaf.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_allow_origin.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_tls_cipher_suite.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_validity.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.response.server.enabled",
            "Value": "true"
        },
        {
            "Key": "routing.http.request.x_amzn_tls_version.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_max_age.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_allow_headers.header_value",
            "Value": ""
        }
    ]
}

describe-listener-attributes が実行できない場合はAWSCLIのバージョンが2.22.3以上であることを確認してみます。

2.22.3
api-change:elbv2: This feature adds support for enabling zonal shift on cross-zone enabled Application Load Balancer, as well as modifying HTTP request and response headers.
https://github.com/aws/aws-cli/blob/v2/CHANGELOG.rst

aws --version
aws-cli/2.22.7

modify-listener-attributes で変更したいKeyとValueを指定して変更します。

aws elbv2 modify-listener-attributes --listener-arn "arn:aws:elasticloadbalancing:ap-northeast-1:{aws-account-id}:listener/app/denet-blog-alb/hogehoge/fuaufa" --attributes Key="routing.http.response.strict_transport_security.header_value",Value="31536000;includeSubdomains;preload;"
{
    "Attributes": [
        {
            "Key": "routing.http.response.strict_transport_security.header_value",
            "Value": "31536000;includeSubdomains;preload;"
        },
        {
            "Key": "routing.http.response.access_control_expose_headers.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_allow_credentials.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_subject.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_issuer.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_serial_number.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.response.x_content_type_options.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.content_security_policy.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_allow_methods.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.x_frame_options.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_leaf.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_allow_origin.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_tls_cipher_suite.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.request.x_amzn_mtls_clientcert_validity.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.response.server.enabled",
            "Value": "true"
        },
        {
            "Key": "routing.http.request.x_amzn_tls_version.header_name",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_max_age.header_value",
            "Value": ""
        },
        {
            "Key": "routing.http.response.access_control_allow_headers.header_value",
            "Value": ""
        }
    ]
}

動作確認

ブラウザでアクセスしてみると無事にレスポンスヘッダーに設定した値が確認できました。

おわりに

CLIが触れる環境であればすぐすぐで対応可能なのが便利だと思いました。
この記事がなにかしら参考になれば幸いです。

社内でアドベントカレンダーのイベント実施中で、他の方の記事もあがっていくので良ければ覗いてみてください。
DENET 技術ブログ | カテゴリー: アドカレ2024

参考にさせていただいた記事

AWS Application Load Balancer introduces header modification for enhanced traffic control and security

HTTP header modification for your Application Load Balancer

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA