背景
S3にデータを置いてGlue/Athenaで分析する際、既存のテーブルには機密情報が含まれていて誰でもアクセスできる状態だったため問題がありました。
まず機密情報をマスクしたビューを作成しました。
それからLakeFormationを使って機密情報を含むテーブルにはアクセス制限をかけて、新しく作成したビューは誰でも見れるような状態を作ることで解決しました。
LakeFormationとは
以下の特徴があります。
- Data Catalog(Glue)と統合して「列単位・行単位・テーブル単位」で制御できる
- IAMのポリシー制御だけだと「S3バケット単位」でしか制御できない → 粒度が荒い
- Lake Formationを使うと「分析基盤に必要なきめ細かい制御」が可能
LakeFormationによるアクセス制御手順
Data lake administratorsの設定
管理者になるとData Catalogに対するアクセス制御を設定できるようになります。

Data lake locationsの設定
LakeFormationで管理したいデータを格納しているS3のパスを登録します。

IAMでの制御を無効にする
LakeFormationで細かい制御を可能にするためにはデータベースとテーブルのIAMでの制御を無効化する必要があります。
データベースのIAM制御を無効化
- メニューからDatabasesに移動して該当のテーブルを選択して編集画面に移動します
- デフォルトでは「Use only IAM access control for new tables in this database」の項目にチェックがついているのでチェックを外します
- これでこのデータベースから新しく作成されるテーブルやビューはIAMによる制御が無効になります
テーブルのIAM制御を無効化
デフォルトではテーブルのパーミッションにIAMAllowedPrincipalsがついているので削除します。
IAMAllowedPrincipalsがついている状態だとLakeFormationによる制御が無効になります。

ビューの作成
機密情報をマスクしたビューを作成していきます。
まず前提としてこのビューはAthenaビューではなく、データカタログビューである必要があります。1
データカタログビューは以下の構文で作成可能です。
CREATE PROTECTED MULTI DIALECT VIEW ビュー名
SECURITY DEFINER
AS 機密情報をマスクしたビューのSQL
ただしこれをAthenaで実行するにはIAMロールでないとエラーになります。
IAMロールを作成したらLakeFormationでビューの作成元となるテーブルにパーミッションを付与します。

作成したIAMロールにassumeしてAthenaで実行するとデータカタログビューの作成に成功します。
テーブルとビューそれぞれにアクセス制御設定
あとはLakeFormationの画面からテーブルとビューそれぞれにパーミッションを付与して別々でアクセス制御可能になります。