AWSのELBとRDS AuroraでTLSv1.1以下を無効化する方法

セキュリティチェックシートに「SSL3.0およびTLS1.1以前を無効化しているか」という質問があったのですが、恥ずかしながら即答できなかったので、調査および対応を行いました。

同様の対応が必要な方々の参考になれば幸いです。

なお、インフラ構成はELB(ALB) + ECS on Fargate + Aurora MySQLとなっております。

## ELB(ALB)
ELBにデフォルトでアタッチされているセキュリティポリシー`ELBSecurityPolicy-2016-08`の詳細をAWS CLIで確認したところ、以下のようにTLSv1とTLSv1.1が有効化されていました。

```bash
$ aws elbv2 describe-ssl-policies --names ELBSecurityPolicy-2016-08 --output table
---------------------------------------------------
|               DescribeSSLPolicies               |
+-------------------------------------------------+
||                  SslPolicies                  ||
|+-----------------------------------------------+|
||                     Name                      ||
|+-----------------------------------------------+|
||  ELBSecurityPolicy-2016-08                    ||
|+-----------------------------------------------+|
|||                   Ciphers                   |||
||+--------------------------------+------------+||
|||              Name              | Priority   |||
||+--------------------------------+------------+||
|||  ECDHE-ECDSA-AES128-GCM-SHA256 |  1         |||
|||  ECDHE-RSA-AES128-GCM-SHA256   |  2         |||
|||  ECDHE-ECDSA-AES128-SHA256     |  3         |||
|||  ECDHE-RSA-AES128-SHA256       |  4         |||
|||  ECDHE-ECDSA-AES128-SHA        |  5         |||
|||  ECDHE-RSA-AES128-SHA          |  6         |||
|||  ECDHE-ECDSA-AES256-GCM-SHA384 |  7         |||
|||  ECDHE-RSA-AES256-GCM-SHA384   |  8         |||
|||  ECDHE-ECDSA-AES256-SHA384     |  9         |||
|||  ECDHE-RSA-AES256-SHA384       |  10        |||
|||  ECDHE-RSA-AES256-SHA          |  11        |||
|||  ECDHE-ECDSA-AES256-SHA        |  12        |||
|||  AES128-GCM-SHA256             |  13        |||
|||  AES128-SHA256                 |  14        |||
|||  AES128-SHA                    |  15        |||
|||  AES256-GCM-SHA384             |  16        |||
|||  AES256-SHA256                 |  17        |||
|||  AES256-SHA                    |  18        |||
||+--------------------------------+------------+||
|||                SslProtocols                 |||
||+---------------------------------------------+||
|||  TLSv1                                      |||
|||  TLSv1.1                                    |||
|||  TLSv1.2                                    |||
||+---------------------------------------------+||
|||         SupportedLoadBalancerTypes          |||
||+---------------------------------------------+||
|||  application                                |||
|||  network                                    |||
||+---------------------------------------------+||
```
そのため、TLSv1.2とTLSv1.3をサポートしているセキュリティポリシー`ELBSecurityPolicy-TLS13-1-2-2021-06`に更新することにしました。

```bash
$ aws elbv2 describe-ssl-policies --names ELBSecurityPolicy-TLS13-1-2-2021-06 --output table
---------------------------------------------------
|               DescribeSSLPolicies               |
+-------------------------------------------------+
||                  SslPolicies                  ||
|+-----------------------------------------------+|
||                     Name                      ||
|+-----------------------------------------------+|
||  ELBSecurityPolicy-TLS13-1-2-2021-06          ||
|+-----------------------------------------------+|
|||                   Ciphers                   |||
||+--------------------------------+------------+||
|||              Name              | Priority   |||
||+--------------------------------+------------+||
|||  TLS_AES_128_GCM_SHA256        |  1         |||
|||  TLS_AES_256_GCM_SHA384        |  2         |||
|||  TLS_CHACHA20_POLY1305_SHA256  |  3         |||
|||  ECDHE-ECDSA-AES128-GCM-SHA256 |  4         |||
|||  ECDHE-RSA-AES128-GCM-SHA256   |  5         |||
|||  ECDHE-ECDSA-AES128-SHA256     |  6         |||
|||  ECDHE-RSA-AES128-SHA256       |  7         |||
|||  ECDHE-ECDSA-AES256-GCM-SHA384 |  8         |||
|||  ECDHE-RSA-AES256-GCM-SHA384   |  9         |||
|||  ECDHE-ECDSA-AES256-SHA384     |  10        |||
|||  ECDHE-RSA-AES256-SHA384       |  11        |||
||+--------------------------------+------------+||
|||                SslProtocols                 |||
||+---------------------------------------------+||
|||  TLSv1.2                                    |||
|||  TLSv1.3                                    |||
||+---------------------------------------------+||
|||         SupportedLoadBalancerTypes          |||
||+---------------------------------------------+||
|||  application                                |||
|||  network                                    |||
||+---------------------------------------------+||
```

ELBに設定されているリスナーのセキュリティポリシーをAWSコンソールから更新しました。
![スクリーンショット 2024-09-02 17.09.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/359787ee-8dfe-fb72-cc3f-2ff7310ad2a9.png)

Terraformから変更する場合は、`aws_lb_listener`の`ssl_policy`を新しいセキュリティポリシーに置き換えればOKです。

```hcl
resource "aws_lb_listener" "https_443_prod" {
  load_balancer_arn = aws_lb.alb_prod.arn
  port              = "443"
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-TLS13-1-2-2021-06"
  certificate_arn   = data.aws_ssm_parameter.cert_arn.value

  default_action {
    type = "fixed-response"
    fixed_response {
      content_type = "text/plain"
      message_body = "Not Found"
      status_code  = "404"
    }
  }
}
```

また、TLSv1.1による通信が実際に行われているかどうかは、ALBのアクセスログをAthenaでクエリすることでも確認できます。

```sql
SELECT *
FROM alb_access_logs
WHERE ssl_protocol = 'TLSv1.1'
```
アクセスログをAthenaでクエリする方法については、以前の記事をご覧ください。

https://qiita.com/suzuki0430/items/b163ee41ebc896496c2f

## Aurora(RDS)
Auroraのカスタムパラメータグループを使用して、TLSバージョンを指定することが可能です。
`tls_version`パラメータを設定することで、TLSv1.2とTLSv1.3のみを許可するようにします。また、`require_secure_transport`を`ON`に設定することで、安全なトランスポートを要求することも可能です。

AWSコンソールからアタッチしているパラメータグループの設定を開き、それぞれ更新します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/7dc96d33-d97e-af5e-8b5e-a6144dcb0c95.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/56239552-5244-e7bd-0995-e3a2b97cc907.png)

Terraformで設定する場合は、　`aws_rds_cluster_parameter_group`に変更するパラメータ用の`parameter`ブロックを追加します。

```hcl
resource "aws_rds_cluster_parameter_group" "aurora_cluster_parameter_group_prod" {
  name        = "aurora-cluster-parameter-group-prod"
  family      = "aurora-mysql8.0"
  description = "Aurora MySQL Cluster Parameter Group for prod"

  parameter {
    name         = "require_secure_transport"
    value        = "ON"
    apply_method = "pending-reboot"
  }

  parameter {
    name         = "tls_version"
    value        = "TLSv1.2,TLSv1.3"
    apply_method = "pending-reboot"
  }
}
```

## 参考資料

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Security.html

https://dev.classmethod.jp/articles/application-load-balancer-tls-1-3/