テーマ切替
確認問題|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.(シナリオ)region が STRING 型のテーブルに対し、パラメーターを誤って 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 COLUMNSはhas_tag/has_tag_valueで対象列を識別しエイリアスを付ける句で最大 3 つまで持てる。ON COLUMNはマスク対象の一致列をエイリアスで指定し、USING COLUMNSは UDF に渡す引数(エイリアスまたは定数リテラル) - B.
TOとEXCEPTは同義で、どちらもポリシー適用対象を表す - 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')(アカウントレベルグループのメンバーなら TRUE、Unity 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 も誤り。