APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【AWS DEA】Lake Formationの列レベル・行レベルのアクセス制御を試してみる

はじめに

こんにちは!クラウド事業部の中根です。

先日、AWS DEAを取得しました。
その学習中にLake Formationの列レベルと行レベルでのアクセス制御、というものを初めて知りました。
なんだか気になったので、試してみました。
AWS DEA学習中の方の参考になれば幸いです。

Lake Formationとは

Lake Formationは、簡単に言うと、データレイクの構築と管理を簡素化するためのAWSサービスです。
公式ドキュメント

列レベル・行レベルでのアクセス制御

1つのデータセット(テーブル)に対し、アクセスするユーザーやグループに応じて特定の列や行を見えないようにすることができます。
これがないと、各ユーザーやグループがアクセスするためのビューを作成する必要があり、管理が煩雑になります。
例えば、顧客データの中で電話番号列などの個人情報を、特定の社員しかアクセスできないようにする、という制御が可能です。
列レベル・行レベルでのアクセス制御を活用することで、シンプルなアクセス制御を実現できます。
公式ドキュメント

事前準備

1. データセットの準備

S3バケットを作成し、以下のサンプルデータを格納します。

id,name,department,salary,region
1,Alice,Engineering,8000,US
2,Bob,Engineering,7500,EU
3,Charlie,HR,6000,US
4,David,HR,6200,EU
5,Eve,Finance,9000,US
6,Frank,Finance,8800,EU
7,Grace,Sales,7000,US
8,Heidi,Sales,7200,EU

2. テーブル作成

Athenaクエリエディタを開き、以下のクエリを実行します。

CREATE database lake_formation_test;
CREATE EXTERNAL TABLE lake_formation_test.employees (
    id INT,
    name STRING,
    department STRING,
    salary INT,
    region STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '<1.で格納したサンプルデータのフォルダパス(ファイル名なし)>'
TBLPROPERTIES ("skip.header.line.count"="1");

次の画面のようにエラーが出たら、右上の「設定を編集」を押下します。
遷移先でクエリ結果を保存するためのS3バケットを指定してください。
バケットは1.とは別で作っておくのがおすすめです。

作成したら、データが格納されていること、全てのデータを見られることを確認します。

select * from lake_formation_test.employees;

3. IAMロール作成

検証用に、IAMロールを作成します。
以下のように設定して「次へ」。

AmazonAthenaFullAccess,AmazonS3FullAccessポリシーをアタッチします。
適当な名前を付けてIAMロールを作成します。

4. IAMAllowedPrincipalsのアクセス権の削除

Lake Formationのサービス画面から、「Data permissions」に進み、以下の2つにチェックをして「Revoke」を押下します。
環境によってはそもそも存在しないかもしれませんが、その場合は無視してください。

2.作成したテーブルに対して、IAMAllowedPrincipalsが権限を持っている場合は削除する、ということをしています。
簡単に説明すると、IAMAllowedPrincipalsが権限を持っている場合、IAMベースでアクセス制御がされ、今回の行レベル、列レベルのアクセス制御をすることができないです。

行レベルのアクセス制御

1. データフィルター設定

Lake Formationのサービス画面から、「Data filters」に進み、「Create new filter」を押下します。

Data filter nameは任意の名前を付けます。
Target tableは、事前準備の2.で作成したテーブルです。

Row filter expressionには以下を入力します。

region = 'US'

2. 行レベルのアクセス制御設定

Lake Formationのサービス画面から、「Data permissions」に進み、「Grant」を押下します。

以下のように入力して「Grant」押下します。
IAM users and roles: 事前準備の3.IAMロール作成のロール名
LF-Tags or catalog resources: Named Data Catalog resources
Tables: 事前準備の2.で作成したテーブル
Data filters: 1.で作成したデータフィルター
Data filter permissions: Selectだけチェック

3. スイッチロール

マネジメントコンソール右上から、ロールの切り替えを行います。
マルチセッションサポートオフの方は多少UIが違うかもしれませんが、同様にロールの切り替えをします。

Account ID:自分のアカウントID
IAM role name:事前準備の3.IAMロール作成のロール名

マネジメントコンソール右上で、ロールが切り替わったことを確認してください。

4. クエリ実行

Athenaクエリエディタを開き、以下のクエリを実行します。

select * from lake_formation_test.employees;

次の画面のようにエラーが出たら、事前準備の2.と同様に対処してください。

regionがUSのデータだけ表示されていることが確認できました!

列レベルのアクセス制御

※前の手順で、スイッチロールしている場合は、元のセッションで操作してください。

1. データフィルター設定

Lake Formationのサービス画面から、「Data filters」に進み、「Create new filter」を押下します。

Data filter nameは任意の名前を付けます。
Target tableは、事前準備の2.で作成したテーブルです。
Column-level accessは、Exclude columnsを選択し、Salaryだけチェックします。

2. 列レベルのアクセス制御設定

Lake Formationのサービス画面から、「Data permissions」に進み、「Grant」を押下します。

以下のように入力して「Grant」押下します。
IAM users and roles: 事前準備の3.IAMロール作成のロール名
LF-Tags or catalog resources: Named Data Catalog resources
Tables: 事前準備の2.で作成したテーブル
Data filters: 1.で作成したデータフィルター
Data filter permissions: Selectだけチェック

3. 行レベルのアクセス制御を解除

「行レベルのアクセス制御」を試している場合は、その権限をRevokeしておきましょう。

4. スイッチロール

前述の行レベルのアクセス制御の3.と同じロールにスイッチロールします。

5. クエリ実行

Athenaクエリエディタを開き、以下のクエリを実行します。

select * from lake_formation_test.employees;

salary列が非表示になっていることが確認できました!

まとめ

今回は、Lake Formationの列レベル・行レベルのアクセス制御を試してみました。
AWS DEAを受験予定の方の参考になれば幸いです。

関連記事

今回は列レベル、行レベルそれぞれで試しましたが、両方を組み合わせることも可能です。
以下の記事もご参考ください!

techblog.ap-com.co.jp

終わりに

APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。

その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
www.ap-com.co.jp

https://www.ap-com.co.jp/service/utilize-aws/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp