LoginSignup
0
0

More than 1 year has passed since last update.

Amazon Redshift で 行レベルアクセス制御(RLS)

Last updated at Posted at 2022-09-24
  • 例えば、各自が所属する部門に関する行(レコード)だけを表示させたい場合など、ROLEに応じて操作範囲を制限したい場合に使えるRedshiftの機能 (2022年7月GA)。
  • RLS : Row-level Securityといい、基本はRBAC(Role-Base Access Control)を使う。
  • SQLだけで操作できる。
  • 列レベルのアクセス制御機能と組み合わせることで、より細かい制御が可能。

参考)

ざっくり仕組みを理解

  • ROLE(IAM ROLEとは別)を定義する。例:管理者、運用者、XX利用部門
  • RLSポリシーを定義し、行レベルフィルタルールをSQLで書く
  • ROLEには列レベルのアクセス制御のルールもセットできる
  • RLSポリシーをテーブルとROLEに紐付け(アタッチ)する
  • DBユーザーはROLEと紐づける(GRANT

image.png
参考)AWS公式ブログ:Achieve fine-grained data security with row-level access control in Amazon Redshift

ユースケース例

  • 地理的な位置に基づいてデータアクセスを制限(自分が所属するエリアに限定)
  • 個人の給与だけを見るアクセス制限
  • マネージャーは直属部下情報のみを参照し、他部門の情報を参照させない
  • 医師と看護師が患者のデータ行のみを表示できるようにする
  • 従業員の事業部門や会社における役割に基づいて、財務データ行へのアクセスを制限
  • 各テナントのデータ行を、他のすべてのテナントのデータ行から論理的に分離する

やってみる

事前準備

まずはサンプル顧客テーブルとサンプルユーザ準備

CREATE TABLE customer 
(
  customerid       INT8 NOT NULL,
  customername     VARCHAR(25) NOT NULL,
  phone            CHAR(15) NOT NULL,
  nationid        INT4 NOT NULL,
  marketsegment    CHAR(10) NOT NULL,
  accountbalance   NUMERIC(12,2) NOT NULL
);

INSERT INTO customer VALUES
(1, 'Customer#000000001', '33-687-542-7601', 3, 'HOUSEHOLD', 2788.52),
(2, 'Customer#000000002', '13-806-545-9701', 1, 'MACHINERY', 591.98),
(3, 'Customer#000000003', '13-312-472-8245', 1, 'HOUSEHOLD', 3332.02),
(4, 'Customer#000000004', '23-127-851-8031', 2, 'MACHINERY', 9255.67),
(5, 'Customer#000000005', '13-137-193-2709', 1, 'BUILDING', 5679.84)
;

CREATE USER staff WITH password 'Abcd1234!'; 
CREATE USER manager WITH password 'Abcd1234!'; 

1) ROLE作成

CREATE ROLE [ROLE名];

例)

CREATE ROLE role_household;
CREATE ROLE role_manager;

特定セグメントのみアクセスするROLEと、全体をアクセスできるROLEを作成しておく

2) RLSポリシー作成

CREATE RLS POLICY [ポリシー名] WITH ([参照対象列]) USING ([クエリの WHERE 句に適用されるフィルター])
※ WITHはオプション
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_CREATE_RLS_POLICY.html

例)

-- HOUSEHOLDセグメントのみアクセス許可するポリシー
CREATE RLS POLICY policy_household
WITH (marketsegment CHAR(10))
USING (marketsegment = 'HOUSEHOLD');

-- 全部参照可
CREATE RLS POLICY policy_manager
USING (ture);

3) RLSポリシーをROLEにアタッチ

ATTACH RLS POLICY [ポリシー名] ON [テーブル] TO ROLE [ROLE名]
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_ATTACH_RLS_POLICY.html
※ TOの後はユーザでもセット可能

例)

ATTACH RLS POLICY policy_household ON customer TO ROLE role_household;

ATTACH RLS POLICY policy_manager ON customer TO ROLE role_manager;

4) ROLEに権限付与

GRANT [権限] ON [テーブル名] TO ROLE [ROLE名];

例)

GRANT SELECT ON customer TO ROLE role_household;
GRANT SELECT,UPDATE,DELETE ON customer TO ROLE role_manager;

5) RLSセキュリティ機能を有効化

ALTER TABLE [テーブル名] ROW LEVEL SECURITY on;

例)

ALTER TABLE customer ROW LEVEL SECURITY on;

6) ROLEとユーザを紐付け

GRANT ROLE [ROLE名] TO [ユーザ]

例)

GRANT ROLE role_household TO staff;
GRANT ROLE role_manager TO manager;

動作確認

staffユーザの場合

SET SESSION AUTHORIZATION 'staff';
select * from customer;
update customer set phone = 'xxxx';
RESET SESSION AUTHORIZATION;

updateは権限がないためPermission Deniedになり、参照結果は意図通りmarketsegementがHOUSEHOLDの行だけ表示される。
image.png

managerユーザの場合

SET SESSION AUTHORIZATION 'manager';
select * from customer;
update customer set marketsegment = 'BUILDINGS' where marketsegment = 'BUILDING';
RESET SESSION AUTHORIZATION;

制限をかけていないので全行表示され、UPDATE権限も付与したので、更新も成功する
image.png

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