Lake Formation でのデータフィルタリングとセルレベルのセキュリティ - AWS Lake Formation

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Lake Formation でのデータフィルタリングとセルレベルのセキュリティ

Data Catalog テーブルに対する Lake Formation 許可を付与するときは、クエリ結果、および Lake Formation と統合されたエンジン内の特定のデータへのアクセスを制限するためのデータフィルタリング仕様を含めることができます。Lake Formation は、列レベルのセキュリティ、行レベルのセキュリティ、およびセルレベルのセキュリティを実現するために、データフィルタリングを使用します。ソースデータにネストされた構造が含まれている場合は、ネストされた列にデータフィルターを定義して適用できます。

Lake Formation のデータフィルタリング機能により、以下のレベルのデータセキュリティを実装することができます。

列レベルのセキュリティ

列レベルのセキュリティ (列フィルタリング) を使用して Data Catalog テーブルに対するアクセス許可を付与すると、ユーザーはそのテーブル内でアクセスが許可されている特定の列とネストされた列のみを表示できます。大規模な多地域通信会社向けの複数のアプリケーションで使用される persons テーブルについて考えてみましょう。列フィルタリングを使用して Data Catalog テーブルに対するアクセス許可を付与すると、人事部門に勤務していないユーザーが、社会保障番号や生年月日などの個人を特定できる情報 (PII) を表示できなくなる可能性があります。セキュリティポリシーを定義して、ネストされた列の一部のサブ構造のみへのアクセスを許可することもできます。

行レベルのセキュリティ

Data Catalog テーブルに対する行レベルのセキュリティ (行フィルタリング) を伴う許可の付与は、ユーザーがそのテーブル内でアクセス権を持っている特定のデータの行のみを表示できるようにします。フィルタリングは、1 つ、または複数の列の値に基づいて行われます。行フィルター式を定義するときに、ネストされた列構造を含めることができます。例えば、この通信会社の異なる地域支社にそれぞれ独自の人事部門がある場合、人事部門の従業員が表示できる個人情報記録を、その地域の従業員の記録のみに制限することができます。

セルレベルのセキュリティ

セルレベルのセキュリティは、柔軟性に優れた許可モデルのために、行フィルタリングと列フィルタリングを組み合わせます。テーブルの行と列をグリッドとして考えると、セルレベルのセキュリティを使用することによって、行と列の二次元上にあれば、どこでもグリッドの個々の要素 (セル) へのアクセスを制限することができます。つまり、行に応じて異なる列へのアクセスを制限することができます。これは、制限された列に色が付けられた以下の図に表されています。

5つの 行と 6 つの列で構成されたグリッドが表示されています。行と列には、Col1、Col2、Row1、Row2 などのヘッダーがあります。R3 と C1、R3 と C2、R3 と C3、R5 と C1、R5 と C2、R5 と C5、R5 と C6 の座標のグリッドセルに色が付けられています。

個人情報テーブルの例を引き続き使用すると、国の列が「英国」に設定されている行の住所列へのアクセスを制限するが、国の列が「米国」に設定されている行の住所列へのアクセスは許可するというデータフィルターをセルレベルで作成することができます。

フィルターは読み取り操作のみに適用されます。このため、付与できるのはフィルターを伴う SELECT Lake Formation 許可のみになります。

ネストされた列のセルレベルのセキュリティ

Lake Formationでは、ネストされた列のセルレベルのセキュリティを使用してデータフィルターを定義して適用できます。ただし、Amazon Athena 、Amazon 、Amazon Redshift Spectrum などの統合分析エンジンはEMR、行および列レベルのセキュリティを備えた Lake Formation マネージドネストテーブルに対するクエリの実行をサポートしています。

制限事項については、「データフィルタリングの制限事項」を参照してください。

Lake Formation でのデータフィルター

データフィルターを作成することで、列レベル、行レベル、およびセルレベルのセキュリティを実装することができます。データフィルターは、テーブルに対する SELECT Lake Formation 許可を付与する時に選択します。テーブルにネストされた列構造が含まれている場合は、子列を含めるか除外するかしてデータフィルターを定義できます。また、ネストされた属性に対して行レベルのフィルター式を定義できます。

各データフィルターは、Data Catalog 内の特定のテーブルに属します。データフィルターには、以下の情報が含まれています。

  • フィルター名

  • フィルターに関連付けられたテーブルIDsのカタログ

  • テーブル名

  • テーブルが含まれるデータベースの名前

  • 列の指定 – クエリ結果に含めたり、クエリ結果から除外したりする列およびネストされた列 (struct データ型) のリスト。

  • 行フィルター式 – クエリ結果に含める行を指定する式。制限はいくつかありますが、この式には PartiQL 言語の WHERE 句の構文があります。すべての行を指定するには、コンソールで行レベルのアクセスすべての行へのアクセスを選択するか、API通話AllRowsWildcardで を使用します。

    行フィルター式で何がサポートされるかに関する詳細については、「行フィルター式での PartiQL のサポート」を参照してください。

得られるフィルターのレベルは、データフィルターの設定方法に応じて異なります。

  • 「全列」ワイルドカードを指定して、行フィルター式を提供する場合は、行レベルのセキュリティ (行フィルタリング) のみを確立することになります。

  • 特定の列およびネストされた列を含めるか除外し、全行ワイルドカードを使用して「すべての行」を指定すると、列レベルのセキュリティ (列フィルタリング) のみを設定することになります。

  • 特定の列を包含または除外するとともに、行フィルタリング式も指定するという場合は、セルレベルのセキュリティ (セルフィルタリング) を確立することになります。

Lake Formation コンソールからの以下のスクリーンショットは、セルレベルのフィルタリングを実行するデータフィルターを示しています。これは、orders テーブルに対するクエリについて、customer_name 列へのアクセスを制限し、クエリ結果は product_type 列に 'pharma' が含まれる行のみを返します。

データフィルターウィンドウには、縦向きに配置された [Data filter name] (データフィルター名)、[Target database] (ターゲットデータベース)、[Target table] (ターゲットテーブル)、[Access to all columns] (すべての列にアクセス) と [Include columns] (列を含める) と [Exclude columns] (列を除外する) のオプションがあるオプションボタンのグループ、[Select columns] (列の選択) (ドロップダウンリスト)、および [Row filter expression] (行フィルター式) (複数行のテキストボックス) のフィールドが含まれています。[Exclude columns] (列を除外する) オプションが選択され、customer_name 列が除外対象として選択されて、[Row filter expression] (行フィルター式) フィールドには 'product_type='pharma' が表示されています。

文字列リテラルを囲むための一重引用符の使用 ('pharma') に注意してください。

Lake Formation コンソールを使用してこのデータフィルターを作成するか、次のリクエストオブジェクトを CreateDataCellsFilter API オペレーションに指定できます。

{ "Name": "restrict-pharma", "DatabaseName": "sales", "TableName": "orders", "TableCatalogId": "111122223333", "RowFilter": {"FilterExpression": "product_type='pharma'"}, "ColumnWildcard": { "ExcludedColumnNames": ["customer_name"] } }

テーブルには、必要な数だけデータフィルターを作成できます。これには、テーブルに対する grant オプション付きの SELECT 許可が必要です。データレイク管理者はデフォルトで、そのアカウント内のすべてのテーブルに対してデータフィルターを作成する許可を持っています。通常、テーブルに対する許可をプリンシパルに付与するときは、使用可能なデータフィルターのサブセットのみを使用します。例えば、データフィルターであるordersテーブルの 2 番目の row-security-only データフィルターを作成できます。上記のスクリーンショットを参考にすると、[Access to all columns] (すべての列にアクセス) オプションを選択して、product_type<>pharma という行フィルター式を含めることができます。このデータフィルターの名前は no-pharma にすることができます。これは、product_type 列が 'pharma' に設定されているすべての行に対するアクセスを制限します。

このデータフィルターの CreateDataCellsFilterAPIオペレーションのリクエストオブジェクトは次のとおりです。

{ "Name": "no-pharma", "DatabaseName": "sales", "TableName": "orders", "TableCatalogId": "111122223333", "RowFilter": {"FilterExpression": "product_type<>'pharma'"}, "ColumnNames": ["customer_id", "customer_name", "order_num" "product_id", "purchase_date", "product_type", "product_manufacturer", "quantity", "price"] }

その後、orders テーブルに対する restrict-pharma データフィルターを伴う SELECT を管理者ユーザーに、orders テーブルに対する no-pharma データフィルターを伴う SELECT を非管理者ユーザーに付与することができます。ヘルスケア部門のユーザーの場合は、orders テーブルに対するすべての行と列への完全なアクセス権を伴う (データフィルターなし) SELECT を付与するか、料金設定情報へのアクセスを制限する別のデータフィルターを使用するものを付与こともできます。

データフィルター内に列レベルと行レベルのセキュリティを指定する際に、ネストされた列を含めるか除外することができます。次の例では、修飾列名 (二重引用符で囲まれた列名) を使用して product.offer フィールドへのアクセスを指定しています。これは、ネストされたフィールドにとって、列名に特殊文字が含まれている場合にエラーが発生するのを防ぎ、最上位の列レベルのセキュリティ定義との下位互換性を維持するために重要です。

{ "Name": "example_dcf", "DatabaseName": "example_db", "TableName": "example_table", "TableCatalogId": "111122223333", "RowFilter": { "FilterExpression": "customer.customerName <> 'John'" }, "ColumnNames": ["customer", "\"product\".\"offer\""] }
以下も参照してください。