Upload
toshi-harada
View
917
Download
0
Embed Size (px)
Citation preview
PostgreSQL カンファレンス 2015Lightning Talk
ぬこ@横浜 (@nuko_yokohama)
PostgreSQL カンファレンス 2015Lightning Talk
フックの鬼
ぬこ@横浜 (@nuko_yokohama)
3
自己紹介
ぬこ@横浜でググると何かしら出てくると思います
今日は呼ばれもしないのにこちらへ来ましたw
4
PostgreSQL 9.5 リリース楽しみですね!
でも今日は別のお話を
5
フック フックフック フックフックの鬼だフックの鬼だ
「フックの鬼」作詞:ぬこ
6
HOOK 拡張って?
7
HOOK で何ができる?
8
俺々 Logging が実装できる!(かもしれない)
9
俺々認証が実装できる!(かもしれない)
10
俺々 Planner が実装できる!(かもしれない)
11
俺々 Excutor が実装できる!(かもしれない)
12
可能性は無限大
13
PostgreSQL 9.5 で使えるHOOK は 37 種類 ( たぶん )
でも、 HOOK の情報ってPostgreSQL 文書にないよね
ソースから探すfind . -name "*.h" | xargs egrep -n "extern.*PGDLLIMPORT.*hook"
あと、 GUC 関連の HOOK もあるっぽい./src/include/utils/guc.h
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
15
PostgreSQL 9.5 の HOOK
GucBoolCheckHookGucIntCheckHookGucRealCheckHookGucStringCheckHookGucEnumCheckHook
GucBoolAssignHookGucIntAssignHookGucRealAssignHookGucStringAssignHookGucEnumAssignHook
GucShowHook
16
各 HOOK の説明時間がないので割愛
HOOK 名から・・・伝わって・・・ください・・・
17
HOOK を使った拡張の例
拡張内容と使われている HOOK から
察してください
18
HOOK を使った拡張の例contrib/passwordcheck
check_password_hook
contrib/pg_stat_statementsshmem_startup_hookpost_parse_analyze_hookExecutorStart_hookExecutorRun_hookExecutorFinish_hookExecutorEnd_hookProcessUtility_hook
パスワードのチェック!
統計情報の記録!
19
HOOK を使った拡張の例contrib/auto_explain
ExecutorStart_hookExecutorRun_hookExecutorFinish_hookExecutorEnd_hook
contrib/sepgsqlClientAuthentication_hookfmgr_hookExecutorCheckPerms_hookProcessUtility_hook
遅い SQL の実行計画を自動記録!
ラベルベースの強制アクセス制御!
20
HOOK を使った拡張の例pg_hint_plan
ProcessUtility_hookplanner_hookget_relation_info_hookjoin_search_hookshmem_startup_hookpost_parse_analyze_hookExecutorStart_hookExecutorRun_hookExecutorFinish_hookExecutorEnd_hook
実行計画の制御!
21
HOOK を使った拡張の例
pg_dbms_statsget_relation_info_hookget_attavgwidth_hookget_relation_stats_hookget_index_stats_hook
統計情報の固定化!
22
HOOK を使った拡張の例
sql_firewallshmem_startup_hookpost_parse_analyze_hookExecutorStart_hookExecutorRun_hookExecutorFinish_hookExecutorEnd_hookProcessUtility_hook
ルールによる SQL 実行抑止@snaga さんに聞いてね!!
23
HOOK を使った拡張の例pgaudit
ExecutorCheckPerms_hookProcessUtility_hookobject_access_hookExecutorStart_hook
jsonlogemit_log_hook
pg_panicplanner_hook
データベース監査!
サーバログの JSON 化!
確率的に PANIC を発生させる!
24
くやしいのでくやしいので俺も作ってみた俺も作ってみた
どれもみな、どれもみな、すばらしい拡張だ!すばらしい拡張だ!
25
pg_heartman
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 を発行したときの例
27
役にたたない役にたたない
28
もうちょっと真面目に作ろう
30
上級国民 = スーパーユーザ
31
上級国民はなんでもできる!上級国民はなんでもできる!
データの不正な参照データの不正な参照テーブルの不正な変更テーブルの不正な変更スキーマの不正な変更スキーマの不正な変更設定の不正な変更設定の不正な変更
log_statment 設定もあっさり無効化!
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 拡張を作ってみた
33
pg_sulog
https://github.com/nuko-yokohama/pg_sulog
http://to-a.ru/
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 は一般ユーザを示す
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
スーパーユーザ
一般ユーザ
スーパーユーザ
サーバログにもスーパユーザ操作のみ書き込まれる
36
上級国民ロギングすべし慈悲はない
37
ついでにオプションで
38
スーパーユーザ操作をブロック
上級国民に ケンカをうるとは ...どこまでも たのしい ひとたちだ ...
# pg_sulog configurationshared_preload_libraries = pg_sulogpg_sulog.block = on # on/off
postgresql.conf
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
40
DML も DDL も DCL もSET も ALTER SYSTEMもブロックされるので
上級国民は何もできない w
41
上級国民ブロックすべし慈悲はない
42
目的:いやがらせ目的:いやがらせ
通常運用時にこれを組み込んでスーパーユーザ操作を抑止するとか、
実用的な使い方は誰かが考えるんじゃね?
43
HOOK で何ができる?
44
上級国民 に勝てる!(かもしれない)
45
おわりに
46
懇親会費を懇親会費を浮かすため浮かすためLTLT で話したで話したわけじゃないわけじゃない(建前)(建前) 「フックのあけぼの」
作詞:ぬこ
47
この LT を通じてHOOK を使ったPostgreSQL の
拡張に興味をもってもらえればと
48
きちんと作ろうとすると難易度は高いと思うけど
49
PostgreSQL 内部の挙動を理解する
いい材料にもなる(たぶん)
50
みんなでHOOK の鬼を目指そう!
(私でも作れるし )
51
あと
52
Hacker な人がJPUG 勉強会で
HOOK 集中講座とかしてくれないかなー
と、心からそう思う、ぬこ@横浜であった。
53
おしまい