Slide 1

Slide 1 text

生成AI×マルチテナントSaaSな 新規事業を立ち上げる上で テックリードとして気を使った点の紹 介 id:lunastera / @lunastera 2024/10/24 はてな 生成AI×新規事業 の挑戦 1

Slide 2

Slide 2 text

自己紹介 id: lunastera (ERA) 2 2021 入社 はてなブックマークチーム 2023 はてなブックマークチーム テックリード 2024 新規事業チーム テックリード

Slide 3

Slide 3 text

toitta ● インタビューデータの解析 ● マルチテナントSaaS 最も気をつけるべきことは… 3

Slide 4

Slide 4 text

4 データの取り扱い

Slide 5

Slide 5 text

絶対に避けたいリスク ● 顧客のデータが流出 ● 他の顧客のデータが見えてしまう … etc ● センシティブな個人情報を取り扱うので… 5

Slide 6

Slide 6 text

6 具体的な対策

Slide 7

Slide 7 text

具体的な対策 ● エンジニア × 法務 ● マルチテナントにおけるデータの分離 ● 署名付きCookieによるアクセス制限 ● その他の取り組み 7

Slide 8

Slide 8 text

8 エンジニア × 法務

Slide 9

Slide 9 text

エンジニア × 法務 ● 「誰かが気をつける」ではなく、 「全員気をつける」 ● コンプライアンス研修はもちろん ● ログにおける「個人情報となりうるデータ」 ● 法務ドキュメント読み合わせ会、等 9

Slide 10

Slide 10 text

生成AI関連 ● 処理フローの公式ドキュメント等を確認して学習され ない保証を得る ○ Data, privacy, and security for Azure OpenAI Service - Azure AI services | Microsoft Learn ● あるいは我々が遵守しなければならないことの確認等 ○ Code of Conduct for Microsoft Generative AI Services | Microsoft Learn 10

Slide 11

Slide 11 text

11 マルチテナントにおける データの分離

Slide 12

Slide 12 text

マルチテナント ● 他の顧客データが見えないように ○ DBを分ける、インスタンスを分ける等 ● 今回はPostgreSQL + Row Level Security(RLS) を採用 12

Slide 13

Slide 13 text

Row Level Security(RLS) ● テーブルの行へのアクセスを制限する機能 ● RLSが有効になっていると、条件を満たさな い限りデータの操作を制限する ● 例えばWHERE句忘れによる事故を防ぐ  今回は原則全てのテーブルに付与することに 13

Slide 14

Slide 14 text

Row Level Security(RLS)の例 ALTER TABLE tenant ENABLE ROW LEVEL SECURITY; CREATE POLICY tenant_isolation ON tenant USING ("id" = current_setting('tenant_id', TRUE)); 14

Slide 15

Slide 15 text

Row Level Security(RLS)の例 ALTER TABLE tenant ENABLE ROW LEVEL SECURITY; CREATE POLICY tenant_isolation ON tenant USING ("id" = current_setting('tenant_id', TRUE)); 15 1行目でRow Level Securityを使うことを宣言

Slide 16

Slide 16 text

Row Level Security(RLS)の例 ALTER TABLE tenant ENABLE ROW LEVEL SECURITY; CREATE POLICY tenant_isolation ON tenant USING ("id" = current_setting('tenant_id', TRUE)); 16 2行目でセキュリティポリシーを設定。 set_config によって ’tenant_id’ を設定し、 それが tenant.id カラムと一致しなければ操作できない (SELECT, INSERT, UPDATE, DELETE)

Slide 17

Slide 17 text

usersテーブルへのRLS ● usersにテナントレベルのRLSをどうかけるか ○ usersにtenant_idカラムをもたせる? ■ usersは複数のテナントに所属できたいのでデータの持ち方 が難しい! ■ PostgreSQLにはArrayがあるけど扱いづらい! ○ だからといってRLSをかけないのだけはやめたい! → 複数テーブルをまたいだRLSを定義 17

Slide 18

Slide 18 text

Row Level Security(RLS)の例 CREATE POLICY tenant_isolation ON users USING (users.id IN ( SELECT tm.user_id FROM tenant_membership AS tm WHERE tm.tenant_id = current_setting('tenant_id', TRUE)::TEXT )); 18

Slide 19

Slide 19 text

Row Level Security(RLS)の例 CREATE POLICY tenant_isolation ON users USING (users.id IN ( SELECT tm.user_id FROM tenant_membership AS tm WHERE tm.tenant_id = current_setting('tenant_id', TRUE)::TEXT )); 19 tenant_membership の tenant_id カラムと set_config された ‘tenant_id’ が一致するレコードの user_id を引く

Slide 20

Slide 20 text

Row Level Security(RLS)の例 CREATE POLICY tenant_isolation ON users USING (users.id IN ( SELECT tm.user_id FROM tenant_membership AS tm WHERE tm.tenant_id = current_setting('tenant_id', TRUE)::TEXT )); 20 引いてきた user_id と一致する users レコードだけが引ける

Slide 21

Slide 21 text

21 署名付きCookieによる アクセス制限

Slide 22

Slide 22 text

署名付きCookieによるセキュアな動画配 信 ● 社内の実験利用のタイミングでは (制限時間付き)署名付きURLによる動画配信を行っていた ○ 制限時間内に動画のストリーミングURLさえわかれば 誰でも見れてしまう! ● -> 署名付きCookieによる配信 ○ 署名付き URL と署名付き Cookie の概要 | Cloud CDN | Google Cloud 22

Slide 23

Slide 23 text

署名付きCookie インタビューページにアク セスした際、内部APIにア クセス。 そのユーザーに閲覧権限が あれば、該当インタビュー の動画ファイルへのアクセ ス権を付与する。 23

Slide 24

Slide 24 text

24 その他の取り組み

Slide 25

Slide 25 text

その他セキュリティに関する取り組み ● 社内セキュリティレビュー ● 外部からの脆弱性診断 ● 各社セキュリティチェックシート ● …etc 25

Slide 26

Slide 26 text

今後のtoitta ● セキュリティ面は今後も強化していく ● 直近ではSAMLへの対応 ○ 意図しないユーザーがアクセスする可能性を減らす ● データの取り扱いに関する定期確認会 26