はじめに
みなさんは、DBユーザーの管理をどのように行っているでしょうか。
Create UserやGrantなどの生のSQL文をそのまま管理していたり、何かしらのツールを使って管理しているのではないでしょうか。
弊社では今まではgratanというツールを使って管理してましたが、昨年にHashiCorp Vaultを使った管理に移行しました。
背景と課題
チャットサービスならではの要件
「Chatwork」ではチャットという特性上、秘匿情報を持ったDBテーブルが多く存在します。
そのため、各エンジニアは秘匿情報にアクセスできないようにカラムレベルで権限制御を行っています。
また、監査という観点からもAuditログをしっかりと記録する必要があるため、エンジニア単位でDBユーザーを作成する必要があります。
(ここまで細かくユーザーや権限を管理しているところは意外と珍しいのではないでしょうか)
既存の管理方法と課題
エンジニア単位での管理は、エンジニアの増加に伴い管理コストも上がっていくため、
先程も紹介したgratanというツールを使ってIaC化して管理をしていました。
ただし、ユーザー作成には強い権限が必要な関係から、CI上での実行などが実現できておらず、トイルとなっていました。
また、gratan自体にもいくつか課題がありました。
gratanの課題
- ユーザー作成(権限付与)時の問題点
- 毎回ユーザー毎に
FLUSH PRIVILEGESを実行していた- ユーザー数が多いとDBへの負荷が上昇してしまう
- 本来は
Grant文でのユーザー作成、権限付与の場合にはFLUSH PRIVILEGESは不要
- 回避策として、dry-runで生成されたSQLから
FLUSH PRIVILEGESを除いて実行する運用になっていた
- 毎回ユーザー毎に
- MySQL8.0以降への対応
- MySQL8.0以降では
Create Userでのユーザー作成が必須 - gratanはアーカイブ化されており更新されていない
- Aurora MySQL V3(MySQL8.0互換)への移行時に利用不可
- MySQL8.0以降では
これらの理由から、gratanをやめて別のツールや仕組みに移行することを決断しました。
続きを読む