Power BI DesktopからMFA有効化Snowflake（DUO認証）に接続する方法-AUTHENTICATION POLICYを使用する-

# はじめに
Snowflakeにおけるパスワードサインイン時にMFAが段階的にデフォルトになっています。

>これはまた、2024年10月以降に作成される新しいSnowflakeアカウントでは、多要素認証（MFA）がすべてのパスワードサインインのデフォルトになるという前回の発表に続くものでもあります。

https://www.snowflake.com/ja/blog/blocking-single-factor-password-authentification/

しかし、MFA有効化状態（DUOアプリを使用して認証している状態）では、Power BIからの接続時に問題が発生します。

* 接続時にテーブルごとにDUOアプリで認証しなくてはならない
    * 例えば、20テーブル接続するときはアプリで20回認証が必要😅
* 更新時や、スライサー適用時にも影響するテーブル分だけ認証が必要

今回は以上のような課題を解決するために試行錯誤した内容を備忘録としてまとめました。
より良い方法をご存じの方がいらっしゃいましたら情報共有お願いいたします。

▽参考：以下と似たような課題です。

https://community.fabric.microsoft.com/t5/Desktop/Power-BI-and-MFA-And-Snowflake/td-p/2843266

:::note info
以下の解決策は、Power BI Desktop に限らず、Fabric や ADF から Snowflake へ接続する際にも有効である可能性があります。
実際に、Fabric パイプラインを使用して Snowflake へ接続した際には、対策②によって DUO 認証を回避できました。
:::


# 問題点：Power BI DesktopからMFA有効化Snowflake接続すると認証が毎回求められる

[データを取得]>[Snowflake]>[接続]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/f6e8ad84-d934-40f8-ad67-0709e2419144.png)

[サーバー名]と[ウェアハウス名]を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/58417e34-28cf-47cb-b00d-74ab92a042d6.png)

:::note info
サーバー名の取得方法

SnowflakeのUIのホームに移動し、URLを確認
app.snowflake.comの後の組織名/アカウント名を使用する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/c6f6d928-d542-4ff5-a0e7-e4919c503443.png)

組織名とアカウント名をスラッシュではなく-でつなぎ、.snowflakecomputing.comをつける

▽参考
[アカウントへの接続](https://docs.snowflake.com/ja/user-guide/organizations-connect)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/37ce7d89-81d1-4a71-93ed-03a0e51af5a8.png)

:::

次の画面に遷移しますが、ここでDUOアプリの認証をする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/e62d2b2f-c863-43b3-84dd-4402c3156856.png)

またこの後も冒頭で述べた通り、以下の問題が発生します。
* 接続時にテーブルごとにDUOアプリで認証しなくてはならない
    * 例えば、20テーブル接続するときはアプリで20回認証が必要😅
* 更新時や、スライサー適用時にも影響するテーブル分だけ認証が必要

テーブル数が少なかったり、更新頻度が少ない場合はこのままでもそこまで問題にならないかもしれませんが、さすがにこの状況では毎回認証が必要になり、かなり面倒です。

# 対策①：security integration（セキュリティ統合）-テナント設定を変えられる場合には◎

Snowflkaeから以下を実行

```SQL
create security integration powerbi
    type = external_oauth
    enabled = true
    external_oauth_type = azure
    external_oauth_issuer = 'https://sts.windows.net/<your_tenant_id>/'
    external_oauth_jws_keys_url = 'https://login.windows.net/common/discovery/keys'
    external_oauth_audience_list = ('https://analysis.windows.net/powerbi/connector/Snowflake')
    external_oauth_token_user_mapping_claim = 'upn'
    external_oauth_snowflake_user_mapping_attribute = 'email_address';

```

:::note info
external_oauth_issuerの<your_tenant_id>のあとには必ず/（スラッシュ）を入れてください

▽参考
[【エラー対応方法共有】Snowflakeにて、Power BI Desktopから、Azure ADアカウントによる接続エラーへの対応方法について](https://qiita.com/manabian/items/111daed8c21420940530)

:::



▽参考

https://docs.snowflake.com/ja/sql-reference/sql/create-security-integration-oauth-external


PBI desktopからSnowflakeにつなぎに行き、[Microsoft Account]でサインインする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/e680e942-bf1b-45a7-859d-0b0fa95c53ec.png)

しかし、テナント設定を変える必要があるので、今回の私の場合はここで断念

>SSO を有効にするには、Fabric 管理者が Power BI 管理ポータルで設定を有効にする必要があります。 この設定により、Power BI サービス内から Snowflake への Microsoft Entra 認証トークンの送信が承認されます。 この設定は、組織レベルで設定されます。 次の手順に従って、SSO を有効にします。


https://learn.microsoft.com/ja-jp/power-bi/connect-data/service-connect-snowflake


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/9d4091fc-9221-409a-a1b1-9755ab6505e7.png)



# 対策②：AUTHENTICATION POLICY-セキュリティ的に望ましくはないが現状の解決策

Snowflakeから以下を実行し、AUTHENTICATION POLICYを作成します。

```SQL

use database <your_database>;

USE SCHEMA <your_schema>;
CREATE USER pbi_user PASSWORD='~~~' DEFAULT_ROLE = <your_role> DEFAULT_SECONDARY_ROLES = ('ALL') MUST_CHANGE_PASSWORD = FALSE;

CREATE AUTHENTICATION POLICY password_auth
  CLIENT_TYPES = ('ALL')
  MFA_ENROLLMENT  = 'OPTIONAL'
  AUTHENTICATION_METHODS = ('OAUTH', 'PASSWORD');

ALTER USER pbi_user SET AUTHENTICATION POLICY password_auth;

```

:::note info
ACCOUNTADMINロールが必要です
またロールにはウェアハウスへのUSAGE権限が必要です。（でないとレポート作成時に以下のエラーになります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/3dd6ab16-cd15-4b3e-a565-4fe7e36d60c7.png)

▽権限の参考
[アクセス制御権限](https://docs.snowflake.com/ja/user-guide/security-access-control-privileges#virtual-warehouse-privileges)


:::

:::note info
チェック
試しにプライベートウインドウから、pbi_userでパスワードを用いいてログインしてみると
DUOアプリの認証が来ないことを確認できます。
:::



PBI desktopからSnowfklakeにつなぎに行きます
先ほど作成した、user名とパスワードを使用します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/3bf193d3-42e9-4309-8602-8c90033dd31e.png)

これで問題なくレポートが作成できます。
（レポートは適当に作成しています🙇）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/2800bfaf-6d34-42fd-a9c4-a85ba8426b96.png)




# Appendix （補足情報）

## データソース設定の削除

同じデータソースに違う資格情報で接続し直したいときに行う必要があります。

[ファイル]>[オプションと設定]>[データソース設定]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/189ebe12-ff2f-4e67-b819-8ea7e18b4b6d.png)

対象のデータソースを選び、[アクセスの許可と編集]>[削除]>[OK]>[OK]の順にクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921999/9defae4b-3a3e-4c8b-be41-d1b1ec4fe40e.png)

その後、PBIのウインドウを一度閉じてから、再度接続のチャレンジをしてみてください


# さいごに


AUTHENTICATION POLICYの方法は、セキュリティ的には推奨はできないので、その点注意してください。
今後、MFAありでもスムーズに接続できる方法が出ることを期待します。
また他の方法をご存じでしたら、ご共有いただけますと幸いです。