株式会社クイックのWebサービス開発blog

HAPPYなサービスプランナー・エンジニア・デザイナーのブログです。

ECSでセキュリティと利便性を両立できるphpMyAdminを構築した話

こんにちは、クイックSREチームのみっちーです!

弊社SREチームでは、インフラの安定稼働だけでなく、運用改善、セキュリティ強化など。ユーザーが快適に使える仕組みを考え、日々いろいろな改善を行っています。
今回は、そんな仕組みを考えていく中での取り組み事例を1つ、ご紹介したいと思います。

目次

1.前置き(課題について)

2.検討したこと

3.こうしてみた

4.最後に

1.前置き(課題について)

セキュリティを強固にすると運用コストが高くなる

弊社では、主にデータ分析のためにエンジニア以外もDBを触る機会があります。
そのため利便性の面からphpMyAdminを採用し、接続ユーザー/パスワードは共通のものをみんなで利用する運用を行っていました。

これだと確かに利便性は向上しますが、
ユーザー/パスワードを使いまわす運用にしているので、流出した際にセキュリティリスクが大きい状態でした。

加えてphpMyAdminでは、標準で操作ログの追跡が困難です。この点も、リスク管理という点で課題となっていました。

2.検討したこと

「利用者ごとにユーザー/パスワードを発行する」

これを解決する手段の1つとして「利用者ごとにユーザー/パスワードを発行する」案が持ち上がりましたが、実際の運用を想定すると以下のような課題があり、なかなか導入に踏み切れませんでした。

  • 必要な処理をすべて自動化できないと運用コストが高い
  • そもそも、必要な処理をすべて自動化できるノウハウがなかった

構成管理ツール「Terraform」とコンテナを利用して、必要な処理をすべて自動化する

最近弊社内の案件においては、DB(RDS)をはじめとする各種インフラリソースはTerraformでコード管理する機会も増えており、ノウハウも少しずつ蓄積されていた状況でした。
そんな中、SREチーム内での雑談中に「それらのコードを組み合わせることで、本件の課題解決できないか?」という話が持ち上がりました。

3.こうしてみた

以下のような構成であれば課題解決できそうということで、早速やってみました!

phpMyAdminコンテナ」 + 「AWS ECS」 + 「AWS Route53」 + 「Terraform」 + 「Jenkins」

動作イメージとしては以下の通りです。 f:id:aimstogeek:20211105145259p:plain

運用を想定し、Jenkinsのジョブとして起動できるような仕組みにします。
このとき、Jenkinsの権限管理プラグイン(Role-based Authorization Strategy)も併せてインストールして、ジョブ実行可能ユーザーを制限します。

Jenkinsジョブの中で実際に呼び出すコードは、以下のような仕組みとしました。

まずECS FargateでphpMyAdminのコンテナを起動し、ELBも起動させて紐づけます。
その後Route53にアクセス用のDNSレコードを登録させます。
※ このときTerraformのrandom_passwordリソースを利用して、実行時に毎回新しいパスワードを生成して、DBに設定するようなコードにしておきます。
https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password

  • ⑤ 業務利用開始

あとは作成したDNS、ユーザー情報でアクセスすればOKです!

これで、DBへ接続権限のある利用者だけがphpMyAdminを起動して利用できる状況としました。
加えて万が一接続パスワードが漏れた場合にも、次に使うときには新しいパスワードに置き換わるような仕組みとすることで、セキュリティ強化を図っています。

4.最後に

コンテナなのでEC2と比べて起動も早いですし、コード化しているため前述の「セキュリティを強固にすると運用コストが高くなる」課題も見事解決することができました!

SREは職種柄、直接ユーザーと接する機会は少ないですが、その分「ユーザーが快適に使える仕組み」を考え、整理していく機会は多いと感じます。
これからも、色々とチャレンジしていきたいですね!

今回は以上です。ありがとうございました!


\\『真のユーザーファーストでマーケットを創造する』仲間を募集中です!! //

919.jp