RDS（MySQL）監査ログを有効化（Terraform）

# 前書き

- そういう要件、あると思います

# “監査ログ” is 何

ログオンしているユーザーや、データベースに対しての実行クエリなどが出力されるログ。セキュリティ要件の高い案件などはサイバー攻撃を食らった時に証跡が要りますよね。（データ抜かれたとか大丈夫だったかとか）そうしたデータベースアクティビティを記録しておくためのログです。

# いざ有効化

例えば以下のようなrdsの定義があるとしましょう。

rds.tf

```go
resource "aws_db_instance" "default" {
  allocated_storage    = 10
  engine               = "mysql"
  engine_version       = "5.7"
  instance_class       = "db.t3.micro"
  name                 = "mydb"
  username             = "foo"
  password             = "foobarbaz"
  parameter_group_name = "default.mysql5.7"
  skip_final_snapshot  = true

	enabled_cloudwatch_logs_exports = ["error", "general", "slowquery"]
}
```

`enabled_cloudwatch_logs_exports`に`audit`を追加してやります。

（ちなみに上記の設定では、error、general、slowqueryのクエリログ がCloud Watchにエクスポートされるという設定になっています。）

```go
resource "aws_db_instance" "default" {
  allocated_storage    = 10
  engine               = "mysql"
  engine_version       = "5.7"
  instance_class       = "db.t3.micro"
  name                 = "mydb"
  username             = "foo"
  password             = "foobarbaz"
  parameter_group_name = "default.mysql5.7"
  skip_final_snapshot  = true

	enabled_cloudwatch_logs_exports = ["error", "general", "slowquery", "audit"] // ここに追加
}
```

これで監査ログが取れるようになったぜ...。

**ちょっとまちーな。**

実はまだやることがあるんです。（そうなんです、自分もこれやらかしてログ取れてなかった経験があります。）

**監査プラグインを有効にしてください。**

公式にもちゃんと書いてありました。。。

[https://aws.amazon.com/jp/premiumsupport/knowledge-center/advanced-audit-rds-mysql-cloudwatch/](https://aws.amazon.com/jp/premiumsupport/knowledge-center/advanced-audit-rds-mysql-cloudwatch/)

RDSではMariaDBの監査プラグインをサポートしているので、これを使います。

対応しているMySQLのverは要確認です。

[https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.Options.AuditPlugin.html](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.Options.AuditPlugin.html)

下記のオプショングループのリソース定義があったとして、

rds.tf

```go
resource "aws_db_option_group" "example" {
  name                     = "option-group-test-terraform"
  option_group_description = "Terraform Option Group"
  engine_name              = "sqlserver-ee"
  major_engine_version     = "11.00"

  option {
    option_name = "Timezone"

    option_settings {
      name  = "TIME_ZONE"
      value = "UTC"
    }
  }

  option {
    option_name = "SQLSERVER_BACKUP_RESTORE"

    option_settings {
      name  = "IAM_ROLE_ARN"
      value = aws_iam_role.example.arn
    }
  }

  option {
    option_name = "TDE"
  }
}
```

以下のように `MARIADB_AUDIT_PLUGIN` を入れてやります。

```go
resource "aws_db_option_group" "example" {
  name                     = "option-group-test-terraform"
  option_group_description = "Terraform Option Group"
  engine_name              = "sqlserver-ee"
  major_engine_version     = "11.00"

  option {
    option_name = "Timezone"

    option_settings {
      name  = "TIME_ZONE"
      value = "UTC"
    }
  }

  option {
    option_name = "SQLSERVER_BACKUP_RESTORE"

    option_settings {
      name  = "IAM_ROLE_ARN"
      value = aws_iam_role.example.arn
    }
  }

  option {
    option_name = "TDE"
  }

	// 追加
	option {
    option_name = "MARIADB_AUDIT_PLUGIN"
  }
}
```

これで、晴れてCloud Watchに監査ログが流れるようになりました。

デフォルトでは、`/aws/rds/instance/{rdsの識別子}/audit`で保存期限は失効しない形で作成されるようでした。

## ログは大事だぞ！