Amazon Web Services ブログ

AWS Lake Formation による効果的なデータレイクの構築 パート 5: 行レベルのアクセス制御でデータレイクを保護する

本記事は Amazon Web Services, Senior Big Data Architect である 関山 宜孝 と AWS Lake Formation の Principal Product Manager である Sanjay Srivastava によって投稿されたものです。
お客様は、組織全体のデータアクセスを民主化する戦略の中核をなすデータレイクをますます検討するようになってきています。データレイクを使用すると、さまざまな形式で多数のソースから送信されるペタバイトおよびエクサバイトのデータを扱うことができ、ユーザーは様々な分析ツールや機械学習ツールからアクセスできるようになります。データを保護し、データを必要とする人にのみアクセス権を付与するには、きめ細かなアクセス制御が必要です。
AWS Lake Formation は、データレイクを構築、保護、管理し、データレイク内のデータに対するアクセス制御を提供するフルマネージド型のサービスです。Lake Formation の行レベルの権限を使用すると、データコンプライアンスとガバナンスポリシーに基づいて、特定の行へのアクセスを制限できます。また、Lake Formation は、どのプリンシパルがどのデータにアクセスしたのか、いつ、どのサービスを通じてアクセスしたかを特定することで、一元的な監査とコンプライアンスレポートを提供します。

AWS Lake Formation を使用した効果的なデータレイク

この記事では、Lake Formation での行レベルのアクセス制御がどのように機能するのかと、それらの設定方法について説明します。

数十億のレコードを格納する大きなファクトテーブルがある場合、異なるユーザーやチームが、権限のあるデータのみにアクセスできるようにする方法が必要です。行レベルのアクセス制御は、ユーザーがジョブを実行するために必要なデータへのアクセスを許可しながら、データを保護するためのシンプルでパフォーマンスの高い方法です。たとえば、小売業界では、個々の部門が独自のトランザクションのみを表示して、地域マネージャがすべての部門からのトランザクションにアクセスできるようにしたいといったユースケースがあります。

行レベルアクセス制御を実現するには、従来は以下の2つの方法が一般的に利用されています:

  • データを複製し、機密情報を削除して、データセットに対する大まかな権限を付与する
  • データベースまたはデータウェアハウスにデータをロードし、特定のレコードのみを選択する WHERE 句を使用してビューを作成し、ビューに対するパーミッションを付与する

これらのソリューションは、少数のテーブル、プリンシパル、およびパーミッションを扱うときにはうまく機能します。ただし、アクセス制御が複数のシステムや手法に分散されているため、監査と保守が難しくなります。データレイクでのきめ細かなアクセス制御の管理を容易にするために、Lake Formation の行レベルのアクセス制御のプレビューを発表しました。このプレビュー機能を使用すると、行レベルのフィルタを作成してテーブルにアタッチして、 AWS Identity and Access Management(IAM)および SAMLv2 フェデレーションアイデンティティに対してデータのアクセスを制限できます。

行レベルのセキュリティにおけるデータフィルタの仕組み

行レベルのセキュリティ (行フィルタリング) を持つテーブルに対するパーミッションを付与すると、テーブル内の特定の行のみへのアクセスに制限されます。フィルタリングは、1 つ以上の列の値に基づいて行われます。例えば、販売機会を分析している営業担当者は、割り当てられたテリトリー内の行のみを表示でき、他のテリトリーの行は表示できません。行レベルのフィルタを定義して、テリトリー列の値がユーザーの割り当てられたテリトリーと一致する行へのアクセスに制限できます。

行レベルのセキュリティでは、データフィルタの概念を導入しました。データフィルタを使用すると、多数のきめ細かい権限の管理と割り当てが簡単になります。PartiQL クエリ言語で記述されている WHERE 句を使用して、行フィルタ式を指定できます。

ユースケースの例

この記事では、架空の EC 企業が書籍、ビデオ、おもちゃなど、さまざまな製品を販売しています。顧客は商品ごとにレビューや評価を残すことができるので、他の顧客は、そうした情報を参考にしながら購入するものを決めることができます。この記事では Amazon カスタマーレビューデータセットを使用します。このデータセットには、さまざまな商品やカスタマーレビューが含まれています。

データの所有者と利用者のさまざまな役割と責任を説明するために、データレイク管理者とデータアナリストの 2 つのペルソナを想定しています。管理者は、データレイクの設定、データフィルタの作成、およびデータアナリストへの権限の付与を担当します。異なる国に居住するデータアナリスト(ユースケースでは米国および日本)は、自国にお住まいの顧客の製品レビューのみを分析でき、コンプライアンス上の理由から、他の国に所在する顧客のデータを表示することはできません。データアナリストは 2 人います。米国のマーケットプレイスの担当者と、日本のマーケットプレイスの担当者です。各アナリストは Amazon Athena を使用して、各自の国のマーケットプレイスのカスタマーレビューのみを分析します。

AWS CloudFormation でリソースを準備する

この記事には、すばやくセットアップするための AWS CloudFormation テンプレートが含まれています。用途に合わせてカスタマイズできます。

CloudFormation テンプレートは次のリソースを生成します:

  • AWS Lambda 関数(AWS CloudFormation Lambda-backed カスタムリソース用)。この関数を使用して、Amazon Simple Storage Service (Amazon S3) バケットにパブリック S3 バケットからサンプルデータファイルをコピーします。
  • データレイクとして機能する S3 バケット。
  • IAM ユーザーとポリシー:
    • DataLakeAdmin
    • DataAnalystUS
    • DataAnalystJP
  • AWS Glue データカタログのデータベース、テーブル、およびパーティション。
  • Lake Formation データレイクの設定とパーミッション。

このセクションの手順を実行する場合は、us-east-1 または us-west-2 リージョン (プレビュー機能がこの記事の執筆時点で使用可能) のいずれかを使用します。

CloudFormation テンプレートを起動する前に、次の手順を実行して、Use only IAM access control for new databases/tables を無効にしておく必要があります:

  1. us-east-1 または us-west-2 リージョンの Lake Formation コンソールにサインインします。
  2. Data catalog で、Settings を選択します。
  3. Use only IAM access control for new databasesUse only IAM access control for new tables in new databases の選択を解除します。
  4. Save を選択します。

CloudFormation スタックを起動するには、次の手順を実行します:

  1. 同じリージョンで CloudFormation コンソールにサインインします。
  2. Launch Stack を選択します:
  3. Next (次へ) を選択します。
  4. DatalakeAdminUserNameDatalakeAdminUserPassword には、データレイク管理者 IAM ユーザーに必要なユーザー名とパスワードを入力します。
  5. DataAnalystUsUserName および DataAnalystUsUserPassword には、米国マーケットプレイスを担当するデータアナリストユーザーに必要なユーザー名とパスワードを入力します。
  6. DataAnalystJpUserName および DataAnalystJpUserPassword には、日本のマーケットプレイスを担当するデータアナリストユーザーに必要なユーザー名とパスワードを入力します。
  7. DataLakeBucketName には、データレイクバケットの名前を入力します。
  8. DatabaseNameTableName は、デフォルトのままにしておきます。
  9. Next (次へ)を選択します。
  10. 次のページで、Next (次へ)を選択します。
  11. 最後のページで詳細を確認し、I acknowledge that AWS CloudFormation might create IAM resources(AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。) を選択します。
  12. Create (スタックの作成)を選択します。

スタックの作成には約 1 分かかります。

データフィルタを使用しないクエリ

環境を準備したら、製品レビューテーブルをクエリできます。まず、行レベルのアクセス制御なしでテーブルをクエリして、データが見えることを確認しましょう。Athena でクエリを初めて実行する場合は、クエリ結果の場所を設定する必要があります。

DatalakeAdmin ユーザーを使用して Athena コンソールにサインインし、次のクエリを実行します:

SELECT * 
FROM lakeformation_tutorial_row_security.amazon_reviews
LIMIT 10
SQL

次のスクリーンショットは、クエリの結果を示しています。このテーブルには、product_category=Video というパーティションが 1 つしかないため、各レコードはビデオ製品のレビューコメントになります。

集計クエリを実行して、marketplace の合計レコード数を取得しましょう:

SELECT marketplace, count(*) as total_count
FROM lakeformation_tutorial_row_security.amazon_reviews
GROUP BY marketplace
SQL

次のスクリーンショットは、クエリの結果を示しています。marketplace 列には 5 つの異なる値があります。以降の手順では、marketplace 列を使用して行ベースのフィルタを設定します。

データフィルタを設定する

まず、米国のマーケットプレイスを担当するアナリスト用と、日本のマーケットプレイスを担当するアナリスト用の 2 つの異なるデータフィルタを作成してみましょう。これにより、ユーザーにそれぞれの権限が付与されます。

米国のマーケットプレイスデータのフィルタを作成する

まず、米国のマーケットプレイスデータのフィルタを設定しましょう。

  1. DatalakeAdmin ユーザーとして、Lake Formation コンソールを開きます。
  2. Data filters を選択します。
  3. Create new filter を選択します。
  4. Data filter nameamazon_reviews_US と入力します。
  5. Target database で、データベース lakeformation_tutorial_row_security を選択します。
  6. Target table で、テーブル amazon_reviews を選択します。
  7. Column-level access では、デフォルトのままにしておきます。
  8. Row filter expressionmarketplace='US'と入力します。
  9. Create filter を選択します。

日本のマーケットプレイスデータのフィルタを作成する

別のデータフィルタを作成して、日本のマーケットプレイスのデータへのアクセスを制限しましょう。

  1. Data filters ページで、Create new filter を選択します。
  2. Data filter nameamazon_reviews_JP と入力します。
  3. Target database で、データベース lakeformation_tutorial_row_security を選択します。
  4. Target table で、テーブル amazon_reviews を選択します。
  5. Column-level access は、デフォルトのままにしておきます。
  6. Row filter expressionmarketplace='JP'と入力します。
  7. Create filter を選択します。

米国のデータアナリストにパーミッションを付与する

これで 2 つのデータフィルタが作成できました。次に、これらのデータフィルタを使用して権限をアナリストに付与する必要があります。まず、 DataAnalystUS ユーザーに権限を付与します。

  1. Data lake permissions ページで、Grant を選択します。
  2. PrincipalsIAM users and roles を選択し、ユーザー DataAnalystUS を選択します。
  3. LF tags or catalog resources で、Named Data catalog resources を選択します。
  4. Database で、データベースの lakeformation_tutorial_row_security を選択します。
  5. Table – optional で、テーブル amazon_reviews を選択します。
  6. Data filters – optional で、Samazon_reviews_US を選択します。
  7. Data filter permissions で、Select を選択します。
  8. Grant を選択します。

次のスクリーンショットは、パーミッションの構成時にテーブルにアタッチできる使用可能なデータフィルタを示しています。

日本のデータアナリストに権限を付与する

次に、次の手順を実行して、ユーザー DataAnalystJP の権限を設定します:

  1. Data lake permissions ページで、Grant を選択します。
  2. PrincipalsIAM users and roles を選択し、ユーザー DataAnalystJP を選択します。
  3. LF tags or catalog resources で、Named data catalog resources を選択します。
  4. Database で、データベースの lakeformation_tutorial_row_security を選択します。
  5. Table – optional で、テーブル amazon_reviews を選択します。
  6. Data filters – optionalで、amazon_reviews_JP を選択します。
  7. Data filter permissions で、Select を選択します。
  8. Grant を選択します。

データフィルタを使用したクエリ

製品レビューテーブルにデータフィルタが設定されたので、いくつかのクエリを実行して、Lake Formation によるパーミッションの適用を確認する準備が整いました。この記事の執筆時点では行レベルのセキュリティはプレビューであるため、AmazonAthenaLakeFormation という名前の特別な Athena ワークグループを作成し、使用するように切り替える必要があります。詳細については、ワークグループの管理を参照してください。

DataAnalystUS ユーザーを使用して Athena コンソールにサインインし、 AmazonAthenaLakeFormationワークグループに切り替えます。次のクエリを実行して、先ほど定義した行レベルのパーミッションに基づいてフィルタリングされるいくつかのレコードを取得します:

SELECT * 
FROM lakeformation_tutorial_row_security.amazon_reviews
LIMIT 10
SQL

データベース名の前にある、lakeformation. のプレフィクスに注意してください。これはプレビューのみに必要です。

次のスクリーンショットは、クエリを実行した結果です。

同様に、クエリを実行して、マーケットプレイスごとのレコードの総数をカウントします:

SELECT marketplace, count(*) as total_count
FROM lakeformation_tutorial_row_security.amazon_reviews
GROUP BY marketplace 
SQL

次のスクリーンショットは、クエリの結果を示しています。結果には、マーケットプレイスが US の行のみが表示されます。これは、クエリを実行したユーザーが marketplace 列の値が US と等しい行のみを表示できる権限を持っているからです。

DataAnalystJP ユーザーに切り替えて、同じクエリを実行します:

SELECT * 
FROM lakeformation_tutorial_row_security.amazon_reviews
LIMIT 10
SQL

次のスクリーンショットは、クエリを実行した結果です。すべてのレコードは JP マーケットプレイスに属しています。

次のクエリを実行して、マーケットプレイスごとのレコードの総数をカウントします:

SELECT marketplace, count(*) as total_count
FROM lakeformation_tutorial_row_security.amazon_reviews
GROUP BY marketplace
SQL

次のスクリーンショットは、クエリの結果を示しています。ここでも、 JP マーケットプレイスの行のみが返されます。

クリーンアップ

最後のステップで、リソースをクリーンアップします。

  1. CloudFormation スタックを削除します。
  2. Athena ワークグループ AmazonAthenaLakeFormation を削除します。

まとめ

この記事では、Lake Formation の行レベルのセキュリティによって、データを複製したり、ビューなどの複雑な代替手段を管理したりすることなく、データアクセスを制御する方法を説明しました。Lake Formation データフィルタによって、行レベルのパーミッションの作成、管理、および制御をシンプルかつ簡単に行うことができる方法を実証しました。

特定のセルに対するパーミッションを付与する場合は、行フィルタの式に加えて、データフィルタで列を含めたり除外することができます。セルフィルタの詳細については、パート 4: セルレベルおよび行レベルのセキュリティを実装する を参照してください。

原文はこちらです。
本ブログは Solutions Architect の宮田が翻訳しました。