ALBログからTLSプロトコルバージョンを確認する

Application Load Balancerへの通信に使われるTLSプロトコルのバージョンをALBログから確認する方法をご紹介します。
2020.02.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Application Load Balancerへの通信に使われるTLSプロトコルのバージョンをALBログから確認する方法をご紹介します。

ALBにはセキュリティポリシーがあり、ポリシーごとに利用されるTLS ProtocolsとTLS Ciphersが決まっています。デフォルトのELBSecurityPolicy-2016-08ポリシーでは、TLSv1、TLSv1.1、TLSv1.2が使われます。セキュリティ対応のためにTLSv1.2のみ許可する形に変更したいケースがあります。変更前にALBのログを確認し、TLv1やTLSv1.1が使われていないか確認します。

ALBログの有効化

ALBの属性から、ログ出力を有効にしておきます。ログはS3に出力されます。

Athenaによる確認

S3に溜まったログファイルを直接見るのは骨が折れるので、Amazon Athenaを利用します。

デーベース作成

まずは、データベースを作ります。データベース名は任意ですが、今回はawslogsにしました。

create database awslogs

Athenaコンソールを開いたら、上記のクエリを実行します。左メニューに新しいデータベースが追加されます。

テーブル作成

alb_logsというテーブルを作成します。Application Load Balancer ログのクエリを参考にしました。LOCATIONには、ELBログのあるS3のパスを指定します。

CREATE EXTERNAL TABLE IF NOT EXISTS awslogs.alb_logs (
            type string,
            time string,
            elb string,
            client_ip string,
            client_port int,
            target_ip string,
            target_port int,
            request_processing_time double,
            target_processing_time double,
            response_processing_time double,
            elb_status_code string,
            target_status_code string,
            received_bytes bigint,
            sent_bytes bigint,
            request_verb string,
            request_url string,
            request_proto string,
            user_agent string,
            ssl_cipher string,
            ssl_protocol string,
            target_group_arn string,
            trace_id string,
            domain_name string,
            chosen_cert_arn string,
            matched_rule_priority string,
            request_creation_time string,
            actions_executed string,
            redirect_url string,
            lambda_error_reason string,
            new_field string
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' = 
        '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) ([^ ]*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\"($| \"[^ ]*\")(.*)')
            LOCATION 's3://your-alb-logs-directory/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<REGION>/';

ssl_protocolのカウント

ssl_protocolごとのログ件数は以下のクエリで確認できます。

SELECT ssl_protocol,count(ssl_protocol) as count
FROM awslogs.alb_logs
GROUP BY ssl_protocol
ORDER BY count DESC

私の検証環境では、以下のように表示されました。"-"はリスナーがHTTPSリスナーではない場合に表示されます。

ユーザーエージェントとIPアドレスごとに表示

tls1.2以外のリクエストについて、ユーザーエージェントとIPアドレスを表示します。

SELECT ssl_protocol,user_agent,client, count(*) as count
FROM awslogs.alb_logs
WHERE ssl_protocol != 'TLSv1.2' AND ssl_protocol != '-' AND ssl_protocol IS NOT NULL
GROUP BY ssl_protocol,user_agent,client
ORDER BY count DESC

私の検証環境では、以下のように表示されました。明らかに不審なユーザーエージェントは正規ユーザーではないと判断したり、IPアドレスが特定拠点と判断できる場合は調整する対応になるかと思います。

おわりに

ALBのログを確認し、TLv1やTLSv1.1が使われていないか確認する方法を紹介しました。ログの確認ができたら、セキュリティポリシーを参考に、許可するsslプロトコルを変更ください。

参考