はじめに
こんにちは!クラウド事業部の中根です。
先日、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を受験予定の方の参考になれば幸いです。
関連記事
今回は列レベル、行レベルそれぞれで試しましたが、両方を組み合わせることも可能です。
以下の記事もご参考ください!
終わりに
APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。
その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
www.ap-com.co.jp
https://www.ap-com.co.jp/service/utilize-aws/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。