新しい PASSWORD POLICY を触ってみた

# この記事は
Snowflake Advent Calendar 2022 Calendar 1 Day 8 の記事になります。
Snowflake で Sales Engineer をしている @ryotkato が担当します。

# 概要

この記事では11月末にリリースした Password Policy について触れます。
本記事執筆時点ではドキュメントが日本語訳されていないため基本的に英語のドキュメントを参照します。

リリースノートは[こちら](https://docs.snowflake.com/en/release-notes/2022-11.html#password-policies)

# Password Policy

##  機能リリース前のポリシーと比較

Password Policy 機能リリース前はSnowflakeのポリシーは以下のようになっていました。

* パスワードの桁数：最小8文字の長さ、少なくとも1つの大文字/1つの小文字/数字1つを含める必要あり
* 空白文字や感嘆符（!）、パーセント記号（%）、アスタリスク（*）などの特殊文字（英数字以外の文字）を含め、256文字までの大文字と小文字が区別される文字列を使用可能
* パスワードを誤りによりユーザがロックされるまでの回数：5回
* 同じパスワードを認めない期間あるいは回数：1回
* 初回ログオン時のパスワード変更の必要性の有無：強制変更可能

上記と比較してどのような点が変わったのかを確認していきます。
仕様については [CREATE PASSWORD POLICY](https://docs.snowflake.com/en/sql-reference/sql/create-password-policy.html) ページを参照します。

* 最小/最大文字数が指定可能(最低8、最大256まで)
* パスワードに含める必要がある大文字/小文字/数字/特殊文字の文字数が指定可能
* パスワードの有効期限が指定可能に
* パスワードを誤りによりユーザがロックされるまでの回数：1~10で可変
* ロック解除までの分数：1~999で可変

## 動作確認

今回は [CREATE PASSWORD POLICY ページのサンプル](https://docs.snowflake.com/en/sql-reference/sql/create-password-policy.html#examples)を利用して動作確認をしていきます。

注意点として既存のユーザのパスワードに適用するためにはリリースノートにも記載があるように1度パスワード変更が必要のようです。
今回は既存ユーザへの適用手順を確認していきます。


> リリースノートより抜粋
Note that password policies apply only to new passwords in your Snowflake account. To ensure that a user’s existing password meets the requirements specified in a password policy, set the user property MUST_CHANGE_PASSWORD to TRUE using an ALTER USER statement.


まずはテスト用のユーザを作成します。

```SQL
create user pp_test PASSWORD = 'Snow1208';
```

上記の情報でログインをしてみますと問題なくログインできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/52602087-edaf-fa85-fdec-ab1b606a7ecf.png)

Password Policyを作成し、ユーザに対して有効化します。
サンプルのポリシー内容を書き起こすと
* 最小12文字、最大24文字
* 大文字/小文字/数字/特殊文字をそれぞれ2文字以上含める
* 30日で強制変更
* 3回間違えたらロックされる
* ロックが解除されるまで30分


```SQL
create password policy password_policy_prod_1
    password_min_length = 12
    password_max_length = 24
    password_min_upper_case_chars = 2
    password_min_lower_case_chars = 2
    password_min_numeric_chars = 2
    password_min_special_chars = 2
    password_max_age_days = 30
    password_max_retries = 3
    password_lockout_time_mins = 30
    comment = 'production account password policy';
```

Password Policy を作成しただけではユーザには適用されていません。
動作確認のためPassword Policyのユーザへの付与と実際に適用されるタイミングを分けて確認します。

pp_test ユーザに対してPassword Policyを付与します。

```SQL
alter user pp_test set password policy password_policy_prod_1;
```

サインアウトしてもう一度ログインしてみますがパスワード変更をしていないのでログインができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/52602087-edaf-fa85-fdec-ab1b606a7ecf.png)

今度はパスワードを強制変更させて PASSWORD POLICY が有効になっていることを確認します。

```SQL
alter user pp_test set  must_change_password = true;
```

再度サインアウトしてログインしてみると以下の画面に遷移し適用した PASSWORD POLICY があたっているのがわかります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/bdc6fcc0-d743-e17e-fcaa-8448ac443f18.png)


試しに `Snow1209` という以前は要件を満たしていたが、適用した PASSWORD POLICY 要件を満たさないパスワードを設定してみるとエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/a2fa78fe-ea4a-3da2-2e82-e842d75a7f95.png)

今度は `SNow@@221208` で登録するとエラーがなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/7afecd9c-9010-776c-db89-04a1a9d99f6e.png)


今回はユーザレベルで設定をしていますが以下のようにアカウントレベルでも PASSWORD POLICY を設定可能です。

```SQL
alter account set password policy my_database.my_schema.password_policy_prod_1;
```


# おわりに

新しくリリースされた PASSWORD POLICY の機能はいかがだったでしょうか。
今までSnowflake単体では実現できなかった複雑なポリシーを実現できるようになり
Idｐと連携をしなくても企業のポリシーを満たせるケースも増えてくると思います。