53
PostgreSQL カンファレンス 2015 Lightning Talk ぬこ@横浜 (@nuko_yokohama)

Pg con jp-20151127-lt-ogre-of-hook--published

Embed Size (px)

Citation preview

Page 1: Pg con jp-20151127-lt-ogre-of-hook--published

PostgreSQL カンファレンス 2015Lightning Talk

ぬこ@横浜 (@nuko_yokohama)

Page 2: Pg con jp-20151127-lt-ogre-of-hook--published

PostgreSQL カンファレンス 2015Lightning Talk

フックの鬼

ぬこ@横浜 (@nuko_yokohama)

Page 3: Pg con jp-20151127-lt-ogre-of-hook--published

3

自己紹介

ぬこ@横浜でググると何かしら出てくると思います

今日は呼ばれもしないのにこちらへ来ましたw

Page 4: Pg con jp-20151127-lt-ogre-of-hook--published

4

PostgreSQL 9.5 リリース楽しみですね!

でも今日は別のお話を

Page 5: Pg con jp-20151127-lt-ogre-of-hook--published

5

フック フックフック フックフックの鬼だフックの鬼だ

「フックの鬼」作詞:ぬこ

Page 6: Pg con jp-20151127-lt-ogre-of-hook--published

6

HOOK 拡張って?

Page 7: Pg con jp-20151127-lt-ogre-of-hook--published

7

HOOK で何ができる?

Page 8: Pg con jp-20151127-lt-ogre-of-hook--published

8

俺々 Logging が実装できる!(かもしれない)

Page 9: Pg con jp-20151127-lt-ogre-of-hook--published

9

俺々認証が実装できる!(かもしれない)

Page 10: Pg con jp-20151127-lt-ogre-of-hook--published

10

俺々 Planner が実装できる!(かもしれない)

Page 11: Pg con jp-20151127-lt-ogre-of-hook--published

11

俺々 Excutor が実装できる!(かもしれない)

Page 12: Pg con jp-20151127-lt-ogre-of-hook--published

12

可能性は無限大

Page 13: Pg con jp-20151127-lt-ogre-of-hook--published

13

PostgreSQL 9.5 で使えるHOOK は 37 種類 ( たぶん )

でも、 HOOK の情報ってPostgreSQL 文書にないよね

ソースから探すfind . -name "*.h" | xargs egrep -n "extern.*PGDLLIMPORT.*hook"

あと、 GUC 関連の HOOK もあるっぽい./src/include/utils/guc.h

Page 14: Pg con jp-20151127-lt-ogre-of-hook--published

14

PostgreSQL 9.5 の HOOK

check_password_hookClientAuthentication_hookemit_log_hookExecutorCheckPerms_hookExecutorEnd_hookExecutorFinish_hookExecutorRun_hookExecutorStart_hookExplainOneQuery_hookexplain_get_index_name_hookfmgr_hookget_attavgwidth_hookget_index_stats_hook

get_relation_info_hookget_relation_stats_hookjoin_search_hookneeds_fmgr_hookobject_access_hookplanner_hookpost_parse_analyze_hookProcessUtility_hookrow_security_policy_hook_permissiverow_security_policy_hook_restrictiveset_join_pathlist_hookset_rel_pathlist_hookshmem_startup_hook

Page 15: Pg con jp-20151127-lt-ogre-of-hook--published

15

PostgreSQL 9.5 の HOOK

GucBoolCheckHookGucIntCheckHookGucRealCheckHookGucStringCheckHookGucEnumCheckHook

GucBoolAssignHookGucIntAssignHookGucRealAssignHookGucStringAssignHookGucEnumAssignHook

GucShowHook

Page 16: Pg con jp-20151127-lt-ogre-of-hook--published

16

各 HOOK の説明時間がないので割愛

HOOK 名から・・・伝わって・・・ください・・・

Page 17: Pg con jp-20151127-lt-ogre-of-hook--published

17

HOOK を使った拡張の例

拡張内容と使われている HOOK から

察してください

Page 18: Pg con jp-20151127-lt-ogre-of-hook--published

18

HOOK を使った拡張の例contrib/passwordcheck

check_password_hook

contrib/pg_stat_statementsshmem_startup_hookpost_parse_analyze_hookExecutorStart_hookExecutorRun_hookExecutorFinish_hookExecutorEnd_hookProcessUtility_hook

パスワードのチェック!

統計情報の記録!

Page 19: Pg con jp-20151127-lt-ogre-of-hook--published

19

HOOK を使った拡張の例contrib/auto_explain

ExecutorStart_hookExecutorRun_hookExecutorFinish_hookExecutorEnd_hook

contrib/sepgsqlClientAuthentication_hookfmgr_hookExecutorCheckPerms_hookProcessUtility_hook

遅い SQL の実行計画を自動記録!

ラベルベースの強制アクセス制御!

Page 20: Pg con jp-20151127-lt-ogre-of-hook--published

20

HOOK を使った拡張の例pg_hint_plan

ProcessUtility_hookplanner_hookget_relation_info_hookjoin_search_hookshmem_startup_hookpost_parse_analyze_hookExecutorStart_hookExecutorRun_hookExecutorFinish_hookExecutorEnd_hook

実行計画の制御!

Page 21: Pg con jp-20151127-lt-ogre-of-hook--published

21

HOOK を使った拡張の例

pg_dbms_statsget_relation_info_hookget_attavgwidth_hookget_relation_stats_hookget_index_stats_hook

統計情報の固定化!

Page 22: Pg con jp-20151127-lt-ogre-of-hook--published

22

HOOK を使った拡張の例

sql_firewallshmem_startup_hookpost_parse_analyze_hookExecutorStart_hookExecutorRun_hookExecutorFinish_hookExecutorEnd_hookProcessUtility_hook

ルールによる SQL 実行抑止@snaga さんに聞いてね!!

Page 23: Pg con jp-20151127-lt-ogre-of-hook--published

23

HOOK を使った拡張の例pgaudit

ExecutorCheckPerms_hookProcessUtility_hookobject_access_hookExecutorStart_hook

jsonlogemit_log_hook

pg_panicplanner_hook

データベース監査!

サーバログの JSON 化!

確率的に PANIC を発生させる!

Page 24: Pg con jp-20151127-lt-ogre-of-hook--published

24

くやしいのでくやしいので俺も作ってみた俺も作ってみた

どれもみな、どれもみな、すばらしい拡張だ!すばらしい拡張だ!

Page 25: Pg con jp-20151127-lt-ogre-of-hook--published

25

pg_heartman

Page 26: Pg con jp-20151127-lt-ogre-of-hook--published

26

SQL コマンド種別別に軍曹殿の罵倒がロギングされる

LOG: pg_heartman: I am Gunnery Sergeant Hartman, your Senior Drill Instructor.・・・INFO: pg_heartman: I'll P.T. you until your assholes are sucking buttermilk.INFO: pg_heartman: I'm asking the fxxking questions here, Private. Do you understand?!INFO: pg_heartman: It looks to me like the best part of you ran down the crack of your mama's axx and ended up as a brown stain on the mattress! I think you've been cheated!INFO: pg_heartman: And my orders are to weed out all non-hackers who do not pack the gear to serve in my beloved Corps!INFO: pg_heartman: Was it you, you scroungy little fxxk, huh?!

INSERT, SELECT, UPDATE, DELETE,

DROP を発行したときの例

Page 27: Pg con jp-20151127-lt-ogre-of-hook--published

27

役にたたない役にたたない

Page 28: Pg con jp-20151127-lt-ogre-of-hook--published

28

もうちょっと真面目に作ろう

Page 29: Pg con jp-20151127-lt-ogre-of-hook--published

29

PostgreSQL 上級国民問題

http://to-a.ru/

Page 30: Pg con jp-20151127-lt-ogre-of-hook--published

30

上級国民 = スーパーユーザ

Page 31: Pg con jp-20151127-lt-ogre-of-hook--published

31

上級国民はなんでもできる!上級国民はなんでもできる!

データの不正な参照データの不正な参照テーブルの不正な変更テーブルの不正な変更スキーマの不正な変更スキーマの不正な変更設定の不正な変更設定の不正な変更

log_statment 設定もあっさり無効化!

Page 32: Pg con jp-20151127-lt-ogre-of-hook--published

32

                _,..---- 、 _               / ,r  ̄\ !!; へ              / 〃 /    、  ,   ;i              i,__ i  ‐ = ・ァ j,ir= ・゙ )              lk i.l   / ',! ゙ i \ i   一般国民よ立て!             ゙ i ヾ ,.    ,..- ニ _ /    悲しみを怒りに変えて、立てよ一般国民!               Y ト、  ト -:=┘i                 l   ! \__ j'.l               」 - ゝ r―‐==; 十 i        _,r--―― 、               . ト、 .j.! レ '  ̄三 ! >ー r‐r‐r‐ <  _,.r<" 「  l__ _ __      __ __,..r--r =ヾヽ j,r―'"≦ _ _  ̄ ̄ r―'" \\ \ r",.- 、 ,  \     ∧   ト -'‐'" 三へ>ト -‐'"~     ゙ i   /       \\ (_. 人 ヽ ._  ヽ     レ ' へ ._ ノ i  「 \ ゙ l   //./", 「 ̄/  /   /        ヽ - ゝ .  \   /     レ '/ / .l   l     ! ! i/./ ./   /    /   /          , (  \  ノハ     レ '/    .!   !    i  ゙ '!   ̄ ∠ ,   /   ヽ . _        , ター   '", 〈  !     / ゙ "   ,r'"   .l‐= ニ゙ , 「 l ! 「 ̄ !. / . /   ー =='         .l. ト、 .   -‐'"/!. ト ,   /   . ト -   ゙ー―┘ !└‐'='-‐"    ヽ ._/    、     トミ、 ̄ ̄ ._ ノノ li \

立てよ一般国民!

ということで、上級国民に対抗する HOOK 拡張を作ってみた

Page 33: Pg con jp-20151127-lt-ogre-of-hook--published

33

pg_sulog

https://github.com/nuko-yokohama/pg_sulog

http://to-a.ru/

Page 34: Pg con jp-20151127-lt-ogre-of-hook--published

34

sampledb=> SHOW log_statement; log_statement --------------- none(1 行 )

sampledb=> SELECT rolname, rolsuper FROM pg_roles ; rolname | rolsuper ----------+---------- postgres | t admin | t nuko | f(3 行 )

クエリのロギングは無効

上級国民(スーパーユーザ)と一般国民(一般ユーザ)

t はスーパユーザを示す

postgres と admin は上級国民nuko は一般国民

f は一般ユーザを示す

Page 35: Pg con jp-20151127-lt-ogre-of-hook--published

35

スーパーユーザ属性をもつユーザ操作のみを強制ロギング

$ psql sampledb -U postgres -t -c "SELECT 1";WARNING: pg_sulog: 2015-11-22 10:32:19 JST [logging] user=postgres SELECT 1 1

$ psql sampledb -U nuko -t -c "SELECT 2" 2

$ psql sampledb -U admin -t -c "SELECT 3"WARNING: pg_sulog: 2015-11-22 10:32:27 JST [logging] user=admin SELECT 3 3

$

WARNING: pg_sulog: 2015-11-22 10:32:19 JST [logging] user=postgres SELECT 1WARNING: pg_sulog: 2015-11-22 10:32:27 JST [logging] user=admin SELECT 3

スーパーユーザ

一般ユーザ

スーパーユーザ

サーバログにもスーパユーザ操作のみ書き込まれる

Page 36: Pg con jp-20151127-lt-ogre-of-hook--published

36

上級国民ロギングすべし慈悲はない

Page 37: Pg con jp-20151127-lt-ogre-of-hook--published

37

ついでにオプションで

Page 38: Pg con jp-20151127-lt-ogre-of-hook--published

38

スーパーユーザ操作をブロック

上級国民に ケンカをうるとは ...どこまでも たのしい ひとたちだ ...

# pg_sulog configurationshared_preload_libraries = pg_sulogpg_sulog.block = on # on/off

postgresql.conf

Page 39: Pg con jp-20151127-lt-ogre-of-hook--published

39

上級国民は ばらばらになった上級国民は ブロックされた

$ psql sampledb -U postgres -t -c "SELECT 1";WARNING: pg_sulog: 2015-11-22 10:34:37 JST [blocked] user=postgres SELECT 1SELECT 0$ psql sampledb -U nuko -t -c "SELECT 2" 2

$ psql sampledb -U admin -t -c "SELECT 3"WARNING: pg_sulog: 2015-11-22 10:34:44 JST [blocked] user=admin SELECT 3SELECT 0$

勿論、サーバログにも同じログが出る。WARNING: pg_sulog: 2015-11-22 10:34:37 JST [blocked] user=postgres SELECT 1WARNING: pg_sulog: 2015-11-22 10:34:44 JST [blocked] user=admin SELECT 3

Page 40: Pg con jp-20151127-lt-ogre-of-hook--published

40

DML も DDL も DCL もSET も ALTER SYSTEMもブロックされるので

上級国民は何もできない w

Page 41: Pg con jp-20151127-lt-ogre-of-hook--published

41

上級国民ブロックすべし慈悲はない

Page 42: Pg con jp-20151127-lt-ogre-of-hook--published

42

目的:いやがらせ目的:いやがらせ

通常運用時にこれを組み込んでスーパーユーザ操作を抑止するとか、

実用的な使い方は誰かが考えるんじゃね?

Page 43: Pg con jp-20151127-lt-ogre-of-hook--published

43

HOOK で何ができる?

Page 44: Pg con jp-20151127-lt-ogre-of-hook--published

44

上級国民 に勝てる!(かもしれない)

Page 45: Pg con jp-20151127-lt-ogre-of-hook--published

45

おわりに

Page 46: Pg con jp-20151127-lt-ogre-of-hook--published

46

懇親会費を懇親会費を浮かすため浮かすためLTLT で話したで話したわけじゃないわけじゃない(建前)(建前) 「フックのあけぼの」

作詞:ぬこ

Page 47: Pg con jp-20151127-lt-ogre-of-hook--published

47

この LT を通じてHOOK を使ったPostgreSQL の

拡張に興味をもってもらえればと

Page 48: Pg con jp-20151127-lt-ogre-of-hook--published

48

きちんと作ろうとすると難易度は高いと思うけど

Page 49: Pg con jp-20151127-lt-ogre-of-hook--published

49

PostgreSQL 内部の挙動を理解する

いい材料にもなる(たぶん)

Page 50: Pg con jp-20151127-lt-ogre-of-hook--published

50

みんなでHOOK の鬼を目指そう!

(私でも作れるし )

Page 51: Pg con jp-20151127-lt-ogre-of-hook--published

51

あと

Page 52: Pg con jp-20151127-lt-ogre-of-hook--published

52

Hacker な人がJPUG 勉強会で

HOOK 集中講座とかしてくれないかなー

と、心からそう思う、ぬこ@横浜であった。

Page 53: Pg con jp-20151127-lt-ogre-of-hook--published

53

おしまい