[Snowflake] AWS PrivateLink経由でAzure ADのSSOを利用する

# はじめに

以前、SnowflakeでAWS PrivateLinkを利用するための記事を作成しました。
今回はさらに、PrivateLink経由でAzureADのSSOを利用してみようと思います。
本記事は以下記事の内容が東京リージョンの環境で実施済みであることを前提としています。

https://qiita.com/jnit/items/e143fac5ef276dd8e8f1

https://qiita.com/manabian/items/1384c43a9398bf325f1d

以下のイメージの通り、ユーザとSnowflakeの間をPrivateLinkで閉域化し、ユーザとAzureADの間はインターネット接続とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/8512b892-09bf-e468-5f5f-7ed753dd0c66.png)

SSOでPrivatelinkを使う場合、単純に上図の緑線の通信をPrivatelink用のドメイン名に変更すればよいだけのように思えます。
詳細は省きますが実際に試してみたところ、ブラウザからSnowflakeのログイン画面を開き、Azure ADのユーザでログインしようとしたところ以下のエラーが出て失敗しました。

`AADSTS700016: Application with identifier 'https://XX12345.ap-northeast-1.aws.snowflakecomputing.com' was not found in the directory 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You may have sent your authentication request to the wrong tenant.`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/394c4448-d8f6-d30a-a7a4-8d1db04ea035.png)

Snowflakeサポートに問い合わせてみた結果、PrivateLink下でSSOを利用するには、「SAML2.0セキュリティ統合(SAML2 Security Integration)」を設定する必要があるとのことでした。

「SAML2.0セキュリティ統合」は、SAMLアサーションの暗号化を行う処理のようです。
PrivateLink下でSSOを利用する際は必須の処理のようです。

インターネット経由でのSSOではこのセキュリティ統合が不要なのに対して、PrivateLink経由でのSSOでは必要な理由がよくわかりませんが、Snowflakeの仕様だと捉えることにします。

「SAML2.0セキュリティ統合」の手順は以下に記載されています。本記事は以下URLの手順に依拠しています。

https://docs.snowflake.com/en/user-guide/admin-security-fed-auth-advanced.html#step-1-create-or-migrate-to-a-saml2-security-integration

# 1. Azure AD の設定値確認

まずAzure ADから「エンタープライズアプリケーション」→「Snowflake for AAD」→「シングルサインオン」とたどっていき、表示される「Azure AD 識別子」の値をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/bdee4cf1-2038-453c-4556-5a97c6e91fc0.png)


# 2. Snowflakeで[SAML2.0セキュリティ統合]のセットアップ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/1545263e-4ea0-dd6b-3837-783c6b3aac62.png)

Snowflakeのワークシートを開き、以下のクエリを環境毎の値に読み替えて実行します。

```sql
use role accountadmin;
select system$migrate_saml_idp_registration('azureadsaml2integration', 'https://sts.windows.net/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/');  
alter security integration azureadsaml2integration set saml2_snowflake_acs_url = 'https://xx12345.ap-northeast-1.privatelink.snowflakecomputing.com/fed/login';
alter security integration azureadsaml2integration set saml2_snowflake_issuer_url = 'https://xx12345.ap-northeast-1.privatelink.snowflakecomputing.com';
```

各クエリを簡単に説明します。

`select system$migrate_saml_idp_registration('azureadsaml2integration', 'https://sts.windows.net/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/'); `

- 既存のIDpの設定をセキュリティ統合に移行するクエリです。
  - 第一引数は任意の名前をつけます。
  - 第二引数は手順1.で取得したAzureADの「Azure AD 識別子」を指定します。
  - クエリの詳細は以下を参照してください。
     - https://docs.snowflake.com/en/sql-reference/functions/system_migrate_saml_idp_registration.html


`alter security integration azureadsaml2integration set saml2_snowflake_acs_url = 'https://xx12345.ap-northeast-1.privatelink.snowflakecomputing.com/fed/login';`

- ACS(Assertion Consumer Service) URL をprivatelink用のものに変更します。
  - アカウントロケータの部分はご自身の環境に読み替えてください。


`alter security integration azureadsaml2integration set saml2_snowflake_issuer_url = 'https://xx12345.ap-northeast-1.privatelink.snowflakecomputing.com';`

- issuer URL をprivatelink用のものに変更します。
  - アカウントロケータの部分はご自身の環境に読み替えてください。


# 3. AzureADでSnowflakeのURLをPrivateLink用に変更

Azureポータルにログインし、「Azure AD」→「エンタープライズアプリケーション」→「Snowflake for AAD」を開きます。

「シングルサインオン」→「基本的なSAML構成」の編集をクリックし、「識別子」と「応答URL」をprivatelink用のURLに変更し、保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/b781e03b-2d4c-8215-2cfc-3eebc114235c.png)

|対象|PrivateLink用の値|
|:-|:-|
|識別子|https://xx12345.ap-northeast-1.privatelink.snowflakecomputing.com|
|応答URL|https://xx12345.ap-northeast-1.privatelink.snowflakecomputing.com/fed/login|


※アカウントロケータの部分(xx12345)はご自身の環境に読み替えてください。

# 4. 動作確認

ブラウザからprivatelink用のドメインを使ってSnowflakeログイン画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/140c487b-0b4d-8c5d-bf66-891a4c0316c2.png)


「Azure ADを使用してサインイン」からAzureADのユーザとパスワードを入力すると、Snowflakeのコンソールログインできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/a10d4233-f059-fdc9-8736-4ce763ae726d.png)

リダイレクト後のURLもprivatelink用のドメインになっており、閉域でSnowflakeに接続できていることがわかります。

以上です。