SlideShare a Scribd company logo
JJUG CCC 2021 Spring
PostgreSQLの行レベルセキュリティと
SpringAOPでマルチテナントの
ユーザー間情報漏洩を防止する
2021.5.23
松岡 幸一郎 (@little_hand_s)
1
自己紹介
2
● 資料作成・発表:
松岡 幸一郎 (@little_hand_s)
株式会社ログラス
DDD community jp、Agile Developers Community主催
DDD周りの話をするブログ
「ドメイン駆動設計 モデリング/実装ガイド」執筆
● 資料作成:
飯田 意己 (@ysk_118)
株式会社ログラス
一般社団法人アジャイルチームを支える会理事
SCRUM BOOT CAMP THE BOOK【増補改訂版】 コラムニスト
今日お話しすること
3
今日お話しすること
4
● Webサービスにおいて、お客様間の情報漏洩を防止する必要性
● 機械的に防止する方法
○ 基本方針
○ 実際に突き当たった問題と解決方法
経営にまつわる数値を集約し、

意思決定を支援する経営管理SaaS

ログラスとはどんなサービスか
5
会計ソフト
その他
数値管理ツール
上場企業含む、規模の大きなお客様の経営数値をお預かりしています
6
伸びてます!!
7
● 受賞歴
○ Incubate Camp 13th 総合優勝 (473社中1位)
○ ICC KYOTO 2020 総合3位
と言うのは置いといて
8
● 超重要な数値を扱っている
○ 上場企業の経営数値
重要なポイント
9
→ 情報漏洩、即、死
● マルチテナント・単一DB構成
● テナント=お客様の企業
○ テナントごとに複数ユーザーが存在する
システム構成
10
データベース
テナント1
アプリケーション
テナント2 テナント3
● 異なるテナント間で情報が参照できないことを
アプリケーションで担保する必要がある
システム構成 -必要な制御
11
データベース
お客様Aの
データ
お客様A
アプリケーション
お客様B お客様C
ユースケース層
● オニオンアーキテクチャの構成
● Kotlin + Spring + jOOQ(ORMapper)
アプリケーションアーキテクチャ
12
プレゼン
テーション層
インフラ層
ドメイン層
(Interface)
UserRepository
(Class)
JooqUserRepository
● DBアクセスはインフラ層のリポジトリクラスで実装される
アプリケーションにおける制御
● 全てのテーブルにテナントIDがカラムが存在
● 毎回引数でテナントIDを渡し、SQL実行時忘れずにWhere句に渡している
● 全てのテーブルにテナントIDがカラムが存在
● 毎回引数でテナントIDを渡し、SQL実行時忘れずにWhere句に渡している
● 参照系で絞り込みを忘れると、
他テナントの情報が表示されて情報漏洩になる
アプリケーションにおける制御
アクティブな
お客様Aのユーザー
(Class)
JooqUserRepository
お客様A
テナントID1
SELECT *
FROM users
WHERE user_status = 'ACTIVE'
AND tenant_id = ‘1’
例:アクティブなユーザーを検索する処理
● 全てのテーブルにテナントIDがカラムが存在
● 毎回引数でテナントIDを渡し、SQL実行時忘れずにWhere句に渡している
● 参照系で絞り込みを忘れると、
他テナントの情報が表示されて情報漏洩になる
例:アクティブなユーザーを検索する処理
アクティブな
お客様Aのユーザー
アプリケーションにおける制御
お客様A
テナントID1
(Class)
JooqUserRepository
アクティブな
お客様Bのユーザー
SELECT *
FROM users
WHERE user_status = 'ACTIVE'
AND tenant_id = ‘1’
● 2つの「絞り込み忘れ」
絞り込み忘れのリスク
○ テナントIDをメソッド引数として渡し忘れる可能性
○ メソッド引数として渡してもクエリにセットし忘れる可能性
16
「気を付ける」アプローチの限界
17
● 「実装時&コードレビュー時に気を付ける」は100%ではない
● 人が増えたときにレビュー観点を継承していくことは難しい
● 静的解析でも、パラメーターの渡し漏れは検知できない
PostgreSQLには
行レベルセキュリティ
(RLS: Row Level Security)
という機能があるらしい
18
● DBセッション(=コネクション)ごとにアクセスできるデータを行単位で
制限できる機能
行レベルセキュリティ(RLS)とは
19
DBセッション
(テナント1のみア
クセス可能)
テナント1データ
テーブル
テナント1データ
テナント2データ
テナント2データ
テナント3データ
DBセッション
(テナント2のみア
クセス可能)
● 方針②: ロール(≒ユーザー)で制御する方法
○ ロールごとにアクセス範囲を設定し、
セッションごとに異なるロールを使用する
● 方針①: セッション変数で制御する方法
○ 共通のセッションで、
実行時にセッション変数をセットしてアクセス範囲を設定
DBセッション
(共通ロール)
セッション変数でテナントID=1をセット
→ テナントID1データのみアクセス可能
DBセッション
(テナントID1に
アクセスできるロール )
RLSの実装方針
DBセッション
(テナントID2に
アクセスできるロール )
セッション変数でテナントID=2をセット
→ テナントID2データのみアクセス可能
● Webアプリケーションでは、DBセッションは
コネクションプーリングの仕組みが管理する
コネクションプール
RLSの実装方針
DB
DBセッション
DBセッション
DBセッション
①アプリケーション起動時に一定数のコネクショ
ン(=セッション)を作成し、プールする
②リクエストごとに、
 プールからコネクションが払い出される
リクエスト
リクエスト
リクエスト
リクエスト
● コネクションをプールすることで、コネクション確立にかかる時間を削減
● 方針②: ロールで制御する方法では、
テナント数=ロール数=セッション数が必要
コネクションプール
RLSの実装方針
DB
:
● テナントの数だけセッションをプールすることは、
DB側の最大接続数を超えるため難しい
→「方針①: セッション変数で制御する方法」を採用する
テナント3用
DBセッション
テナント2用
DBセッション
テナント1用
DBセッション
③ロールの作成
アプリケーションからは権限の弱い
ロールでアクセスさせる
権限の弱いロール
(RLSの影響を受ける)
RLS設定全体像
23
テーブル
②テーブルごとに
アクセス制限するPolicyの設定
①テーブルごとに
Row Level Securityを有効化
権限の強いロール
(RLSの影響を受けない)
DBマイグレーションは
権限の強いロールで行う
RLS設定
Policy
● ②テーブルごとにアクセス制限するPolicyの設定
● ①テーブルごとにRow Level Securityを有効化
ALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
やってみた:RLS設定のクエリ
24
create role appuser login password 'xxxxxxx';
alter default privileges for role appuser in schema public
grant select, insert, update, delete on tables to appuser;
CREATE POLICY tenant_isolation_policy ON tenants
USING (tenant_id = current_setting('app.current_tenant'));
● ③ロールの作成
アプリケーションからは権限の弱いロールでアクセスさせる
(AppendixにRole設定時の注意あり) 
● DBアクセスする前にセッション変数を設定
○ セッション変数をSETクエリで設定
○ テナントIDは認証の仕組みから取得
やってみた : アプリケーションの実装
25
fun permitByTenantId(tenantId: ID<Tenant>) {
jooq.execute("SET app.current_tenant = '${tenantId.value}'")
}
● 以下を確認できた
○ 設定するセッション変数を変更すると、
アクセスできるデータが変わる
○ ログイン情報から取得したテナントIDを使って
期待通りのデータが取得できる
検証結果
26
行レベルセキュリティ、使えそう!
27
だが、本当の戦いはここからだった…!
28
ここから、
発生した課題と解決方法を
順に説明していきます
29
● エンドポイントごとにセッション変数のセットを手動実装すると、
漏れるリスクがある
● 結局、実装しているかをレビューで目視確認しないといけない
導入における課題
30
● パターン②本当はデータがあるのに「データなし」レスポンスで正常終了
● パターン①データが取れる想定の処理の後続で例外発生
セッション変数のセットを忘れるとどうなるか
31
②RLSアクセス許可
できていない状態
なので、0件が返される
③結果0件で正常終了
(正しい挙動ではない!!)
①通常なら
結果が返る条件で
リクエスト
UseCase Repository
Client
→ パターン②はアラートで気づけないので、非常に困る
適用時に重要なポイント
32
個別の開発時に意識せず、
自動的に機能が働く仕組みが必要不可欠
最初のアプローチ
33
● AOP(Aspect Oriented Programming)
○ アスペクト指向プログラミングと呼ばれ、
クラス呼び出し以外の形で、特定の条件を満たした時に処理を呼び出せる
○ 例外処理やロギングなど処理など、
横断的・暗黙的な処理に向いている
AOPの検討
34
○ その特性が今回の用途にあっていると判断した
● AOPで、リポジトリクラスのメソッドを呼び出すごとに
セッション変数SETクエリを実行
アプローチ①概要
35
(Interface)
UserRepository
(Class)
JooqUserRepository
ユースケース層
プレゼン
テーション層
インフラ層
ドメイン層
● 実行時変数のsetクエリが複数回呼ばれて、レイテンシが悪化
○ setクエリの99%タイルレイテンシが82msec
○ 集計結果を表示するエンドポイントでは1リクエストで
複数テーブルアクセスがあるため、体感できるレベルで悪化
→SETクエリの回数は最低限にしないと
レイテンシがアプリケーション全体で問題になる
● 正常に動作した!
アプローチ①結果
36
● が、処理が明らかに遅くなった!
● 全コントローラーの入り口で実行
○ AOPで 「@RestControllerがついているクラス実行直前」を指定
アプローチ②概要
37
XxxController
ユースケース層
プレゼン
テーション層
インフラ層
ドメイン層
● 「@RestControllerがついているクラス実行直前」を指定する
AOP記述
アプローチ②概要
38
AuthInfoProviderは認証情報から
テナントIDを取得するクラス
RlsAccessPermitterは内部で
SETクエリを実行するクラス
● 画面経由で動作確認できた!
● 必ずリクエストごとに1回だけ実行される!効率的!
アプローチ②結果
39
● ところが・・・
○ 「たまに」処理が失敗して、エラーログが発生する
○ 処理が成功するケースも多いのに、なぜ?
● postgresqlログを調査
● コネクションプーリングの仕組みにより、
1リクエストのなかでDBアクセスのコネクションが変更されることがあった
アプローチ②課題
40
Controllerで
テナントID1にアクセスできるよ
うSETクエリ実行
UseCase
RepositoryA
Controller
テナント1の
リクエスト
テナント1にアクセスできる
DBセッション
● コネクションが変わると、DBのセッションも別のものになる
● SETクエリは、DBセッションに対して有効になるので、
DBセッションが変わるとRLS制御されたテーブルにアクセスできなくなる
別のDBセッション
● postgresqlログを調査
● コネクションプーリングの仕組みにより、
1リクエストのなかでDBアクセスのコネクションが変更されることがあった
アプローチ②課題
41
Controllerで
テナントID1にアクセスできるよ
うSETクエリ実行
RepositoryB
UseCase
RepositoryA
Controller
テナント1の
リクエスト
テナント1にアクセスできる
DBセッション
● トランザクションを張ると、begin, commit, rollbackするために
トランザクション内では同じDBセッションが使われる
○ postgresqlのログで確認できた
アプローチ②課題への対策
→ トランザクションを張るタイミングで
セッション変数SETクエリを実行する方針とした
42
● @Transactionalがついたクラス内のメソッドが呼ばれる時にSETクエリを実行
○ AOPで「@Transactionalがついたクラス実行直前」と指定
アプローチ③概要
43
UseCaseクラスに
@Transactional ユースケース層
プレゼン
テーション層
インフラ層
ドメイン層
アプローチ③概要
44
● 「@Transactionalがついたクラス実行直前」を指定するAOP記述
● 実行クエリも
SET app.current_tenant = '${tenantId.value}'
から
SET local app.current_tenant = '${tenantId.value}'
と変更
アプローチ③概要
45
→ 変数のスコープがトランザクション内になったので安心
● 動いた!!
アプローチ③結果
46
● でも・・
○ また、特定のエンドポイントで動かない・・・
アプローチ③結果
47
● そのクラスは、@Transactionalを「メソッドに」つけていた
○ @Transactionalはクラスでもメソッドでも動く
○ 実装は両パターン存在していた
● @Transactionalがついたクラス・メソッドが呼ばれる時にSETクエリを実行
○ AOP記述を2パターン定義
アプローチ④概要
48
● 動いた!!
アプローチ④結果
49
● でも・・
また、また特定のエンドポイントで動かない・・・!
アプローチ④課題
50
● @Transactionalをつけていないエンドポイントがあった
● トランザクションを張らなくても実行はできてしまうので、
張らなくても気づけない
● 「トランザクションが張られていなかったら例外を投げる」
というチェック処理をリポジトリ用のアノテーションとして定義
アプローチ⑤概要 -AOP部分
51
51
JooqUserRepositoryに
専用の独自アノテーション付与
ユースケース層
プレゼン
テーション層
インフラ層
ドメイン層
● AOPでトランザクション有無チェック処理を呼び出し
● 通常DIさせたいクラスに付与する @Componentを継承したアノテーション
として実装
付与する独自アノテーション
52
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
@Component
annotation class RequireTransactionComponent
アプローチ⑤概要 -AOP部分
53
● 「@RequireTransactionComponentがついたクラス実行直前」というAOP記述
アプローチ⑤概要 -トランザクションのチェック部分
● TransactionManagerでトランザクション取得
● isNewTransactioがtrueであればそのタイミングでトランザクション開始された
= チェック開始時にトランザクションがなかったと判断して例外を投げる
54
● このチェックはDBアクセスせずに行われ、
10msec以下で完了することを確認
アプローチ⑤概要 -トランザクションのチェック
55
● この処理は1リクエストで何度も呼ばれても問題にならない
● やったね!
● あ、でも、まだちょっと懸念が・・・
56
まだあんのかい
57
もうちっとだけ続くんじゃ
● RLSとの戦いはこんな感じの繰り返しでした
● あと2個だけあります
58
→ 意図せずトランザクションのチェックが効かなくなる
残ったリスク①概要
● リポジトリ実装クラスに異なるアノテーションを張ってしまう可能性がある
● @RequireTransactionComponentではなく
通常の@Componentを付与しても動作してしまう
JooqUserRepositoryに
@RequireTransactionComponent
ではなく
@Component付与
59
ユースケース層
プレゼン
テーション層
インフラ層
ドメイン層
残ったリスク①対策
60
● ArchUnitでチェック
○ パッケージ、クラス、アノテーションなどの依存関係を
テストするライブラリ
● 「リポジトリを配置するパッケージにあるクラスで、  
@RequireTransactionComponentがついていなかったらfail」
というテストを実装
ArchUnitドキュメントより
● 新規テーブル追加時にRLSの設定を忘れてしまうリスク
● RLS設定はテーブル単位なので、
新規テーブルに忘れず設定しなければ有効にならない
● 有効になっていなくても気付くきっかけがない
残ったリスク②概要
61
残ったリスク②対策
● 自動テスト(JUnit)で、
「”対象外テーブル”以外でRLS設定されてなったらfail」というテストを実装
62
RLS除外対象テーブルを定義し、テストコー
ドでここに埋める。
1件以上値が帰ってきたらFailとする。
ついに完成!!
63
● 新規テーブル追加時にはRLS設定を行う
○ 忘れた場合、自動テストがfailするので気付ける
● エンドポイント実装時には以下2つを守ればOK
○ ユースケースクラスには@Transactionalを付与する
○ リポジトリ実装クラスには@RequireTransactionComponentを付与する
● アノテーションの付与はRLS関係なく行うので、違和感なく実装できる
● 付与しなければ例外が発生するので気付ける
実施内容まとめ
64
● これで、「うっかり忘れ」を機械的に防げるようになった!!
リリース戦略
65
● リリースをどのように行うか
● 影響範囲が大きい(DBアクセスする全エンドポイント)ので、
安全にリリースしていく
リリース戦略:段階的にリリース
66
● ①1テーブルのみ対象にしてリリースして、問題ないことを確認
○ 検証環境リリースの段階で、いろいろな問題が発生&対処
○ 全てクリアしてから、本番リリース
→ここまでくれば勝ち!!
● ②あとは念のためにテーブルを機能群ごとに何度かに分けてリリース
■ 実際は2回に分けました
● RLSのpolicyの制御で、テナントIDで絞り込みが行われる
○ explainを取ったところ、
テナントIDを含んだインデックススキャンになっていた
● 計測したが、大きなパフォーマンス劣化は観測されなかった
リリース後の影響
67
● RLS導入前からテナントIDは毎回検索条件に含めており、
インデックスが張られていたため大きな影響がなかったと思われる
● 「どう転んでもテナント間情報流出がない」という圧倒的安心感!
○ 実装がアノテーション付与だけで簡単、忘れたら気付けるので安心
○ レビュー時に目を皿にしてみなくてよくなった
導入後の感想
68
まとめ
69
● 人間はミスするもの、ミスを見越して機械的アプローチを!
○ 同じような課題を抱えているチームは多いはず、参考になれば幸いです
ご静聴ありがとうございました
70
sli.do回答タイム
71
Appendix
72
Postgres側の設定の注意点
● テーブル所有者(マイグレーション実行ロール)から、アプリケーション接続ロールに対し
てデフォルト権限を付与する
○ これをしないとテーブル追加時に毎回アプリケーション接続ロールにGRANTが必
要になってしまう
○ ALTER DEFAULT PRIVILEGES FOR ROLE マイグレーションロール IN SCHEMA PUBLIC
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO アプリケーション接続ロール
● ポリシー設定でSELECT権限のみの設定でもINSERT … RETURNINGコマンドなどに影
響が出る
73
https://www.postgresql.jp/document/12/html/sql-createpolicy.html

More Related Content

What's hot (20)

マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
Samir Hammoudi
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Amazon Web Services Japan
 
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal
Toru Makabe
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
Shingo Fukui
 
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門
Yuki Morishita
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
Samir Hammoudi
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Amazon Web Services Japan
 
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal
Toru Makabe
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
Shingo Fukui
 
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門
Yuki Morishita
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano
 

Similar to PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring) (20)

セキュアプログラミング講座
セキュアプログラミング講座セキュアプログラミング講座
セキュアプログラミング講座
minoru-ito
 
20080521-Ruby-on-Rails-Security
20080521-Ruby-on-Rails-Security20080521-Ruby-on-Rails-Security
20080521-Ruby-on-Rails-Security
Koji SHIMADA
 
20170408 securiy-planning
20170408 securiy-planning20170408 securiy-planning
20170408 securiy-planning
hogehuga
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
Hiroshi Tokumaru
 
C27 基幹領域への適用におけるpostgre sqlの抱える課題 by 原嘉彦
C27 基幹領域への適用におけるpostgre sqlの抱える課題 by 原嘉彦C27 基幹領域への適用におけるpostgre sqlの抱える課題 by 原嘉彦
C27 基幹領域への適用におけるpostgre sqlの抱える課題 by 原嘉彦
Insight Technology, Inc.
 
Security JAWS AWS reInvent 2022 Security reCap 20230228
Security JAWS AWS reInvent 2022 Security reCap 20230228Security JAWS AWS reInvent 2022 Security reCap 20230228
Security JAWS AWS reInvent 2022 Security reCap 20230228
Hayato Kiriyama
 
PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)
PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)
PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)
NTT DATA Technology & Innovation
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方
Chihiro Ito
 
ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎
Takahisa Kishiya
 
データベースセキュリティ
データベースセキュリティデータベースセキュリティ
データベースセキュリティ
Yasuo Ohgaki
 
AWS Well-Architected Tool 活用術セミナー セキュリティ編
AWS Well-Architected Tool 活用術セミナー セキュリティ編AWS Well-Architected Tool 活用術セミナー セキュリティ編
AWS Well-Architected Tool 活用術セミナー セキュリティ編
Nobuhiro Nakayama
 
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
Insight Technology, Inc.
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
Yoshiyuki Asaba
 
Postgre SQL security_20170412
Postgre SQL security_20170412Postgre SQL security_20170412
Postgre SQL security_20170412
Kazuki Omo
 
AWSの共有責任モデル(shared responsibility model)
AWSの共有責任モデル(shared responsibility model)AWSの共有責任モデル(shared responsibility model)
AWSの共有責任モデル(shared responsibility model)
Akio Katayama
 
#qpstudy 2016.07 第一部 基礎知識編 「ご認証は認可ですか?」
#qpstudy 2016.07  第一部 基礎知識編 「ご認証は認可ですか?」#qpstudy 2016.07  第一部 基礎知識編 「ご認証は認可ですか?」
#qpstudy 2016.07 第一部 基礎知識編 「ご認証は認可ですか?」
Masahiro NAKAYAMA
 
NGINXでの認可について考える
NGINXでの認可について考えるNGINXでの認可について考える
NGINXでの認可について考える
Hitachi, Ltd. OSS Solution Center.
 
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Takuya Iwatsuka
 
セキュアプログラミング講座
セキュアプログラミング講座セキュアプログラミング講座
セキュアプログラミング講座
minoru-ito
 
20080521-Ruby-on-Rails-Security
20080521-Ruby-on-Rails-Security20080521-Ruby-on-Rails-Security
20080521-Ruby-on-Rails-Security
Koji SHIMADA
 
20170408 securiy-planning
20170408 securiy-planning20170408 securiy-planning
20170408 securiy-planning
hogehuga
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
Hiroshi Tokumaru
 
C27 基幹領域への適用におけるpostgre sqlの抱える課題 by 原嘉彦
C27 基幹領域への適用におけるpostgre sqlの抱える課題 by 原嘉彦C27 基幹領域への適用におけるpostgre sqlの抱える課題 by 原嘉彦
C27 基幹領域への適用におけるpostgre sqlの抱える課題 by 原嘉彦
Insight Technology, Inc.
 
Security JAWS AWS reInvent 2022 Security reCap 20230228
Security JAWS AWS reInvent 2022 Security reCap 20230228Security JAWS AWS reInvent 2022 Security reCap 20230228
Security JAWS AWS reInvent 2022 Security reCap 20230228
Hayato Kiriyama
 
PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)
PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)
PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)
NTT DATA Technology & Innovation
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方
Chihiro Ito
 
ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎
Takahisa Kishiya
 
データベースセキュリティ
データベースセキュリティデータベースセキュリティ
データベースセキュリティ
Yasuo Ohgaki
 
AWS Well-Architected Tool 活用術セミナー セキュリティ編
AWS Well-Architected Tool 活用術セミナー セキュリティ編AWS Well-Architected Tool 活用術セミナー セキュリティ編
AWS Well-Architected Tool 活用術セミナー セキュリティ編
Nobuhiro Nakayama
 
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
Insight Technology, Inc.
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
Yoshiyuki Asaba
 
Postgre SQL security_20170412
Postgre SQL security_20170412Postgre SQL security_20170412
Postgre SQL security_20170412
Kazuki Omo
 
AWSの共有責任モデル(shared responsibility model)
AWSの共有責任モデル(shared responsibility model)AWSの共有責任モデル(shared responsibility model)
AWSの共有責任モデル(shared responsibility model)
Akio Katayama
 
#qpstudy 2016.07 第一部 基礎知識編 「ご認証は認可ですか?」
#qpstudy 2016.07  第一部 基礎知識編 「ご認証は認可ですか?」#qpstudy 2016.07  第一部 基礎知識編 「ご認証は認可ですか?」
#qpstudy 2016.07 第一部 基礎知識編 「ご認証は認可ですか?」
Masahiro NAKAYAMA
 
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
Takuya Iwatsuka
 
Ad

More from Koichiro Matsuoka (9)

ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
Koichiro Matsuoka
 
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Koichiro Matsuoka
 
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Koichiro Matsuoka
 
ベロシティを上手く使って 技術的負債を計画的に解消する
ベロシティを上手く使って 技術的負債を計画的に解消するベロシティを上手く使って 技術的負債を計画的に解消する
ベロシティを上手く使って 技術的負債を計画的に解消する
Koichiro Matsuoka
 
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
Koichiro Matsuoka
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
 
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くかDDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
Koichiro Matsuoka
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
 
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
Koichiro Matsuoka
 
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
Koichiro Matsuoka
 
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Koichiro Matsuoka
 
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Koichiro Matsuoka
 
ベロシティを上手く使って 技術的負債を計画的に解消する
ベロシティを上手く使って 技術的負債を計画的に解消するベロシティを上手く使って 技術的負債を計画的に解消する
ベロシティを上手く使って 技術的負債を計画的に解消する
Koichiro Matsuoka
 
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
Koichiro Matsuoka
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
 
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くかDDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
Koichiro Matsuoka
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
 
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
Koichiro Matsuoka
 
Ad

PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)