🐙

Amazon Redshift カラムレベルでのアクセス制御|Offers Tech Blog

2022/10/27に公開

はじめに

こんにちは、Offers を運営している株式会社 overflow の磯崎です。

今回は Amazon redshift でのカラムレベルアクセス制御について記します。

「分析のために Redash を用いて、Amazon Redshift と繋いでデータ分析できるようにしたい。」

「しかし、テーブル内に機密性の高い情報が含まれているからどうやって制御しよう...」

といった状況に陥り、今回ご紹介する Amazon redshift でのカラムレベルアクセスコントロールを使わせていただくことにしました。

機密性の高い情報を守った状態で、分析を可能にするための他の方法

そもそも上述した「テーブル内に機密性の高い情報が含まれているからどうやって制御しよう...」問題を解決するにあたっては、カラムレベルのアクセスコントロールだけが唯一の解決策ではありません。

他にもいくつか方法がありますが、一番手っ取り早くやりたいことを満たせそうなため、列レベルでのアクセス制御に至りました。

他に検討した方法を記載しておきます。

1. 表示する情報を予め絞ったビューを用意して、そこにアクセス権限を与える

この手の要望を実現したい時によく使う方法ですね。
これでも良いが、ビューの管理やテーブル毎の権限設定など、列レベルでのアクセス制御に比べて複雑性が増すためやりませんでした。

2. 機密性の高い情報のテーブルを分ける

機密性の高い情報は別テーブルに逃して、アクセスできないように絞っておけば良いんじゃないかという方法です。

今そのリファクタに工数を割いている余裕は全くなかったのと、今後この概念を意識しながら開発をしていくのは少々面倒に感じたためやってません。

カラムレベルでのアクセス制御とは

その名の通り、あるテーブルに対して特定のカラムのみにアクセスを絞る制御方法です。

例えば下記のようなテーブルがあったとします。

id age name
xxx xxx xxx
xxx xxx xxx

この時、age(年齢)情報はユーザーの個人情報なので、全 DB ユーザーからアクセスさせたくない情報とします。

DB 管理者ユーザーA さんは全ての情報が見えて OK ですが、DB 管理者ユーザーB さんには age 情報を見せたくないといった場合に、列レベルでのアクセス制御を行います。
そうすると、管理者ユーザーB さんは age カラムの select を付与しないでおけば、同カラムの取得が行えなくなります。

アクセス権限の付与方法

テーブルへのアクセス権限を一度取り消した後に、列レベルでのアクセス件を付与するだけで OK です。
テーブル自体への権限を持っている場合は、列レベルでのアクセス権限を付与しても打ち消されてしまうため、一度取り消しています。

REVOKE SELECT ON TABLE <table name> FROM <user name>;
GRANT SELECT (id, <アクセス許可するカラムを列挙>) ON <table name> TO <user name>;

おわりに

  • 一旦これでも良いが、これだと対象テーブルのカラムが増え続けて、それを参照させたい場合は毎回権限を与え続けなければならないので面倒
    ※ 弊社のサービスの場合は、そこまで変更頻度が高くなさそうなテーブルだったので、一旦これで良しとしています。
  • 列レベルでのアクセス制御をされたユーザーは、テーブル全体を参照しようとするとエラーが出る。しかし、「権限エラー」という形でエラーがでるのみなので、具体的にどのカラムならアクセスできるのかがその場で操作ユーザーが判断できない。
  • 列レベルで守る情報は守りつつ、さっと分析環境を整えるための解決策としてはすぐにやりたいことを実現できており、今も運用されているので一旦はよし。
Offers Tech Blog

Discussion