こんにちは、クイックSREチームのみっちーです!
弊社SREチームでは、インフラの安定稼働だけでなく、運用改善、セキュリティ強化など。ユーザーが快適に使える仕組みを考え、日々いろいろな改善を行っています。
今回は、そんな仕組みを考えていく中での取り組み事例を1つ、ご紹介したいと思います。
目次
1.前置き(課題について)
セキュリティを強固にすると運用コストが高くなる
弊社では、主にデータ分析のためにエンジニア以外もDBを触る機会があります。
そのため利便性の面からphpMyAdminを採用し、接続ユーザー/パスワードは共通のものをみんなで利用する運用を行っていました。
これだと確かに利便性は向上しますが、
ユーザー/パスワードを使いまわす運用にしているので、流出した際にセキュリティリスクが大きい状態でした。
加えてphpMyAdminでは、標準で操作ログの追跡が困難です。この点も、リスク管理という点で課題となっていました。
2.検討したこと
「利用者ごとにユーザー/パスワードを発行する」
これを解決する手段の1つとして「利用者ごとにユーザー/パスワードを発行する」案が持ち上がりましたが、実際の運用を想定すると以下のような課題があり、なかなか導入に踏み切れませんでした。
- 必要な処理をすべて自動化できないと運用コストが高い
- そもそも、必要な処理をすべて自動化できるノウハウがなかった
構成管理ツール「Terraform」とコンテナを利用して、必要な処理をすべて自動化する
最近弊社内の案件においては、DB(RDS)をはじめとする各種インフラリソースはTerraformでコード管理する機会も増えており、ノウハウも少しずつ蓄積されていた状況でした。
そんな中、SREチーム内での雑談中に「それらのコードを組み合わせることで、本件の課題解決できないか?」という話が持ち上がりました。
3.こうしてみた
以下のような構成であれば課題解決できそうということで、早速やってみました!
「phpMyAdminコンテナ」 + 「AWS ECS」 + 「AWS Route53」 + 「Terraform」 + 「Jenkins」
動作イメージとしては以下の通りです。
- ① phpMyAdmin起動ジョブ実行
運用を想定し、Jenkinsのジョブとして起動できるような仕組みにします。
このとき、Jenkinsの権限管理プラグイン(Role-based Authorization Strategy)も併せてインストールして、ジョブ実行可能ユーザーを制限します。
Jenkinsジョブの中で実際に呼び出すコードは、以下のような仕組みとしました。
② phpMyAdminコンテナ & ELB起動して紐づけ
③ phpMyAdmin用DNS(例:https://pma.919.com) を追加
④ レコード値をELBへ向ける
まず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は職種柄、直接ユーザーと接する機会は少ないですが、その分「ユーザーが快適に使える仕組み」を考え、整理していく機会は多いと感じます。
これからも、色々とチャレンジしていきたいですね!
今回は以上です。ありがとうございました!
\\『真のユーザーファーストでマーケットを創造する』仲間を募集中です!! //