こちらのページで準備した Looker から、Snowflake の DB を OAuth 認証で参照する設定例を記載します。
参考資料: Looker / feedbackSnowflake / Configuring OAuth for Snowflake connections
Role と User を Looker 用に作成します。関連ページ: Snowflake におけるアクセス制御の設定
USE ROLE USERADMIN;
CREATE ROLE looker_role;
GRANT ROLE looker_role TO ROLE SYSADMIN;
CREATE USER looker_user PASSWORD='looker_user';
GRANT ROLE looker_role TO USER looker_user;
ALTER USER looker_user SET DEFAULT_ROLE='LOOKER_ROLE' DEFAULT_WAREHOUSE='LOOKER_WH';
Warehouse と DB を Looker 用に作成します。
USE ROLE SYSADMIN;
CREATE WAREHOUSE looker_wh WAREHOUSE_SIZE=XSMALL AUTO_SUSPEND=60 AUTO_RESUME=true INITIALLY_SUSPENDED=true;
GRANT USAGE ON WAREHOUSE looker_wh TO ROLE looker_role;
CREATE DATABASE looker_db;
CREATE SCHEMA looker_db.looker_scratch;
CREATE TABLE looker_db.looker_scratch.mytbl (c1 STRING, c2 DATE);
INSERT INTO looker_db.looker_scratch.mytbl (c1, c2) VALUES ('abc', '2023-01-01');
GRANT USAGE ON DATABASE looker_db TO ROLE looker_role;
GRANT USAGE ON SCHEMA looker_db.looker_scratch TO ROLE looker_role;
GRANT SELECT ON ALL TABLES IN SCHEMA looker_db.looker_scratch TO ROLE looker_role;
関連資料: CREATE SECURITY INTEGRATION
USE ROLE ACCOUNTADMIN;
CREATE SECURITY INTEGRATION looker_integration TYPE=oauth ENABLED=true OAUTH_CLIENT=looker OAUTH_REDIRECT_URI='https://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.looker.app/external_oauth/redirect';
OAUTH_CLIENT_ID
と OAUTH_CLIENT_SECRET
の値を確認します。Security Integration の名称は大文字で作成されていることに注意します。
SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('LOOKER_INTEGRATION');
Add Conneciton をクリックします。
以下の事項に注意して値を入力します。
https://
は不要です。Account Identifiers に記載の情報を参照して、Snowflake の識別子を入力します。Test をクリックします。
Login to OAuth をクリックします。
ポップアップに認証情報を入力します。
許可をクリックします。
許可をクリックすると、Connections の画面に遷移します。遷移するまでの間に、OAuth の認可コードが Looker に渡されていることが確認できます。Chrome の Preserve log にチェックを入れておくことで、画面遷移中のリクエストも確認できます。
上から 3つ目のログが、許可ボタンをクリックした直後のものです。
Snowflake OAuth に対して認可コードの発行を求めています。
一般的な OAuth では HTTP 302 が返されることが期待されますが、HTTP 200 が返されていることが分かります。
上記のとおり HTTP 200 ではありましたが、一般の OAuth と同様に、redirectUri に指定した Looker の URL に HTTP GET リクエストが発生したことが分かります。クエリストリングで認可コードが Looker に渡されました。
redirectUri へのアクセスのレスポンスとしては HTTP 302 となっており、Connections 管理画面に遷移することとなります。
OAuth 認可コードのフローが完了した段階で、Snowflake 内のアクセスログは以下のようになっています。関連ページ: Snowflake におけるセキュリティ関連の機能
関連資料: LOGIN_HISTORY , LOGIN_HISTORY_BY_USER
SELECT * FROM TABLE(INFORMATION_SCHEMA.LOGIN_HISTORY_BY_USER(USER_NAME => 'looker_user', RESULT_LIMIT => 1000)) ORDER BY event_timestamp;
パスワードログインのログが確認できます。アクセス元IP は、OAuth 認証を行ったユーザーのものです。
IS_SUCCESS
が YES となっています。
pendo.looker.app などのアクセスは Connections ページへの遷移後のものです。
Test をクリックします。Snowflake OAuth が完了していない場合は、以下のような表記になります。
Snowflake OAuth が完了している場合は、以下のような表記になります。
Snowflake Resource Server へのアクセス (JDBC_DRIVER がクライアントとなっているアクセス) は、ユーザーのブラウザではなく、Looker サーバであることに注意します。以下のように、Looker サーバの IP アドレスがアクセス元になります。
Snowflake OAuth Authorization Flow について、Step1-2 の Client Application がユーザーの Web ブラウザであるのに対して、Step3-4 の Client Application は Looker サーバーとなっています。実際に、上記 Test ボタンを押したあとの Chrome のネットワークログには、アクセストークン取得に関するログは出力されていません。
Auditing OAuth Logins で Snowflake 側のログ確認が可能です。
SELECT * FROM TABLE(INFORMATION_SCHEMA.LOGIN_HISTORY_BY_USER(USER_NAME => 'looker_user', RESULT_LIMIT => 1000)) ORDER BY event_timestamp;
注意: Information schema は即時でログが確認可能です。ACCOUNT_USAGE schema は確認できるまでに時間を要します。関連資料: Snowflake におけるセキュリティ関連の機能
Looker / feedbackSnowflake / Configuring OAuth for Snowflake connections で手順がサポートされているのは、OAuth の authorization server が Snowflake OAuth の場合のみです。External OAuth として Auth0 を用いている場合などは含みません。
Looker 画面右上の Account から OAuth Connection Credentials の Reauthorize をクリックすることで、OAuth フローを再実行して検証できます。
Looker のバージョンが Snowflake をサポートしているか確認します。
Snowflake supports the following features as of Looker 23.12
関連ページ:
前述のとおり、Snowflake OAuth Authorization Flow の Step1-2 のアクセス元IP は、ユーザーの Web ブラウザ側です。looker_user に適用される Network Policy が、アカウントレベルまたはユーザーレベルで設定されている場合、該当の IP アドレスが許可されている必要があります。
アクセスが許可されていない場合は、以下のようなエラーとなります。
前述のとおり、Snowflake OAuth Authorization Flow の Step3-4 のアクセス元IP は、Looker サーバです。
Step3 において、アカウントレベルの Network Policy で該当の IP (Looker サーバの IP) が許可されていない場合は、以下のようなエラーになります。Step3 においては、looker_user のユーザーレベルで設定されている Network Poliy の値は意味を持ちません。
Step4 において、アカウントレベルまたはユーザーレベルで looker_user に適用される Network Policy が、該当の IP (Looker サーバの IP) を許可していない場合は、以下のようなエラーになります。
Step3 について、アカウントレベルの Network Policy で該当の IP (Looker サーバの IP) を許可することを避けるためには、Security Integration 専用の Network Policy を設定できます。参考資料: Snowflake OAuth Overview / Network Policies
CREATE NETWORK POLICY mypolicy3 ALLOWED_IP_LIST = ('35.199.188.212');
ALTER SECURITY INTEGRATION looker_integration SET NETWORK_POLICY = MYPOLICY3;
注意: 内部的には大文字で管理されています。大文字で Network Policy 名を指定する必要があります。
Looker サーバの IP アドレスを取得するためには、以下のようなページを参照します。
補足: ALTER SECURITY INTEGRATION (Snowflake OAuth)
The network policy restricts the list of user IP addresses when exchanging an authorization code for an access or refresh token and when using a refresh token to obtain a new access token. If this parameter is not set, the network policy for the account (if any) is used instead.
上記ページで NETWORK_POLICY をサポートするのは CUSTOM だけと読み取れますが、実際には Looker 用の security integration でも設定できます。
SQL Runner を実行する例です。