SageMaker Lakehouse では属性ベースのアクセス制御(ABAC)がサポートされており、ユーザの属性情報に基づいてデータアクセスを動的に制御することができます。
ABAC は、IAMユーザやロールにタグ(属性)を付与し、タグの条件が合致する場合のみアクセス権限を付与するという仕組みです。
例:人事部門の従業員(department=HR)は全従業員の給与データにアクセスできるが、その他の従業員は自分の給与データにしかアクセスできない。
ABAC はタグの付け替えのみでアクセス権限を管理できるため、大規模環境でも効率的かつ柔軟に運用することが可能です。また、データベース、テーブル、列、行単位でのきめ細かなアクセス制御を実現することができます。
設定手順
データ準備
ノートブックで以下の Python コマンドを実行し、SageMaker Lakehouse のデフォルトのカタログ(AwsDataCatalog)にemployees
テーブルを作成します。employees
テーブルは従業員の名前、所属部署、所属国、給料などのデータを格納したテーブルです。
※Connection Type は PySpark、Compute は project.spark.compatibility を選択します。
from pyspark.sql import SparkSession
from pyspark.sql.types import *
# Sparkセッション作成
spark = SparkSession.builder \
.appName("connection") \
.getOrCreate()
from sagemaker_studio import Project
# プロジェクトデータ取得
project = Project()
catalog = project.connection().catalog()
project_database = catalog.databases[0].name
# employees テーブル作成
sql = f"""
CREATE TABLE IF NOT EXISTS {project_database}.employees (
id INT,
name STRING,
department STRING,
country STRING,
address STRING,
email STRING,
salary FLOAT
);
"""
spark.sql(sql)
# employees テーブルへのデータ挿入
sql = f"""
INSERT INTO {project_database}.employees VALUES
(1, 'John Doe', 'Engineering', 'USA', '123 Elm St', 'john.doe@example.com', 75000.00),
(2, 'Jane Smith', 'Marketing', 'Canada', '456 Maple Ave', 'jane.smith@example.com', 65000.00),
(3, 'Alice Jones', 'Sales', 'UK', '789 Oak Blvd', 'alice.jones@example.com', 70000.00),
(4, 'Bob Brown', 'HR', 'Australia', '101 Pine Rd', 'bob.brown@example.com', 60000.00),
(5, 'Carol White','Finance', 'Germany', '202 Birch Ln', 'carol.white@example.com', 80000.00);
"""
spark.sql(sql)
テーブルが作成されると、Lakehouse の対象データベース配下にテーブルが表示されます。
ユーザ作成
今回、以下の状態を目標にアクセス権の設定を行います。
- HR:全従業員のデータ(給料含む)を閲覧可能
- EMPLOYEE_XX:対応するリージョン(US、EU、AU)の従業員のデータ(給料以外)を閲覧可能
- Other:閲覧不可
IAMコンソールで、以下のロールを作成します。
- UserRole_HR
- UserRoleEMPLOYEEUS
- UserRole_Other
UserRole_HR
タグで Role に HR を設定します。
UserRole_EMPLOYEE_US
タグで Role に EMPLOYEE_US を設定します。
UserRole_Other
何もタグを設定しない状態です。
権限付与
Lake Formation コンソールを開き、「Data permissions」→「Grant」をクリックします。
各ロールに対し、対象のデータベースに対する Describe 権限を付与しておきます。
次に、テーブルに対する権限の設定を行います。
Role が HR のプリンシパルに対してemployees
テーブルに対する読み取り権限(Describe、Select)を付与します。
次に、Role が EMPLOYEE_US のプリンシパルに対してemployees
テーブルに対する読み取り権限(Describe、Select)を付与します。
ABACでは、行レベルと列レベルでデータをフィルタする Data filter を設定可能です。今回は以下のように「filter_EMPLOYEE_US」というフィルタを作成します。列レベルのフィルタでは salary 列を除外し、行レベルのフィルターでは country が USA と Canada のデータのみを対象とします。
動作確認
Athena でクエリエディタを開き、動作確認を行います。
UserRole_HR
employees
テーブルが表示され、全従業員のすべてのデータを参照できます。
UserRole_EMPLOYEE_US
employees
テーブルが表示され、USリージョン(USA、Canada)の従業員の給料以外のデータを参照できます。
UserRole_Other
employees
テーブルに対する読み取り権限(Describe、Select)が付与されていないため、テーブルが表示されません。
補足
SageMaker Lakehouse では、行/列レベルセキュリティはABACのフィルター機能として提供されています。以下の点にご注意ください。
- フィルターはテーブルごとに作成する必要がある(Databricksのように関数として作成したフィルターを複数のテーブルで使いまわしたりすることはできない)
- フィルターによる制御は表示/非表示レベルで、細かい表示の制御はできない(例:HRと本人以外、給料列は「****」でマスキングするなど)
まとめ
SageMaker Lakehouse のアクセスコントロールについてご紹介しました。
Lakehouse ではABACという仕組みにより、各ユーザやロールの属性に応じて柔軟にアクセス権の管理を行うことができます。属性はタグベースであるため簡単に追加や変更を行うことができ、フィルター機能によって行/列レベルでの細かいアクセス権設定も可能です。
Databricks などのアクセスコントロールと比べるとやや物足りなさを感じる部分はありますが、よほど要件がシビアでない限り幅広いユースケースに対応可能な機能となっています。SageMaker をご利用の方はぜひ活用してみてください。