Snowflakeで認証ポリシーを設定してみた

日本ビジネスシステムズでデータエンジニアをしてる稲留です。いろいろなお客様先でSnowflakeのDataOpsを担当しています。

July 01-03, 2024のリリースノートにて、認証ポリシーに新しいパラメータが追加され、多要素認証(以下、MFA)の設定を強制できるようになりました。

docs.snowflake.com

以前までは、利用者にMFAを使ってもらうためには利用者自身で設定する必要がありました。管理者側で強制はできなかったため、MFA未設定のユーザーには繰り返しアナウンスをするしか方法が無かったのですが、本機能により管理者から強制できるようになりました。

本記事は、MFAの強制を含めた認証ポリシーの設定方法と、その挙動について検証した内容を簡単に紹介します。

背景

最初に、MFAを強制する背景や設定する意義やについて軽く触れさせてください。

先日、Snowflake社が「5月23日に特定の顧客アカウントへの不正アクセスが発生した」ことを発表しました。

www.cybersecuritydive.com

Snowflake社のプラットフォームによる脆弱性や設定ミスによるものではなく、マルウェア感染等で侵害された顧客の認証情報を使ったアイデンティティベースの攻撃によって発生した事象になります。

実際に今回の事象により、顧客100社以上が攻撃され、中には不正にデータをダウンロードされる被害も出ています。

被害にあった顧客には、3つの共通点があったと発表されています。

  1. 多要素認証(MFA)が設定されていなかった
  2. 資格情報がローテーションされておらず、長期間同じものが使われていた
  3. 信頼できる場所からのアクセスのみを許可するネットワーク許可リストが設定されていなかった

Snowflakeのみならず、SaaS製品全体に言える潜在的なセキュリティ上の落とし穴が浮き彫りになったといるのではないでしょうか。

今回の件で、MFAだけでなく、ネットワーク制限や認証情報の制約が重要であることが再認識できたかと思います。

SnowflakeでもMFAを強制できるようになったのは、この背景が大きかったのではないかと予想しています。

認証ポリシー

認証ポリシーとは

認証ポリシーはSnowflakeのセキュリティポリシーの1つです。認証ポリシーを使用すると、以下の認証方法を制御することができます。

  • ログイン時の認証方法(PASSWORD, KEYPAIR, SAML, OAUTH)
  • MFAを適用する認証方法(PASSWORD, SAML)
  • MFAを強制するか否か
  • アクセスできるクライアント(SnowflakeUI, SnowSQL, ドライバ)
  • セキュリティ統合との関連付け

例えば、パスワード認証を採用しているシステム用ユーザーが直接UIにアクセスできないようにしたい場合や、SSO連携のみでパスワード認証できないようにしたい場合など、いろいろな認証要件で利用できそうです。

認証ポリシーの優先順位

セキュリティポリシー間で優先順位が設定されています。各セキュリティポリシーの優先順位は、以下になります。

  1. ネットワークポシリー
  2. 認証ポリシー
  3. パスワードポリシー
  4. セッションポリシー

認証ポリシーの優先順位は2番目です。

今回の検証では認証ポリシーのみになるため優先順位を気にすることはありませんが、上記の背景で被害にあった顧客の3つの共通点には、ネットワークポリシーやパスワードポリシーを使って改善する必要が出てきます。

各ポリシーの中でネットワーク許可など重複するような制御方法もあるため、優先順位について意識しておく必要があります。

認証ポリシーの詳しい内容は、以下の公式ドキュメントを参照してください。

docs.snowflake.com

認証ポリシー検証

ここから、実際にMFAの強制や認証方法の制御をかける認証ポリシーを作成して、どのような挙動になるか検証していきます。

ユーザー要件

以下の2種類のユーザー要件を想定した認証ポリシーをそれぞれ作成していきます。

  • 個人ユーザー:Snowsightにパスワード認証でログインできるが、MFAを設定しなければSnowsightを利用できない。
  • システムユーザー:連携システムからドライバ接続のみを想定しているため、Snowsightへのログインを不可にする。

表にまとめると以下の内容となります。

ユーザータイプ 認証方法 クライアント MFA 用途
個人ユーザー パスワード   Snowsight 強制 Snowsightからログインすることを想定した個人用に割り当てるユーザー
システムユーザー    パスワード   ドライバ なし Snowflakeに連携するシステム用に割り当てるユーザー

表の通りになるように認証ポリシーを作成します。

ユーザーの作成

個人ユーザーを"TEST_PERSON"、システムユーザーを"TEST_SYSTEM"として作成していきます。

use role USERADMIN;
-- 個人ユーザーの作成
create user TEST_PERSON
    password = '<任意のパスワード>'
    comment = '検証用個人ユーザー'
;

-- システムユーザーの作成
create user TEST_SYSTEM
    password = '<任意のパスワード>'
    comment = '検証用システムユーザー'
;

認証ポリシーの作成

作成する上での注意事項

  • 認証ポリシーの作成は、SECURITYADMIN以上のロールもしくは、CREATE AUTHENTICATION POLICYの権限を持つロールが必要です。
  • 個人的にはPOLICYADMINといった管理用カスタムロールを作成することを推奨します。
  • 認証ポリシーはスキーマ配下のオブジェクトになります。事前に認証ポリシーの作成元となるDB、スキーマを作成しておく必要があります。

個人ユーザー用の認証ポリシー

個人ユーザーの要件に沿った認証ポリシーを作成していきます。

-- 個人ユーザー用認証ポリシーの作成
create authentication policy TEST_PERSON_AUTH_POLICY
    authentication_methods = ('password') -- ログイン時の認証方法
    mfa_authentication_methods = ('password') -- MFAを適用する認証方法
    mfa_enrollment = required -- MFAを強制
    client_types = ('snowflake_ui', 'snowsql') -- アクセスできるクライアント
    comment = '検証用 個人ユーザーの認証ポリシー'
;
システムユーザー用の認証ポリシー

システムユーザーの要件に沿った認証ポリシーを作成していきます。

-- システムユーザー用認証ポリシーの作成
create authentication policy TEST_SYSTEM_AUTH_POLICY
    authentication_methods = ('password') -- ログイン時の認証方法
    mfa_enrollment = optional -- MFAの設定は選択制
    client_types = ('drivers') -- アクセスできるクライアント
    comment = '検証用 システムユーザーの認証ポリシー'
;

以下のクエリで、問題なく認証ポリシーが作成されていることも確認できました。

-- 認証ポリシーの作成確認
show authtication policies;

認証ポリシーをユーザーに適用

上記で作成した認証ポリシーをユーザーに適用します。

適用する上での注意事項

  • 認証ポリシーの適用は、SECURITYADMIN以上のロールもしくは、APPLY AUTHENTICATION POLICYの権限を持つロールが必要です。
  • 個人的にはPOLICYADMINといった管理用カスタムロールを作成することを推奨します。
  • 認証ポリシーはアカウントレベルとユーザーレベルで設定することが可能です。今回はユーザー別に適用するのでユーザーレベルで設定します。アカウントレベルに設定すると全ユーザーに適用されるため注意してください。

use role SECURITYADMIN;
-- 個人ユーザーに個人ユーザー用認証ポリシーを設定
alter user TEST_PERSON set authtication policy TEST_PERSON_AUTH_POLICY;
-- システムユーザーにシステムユーザー用認証ポリシーを設定
alter user TEST_SYSTEM set authtication policy TEST_SYSTEM_AUTH_POLICY;

認証挙動確認

私が利用している検証環境では、Snowsightに対しての認証方法のみ確認が可能であるため、挙動確認については、簡単に以下について確認できればと思います。

  • TEST_PERSONユーザでSnowsightにログインすることができ、MFAの設定が強制される。
  • TEST_SYSTEMユーザでSnowsightにログインを実施し、ログインできないことを確認する。
TEST_PERSONユーザーでログインした結果

Snowsightにログイン可能でした。

また、ログインすると最初の画面にMFAのセットアップ画面が表示されます。セットアップが完了しないとSnowsightの機能は利用できない状態となります。


TEST_SYSTEMユーザーでログインした結果

Snowsightにログインできませんでした。

「Authentication attempt rejected by the current authentication policy.」というエラーメッセージが返されます。


まとめ

本記事では、Snowflakeの認証ポリシーについてご紹介しました。

MFAの強制やアクセスできるクライアントが制御できることは、運用している立場からするとありがたい機能だと感じています。

また、直近のリリースノートでは、ユーザーのパラメータに「TYPE」が追加されたようです。認証ポリシーと似たようなパラメータになっているので、「TYPE」と認証ポリシーを含めた挙動検証も実施してみたいです。
docs.snowflake.com

次回の記事では、パスワードポリシーやネットワークポリシーについて検証した内容をご紹介できればと思います。

執筆担当者プロフィール
稻留 敬太

稻留 敬太(日本ビジネスシステムズ株式会社)

新卒からHadoopなどビッグデータ基盤周りの業務に着手。現在は、データエンジニアとしてSnowflakeを中心にETLなどの開発業務やデータパイプラインの運用業務を担当。趣味はスニーカー収集。

担当記事一覧