Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PostgreSQLのロール・権限のここがわかりづらい
Search
まぐろ
July 03, 2023
Programming
2.8k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PostgreSQLのロール・権限のここがわかりづらい
まぐろ
July 03, 2023
More Decks by まぐろ
See All by まぐろ
PL/pgSQLはなぜ「ふつうのSQL」より遅いのか
tameguro
0
150
PL/pgSQLの基本と使い所
tameguro
2
650
PostgreSQLで手続き言語を動かす PL/pgSQL入門
tameguro
1
1.9k
Other Decks in Programming
See All in Programming
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
16
8.9k
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
370
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
300
TS 7.0 で baseUrl が使えなくなった今、パスエイリアスをどうするか
bicstone
2
580
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
240
느린 네트워크와 저사양 디바이스 사용자를 위한 웹뷰 로딩 시간 개선기
kmkim
1
220
GraphQL の onError と Nullability のこれから
quramy
0
210
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.2k
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
180
Kawaiicon: Kubernetes, it's no longer cool, but let's secure it anyway!
barnbarn
0
130
Web3Dライブラリを作ってVue Custom Rendererの仕組みを理解しよう / lets learn vue custom renderer by making 3d library
drumath2237
1
130
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.5k
Featured
See All Featured
Code Review Best Practice
trishagee
74
20k
Practical Orchestrator
shlominoach
192
12k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
600
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
650
How Software Deployment tools have changed in the past 20 years
geshan
3
35k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
A Tale of Four Properties
chriscoyier
163
24k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.4k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.3k
Facilitating Awesome Meetings
lara
57
7.2k
Transcript
PostgreSQLのロール・権限 のここがわかりづらい! まぐろ
はじめに • 虎の巻でわいわい言っていた皆さんお疲れさまでした、16でも ロール周りは複雑になりそうです • そもそも、PostgreSQLのロールや権限周りの設定・機能って わかりにくいですよね? わたしも全然わかりません • というわけで、とにかく個人的に「ここがわかりづらい!」と
いう点を列挙しました • 残念ながら「こうすればわかりやすくなるよ!」という話はあ りません
自己紹介 • まぐろ(Twitter:@tameguro) • 都内某SI勤務のSE • PostgreSQLの設計・導入・保守などをやっていたこともあります • PostgreSQL歴はだいたい10年くらい •
PostgreSQLの技術同人誌をいくつか書いてます • その縁で電子書籍として商業誌を書かせてもらえました • Kindleなどで「目黒聖」で検索するとたぶんなんか出てきます
ロールの属性
まずは基本のおさらいから… • PostgreSQLではユーザもグループもいわゆるロールもひっく るめて、すべて「ロール」として扱われます • 端的に言うと、ログイン属性を持つロールをユーザ、ログイン 属性を持たないロールをグループとして扱います • CREATE ROLEでロールを作成しますが、次のSQLも有効です
• CREATE USER:ログイン属性をデフォルトで付加してロールを作成 • CREATE GROUP:単にCREATE ROLEの別名
ロールの属性とは? • スーパーユーザ、データベース作成、ロールの作成、ログイン、 レプリケーションなど、データベース全体にまたがる役割です • Oracleでいう「システム権限」に近い……かもしれない…… • 「属性」とは言いますが「権限」と言っても差し支えなく、日 常会話では「権限」と言っても全く問題ありません •
実質権限ではありますが、GRANTやREVOKEではなくALTERで 変更します • つまりPostgreSQLには権限の設定の方法が2つある
グループについて
ロールとグループについて • CREATE GROUPはCREATE ROLEの別名となっており、 PostgreSQLにおいて実質的にグループはなくなっていると 思っていいでしょう • 下位互換のためpg_groupシステムビューは残っていますが、結局は pg_rolesシステムビューのrolcanloginがfalseのロールを表示している
のみ • グループは存在せず、ユーザとロール(いくつかの権限を集め た権限の集合)しかないと考えたほうがいいと思います
グループと考えてしまうと… • グループだとこのGRANT文が理解しにくくなります • 普通はグループの中にユーザなのに、GRANT文ではユーザの中にグルー プを入れているように見えてしまい、どっちがグループかわかりにくい • ロール(権限の集合)と考えればGRANT文は妥当に見えます
グループなんてものは存在しない • グループという概念は忘れたほうがよさそうです • いつまでも下位互換と言わず整理して廃止したら? こういうところに残ってる (英語ではMember of)
オブジェクト権限 も曲者
オブジェクト権限は複雑すぎる • saitamaユーザとtokyoユーザがいて、それぞれsaitamaスキー マとtokyoスキーマの所有者であり、他の権限は何もついてい ない状態とします • Oracleはユーザとスキーマが一緒ですが、それを擬似的に再現 していると思ってください
オブジェクト権限は複雑すぎる • tokyoスキーマにはtestというテーブルがありますが… • saitamaユーザが検索すると、tokyoスキーマへのアクセス権限 がないと言われてしまいます
オブジェクト権限は複雑すぎる • それでは、saitamaユーザにtokyoスキーマの全権限を与えてみます • もう一度saitamaユーザで検索すると… • tokyoスキーマの全権限を与えたはずなのに、tokyoスキーマに存在 するテーブルが参照できません
オブジェクト権限について • PostgreSQLでは、オブジェクトごとにどんな権限が設定できるかが 決まっており、スキーマはUSAGEとCREATE権限のみを与えること ができます • USAGEはオブジェクトによって意味が異なるが、スキーマではスキーマ内の オブジェクト名を参照できる権限 • つまり、GRANT
ALL ON SCHEMAを実行しても、「そのスキーマ にあるオブジェクト名を参照する権限」と、「そのスキーマにオブ ジェクトを作成する権限」が与えられるだけで、そのスキーマとそ の中のオブジェクトに対してなんでもできちゃう権限が与えられる わけではない • もちろんテーブルを参照するにはスキーマの権限がないとダメなの で、誰にどのオブジェクトに対しどういう権限を与えるかをミスる と予想外の動きをする
None
テーブルの全権限を与えるには • ちょっと工夫が必要です • テーブルが参照できるようになりました!
新規テーブルの権限 • しかし新しくテーブルを作ると… • 新しいテーブルは検索できません
デフォルト権限
デフォルト権限というものがあります! • GRANTやREVOKEは「すでに存在しているオブジェクトに対し て」権限を付与したり剥奪したりする構文 • まだ存在していないオブジェクトに対しては、デフォルト権限 というものが存在します! • その名の通り、「新しく作成されたオブジェクトに対して」デ フォルトの権限を割り当てるというもの
• 動的にテーブルが増えたり開発中でテーブル設計が変わる可能 性が高いときに使ったりします
デフォルト権限というものがあります! • ALTER DEFAULT PRIVILEGES構文(詳しくはマニュアルを参 照) • 「今後tokyoスキーマに作成されるテーブルに対し、saitama ロールに自動的にSELECT権限を付与する」という意味 •
めんどくさいしいくらなんでもわかりにくすぎる ALTER DEFAULT PRIVILEGES IN SCHEMA tokyo GRANT SELECT ON TABLES TO saitama;
今ついてる権限は?
権限を確認するには • オブジェクト権限はpg_catalog.pg_classのrelaclという列に保存さ れています • アルファベット1文字が権限を表します • が、例えば「a=append(INSERT)」などマニュアルを見ないとわか らない表し方になっており、パッと見どういう権限なのか全然わか りません
権限を付与されたロール=付与された権限/権限を付与したロール
None
権限を確認するには • オブジェクトについている権限しかわからない • でも一般的に権限って、「誰が」「どういう」権限を持ってい るか?or持っていないか?で確認したくないですか? • ユーザがどういう権限を持っているかを一発で出すコマンドは ない(はず) •
オブジェクトからユーザの持ってる権限を探すって結構きつい し、漏れも出てきそう
デフォルト権限を確認するには • デフォルト権限はpg_default_aclカタログに記録されています • ¥ddpメタコマンドで確認できます
まとめ • 属性と権限の設定方法統一してほしい… • 現在サポート中のバージョンではすでにグループという概念が ないのだから、すべて廃止すればいいのでは? • オブジェクト権限を真面目に設定するの難しすぎる • デフォルト権限がわかりにくい
• ユーザが付与されている権限を確認 できる方法がほしい • 権限分掌はわかるんですけどより複雑で 直感的じゃない方に進んでないですかね?