【Snowflake】パスワード単一認証のMFA必須化に伴う対応

みなさん、こんにちは！
Snowflakeでは、パスワード認証時のMFA（多要素認証）機能が無料提供されています。
先日、Snowflake社よりパスワード単一認証を撤廃する方針が正式発表されました。
今後パスワード認証ユーザーはMFAの登録が必須となりますので、その内容と対応策について紹介します。
詳細は以下のリンクからご確認ください。
[Snowflake公式ブログ：シングルファクターのパスワード認証をブロック](https://www.snowflake.com/ja/blog/blocking-single-factor-password-authentification/)

## アナウンスの内容
2024年12月にSnowflakeより発表されたアナウンスの内容は以下の通りです。
* パスワード単一認証が撤廃され、今後はパスワード認証にMFA機能が必須化されます
* LEGACY_SERVICEタイプは2025年11月をもって廃止となり、SERVICE タイプに移行されます

アナウンスに伴い、Snowflakeより段階的な変更（フェーズ①～③）が実施されます。

### 2025年4月（フェーズ①）
PERSON（またはNULL）ユーザーのパスワード認証にデフォルトのMFAポリシーがすべてのアカウントで有効化されます。
また、フェーズ①でLEGACY_SERVICEユーザーのSnowsightへのサインインができなくなります。
**カスタム認証ポリシーが適用されている（されていない）ユーザー：**
パスワード単一認証でサインインしているユーザーは、次回サインイン時にMFAの登録が求められます。
カスタム認証ポリシー**未適用**のユーザーは、フェーズ①でMFAの登録を済ませていないとサインイン不可となります。
カスタム認証ポリシー**適用済**のユーザーは、パスワード単一認証でもMFAの登録は求められません。
### 2025年8月（フェーズ②）
パスワード単一認証でサインインしている**すべての**ユーザーにMFAの登録が求められます。
カスタム認証ポリシー適用済のユーザーも、フェーズ②でMFAの登録を済ませていないとサインイン不可となります。
### 2025年11月（フェーズ③）
LEGACY_SERVICEが撤廃され、**すべての** LEGACY_SERVICEユーザーがSERVICEユーザーに移行されます。
それに伴い、元LEGACY_SERVICEユーザーのパスワード単一認証を使用したSnowflakeへのサインインが不可となります。

## ユーザータイプについて
アナウンスに登場する用語について説明します。
まず、Snowflakeより2024年7月導入されているユーザータイプ（TYPE）について説明します。
Snowflakeのユーザータイプは、以下に大別できます。
| ユーザータイプについて |  |
|:-|:-|
| 利用ユーザー  | PERSON（NULL）  |
|  システムユーザー |  	SERVICE／LEGACY SERVICE |

[TYPEオプション（英語マニュアル）](https://docs.snowflake.com/en/sql-reference/sql/create-user)
### PERSONユーザー
インタラクティブなサインインを使用してSnowflakeにアクセスする利用ユーザーを指します。
ユーザータイプは、TYPE = PERSONを指定します。
### NULLユーザー
TYPEオプションを指定していないユーザーは、NULL（オブジェクト）として識別されます。
NULLユーザーは、PERSONユーザーとして機能します。
### SERVICE（LEGACY_SERVICE）ユーザー
インタラクティブサインインなしでプログラムアクセスするシステムユーザーを指します。
ユーザータイプは、TYPE = SERVICEまたはLEGACY_SERVICEを指定します。
### SERVICEタイプとLEGACY_SERVICEタイプの違い
SERVICEタイプはキーペア／OAuth認証を、LEGACY_SERVICEタイプはパスワード／SAML認証をサポートしています。
LEGACY_SERVICEタイプは、SERVICEタイプと違いSnowsightへのサインインが可能です。
※ 前述のアナウンスの通りLEGACY_SERVICEタイプは段階的にSnowsightへアクセス不可となり、最終的に廃止となります。

## 認証ポリシーについて
認証ポリシーはSnowflakeへの認証制御を行うオブジェクトであり、アカウント／ユーザーレベルに適用できます。
ユーザーレベルの認証ポリシーがアカウントレベルより優先されるため、細かい認証制御が可能です。

MFAは、認証ポリシー内でMFAパラメータとして指定可能です。
MFAを認証ポリシー内で指定し適用できる認証方式とユーザータイプは以下の通りです。
| MFAポリシーの適用対象 |  |
|:-|:-|
| 適用できる認証方式  | パスワード／SAML  |
| 適用できるユーザータイプ  | PERSON（NULL）  |

認証ポリシーの作成／適用方法は以下をご参照ください。
認証ポリシーにおけるMFAパラメータの詳細については、以下の英語マニュアルをご参照ください。
[認証ポリシーの作成と適用方法](https://docs.snowflake.com/ja/user-guide/authentication-policies)
[認証ポリシーにおけるMFAパラメータ（英語マニュアル）](https://docs.snowflake.com/en/sql-reference/sql/create-authentication-policy)

## 対応方針
以上を踏まえ、それぞれの認証方式において対応が必要なユーザータイプは以下の通りとなります。
| 認証方法 | PERSON（NULL） | SERVICE | LEGACY_SERVICE |
|:-|:-|:-|:-|
| パスワードのみ  | <font color="red">要</font>  | -  | <font color="red"> 要（廃止予定）</font> |
| パスワード＋MFA  |  不要 | -  | -  |
|  SAML(SSO)のみ |  不要 |  - |  <font color="red">要（廃止予定）</font> |
| SAML(SSO)＋MFA  | 不要  |  - | - |
| OAuth(SSO)	  | 不要  | 不要  | -  |
| キーペア  | 不要  | 不要  |  - |

### パスワード単一認証かつPERSON（NULL）タイプのユーザーの対応方針
ユーザーのカスタム認証ポリシーの適用有無で対応時期が異なりますが、対応作業はMFAの登録となります。
カスタム認証ポリシーの適用有無に関わらず、フェーズ①（3月末）までに全利用ユーザーのMFA登録をおすすめします。


**パスワード認証にMFA登録を追加する場合：**
Snowsightワークスペース等で以下のようなクエリを実行し、パスワード単一認証の利用ユーザーを洗い出します。
```ruby:qiita.rb
-- パスワード単一認証ユーザーの洗い出し
SELECT name, type, disabled, has_password, has_mfa, email
FROM snowflake.account_usage.users
WHERE has_password = TRUE
AND has_mfa = FALSE
AND (type IS NULL OR type = 'PERSON')
;
```
上の例ですと、MFAを登録していないパスワード単一認証の利用ユーザーとメールアドレスを洗い出すころができます。
アカウント管理者にて、メール通知等で利用ユーザーに3月末までにMFA登録を促してください。
具体的なMFAの登録方法は、以下をご参照ください。
[多要素認証（MFA）に登録する](https://docs.snowflake.com/ja/user-guide/ui-snowsight-profile#label-snowsight-set-up-mfa)
事前に認証ポリシーを使用して利用ユーザーにMFA登録を強制することも有効です。
以下のようにMFAポリシーを作成しアカウントレベルで適用することで、
パスワード単一認証の利用ユーザーは、次回までにMFAを登録しないとサインインできなくなります。
```ruby:qiita.rb
-- MFAポリシーの作成例
CREATE AUTHENTICATION POLICY account_level_mfa_authentication_policy
AUTHENTICATION_METHODS = ('PASSWORD')
CLIENT_TYPES = 'SNOWFLAKE_UI'
MFA_AUTHENTICATION_METHODS = ('PASSWORD')
MFA_ENROLLMENT = REQUIRED
;
```
```ruby:qiita.rb
--MFAポリシーをアカウントレベルに適用
ALTER ACCOUNT SET AUTHENTICATION POLICY 
account_level_mfa_authentication_policy;
```


**認証方式を変更する場合：**
利用ユーザーの認証方式をパスワード認証＋MFA以外に変更する場合は、SSO認証やOAuth認証などへの検討が必要です。
ユーザーに対してフェデレーション認証を提供したい場合は、認証ポリシーの作成と適用以外に、SnowflakeとサードパーティのIDプロバイダー間に連携設定を行う必要があります。
例えば、SAMLによるSSO認証を実現したい場合は、以下のようにSnowflakeにてセキュリティ統合オブジェクトを作成のうえ、認証ポリシーに適用します。
```ruby:qiita.rb
-- Microsoft Entra IDのSSO認証に使用するSAML2用セキュリティ統合の作成例
CREATE SECURITY INTEGRATION saml2_security_integration
TYPE = SAML2
ENABLED = TRUE
SAML2_USSUER = '<EntityID>'
SAML2_URL = '<idp_sso_url>'
SAML2_PROVIDER = 'CUSTOM'
SAML2_X509_CERT = 'pem_cert : xxx...xxx'
SAML2_FORCE_AUTHN = TRUE
SAML2_SNOWFLAKE_ISSUER_URL = '<snowflake_account_url>'
SAML2_SNOWFLAKE_ACS_URL = '<snowflake_account_url>/fed/login'
;
```
```ruby:qiita.rb
-- SSO(SAML)用の認証ポリシーの作成例
CREATEAUTHENTICATIONPOLICY sso_authentication_policy
AUTHENTICATION_METHODS = ('SAML')
CLIENT_TYPES = 'SNOWFLAKE_UI'
SECURITY_INTEGRATION = ('SAML2_SECURITY_INTEGRATION')
;
```
```ruby:qiita.rb
--SSO(SAML)用の認証ポリシーをユーザーレベルに適用
ALTER USER SET AUTHENTICATION POLICY 
sso_authentication_policy;
```
SAMLによるSSO認証に関しては、以下をご参照ください。（本認証方法は別途ブログにて共有予定）
[フェデレーション認証を使用するためのSnowflakeの構成](https://docs.snowflake.com/ja/user-guide/admin-security-fed-auth-security-integration)

### LEGACY_SERVICEタイプのユーザーの対応方針
LEGACY_SERVICEユーザーは、フェーズ③（10月末）までに新しくSERVICEタイプにあわせた認証方式（キーペアまたはOAuth認証）でユーザーを作成する必要があります。
ユーザーに対してキーペア認証を提供したい場合も、Snowflakeクライアント間に連携設定を行う必要があります。
キーペア認証に関しては、以下をご参照ください。（本認証方法は別途共有予定）
[キーペア認証とキーペアローテーション](https://docs.snowflake.com/ja/user-guide/key-pair-auth)

## まとめ
本アナウンスについて、パスワード単一認証ユーザーは、利用ユーザー／システムユーザーともに対策が必須となります。
ユーザータイプやMFAポリシーに関する詳細は、日本語版のマニュアルに記載がなく、英語版を参照する必要があります。
パスワード認証にMFA登録を追加するか認証方式を変更するか、ユーザー毎の変更方針にあわせて計画的に進めてください。