Skip to content

確認問題|Professional ⑤ セキュリティ・コンプライアンス(配点 10%)

教材 05-security-compliance.md の内容に基づく確認問題です(全10問)。 まず問題を解き、下の「解答・解説」で答え合わせをしてください。

問題

Q1.(シナリオ)3 つの要件がある。(a) 特定の 1 テーブルだけに、そのテーブル固有のロジックで行制限をかけたい。(b) 数十のテーブルに一貫した列マスクを適用し、今後 pii タグを付けた新規テーブルにも自動適用したい。ポリシー作成者とデータスチュワードの職務も分離したい。(c) ベーステーブルにアクセスできないアナリストグループに、複数テーブルを結合し一部を編集したバージョンを公開したい。適切なメカニズムの組み合わせはどれか。

  • A. (a) 動的ビュー、(b) テーブルレベル列マスク、(c) ABAC ポリシー
  • B. (a)(b)(c) すべてテーブルレベルの行フィルター/列マスクで実装するのが Databricks の推奨である
  • C. (a) テーブルレベルの行フィルター(ALTER TABLE ... SET ROW FILTER)、(b) ABAC ポリシー(CREATE POLICY、管理タグベースで自動適用・テーブル所有者はオーバーライド不可)、(c) 動的ビュー
  • D. (a) ABAC ポリシー、(b) 動的ビュー、(c) テーブルレベル行フィルター

Q2. 行フィルターと列マスクの定義と個数制約について、正しい説明はどれか。

  • A. 行フィルターはクエリ時に各行を評価する SQL UDF で、関数が FALSE を返した行がクエリ結果から除外される。各テーブルに設定できる行フィルターは 1 つだけ。列マスクは列の値を入力に取り元の値かマスク済みの値を返す SQL UDF で、戻り値の型は列のデータ型と一致またはキャスト可能である必要があり、各列は 1 つのマスクだけを持てる(USING COLUMNS で他の列を入力に取れる)
  • B. 行フィルターは TRUE を返した行を除外し、1 テーブルに複数設定できる
  • C. 列マスクの戻り値型は任意で、列の型と無関係に指定できる
  • D. 行フィルターも列マスクも 1 テーブル/1 列につき複数設定でき、指定順に評価される

Q3. 行フィルター/列マスク付きテーブルにアクセスするためのコンピューティング要件(DBR バージョン)として、正しいものはどれか。

  • A. どのアクセスモードでも DBR 10.4 LTS 以降で読み書きできる
  • B. 専用アクセスモードでは DBR 13.3 LTS 以降で読み書きが可能である
  • C. DBR 12.2 LTS 未満では読み取りだけが可能で、書き込みだけがブロックされる
  • D. 標準アクセスモードは DBR 12.2 LTS 以降専用アクセスモードは DBR 15.4 LTS 以降(かつワークスペースでサーバーレスコンピューティングが有効。FGAC はサーバーレス上で実行されるため課金が発生し得る)。専用アクセスモードでは DBR 15.4〜16.2 は読み取り操作のみで、INSERT / UPDATE / DELETE などの書き込みは DBR 16.3 以降が必要。DBR 12.2 LTS より前は非サポートで「安全に失敗(fail safe)」=アクセスしてもデータが返らない

Q4. 行フィルター関数を完全に削除したい。正しい手順はどれか。

  • A. DROP FUNCTION <function_name>; を実行すれば、テーブルの参照は自動的にクリーンアップされる
  • B. まず ALTER TABLE <table_name> DROP ROW FILTER; でテーブルからフィルターを外し、その後 DROP FUNCTION <function_name>; を実行する。順序を逆にすると(関数を先に削除すると)テーブルにアクセスできなくなり、その場合は DROP ROW FILTER で孤立参照を削除する
  • C. ALTER TABLE ... SET ROW FILTER NONE; を実行してから関数を削除する
  • D. テーブルを REPLACE TABLE で作り直せばフィルターが外れるので、その後に関数を削除する

Q5.(シナリオ)regionSTRING 型のテーブルに対し、パラメーターを誤って INT で宣言した行フィルター関数を割り当てた。spark.sql.ansi.enabled = false の環境で起きることと推奨対処はどれか。

  • A. 型が違うため ALTER TABLE ... SET ROW FILTER の時点でエラーになり、割り当て自体が失敗する
  • B. Databricks が自動的にパラメーター型を列型に合わせて修正するため、問題は起きない
  • C. Databricks は暗黙的にキャストし、キャスト不能な値はサイレントに NULL に変換されエラーが出ない。結果として「全行を返す行フィルター」や「誤った値をマスクする列マスク」など誤った結果を生む。Databricks は ANSI モード有効(spark.sql.ansi.enabled = true)を推奨しており、キャスト失敗時にエラーになって問題がすぐ顕在化する。UDF のパラメーター型は列型と一致させる
  • D. ANSI モードが無効なので、フィルターは全行を除外して結果が空になる

Q6. 動的ビューで使う関数と、そのベストプラクティスについて正しいものはどれか。

  • A. Unity Catalog のデータでは is_member() を使うのが推奨で、is_account_group_member() はレガシ関数である
  • B. is_account_group_member('group') は現在のユーザーがそのアカウントレベルグループのメンバーなら TRUE を返し、Unity Catalog データの動的ビューで推奨される。is_member() は Hive メタストア互換用でアカウントレベルのグループメンバーシップを評価しないため UC データのビューでは使わない。また動的ビューを使うときは、ビューで参照される元テーブル・元ビューをユーザーが直接読み取れないようにする(そうしないと迂回される)
  • C. 動的ビューでは session_user() / current_user() は使えず、グループ判定関数のみが使える
  • D. 動的ビューは元テーブルへの読み取り権限を持つユーザーにのみ公開すべきである

Q7. 次の ABAC ポリシーについて、各句の役割の説明として正しいものはどれか。

sql
CREATE POLICY mask_ssn
ON SCHEMA prod.customers
COLUMN MASK ssn_to_last_nr
TO us_analysts EXCEPT admins
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn
ON COLUMN ssn
USING COLUMNS (4);
  • A. ON SCHEMA はポリシーをアタッチするスコープ(配下の全テーブルに対して評価)。TO は適用対象プリンシパル、EXCEPT は除外プリンシパル(除外者はマスクされず完全なデータを見られる)。MATCH COLUMNShas_tag / has_tag_value で対象列を識別しエイリアスを付ける句で最大 3 つまで持てる。ON COLUMN はマスク対象の一致列をエイリアスで指定し、USING COLUMNS は UDF に渡す引数(エイリアスまたは定数リテラル)
  • B. TOEXCEPT は同義で、どちらもポリシー適用対象を表す
  • C. MATCH COLUMNS はテーブルを選択する句で、列を選択するのは WHEN 句である
  • D. USING COLUMNS にはテーブル名を渡し、ON COLUMN には定数リテラルを渡す

Q8. 行フィルター/列マスクの制限事項として、教材の記述に当てはまらないものはどれか。

  • A. 行レベルセキュリティや列マスクをビューに適用することはできない
  • B. タイムトラベルは行/列マスクでは機能せず、深いクローン・浅いクローンもサポートされない
  • C. Delta Lake API はサポートされず、ポリシーを含むテーブル内ファイルへのパスベースアクセスも非サポート。行フィルター/列マスク付きテーブルから AI Search インデックスは作成できない
  • D. 列マスクは生成された列(generated column)が参照する列にも適用でき、REPLACE TABLE を実行すると行フィルターと列マスクは必ず削除される

Q9. Python で書いたマスクロジックを列マスクとして使いたい。正しい方法とパフォーマンス上の注意はどれか。

  • A. Python UDF を直接 SET MASK に指定できるが、実行が遅いだけである
  • B. Python UDF は列マスクには一切使えないため、必ず SQL の CASE 式で書き直す必要がある
  • C. Python UDF を直接列マスクに指定すると [ROUTINE_NOT_FOUND] エラーになるため、SQL 関数でラップしてそのラッパーを列マスクとして適用する。パフォーマンス面では Python UDF より SQL を優先(Python UDF は低速で最適化機会が少ない)、単純な CASE 式を使う、大きなテーブルでの個別マスク数を制限する、UDF 引数の数を減らす、AND 結合が多すぎる行フィルターを避ける、try_divide のようにエラーを送出しない決定的な式を使う(エラーはフィルター/マスク前の値の情報漏えいにつながりプッシュダウンを妨げる)などが推奨される
  • D. Python UDF を使う場合は NONDETERMINISTIC としてマークするのが推奨である

Q10. Azure Databricks のセキュリティ 5 本柱と機能の対応、および監査について正しいものはどれか。

  • A. カスタマーマネージドキー(CMK)は「認証とアクセス制御」、JIT プロビジョニングは「データセキュリティと暗号化」に属する
  • B. 5 本柱は「認証とアクセス制御(SSO / JIT プロビジョニング、PAT の監視・管理、ワークスペースオブジェクトのアクセス制御)」「ネットワーク(プライベート接続、サーバーレス エグレス制御、ストレージファイアウォール、VNet インジェクション)」「データセキュリティと暗号化(保存中/転送中の暗号化、CMK、クラスターノード間トラフィックの暗号化、資格情報の編集=redaction)」「シークレット管理(Spark conf / 環境変数のシークレット)」「コンプライアンス(コンプライアンスセキュリティプロファイル、拡張セキュリティ監視、HIPAA など)」。管理タグと ABAC ポリシー操作は system.access.audit システムテーブルに記録されるcreatePolicy / deletePolicy / createEntityTagAssignment など)
  • C. ABAC ポリシー操作は監査ログに記録されないため、変更履歴は別途手動で管理する必要がある
  • D. サーバーレス エグレス制御は「コンプライアンス」の柱に属し、拡張セキュリティ監視は「ネットワーク」の柱に属する

解答・解説

Q1. 正解: C 判断軸は明快である。1 テーブルだけ、テーブル固有のロジック → テーブルレベルの行フィルター/列マスク(ALTER TABLE でテーブル所有者または MANAGE 保有者が管理)。多数のテーブルに一貫したルール、職務分離、タグ付き新規テーブルの自動カバレッジABAC ポリシー(Databricks 推奨。カタログ/スキーマにアタッチし管理タグに基づき自動適用され、上位管理者が定義するためテーブル所有者はオーバーライド/削除できず、ポリシーロジックはテーブル固有 UDF より効率的に評価される)。ベーステーブルにアクセスできないユーザーに加工・結合・編集済みバージョンを公開 → 動的ビュー。B は Databricks が多数テーブルには ABAC を推奨している点で誤り。

Q2. 正解: A 行フィルターはクエリ時に各行を評価する SQL UDF で、関数が FALSE を返した行がクエリ結果から除外される(B が誤り)。各テーブルに設定できる行フィルターは 1 つだけで、0 個以上の入力パラメーターを取り各パラメーターはテーブルの 1 列にバインドされる。列マスクは列の値を入力に取り元の値かマスク済みの値を返す SQL UDF で、戻り値の型は列のデータ型と一致またはキャスト可能でなければならない(C が誤り)。各列は 1 つのマスクだけを持てるが、USING COLUMNS で他の列を入力に取り複数の属性に基づいて動作を変えられる。D は個数制約に反する。

Q3. 正解: D 行フィルター/列マスクは SQL ウェアハウスで利用でき、標準アクセスモード(旧・共有アクセスモード)は DBR 12.2 LTS 以降専用アクセスモード(旧・シングルユーザーアクセスモード)は DBR 15.4 LTS 以降(かつワークスペースでサーバーレスコンピューティングが有効であること。FGAC はサーバーレス上で実行されるため課金が発生し得る)。DBR 15.3 以下の専用コンピューティングからは読み取れない。専用アクセスモードでは DBR 15.4〜16.2 は読み取り操作のみサポートで、書き込み(INSERT / UPDATE / DELETE)は DBR 16.3 以降が必要(MERGE INTO などサポートされたパターンを使う)。DBR 12.2 LTS より前は非サポートで「安全に失敗(fail safe)」=テーブルにアクセスしてもデータが返らない(C が誤り)。

Q4. 正解: B 関数を完全に削除する場合は、必ず先に ALTER TABLE <table_name> DROP ROW FILTER;(列マスクなら ALTER TABLE ... ALTER COLUMN <col> DROP MASK;)でテーブルから外し、その後 DROP FUNCTION <function_name>; を実行する。順序を逆にして関数を先に DROP FUNCTION するとテーブルにアクセスできなくなり、その場合は DROP ROW FILTER で孤立参照を削除して復旧する(A が誤り)。C の SET ROW FILTER NONE という構文はなく、削除は DROP ROW FILTER。D については、REPLACE TABLE を実行してもスキーマ変更に関係なく既存の行フィルターは保持され、新テーブルにマスク付き列と同名の列があれば列マスクも保持される(誤消去防止)ため誤り。

Q5. 正解: C UDF のパラメーター型は渡されるテーブル列のデータ型と一致させる必要がある。型が違うと Databricks は暗黙的にキャストし、ANSI モード無効(spark.sql.ansi.enabled = false)ではキャスト不能値がサイレントに NULL に変換されエラーが出ない。公式例では STRING 列を INT パラメーターに渡した RETURN dept IS NULL のフィルターが、キャスト不能値が NULL になることで true を返し、結果として全行が返ってしまう(=フィルターが無効化される)。Databricks は ANSI モード有効を推奨しており、キャスト失敗時にエラーになるため問題がすぐ顕在化する。A・B のような割り当て時の検証や自動修正は行われない。

Q6. 正解: B 動的ビューで使う関数は session_user()(現在のユーザーのメールアドレス、current_user() も同様に呼び出し元判定に使える。C が誤り)と is_account_group_member('group')(アカウントレベルグループのメンバーなら TRUEUnity Catalog データの動的ビューで推奨)。is_member('group') は既存の Hive メタストア互換用で、アカウントレベルのグループメンバーシップを評価しないため UC データのビューでは使わない(A が逆)。ベストプラクティスは、ビューで参照される元テーブル・元ビューをユーザーが直接読み取れないようにすること(読めてしまうとビューを迂回されるため)。D はこの原則と逆。

Q7. 正解: A ABAC ポリシーの主要句は、ON { CATALOG | SCHEMA | TABLE }(アタッチするスコープ。子孫の全テーブルに対して評価される)、ROW FILTER / COLUMN MASK(ポリシー種別とロジック UDF)、TO principal(適用対象。All account users で全員)、EXCEPT principal除外プリンシパル。除外者はフィルター/マスクされず、変更されていない完全なデータを見られるので B は誤り)、FOR TABLES(対象種別)、WHEN conditionタグに基づき適用テーブルを決めるブール式。has_tag / has_tag_value、省略時の既定は TRUE)、MATCH COLUMNS condition [AS alias]対象列を識別する条件。最大 3 つまで持て、すべて一致で適用。C はテーブル選択と列選択が逆)、ON COLUMN alias(列マスクでマスク対象の一致列をエイリアス参照)、USING COLUMNS (...)(UDF に渡す引数。MATCH COLUMNS のエイリアスまたは定数リテラル。D が誤り)。

Q8. 正解: D 「当てはまらないもの」を選ぶ設問。教材の制限では、列マスクは生成された列(generated column)が参照する列には適用できない(D の前半が誤り)。また REPLACE TABLE を実行してもスキーマ変更に関係なく既存の行フィルターは保持され、新テーブルにマスク付き列と同名の列があれば列マスクも保持される(誤消去防止。D の後半も誤り)。A・B・C はいずれも正しい制限で、他にも「Iceberg REST カタログ/Unity REST API 経由でアクセス不可」「OpenSharing の制約」「MERGE は入れ子・集計・ウィンドウ・LIMIT・非決定的関数を含むポリシーを持つテーブルで非サポート」「DBR 17.2 より前はパーティション列にポリシーがあるパーティションテーブルの DELETE / UPDATE / MERGE が非サポート」「循環依存不可」「アクティブなフィルター/マスクを含む別テーブルを参照できない」などがある。

Q9. 正解: C Python UDF を列マスクに使うには SQL 関数でラップする必要があり、Python UDF を直接指定すると [ROUTINE_NOT_FOUND] エラーになる(A が誤り、B も「一切使えない」は誤り)。パフォーマンス推奨は、行フィルター/列マスクでは情報漏えい防止のため常に「安全な選択」がなされ最適化が抑制され得ることを踏まえて、①単純な UDF(マッピングテーブルやサブクエリより単純な CASE 式)、②大きなテーブルでの個別の列マスク数を制限(各マスクがクエリ中に評価される)、③UDF 引数の数を減らす(引数由来の列参照はクエリで未使用でも最適化できない)、④AND 結合が多すぎる行フィルターを避ける、⑤エラーを送出しない決定的な式try_divide など。ANSI 除算のようにエラーになるとフィルター/マスク前の値情報が漏れるためプッシュダウンできない)、⑥Python UDF より SQL を優先(使う場合は必要に応じて DETERMINISTIC とマーク。D が誤り)。

Q10. 正解: B セキュリティは 5 本柱で整理する。①認証とアクセス制御(SSO / JIT プロビジョニング、PAT の監視・管理、ワークスペースオブジェクトへのきめ細かいアクセス制御)、②ネットワーク(プライベート接続、サーバーレス エグレス制御=ネットワークポリシー、Azure Storage ファイアウォール、VNet インジェクション)、③データセキュリティと暗号化(保存中/転送中の暗号化、CMK、クラスターワーカーノード間トラフィックの暗号化、資格情報の編集=redaction)、④シークレット管理(Spark conf / 環境変数のシークレット、シークレットワークフロー)、⑤コンプライアンス(コンプライアンスセキュリティプロファイル=セキュリティベースライン、拡張セキュリティ監視、HIPAA 等)。A・D は柱の対応が入れ替わっているため誤り。管理タグと ABAC ポリシー操作は system.access.audit に記録されるcreateEntityTagAssignment / deleteEntityTagAssignment / createPolicy / deletePolicy / getPolicy / listPolicies など)ので C も誤り。