AWS Lake FormationでTBAC(Tag-Based Access Control)を利用して権限制御をしてみた

2021.07.28

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

Lake Formationには権限制御の方法として、データベース名やテーブル名で制御する「Named Resource Access Control(名前付きリソースアクセスコントロール)」と、タグを利用して制御する「Tag-Based Access Control (TBAC, タグベースアクセスコントロール)」の2つの、権限制御方法があります。

Lake Formationでの権限制御は基本となる機能なので、実際に触りながらこの機能を抑えていきたいと思います。

また、今回はこの2つの権限制御方法のうち、管理コンソール上でも「recommended」と表示されている「TBAC」を利用した権限制御を試してみたいと思います。

前提

AWS Lake Formationにおける「Administrators」には、AWS管理コンソールにログイン(スイッチロール)している自分自身のIAM Roleを指定してあります。

また、今回は権限制御を試したいので「Lake Formation用の専用IAMロール」を事前に準備しておきます。最終的にはこのIAMロールにスイッチして権限制御が出来ているかを確認します。

利用するデータについて

権限制御をする前に、データベースとテーブルを作成します。

テーブル作成用に利用するデータとしては、以下の郵便番号データを利用させていただきました。「全国一括」のファイルを解凍したものをS3にアップロードして利用します。

また、データ仕様は下記のページに記載のとおりとなっています。

これを踏まえて、テーブルのスキーマ定義としては、下記のJSONのように定義を行いました。

[
    {
        "Name": "code",
        "Type": "string",
        "Comment": "全国地方公共団体コード(JIS X0401、X0402)"
    },
    {
        "Name": "old_zipcode",
        "Type": "string",
        "Comment": "(旧)郵便番号(5桁)"
    },
    {
        "Name": "zipcode",
        "Type": "string",
        "Comment": "郵便番号(7桁)"
    },
    {
        "Name": "pref_kana",
        "Type": "string",
        "Comment": "都道府県名(半角カタカナ)"
    },
    {
        "Name": "city_kana",
        "Type": "string",
        "Comment": "市区町村名(半角カタカナ)"
    },
    {
        "Name": "chouiki_kana",
        "Type": "string",
        "Comment": "町域名(半角カタカナ)"
    },
    {
        "Name": "pref",
        "Type": "string",
        "Comment": "都道府県名(漢字)"
    },
    {
        "Name": "city",
        "Type": "string",
        "Comment": "市区町村名(漢字)"
    },
    {
        "Name": "chouiki",
        "Type": "string",
        "Comment": "町域名(漢字)"
    },
    {
        "Name": "chouiki_include_multi_zipcode",
        "Type": "int",
        "Comment": "一町域が二以上の郵便番号で表される場合の表示"
    },
    {
        "Name": "koaza_include_banchi",
        "Type": "int",
        "Comment": "小字毎に番地が起番されている町域の表示"
    },
    {
        "Name": "chouiki_include_choume",
        "Type": "int",
        "Comment": "丁目を有する町域の場合の表示"
    },
    {
        "Name": "zipcode_include_multi_chouiki",
        "Type": "int",
        "Comment": "一つの郵便番号で二以上の町域を表す場合の表示"
    },
    {
        "Name": "has_update",
        "Type": "int",
        "Comment": "更新の表示"
    },
    {
        "Name": "update_reason",
        "Type": "int",
        "Comment": "変更理由"
    }
]

また、今回利用するデータは文字コードがShiftJISだったので、事前にUTF-8に変換してからS3にアップロードしました。

# 文字コードを ShiftJIS から UTF-8へ変換
$ nkf -w --overwrite KEN_ALL.CSV

タグの作成

テーブルの準備ができたので、タグの作成を行います。

Lake Formationの画面における「Permissions > Administrative roles and tasks > Policy tags」からタグを作成します。

今回は、Confidentialityというキーに対して、privatepublicという値を付けました。

タグの付与

タグを作成したので、テーブルのカラムにタグを付与していきます。Lake Formationのメニューから「Data catalog > Tables」を選択し、設定したいテーブルを開きます。

次に、テーブルのスキーマリストの上部にある「Edit schema」ボタンをクリックし、編集画面へ遷移します。 今回は、下記のカラムを対象としてConfidentiality = publicのタグを付与し、それ以外のカラムはConfidentiality = privateとします。

  • code
  • zipcode
  • pref
  • city
  • chouiki

設定時には、該当カラムにチェックボックスを入れてから「Edit tags」をクリックすることで複数カラムに対して同時にタグを設定できます。

タグ設定をしたら、最後に画面下部の「Save as new version」をクリックして保存します。

権限の設定

最後に「Permissions > Data permissions」メニューから、権限設定を行います。設定は「Grant」ボタンをクリックして開始します。

「Principals」では、付与対象を「Lake Formation用の専用IAMロール」にしたいので、事前に準備しておいたIAMロールを指定します。また「Policy tags or catalog resources」では、タグベースアクセスコントロールをしたいのでResources matched by policy tagsを選択し、キーとバリューを設定します。今回はConfidentialitypublicのものを対象とします。

付与する権限としては、「Database permisions」にはDescribeを、「Table and column permissions」にはSelectDescribeを選択して「Grant」をクリックします。

権限制御の確認

権限の設定終わったら、「Lake Formation用の専用IAMロール」にスイッチして確認していきます。

該当テーブルのスキーマを確認すると、想定どおり許可したカラムだけ「Schema」に表示されていることがわかります。

「Actions > View data」から実際にAthenaでクエリも投げてみましょう。

想定どおりのデータが表示できました!

まとめ

以上、AWS Lake FormationでTBAC(Tag-Based Access Control)を利用して権限制御をしてみました。

実際にやってみて、タグベースでの権限管理は柔軟性が高くて非常に便利だなと感じます。一方で「タグの命名」についてはかなり難しいと感じました。命名についてはセンスが問われる上に、一度タグを付けてしまうと後からやり直すのは大変なので、タグのKey名とValue名については、最初によく検討した上で利用するのが良さそうです。

どなたかのお役に立てば幸いです。それでは!