0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【備忘録】PostgreSQLのロール・ユーザー・権限を基礎から理解する

0
Posted at

PostgreSQLのロール・ユーザー・権限周りはややこしいのでまとめようと思う。

そもそも、なぜユーザーや権限が必要なのか

全てのユーザーがすべてのデータを自由に操作出来たら危険。
そのためPostgreSQLでは、誰が何をしてよいか、を管理する。
その中心にある仕組みが「ロール」となる。

ロールとは

PostgresSQL内部で権限を持つ主体

ロールには、

  • PostgreSQLにログインできる
  • データベースを作成できる
  • テーブルを読める
  • ほかのロールを作れる

といった権限や属性を持たせることができる。

ユーザーとロールの関係

ユーザーもロールの一種。

LOGINできるロールを、一般的にユーザーとして扱う

ROLE 
├── LOGINできる 
│   └── ユーザーとして使える 
│     
└── LOGINできない 
    └── 権限をまとめるグループなどとして使える

ロールには2つの使い方がある

用途 LOGIN ロール名の例
ユーザーとして使う あり app_user
権限グループとして使う なし readonly

ロール属性の代表例

属性 意味
LOGIN PostgreSQLへログインできる
SUPERUSER ほぼすべての権限制限を無視できる
CREATEDB データベースを作成できる
CREATEROLE ロールを作成・管理できる
REPLICATION レプリケーション関連操作ができる
BYPASSRLS Row Level Securityを回避できる

ロール属性とオブジェクト権限は別物

PostgreSQLの権限を考えるときは、

  1. ロールそのものの属性
  2. データベースやテーブルに対する権限

に分けて考える。

ロール属性

LIGIN
SUPERUSER
CREATEDB
CREATEROLE

オブジェクト権限

SELECT
INSERT
UPDATE
DELETE

オブジェクトとは

PostgreSQLでは、データベース内の様々なものをオブジェクトとして扱う。
これらには所有者や権限がある。
代表的なものは次に示す。

オブジェクト
Database myapp
Schema public
Table users
Sequence users_id_seq
View active_users
Function calculate_total()

オブジェクトごとに権限の種類が異なる

Database

権限 意味
CONNECT データベースへ接続する
CREATE データベース内にスキーマを作る
TEMPORARY 一時テーブルを作る

Schema

権限 意味
USAGE スキーマを利用できる
CREATE スキーマ内にオブジェクトを作れる

Table

権限 意味
SELECT データを読む
INSERT データを追加する
UPDATE データを更新する
DELETE データを削除する
TRUNCATE 全行を削除する
REFERENCES 外部キーから参照する
TRIGGER トリガーを作成する

所有者とは

オブジェクトには所有者が存在する。
オブジェクトを作成したロールがその所有者になる。

認証と認可

認証

あなたは誰?

を確認する

認可

あなたは何をしてよいか?

を決める。

認証によってデータベースへ接続し、認可によって操作を行う。

ロールをグループとして使える

ロールは権限をまとめるためにも使える。

たとえば、

readonly
└── SELECT権限

というロールを作り、

readonly
├── user_a
├── user_b
└── user_c

のように複数ユーザーを所属させることができる。

ロールを作る

# 基本形
CREATE ROLE <ロール名>;

# 基本形
CREATE ROLE readonly;

デフォルトではログインできない。

ログインできるロールを作る

ログイン属性を付けるとログインできるロールになる。

CREATE ROLE app_user LOGIN;

CREATE USERを使う

これらは実質同じになる。

CREATE USER app_user;
CREATE ROLE app_user LOGIN;

パスワード付きロールを作る

CREATE USER app_user WITH PASSEORD 'password123';
CREATE ROLE app_user LOGIN PASSWORD 'password123';

パスワードがないと、利用可能なパスワードが設定されていない状態になる。

既存ロールにLOGIN属性を付ける

ALTER ROLE readonly LOGIN;    # ログイン可能にする
ALTER ROLE readonly NOLOGIN;  # ログイン不可能にする

CREATEDB属性を付ける

ALTER ROLE app_user CREATEDB;   # データベースの作成を可能にする
ALTER ROLE app_user NOCREATEDB; # データベースの作成を不可能にする

CREATEROLE属性を付ける

ALTER ROLE app_user CREATEROLE;   # ロールの作成を可能にする
ALTER ROLE app_user NOCREATEROLE; # ロールの作成を不可能にする

SUPERUSER属性を付ける

SUPERUSERは非常に強い権限を持つ。

ALTER ROLE app_user SUPERUSER;   # スーパーユーザーにする
ALTER ROLE app_user NOSUPERUSER; # スーパーユーザーではなくする

ロール属性を作成時にまとめて指定する

CREATE ROLE app_user
LOGIN
PASSWORD 'password123'
CREATEDB;

ロールに対しオブジェクトへの権限を与える

基本形:

GRANT <権限>
ON <オブジェクト>
TO <ロール>;

テーブルに対する権限

INSERT

GRANT INSERT 
ON users 
TO app_user;

UPDATE

GRANT UPDATE 
ON users 
TO app_user;

DELETE

GRANT DELETE 
ON users 
TO app_user;

複数の権限

GRANT SELECT, INSERT, UPDATE, DELETE
ON users
TO app_user;

データベースへの接続権限を与える

GRANT CONNECT
ON DATABASE myapp
TO app_user;

スキーマの利用権限を与える

GRANT USAGE
ON SCHEMA public
TO app_user;

スキーマ内でオブジェクトを作れるようにする

GRANT CREATE
ON SCHEMA public
TO app_user;

権限を取り消す

基本形:

REVOKE <権限>
ON <オブジェクト>
FROM <ロール>;

例:

REVOKE DELETE
ON users
FROM app_user;

ロールを別のロールに所属させる

ロールを作成する。

CREATE ROLE readonly;

権限を与える。

GRANT SELECT
ON users
TO readonly;

このロールに別のロールを所属させる。

GRANT readonly TO user_a;

user_aはreadonlyの権限を持つことになる。

複数ユーザーに同じロールを付ける

全員readonlyの権限を持つ。

GRANT readonly TO user_a;
GRANT readonly TO user_b;
GRANT readonly TO user_c;

ロール一覧を見る

\du

現在のロールを確認する

SELECT current_user;

データベースの所有者を指定する

データベース作成時に所有者を指定できる。

CREATE DATABASE myapp
OWNER app_user;

オブジェクトの所有者を変更する

ALTER TABLE users
OWNER TO app_user;

ロールを削除する

DROP ROLE app_user;
DROP USER app_user;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?