このエントリーをはてなブックマークに追加

はじめに

Aurora Serverless いいですよね。常時起動の必要のないアプリケーションなどにおいて利用することでコストメリットを享受でき心理的にストレスが随分減ります。
今回はこの Aurora Serverless の MySQL エディション使用時にユーザのアクセス制御でつまづいたのでその内容を記しておきたいと思います。

MySQL におけるアクセス制御

MySQL にはアクセスするクライアントの制御を行う仕組みがあります。これを適切に運用することで予期せぬユーザの振る舞いによるデータの変更などを避けられます。便利ですね。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.2 MySQL アクセス権限システム

Aurora MySQL による IAM 制御

一方、Aurora MySQL には AWS のサービスならではの仕組みがあります。それは IAM による制御です。

の IAM データベース認証 - Amazon Aurora

(機械翻訳によるためタイトルの日本語がバグっているようです :sweat_smile:

しかし、 Aurora Serverless ではそれは不可能です。

Aurora Serverless では、以下の機能はサポートされていません。
  • AWS Identity and Access Management (IAM) データベース認証

:

Amazon Aurora Serverless を使用する - Amazon Aurora

以上より、今回は先述の MySQL の機能を利用して特定の CIDR からのアクセスのみを許容するすることを実現しようと試みました。

Aurora Serverless MySQL で IP アドレス制御

たとえば、ユーザ naoyesmydb データベースへのアクセスを以下のように制御したい場合、

  • 10.5.0.0/24 という CIDR を保有するサブネット内にからのアクセスは許容
  • それ以外の CIDR を保有するサブネット内からのアクセスは拒否

下記クエリを流すことで実現できます。

GRANT ALL ON mydb.* TO `naoyes`@`10.5.0.%` IDENTIFIED BY 'pa55w0rd';

これを実施したのち、さっそく 10.5.0.% という CIDR を保有するサブネット内に配置された EC2 インスタンスから MySQL クライアントでアクセスを試みると

SQLSTATE[HY000] [1045] Access denied for user 'naoyes'@'10.1.0.33' (using password: YES)

といったエラーメッセージとともにアクセスが拒否されました。
10.5.0.% に配置された EC2 インスタンスからのアクセスなのに「10.1.0.33 からのアクセスはダメよー」と言われてしまったのです。

結論

できない

理由

どうも解せないのでサポートに問い合わせてみました。
回答によると

  • Aurora Serverless の DB クラスターを作成した際に以下の挙動が起こる
    • Router fleet が作成される
    • VPC 内に VPC エンドポイント(インターフェイスエンドポイント)が作成され、それが Router fleet との PrivateLink のエンドポイントとなる
    • Aurora Serverless にアタッチされた Security Group が上述の VPC エンドポイントに適用される
  • MySQL においてはクライアントの IP アドレスとして Router fleet のものが認識される
    • Router Fleet の IP アドレス範囲はスケールの状況などにより変動する可能性がある。そのため、MySQL の設定におけるホスト名としては、ワイルドカード ‘%’ を指定しておくと良い

とのことでした。
(参考: Aurora Serverless v1 アーキテクチャ
この場合、当該 Router fleet が 10.1.0.33 に配置されていたためエラーメッセージのホスト IP アドレスが 10.1.0.33 となっていたということのようです。
よって以上より、

GRANT ALL ON mydb.* TO `naoyes`@`%` IDENTIFIED BY 'pa55w0rd';

とすることが正しいとのことでした。
アクセス制御を行う場合には Security Group を適切に使うようにとのアドバイスいただきました。

(参考: セキュリティグループによるアクセスコントロール - Amazon Relational Database Service

さいごに

DB をパブリック・アクセス可能にしているわけでなかったら Security Group の制御のみで充分ですね。
そのあたりを意識せずに思考停止していたなと反省しました。適切なレイヤーで適切な制御を行うことを心がけたいと思った次第です。
また、Aurora Serverless のアーキテクチャ、 VPC エンドポイントおよび PrivateLink への理解も深まり得るものが多いつまづきでした。


このエントリーをはてなブックマークに追加

PHPerKaigi2021にて「そのコード、フレームワークの外でも動きますか?」を発表しました。スライドを公開します。



説明に使用したLaravel版とSymfony版のコードは下記で公開しています。 説明した各リファクタステップごとにタグやブランチを切ってあるので、各ステップでコードがどのような状態になっていたか興味のある方は詳細を見てみてください。
https://github.com/77web/fortune-teller-laravel
https://github.com/77web/fortune-teller-symfony


このエントリーをはてなブックマークに追加

今年のPHPerKaigiは、3/26〜3/28の3日間、ニコニコ動画とDiscordを使って開催されます! https://phperkaigi.jp/2021/

この一年、ZoomやYouTubeLive、あるいはカンファレンス用のプラットフォームを使ったイベントには多数参加しましたが、ニコニコ動画を使うカンファレンスにははじめて参加します。 どのような体験になるかとても楽しみです。

3/28(日)の午前中、「そのコード、フレームワークの外でも動きますか?」というタイトルで発表します。 https://fortee.jp/phperkaigi-2021/proposal/43f0d237-e254-4836-8275-9027d27a80ef

12月のPHPカンファレンスのときは自分が話している間、リアルタイムにDiscordに書き込まれていたコメントを確認できず、後からまとめての返信になってしまったのですが、今回は事前収録済みなのでDiscordのコメントにもタイミングよく返信できるんじゃないかなと思っています。

チケットはまだ販売中のようなので、ぜひ今からでもチケットを入手して聞きにきてください!(オンラインのためか今年はずいぶんお求めやすくなってます!) よろしくお願いします!