SELECTSELECT

SELECT

Snowflakeの新しいユーザータイププロパティを徹底解説

By Jeff SkoldbergSep 22, 20244 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

ユーザータイププロパティとは?

Snowflakeでユーザーを作成・変更する際には、Snowflake公式ドキュメントにあるとおり、数十種類のプロパティやパラメータを設定できます。なかでもユーザーに設定できるオブジェクトプロパティの一つが type プロパティで、personservicelegacy_servicenull のいずれかを指定します。

このプロパティは、各ユーザーの用途を明確に管理するため、Snowflakeが2024年第3四半期に導入したものです。後述するとおり、サービスアカウントに鍵ペア認証の利用を促すSnowflake側のさりげない仕掛けでもある、と筆者は見ています。

各タイプの定義

  • person は名前のとおり、人間のユーザー向けです。通常はSSO(SAML)、もしくはユーザー名/パスワード認証でSnowflakeにログインします。person タイプのユーザーには、SnowflakeのMFAの有効化を必ず推奨します。
  • service タイプはサービスアカウント用です。このタイプの特徴は、ユーザー名/パスワード認証やMFAを使えないことにあります。認証は必ずSnowflakeの鍵ペア認証で行う必要があり、MFAやパスワードに関連するコマンド・プロパティは一切利用できません。また service タイプのユーザーには、姓・ミドルネーム・名を設定できません。

Snowflake user type property limitations

  • legacy_service は、パスワードまたはSAMLで認証するサービスアカウントです。

何がうれしいのか?

アカウントの堅牢化

servicelegacy_service を区別することで、アカウントのセキュリティを常に意識しやすくなります。鍵ペア認証はパスワード認証より安全だというのは広く認められた事実であり、安全性の低い方式を使っているアカウントを明示的に洗い出しておくことは、健全な運用管理の第一歩であり、今後の整理対象を可視化するTo-Doリストにもなります。

クエリ履歴の分析

全ユーザーにタイププロパティを設定しておくもう一つのメリットは、その情報を分析に活用できる点です。例えば、Snowflakeのクエリ履歴を使って、あるテーブルへのクエリ件数をサービスタイプ別に集計したいケースを考えてみましょう。

select
    users.type = 'PERSON' as is_person,
    count(*)
from snowflake.account_usage.query_history
left join snowflake.account_usage.users
    on query_history.user_name=users.name
where true
    and query_history.query_text ilike '%analytics.public.orders%'
    and start_time > current_date - 30
group by 1

サンプルコード:タイププロパティの設定方法

新規ユーザー作成時にユーザータイプを指定する

ユーザー作成時に type プロパティを指定するのは簡単です。

create user if not exists my_service_user
    type = service
    rsa_public_key = <string>;

既存ユーザーのタイプを更新する

現在パスワード認証を使っている既存のサービスアカウントに type=service を設定するケースを考えてみましょう。既存ユーザーを更新する場合、最低限なら次のように書けます。

alter user my_service_user set
    type = service
    rsa_public_key = <string>
;

この例ではパスワードなど、互換性のないプロパティを unset していません。互換性のないプロパティは保持されたまま無効化されます。ユーザータイプを legacy_servicepersonnull に変更すると、これらのプロパティが再び有効化される点に注意してください。

運用を健全に保つために、次のようにしておくのがおすすめです。

alter user my_service_user unset password;
alter user my_service_user unset first_name;
alter user my_service_user unset middle_name;
alter user my_service_user unset last_name;
alter user my_service_user set disable_mfa = true;

制限事項

現時点(2024年9月)では、type プロパティはSnowsight UIには表示されず、コードからしか設定できません。また show users コマンドの出力にもユーザータイプの列はありませんが、近いうちに対応されることを期待したいところです。

ユーザーのタイプを確認する手段は、describe user <username> コマンドを実行するか、snowflake.account_usage.users テーブルをクエリするか、いずれかに限られます。

まとめと推奨事項

Snowflakeの新しい type プロパティは、アカウント内のユーザータイプを把握するうえで非常に有用です。レガシー認証のサービスアカウントがどこに残っているかを否応なく可視化してくれるため、アカウントの堅牢化にも効果を発揮します。

Snowflakeアカウント内のサービスアカウントをすべて棚卸しし、それぞれに type = service もしくは type = legacy_service を設定することをおすすめします。legacy_service に分類したアカウントについては、近い将来 type = service へ移行するためのアクションプランを立てておきましょう。

Jeffは、インサイトの自動化とデータによるビジネスプロセス制御を15年以上手がけてきたデータ&アナリティクスコンサルタントです。技術面ではSnowflake + dbt + Tableauを得意とし、業界としては公益事業、臨床試験、出版、CPG、製造業での実績があります。お気軽にご連絡ください:[email protected]