Snowflakeのセキュリティダッシュボードを作ろうとしたけどやめた

# はじめに
以前からSnowflakeのセキュリティ周りの対策に興味があって以下のQuickStartの記事を見つつ、セキュリティ監査ができるダッシュボードを作ろうと思っていました。

https://quickstarts.snowflake.com/guide/security_dashboards_for_snowflake/index.html?index=..%2F..index#0

ですが先日のSnowdayの発表で以下の記事がリリースされました。

https://www.snowflake.com/blog/announcing-new-innovations-for-snowflake-horizon/

> More comprehensive security with the introduction of Trust Center and added platform protections 

...どうやらセキュリティの監視ができる機能が追加されるようです。非常に嬉しい発表ですが私が同じダッシュボードを作っても車輪の再発明になりそうです:sob:
というわけで今回はSnowflakeが準拠する[CIS Banchmark](https://www.cisecurity.org/cis-benchmarks)を眺めながら、Snowflakeが何を保証してくれるのか、そして**我々ユーザーが何を気をつけなければいけないのか**を考えてみたいと思います。

:::note info
この記事は[Snowflake Advent Calendar 2023](https://qiita.com/advent-calendar/2023/snowflake) 6日目の記事です。
:::

:::note warn
この記事の内容は2023年12月時点のものです。ご使用の環境へ設定を適用する際は必ず原本を参照のもと適用いただくようお願いいたします。
https://www.cisecurity.org/cis-benchmarks
:::

# 概要
すべての評価項目は以下の二つの項目に分類されます。
1. Automated
すべての評価が自動で行われます。
2. Manual
一部の評価を手動で行う必要があります。

また各評価項目は以下の2つのレベルに分類されます。
1. Level1
サービスのベストプラクティスに基づいた一般的なものです
2. Level2
Level1よりセキュリティ面を重視したものです。管理面やサービスの有用性に影響を与える可能性があります。

# 1 Identity and Access Management
| 項目 | Level | Autmated/Manual | ユーザー対応 |
|:-----------|:------------|:------------|:------------|
|アカウントでSSOが有効化されていること|1|Automated| [Security integration](https://docs.snowflake.com/ja/user-guide/admin-security-fed-auth-configure-snowflake)を作成する |
|SCIMが有効化され、IdP側でユーザーの管理ができること|2|Automated| [SCIM統合](https://docs.snowflake.com/ja/user-guide/scim-intro)を作成する |
|SSOが有効化されているユーザーのパスワード認証が無効化されていること|1|Manual| [alter user](https://docs.snowflake.com/ja/sql-reference/sql/alter-user)でパスワードをNULLに設定する |
|システムユーザーを除き、パスワード認証に加えてMFAが有効化されていること|1|Automated| [GUIから登録](https://docs.snowflake.com/ja/user-guide/ui-snowsight-profile)
|パスワードの最小文字数が14文字以上であること|1|Automated| [password policy](https://docs.snowflake.com/ja/user-guide/admin-user-management#password-policies)を登録　|
|システムユーザーはキーペア認証をしていること|1|Automated| [キーペア認証](https://docs.snowflake.com/ja/user-guide/key-pair-auth)を参照
|キーペア認証に用いる鍵が180日でローテーションされていること|1|Automated| 手動で定期的に検査が必要 |
|90日以上ログインしていないユーザーが無効化されていること|1|Automated| 手動で定期的に検査が必要 |
|ACCOUNYADMIN, SECURITYADMINを持つユーザーのセッションタイムアウトが15分以内に設定されていること|1|Automated| [Session policy](https://docs.snowflake.com/ja/user-guide/session-policies)を変更する |
|ACCOUNYADMIN, SECURITYADMINを持つユーザーの数が制限されていること|1|Automated| 手動で管理が必要 |
|ACCOUNTADMINを持つユーザーにemailが設定されていること|1|Automated| 手動で検査が必要 |
|ACCOUNYADMIN, SECURITYADMINがデフォルトロールとして設定されていないこと|1|Automated| 手動で検査が必要 |
|ACCOUNYADMIN, SECURITYADMINを継承しているロールが存在しないこと|1|Automated| 手動で検査が必要 |
|ACCOUNYADMIN, SECURITYADMINがownerになっているtaskが存在しないこと|1|Automated| 手動で検査が必要 |
|ACCOUNYADMIN, SECURITYADMINの権限で実行されているtaskが存在しないこと|1|Automated|手動で検査が必要|
|ACCOUNYADMIN, SECURITYADMINがownerになっているprocedureが存在しないこと|1|Automated|手動で検査が必要|
|ACCOUNYADMIN, SECURITYADMINの権限で実行されているprocedureが存在しないこと|1|Automated|手動で検査が必要|

# 2 Monitoring and Alerting

| 項目 | Level | Autmated/Manual | ユーザー対応 |
|:-----------|:------------|:------------|:------------|
|ACCOUNYADMIN, SECURITYADMINに対する権限付与が検知できること|1|Manual|手動で検査が必要|
|MANAGE GRANTSに対する権限付与が検知できること|1|Manual|手動で検査が必要|
|SSOが有効化されているユーザーのパスワードでのログインが検知できること|1|Manual|手動で検査が必要|
|MFAが有効化されていないユーザーのパスワードログインが検知できること|1|Manual|手動で検査が必要|
|Security integrationに対するcreate, update, deleteの操作を検知できること|1|Manual|手動で検査が必要|
|Network policyとそれが紐づいているオブジェクトに対する変更を検知できること|1|Manual|手動で検査が必要|
|SCIM tokenの作成が検知できること|1|Manual|手動で検査が必要|
|Shareが他アカウントに公開された時に検知できること|1|Manual|手動で検査が必要|
|EOSとなっているConnector, JDBC driverのアクセスを検知できること|2|Manual|手動で検査が必要|

# 3 Networking

| 項目 | Level | Autmated/Manual | ユーザー対応 |
|:-----------|:------------|:------------|:------------|
|アカウントレベルでのホワイトリストによるNetwork policyが有効化されていること|2|Manual|[network policy](https://docs.snowflake.com/ja/sql-reference/sql/create-network-policy)を作成する|
|システムユーザーに対してNetwork Policyが有効化されていること|1|Manual|[network policy](https://docs.snowflake.com/ja/sql-reference/sql/create-network-policy)を作成する|

# 4 Data Protection

| 項目 | Level | Autmated/Manual | ユーザー対応 |
|:-----------|:------------|:------------|:------------|
|1年以内にデータの再暗号化が行われること|2|Automated|アカウントパラメータの[PERIODIC_DATA_REKEYING](https://docs.snowflake.com/ja/sql-reference/parameters#periodic-data-rekeying)をtrueに設定する|
|AES暗号化キーが256bitであること|1|Automated|アカウントパラメータの[CLIENT_ENCRYPTION_KEY_SIZE](https://docs.snowflake.com/ja/sql-reference/parameters#client-encryption-key-size)を256に設定する|
|重要なデータに対するDATA_RETENTION_TIME_IN_DAYSが90に設定されていること|2|Manual|必要なデータに対して[DATA_RETENTION_TIME_IN_DAYS](https://docs.snowflake.com/ja/user-guide/data-time-travel)を90に設定する|
|MIN_DATA_RETENTION_TIME_IN_DAYSが7以上に設定されていること|2|Automated|アカウントパラメータの[MIN_DATA_RETENTION_TIME_IN_DAYS](https://docs.snowflake.com/ja/sql-reference/parameters#label-min-data-retention-time-in-days)を7以上に設定する|
|REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATIONがtrueに設定されていること|1|Automated|アカウントパラメータの[REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION](https://docs.snowflake.com/ja/sql-reference/parameters#require-storage-integration-for-stage-creation)をtrueに設定する|
|REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_OPERATIONがtrueに設定されていること|1|Automated|アカウントパラメータの[REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_OPERATION](https://docs.snowflake.com/ja/sql-reference/parameters#require-storage-integration-for-stage-operation)をtrueに設定する|
|すべてのexternal stageにstorage integrationが設定されていること|1|Automated|アカウントパラメータの[REQUIRE_STORAGE_INTEGRATION_FOR_STAGE_CREATION](https://docs.snowflake.com/ja/sql-reference/parameters#require-storage-integration-for-stage-creation)をtrueに設定する|
|PREVENT_UNLOAD_TO_INLINE_URLがrueに設定されていること|1|Automated|アカウントパラメータの[PREVENT_UNLOAD_TO_INLINE_URL](https://docs.snowflake.com/ja/sql-reference/parameters#prevent-unload-to-inline-url)をtrueに設定する|
|Tri-Secret Secureが有効化されていること|2|Manual|[Tri-Secret Secure](https://docs.snowflake.com/ja/user-guide/security-encryption-manage#tri-secret-secure)を参照|
|機密データがマスキングされていること|2|Manual|必要なデータに[masking policy](https://docs.snowflake.com/ja/user-guide/security-column-intro)を設定する|
|機密データがにrow access policyが設定されていること|2|Manual|必要なデータに[row access policy](https://docs.snowflake.com/ja/user-guide/security-row-using)を設定する|

# おわりに
CIS Benchmarkのそれぞれの項目を並べてみました。すべて手で確認するのはかなりの手間なので、これらをすべて確認できるような機能がリリースされると思うと非常に楽しみですね。
これからのSnowflakeの発展にますます期待です！