風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

Power Queryのデータソースを間接的に(相対パスで)指定する場合のプライバシー保護に関するリスクについて

Power Queryにおいて、CSVファイル等のデータソースを間接指定する(相対パスを使う)ことはプライバシー保護上のリスク(情報漏えい)が発生しうるために一般には推奨されないという話題をみかけたのですが、では「どうして間接指定をすると(相対パスを使うと)リスクが発生するのか?」その理由について、簡単な具体例を交え備忘録として記事にしておきます。
また、Power Queryにおけるプライバシーレベルに関して、望ましいと思われる設定(ポリシー)についても自分が把握できた範囲で言及してあります。



概要

Power Queryを用いてCSVファイル等からデータを取得する場合には通常、データソース(対象ファイルの場所)を絶対パス("D:\Path\To\Data.csv"のような形)で直接指定する必要があります。

これだと、たとえばAさんが使っていたエクセルファイルをBさんのPCに持っていくようなケースでは、Bさんの環境にあわせてパスを書き換える必要があったりして不便なため、
データソースとなるファイルは、Power Queryを設定したワークブック(エクセルファイル)と同じ場所に置く
といったルールを定めた上で、
データソースをワークブックからの相対パスで間接的に指定
したくなります。
対象のファイル名("Data.csv"のようなもの)だけを決めておいて、ThisWorkbook.Path & "\Data.csv"のようにして組み立てたパスをPower Queryに渡してやるイメージです

実際、例えばこちらの記事に書かれているように、CSVファイル等のデータソースのパスをワークブックの名前定義を介してPower Queryに受け渡す手法等を用いて、間接的に指定することは可能です。

ワークブックと同じところに置かれたCSVファイル(例えば商品マスターと売上データ)のみをPower Queryで読み込んだり結合等の加工を行うといった用途なら、外部とのやり取りは発生しないため、このような手法(間接指定)をとっても特に問題は生じないと考えられます。
もしこのケースでもリスクが発生しうるということであれば、ご指摘願います

ところが、この手法を用いると、
データソースに対するプライバシーレベルを直接設定することができない
という制限が生じます。

この際、Power Query エディターの「データソース設定」を見ると

⚠ 手動で作成したクエリのため、一部のデータ ソースが一覧に表示されない可能性があります。

のように表示されますので、データソースが動的に変更されること自体は予め想定されており、その上で注意を促しているようですね

プライバシーレベルを直接設定できないデータソースが存在すると、例えばその中に含まれるデータを元にして異なる場所(信頼できる領域の外)にあるデータベース等の別のデータソースとの間でデータをマージ(結合)したい場合には

  1. プライバシーレベルのチェックを無視する設定にする
  2. 全てのプライバシーレベルを「パブリック」にする
  3. ワークブックおよびデータソースが存在するフォルダ/ドライブのプライバシーレベルを「組織」に設定する(後述)

のいずれかにする必要が出てきます。

このとき、安易に1.や2.の手段をとってしまうと、当該データソースの情報が外部に漏出してしまう可能性が出てきてしまうため、特に機密情報等が含まれていた場合には深刻なリスクとなってしまいます

不適切なプライベートレベルの設定に伴うリスク

フォルダ/ドライブに対するプライバシーレベル設定について(2022/01/19追記)

CSVファイル等のデータソースをワークブックと同じところに置いているという条件ならば、
ワークブックと、それが置かれているフォルダ/ドライブのプライバシーレベルを「組織」に設定する
ことで、プライバシーレベルが「パブリック」のデータベース等への情報送出は制限しつつ、データのマージが可能なようです(詳細は後述)
組織内で適切な運用ができるのであれば、間接(相対パス)指定しているデータを元にパブリックなデータソースとマージすることも選択肢として取りうるのかも知れません。
この場合に別のリスク等が発生しうるのかについてまでは検証できていませんが、少なくとも本来「プライベート」に設定すべきデータソースに関しては、間接(相対パス)指定は避けるべきではあるでしょう

プライバシー保護(情報漏えいの防止)の観点からの望ましい設定と運用(ポリシー)(2022/01/19追記)

調べた範囲で、 プライバシー保護(情報漏えいの防止)の観点から望ましいと思われるポリシーについて記載しておきます。

クエリのオプションのグローバルプライバシーレベルの設定

データ>データの取得>クエリオプション>グローバル>セキュリティにおいて、プライバシーレベル

グローバルのプライバシーレベル

の設定を

  1. 常に各ソースのプライバシー レベル設定に従ってデータを結合します
  2. 各ファイルのプライバシー レベル設定に従ってデータを結合します

のどちらかにしておきます(「常にプライバシー レベル設定を無視します」は選択しないようにします)。
なお、1.と2.の違いですが、1.を選択しておくと、現在のブック>プライバシーでは設定がグレーアウトされ(プライバシーレベルを無視する設定にできない)、個別のクエリについても「プライバシーレベルのチェックを無視…」にチェックを入れて保存したとしてもこれは無効化されるようです。

クエリのプライバシーレベルは適切な設定を!

クエリのマージを行う場合などには、必要に応じてプライバシーレベルの設定ダイアログが表示されます。

プライバシーレベルの設定ダイアログ

これは、Power Queryが
「データの一部(照合列として指定した列の情報など)を使って問い合わせればクエリの効率化はできるけれど、そうするとその情報を相手に渡さないといけないから、プライバシー上問題がある(データが漏洩する)可能性がありますよ、どうしますか? 」
と尋ねてきているイメージです。
逆に、上記のグローバルプライバシーレベルが適切に設定されていて、かつ、プライバシーレベルの設定ダイアログが出ないようなら、当該クエリはプライバシー保護の観点からは問題ないものと判断できると思われます

このときには、適切なプライバシーレベルを判断して、保存するようにします。

参考として、プライバシーレベルの組み合わせによる情報送信の有無は次のようになるようです
クエリのマージで結合の種類を「左外部 (最初の行すべて、および 2 番目の行のうち一致するもの)」にした場合
情報送信を「する」となっている組み合わせでは、1番目に指定しているデータソースの情報が送られて問題が無いものかどうか、よく注意する必要があります。

1番目(左(上)側) 2番目(右(下)側) 情報送信 クエリ最適化
プライベート プライベート しない しない
プライベート 組織 しない しない
プライベート パブリック しない しない
組織 プライベート しない しない
組織 組織 する する
組織 パブリック しない しない
パブリック プライベート する する
パブリック 組織 する する
パブリック パブリック する する

特に、

  1. 「このファイルのプライバシー レベルのチェックを無視します」にはチェックを入れない
    プライバシーレベルのチェックは無視しない
  2. 全てを「パブリック」にするといった安易な設定は行わない
    安易にすべてパブリックにしたりしない

ように留意しましょう。

データソースを間接指定することの是非

データソースを相対パスで間接指定すること自体が問題と言うよりも、Formula.Firewallの警告が出てしまうなどしてクエリが動作しないからといって、安易にプライバシーレベルのチェックそのものを無効化したり、すべてをパブリックに設定してしまうようなユーザーの行動(およびそのような設定をリスクの説明をすることなく推奨する記事等)の方に問題があると考えられます。

上述したポリシーを遵守した上で、

  • ワークブックと同じ場所に置いたCSVファイル等のデータソースのみを扱うケース
  • 「組織」(ワークブックと間接指定したデータソースを置くフォルダ)と「パブリック」(外部データソース)のふたつのプライバシーレベルのみで運用可能なケース(※留意点はこちら

であれば、とくに問題はないように思えます。
他にリスクなどが発生するケースがあればご指摘ください


ここからは具体例等です、詳細を知りたい方は御覧ください

リスクの生じうる具体例

前提

プライベートな(ローカルのストレージ上にあって、機密情報を含むような)CSVファイルと、パブリックな場所にあるデータベース上のデータを、Power Queryでマージしてテーブルデータを作成するような場合を想定しています。

シチュエーション

データソースとしては、CSVファイル(202201.csv)と

CSVファイルから読み込んだデータ
データベースのテーブル(t_holiday)
データベースのテーブルから読み込んだデータ

とがあり、これを日付を照合列としてマージし、
マージ設定
一つのテーブルにします。
マージされたデータ
単なる例ですので、データの内容に意味はありません、念のため。

Power Queryのクエリのオプション(データ>データの取得>クエリ オプション)として、プライバシーレベルは「● 各ファイルのプライバシー レベル設定に従ってデータを結合します」の状態になっているものとします。

グローバルなプライバシーレベルの設定

また、各データソースについては、初期のプライバシーレベルは「なし」になっているものとします。

CSVファイルのプライバシーレベル(初期状態)

データベース上のテーブルのプライバシーレベル(初期状態)

絶対パスで指定する場合(直接指定)

CSVファイル用のクエリ

CSVファイル用のクエリ(直接指定)

マージに伴うプライバシーレベルの設定

CSVファイルのクエリとデータベースのクエリとをマージしようとすると、次のようなプライバシーレベルに関するダイアログが表示されました。

プライバシーレベルのダイアログ

これを適切に設定し(CSVファイルについては「プライベート」、データベースについては「パブリック」)、

プライバシーレベルの設定

保存すると、無事目的のテーブルを得ることができました。

相対パスで指定する場合(間接指定)

CSVファイル用のクエリ

ワークシート上と名前定義で次のように間接的にCSVファイルの場所(DateListFilePath)を指定できるようにし、

シートと名前定義の状態

定義した名前をPower Queryのクエリ中で指定しています。
CSVファイル用のクエリ(間接指定)

マージに伴うプライバシーレベルの設定

CSVファイルのクエリとデータベースのクエリとをマージしようとすると、直接指定のときと同じようにプライバシーレベルに関するダイアログが表示されますが、内容が若干異なっていました。

プライバシーレベルのダイアログ
「現在のブック」というものが増えていました。
とりあえず、現在のブックとd:\については「プライベート」、データベースについては「パブリック」に設定して
プライバシーレベルの設定

保存してみたのですが、
Formula.Firewallの警告

Formula.Firewall: クエリ '202201' (ステップ '変更された型') が、同時に使用できないプライバシー レベルの複数のデータ ソースにアクセスしています。このデータの組み合わせを再構築してください。

のような警告が表示されてしまい、テーブルを取得することができません。

また、この状態でデータソース設定を開いてみると、

間接指定時のデータソース設定

手動で作成したクエリのため、一部のデータ ソースが一覧に表示されない可能性があります。

なる警告が表示されています。

やはり、データソースを間接設定すると、当該データソースに対してはプライバシーレベルの設定ができず、このままでは他のデータソースとのデータのマージ(組み合わせ)ができなくなってしまうようです。

間接指定の場合にはプライバシーレベルのチェックを無視する必要あり

先の警告が出たままだと何も出来ないので、とりあえず、一旦データソース設定をもとに戻してみました(すべてのデータソースについてプライバシーレベルを「なし」に変更)。すると、マージしたクエリの警告が

データのプライバシーに関する情報が必要

データのプライバシーに関する情報が必要です。 [続行]

のように変わりました。

[続行]を押すと、改めてプライバシーレベルの設定ダイアログが表示されました。

プライバシーレベルのダイアログ

今度は、

プライバシーレベルのチェックを無視

☑ このファイルのプライバシー レベルのチェックを無視します。プライバシー レベルを無視すると、未承認の人に機微または機密の情報が開示される可能性があります。

の設定にチェックを付けた状態で保存してみます。
すると、ようやく無事に(?)目的のテーブルを得ることができました。

ちなみに、上記のチェックをしなくても全てのプライバシーレベルをパブリックにすることでも

プライバシーレベルを全てパブリックに設定

目的を果たせはしますが、実質プライバシーレベルのチェックを無視するのと変わらないですよね。

直接(絶対パス)指定時と間接(相対パス)指定時のデータの流れの違いと間接指定時のリスクについて

プライバシーレベルのチェックを無視するようにすると、 別のデータソースのあるパブリックな場所にプライベートな(機密情報等を含んだ)データが送られてしまうリスクが有ります。
例えば「SELECT * FROM <パブリックなDB上のテーブル> WHERE secret = <プライベートなデータの照合列の値(機密情報)>」のようなSQLクエリをパブリックなデータベースに対して発行するイメージです

上記の具体例において、直接(絶対パス)指定時と間接(相対パス)指定時にはデータの流れの観点からは次のようになっていると推測されます。

直接指定時

直接指定時(プライバシーレベルを適切に設定した場合)

クエリのオプション>現在のブックのプライバシーレベル

● 各ソースについて、プライバシー レベル設定に合わせてデータを結合します

プライバシーレベルが適切に設定されていれば、機密情報等を含んだデータを不用意に漏洩する危険はなくなります。
ただし、データをマージするためにはいったん全てのデータを取得しておく必要があるため、パフォーマンス的には低下してしまう傾向にあると推測されます(適宜バッファリングはされるようですが)。

間接指定時

間接指定時(プライバシーレベルのチェックを無視しないと動作しないためこうならざるを得ない)(プライバシーレベルのチェックを無視するか全てパブリックにした場合)

クエリのオプション>現在のブックのプライバシーレベル

● プライバシー レベルを無視すると、パフォーマンスが向上する場合があります

データソースのプライバシーレベルを設定することができないため、別のデータソースとマージするためには、プライバシーレベルのチェックを無視する(もしくは全てのプライバシーレベルをパブリックにする)しか有りません→追記:別の回避策もあるようです(後述)
そうすると、必要に応じて別のデータソースにデータが送られることになるため、機密情報等を含んだデータを扱う場合にはリスクが存在することになります。
DBから必要なデータのみ(例ではCSV上に存在する日付だけ)を取得するクエリが発行されることでパフォーマンス的には向上する傾向はあると推測されますが、情報漏洩のリスクとトレードオフの関係にあることに注意が必要です

間接指定時にもプライバシーレベルをうまく設定すれば大丈夫かも?(2022/01/19追記)

はけた@excelspeedupさんよりご指摘があり、

試してみると確かに、間接(相対パス)指定時でも例えば

プライバシーレベルを適切に設定すれば間接(相対パス)指定でもうまくいく(ブックがあるフォルダを指定)

もしくは
プライバシーレベルを適切に設定すれば間接(相対パス)指定でもうまくいく(ドライブ全体を指定)

のように、

  • 対象のワークブックのプライバシーレベルを「組織」に
  • 対象のワークブックが含まれているフォルダ/ドライブ全体(同じフォルダ下にデータソースであるCSVファイルも含まれる前提)のプライバシーレベルを「組織」に
  • 外部のデータベースのプライバシーレベルを「パブリック」に

であれば、プライバシーレベルのチェックを無視せずとも正常にテーブルがマージされました。

なおこの場合(ブックとCSVファイルを)移動やコピーしたり、他の人のところにコピーしたりすると、再度プライバシーレベルの設定が必要になることがあります。

その場合でも、クエリの更新時に出る

プライバシーレベルの設定を促すダイアログ

のようなダイアログにおいて、移動先のフォルダ/ドライブのプライバシーレベルを「組織」に設定するだけですので、ルールをきちんと決めておけばコピー/移動する毎にデータソースを指定し直すよりも運用が楽かも知れません。

留意点

間接(相対パス)指定時にはそのデータソースのプライバシーレベルを「プライベート」にすることは実質的にできないため、少なくとも Microsoftサポートのプライバシー レベルの設定 (Power Query)の項目に書かれている

データソースのプライバシーレベルを設定する
「プライベート」に該当するようなデータソースについては、(それ以外のセキュリティレベルのデータソースとマージ等をする可能性がある場合には)間接指定はしないようにするべきでしょう。

参考