セキュリティリスク回避のためのRDS(MySQL)へのIAM認証導入 Spring Boot編

はじめに

最近、RDSのIAM認証を実装しています。

MySQLは以下のものを。

miyohide.hatenablog.com

PostgreSQLは以下のものを。

miyohide.hatenablog.com

上記ではコマンドライン上での操作を実装してみたのですが、アプリケーションとして実装する方法を検証してみます。

前提事項

以下の環境で実装しました。

実装

実装として、MySQL Connector/J driverの代わりにAmazon Web Services JDBC Driver for MySQLを使います。

awslabs.github.io

具体的には、build.gradleに以下の2行を追加します。

runtimeOnly 'software.aws.rds:aws-mysql-jdbc:1.1.14'
runtimeOnly 'software.amazon.awssdk:rds:2.25.50'

既存のruntimeOnly 'com.mysql:mysql-connector-j'はコメント化しました。

その後、application.propertiesに対して接続先の設定をします。JDBC Driverを変えたので、spring.datasource.driver-class-nameの修正が必要です。具体的には以下のような記述になりました。

spring.datasource.driver-class-name=software.aws.rds.jdbc.mysql.Driver
spring.datasource.url=jdbc:mysql://エンドポイント:3306/データベース名
spring.datasource.username=IAMユーザー名
spring.datasource.hikari.data-source-properties.useAwsIam=true

IAMユーザー認証を有効にするために、spring.datasource.hikari.data-source-properties.useAwsIamtrueに設定する必要があります。これは、コネクションプールライブラリとしてデフォルトであるHikari CPを使っている例です。他のコネクションプールライブラリとして別のものを使っている場合は別の設定となると思います。

以上の設定をすることで、Spring Bootで作ったアプリケーションにてAmazon RDS for MySQLに対してIAM認証を実装することができました。

考察

IAM認証用に使用するライブラリやapplication.propertiesに対して変更が発生することがわかりました。ローカル上でテストする際にはpropertiesファイルを切り替えるなど何らかの対応が必要かなと思います。Spring BootのProfileの機能を使う必要があるかと思います。

docs.spring.io

また、IAMユーザーに対してアクセスするデータベースに対して必要な権限がないと接続に失敗します。地味にはまりポイントなので、まずはコマンドラインで動作確認をすると良いかなと思います。

今回はMySQLで実装しましたが、PostgreSQLでの実装も考えています。同様のJDBC DriverがAWSよりリリースされているのでこれを試すのかなと考えています。

aws.amazon.com