風柳メモ

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

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.の手段をとってしまうと、当該データソースの情報が外部に漏出してしまう可能性が出てきてしまうため、特に機密情報等が含まれていた場合には深刻なリスクとなってしまいます。

f:id:furyu-tei:20220120145043p:plain
不適切なプライベートレベルの設定に伴うリスク

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

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

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

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

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

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

f:id:furyu-tei:20220119134559p:plain
グローバルのプライバシーレベル

の設定を

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

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

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

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

f:id:furyu-tei:20220119130739p:plain
プライバシーレベルの設定ダイアログ

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

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

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

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

特に、

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

ように留意しましょう。

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

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

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

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

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


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

リスクの生じうる具体例

前提

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

f:id:furyu-tei:20220118220400p:plain
シチュエーション

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

f:id:furyu-tei:20220118222353p:plain
CSVファイルから読み込んだデータ
データベースのテーブル(t_holiday)
f:id:furyu-tei:20220118222412p:plain
データベースのテーブルから読み込んだデータ

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

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

f:id:furyu-tei:20220118221326p:plain
グローバルなプライバシーレベルの設定

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

f:id:furyu-tei:20220118223111p:plain
CSVファイルのプライバシーレベル(初期状態)

f:id:furyu-tei:20220118223157p:plain
データベース上のテーブルのプライバシーレベル(初期状態)

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

CSVファイル用のクエリ

f:id:furyu-tei:20220118224916p:plain
CSVファイル用のクエリ(直接指定)

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

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

f:id:furyu-tei:20220118225609p:plain
プライバシーレベルのダイアログ

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

f:id:furyu-tei:20220118225731p:plain
プライバシーレベルの設定

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

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

CSVファイル用のクエリ

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

f:id:furyu-tei:20220118224218p:plain
シートと名前定義の状態

定義した名前をPower Queryのクエリ中で指定しています。
f:id:furyu-tei:20220118224953p:plain
CSVファイル用のクエリ(間接指定)

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

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

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

保存してみたのですが、
f:id:furyu-tei:20220118230333p:plain
Formula.Firewallの警告

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

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

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

f:id:furyu-tei:20220118230715p:plain
間接指定時のデータソース設定

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

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

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

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

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

f:id:furyu-tei:20220118231417p:plain
データのプライバシーに関する情報が必要

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

のように変わりました。

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

f:id:furyu-tei:20220118230113p:plain
プライバシーレベルのダイアログ

今度は、

f:id:furyu-tei:20220118232018p:plain
プライバシーレベルのチェックを無視

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

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

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

f:id:furyu-tei:20220119092744p:plain
プライバシーレベルを全てパブリックに設定

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

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

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

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

直接指定時

f:id:furyu-tei:20220118235155p:plain
直接指定時(プライバシーレベルを適切に設定した場合)

f:id:furyu-tei:20220119004035p:plain
クエリのオプション>現在のブックのプライバシーレベル

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

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

間接指定時

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

f:id:furyu-tei:20220119004302p:plain
クエリのオプション>現在のブックのプライバシーレベル

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

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

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

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

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

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

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

のように、

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

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

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

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

f:id:furyu-tei:20220119083509p:plain
プライバシーレベルの設定を促すダイアログ

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

留意点

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

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

参考