こんにちは。バクラク事業部 機械学習・データ部 データグループの@civitaspoです。最近、仕事で使用するPCを新調したのですが、Nixとhome-managerを使って環境構築していたおかげで、爆速で環境移管が完了しました。MacOSのセットアップをする場合は、nix-darwinというnix moduleを使うのですが、MacOSのdefaults
コマンドを使用して変更するパラメータ(たとえばInitialKeyRepeat
やKeyRepeat
など)も宣言的に書けるので便利です。PAMの設定を変更してsudo実行時にTouch IDを使えるようにする設定もあったりします。非常に便利なので是非試してみてください!
さて、本記事のタイトルである「Don’t Use Passwords in Your Snowflake Account」は、先月開催されたSnowflake Data Cloud Summit 2024の『All You Need to Know About Network Security in Snowflake』というセッションで頻繁に言われていたワードを拝借したものです。このセッションはSnowflake内部のネットワーク構成について非常に詳細に説明するセッションでしたが、認証に関係する話が出てくるたびに「Don't use passwords」と発言しており、スピーカーのパスワード認証への強い想いが溢れ出ていました。本記事は、その強い想いを受け取って、自分たちのSnowflakeアカウントでパスワード認証を禁止する方法を書こうと思います。
先月のSnowflake Data Cloud Summit 2024への参加報告は、以下の記事に書いているので興味を持たれた方は読んでみてもらえると嬉しいです!
なお、7月はLayerXのエンジニアブログがたくさん出る#ベッテク月間です。LayerXの行動指針の一つである「Bet Technology」を略して「ベッテク」と呼んでいます。今後もベッテクな記事がたくさん出ますので、どんな記事がでるのかこちらのカレンダーからチェックしてみてください!
最初に結論から
以下のような認証ポリシーをアカウントを適用することで、パスワード認証を禁止することができます。
-- ポリシー管理専用のロールを運用している方はそちらを利用してください USE ROLE SECURITYADMIN; -- データベースとスキーマは任意のものを利用してください USE SCHEMA SYSTEM.AUTHENTICATION_POLICY; -- 認証ポリシーの作成 CREATE OR REPLACE AUTHENTICATION POLICY ACCOUNT_AUTHENTICATION_POLICY CLIENT_TYPES = ('ALL') AUTHENTICATION_METHODS = ('SAML', 'OAUTH', 'KEYPAIR') SECURITY_INTEGRATIONS = ('ALL'); -- アカウントへ認証ポリシーの適用 ALTER ACCOUNT SET AUTHENTICATION POLICY ACCOUNT_AUTHENTICATION_POLICY;
この設定を行ったうえでパスワード認証によるログインを試行すると以下のように「Authentication attempt rejected by the current authentication policy.」というエラーが表示されるようになります。
なお、この操作によってSnowflakeアカウントからロックアウトされてしまう可能性があることに注意してください。パスワード認証以外の認証方法でログイン可能な状態を作っておかなければ、Snowflakeアカウントへログインする手段が失われてしまうためです。パスワード認証の禁止を行う際は必ず他の認証手段を使うことができることを確認してから行うようにしてください。
では、詳細な説明に移ります。
Snowflakeの認証方法
Snowflakeにおける認証方法は大きく分類して4種類存在しています。Key-Pair認証、OAuth認証、SAML認証、そして、パスワード認証です。
Key-Pair認証
Key-Pair認証は、秘密鍵と公開鍵のペアを利用する認証方式です。Snowflake側に公開鍵を登録し、ユーザーは秘密鍵を使用して認証を行います。Snowflakeでは、2048-bit以上のRSA鍵である必要があります。また、暗号化した鍵の利用もサポートしています。正確な仕様はドキュメントの記載がないので不明ですが、少なくともTriple DESを使用した暗号化に関してはサポートされていることがドキュメントに記載されています。
なお、鍵生成時に指定するbit数は大きければ大きいほど強度の高い鍵が生成されますが、使用するシステムによっては鍵のサイズが大きすぎると利用できないケースがあるので注意が必要です。たとえば、Amazon Data Firehoseは設定できる秘密鍵のサイズが4096byteまでと決まっています。
OAuth認証
OAuthは、サードパーティアプリケーションがユーザーの認証情報を直接扱うことなく、ユーザーのリソースにアクセスするための安全な方法を提供する標準的なプロトコルです。Snowflakeは様々なサードパーティアプリケーションと連携を行うことができ、それらアプリケーションがSnowflake内のリソースにアクセスするためにOAuth認証を使用します。もちろんカスタムクライアントをSnowflake上に定義して、SnowflakeがサポートしていないアプリケーションからOAuth認証を使ってアクセスすることも可能です。*1
SAML認証
Snowflakeでは、一部のネイティブサポートしているIdPを除き、Single Sign-Onを実現するためにSAML認証を使用します。SAMLは異なるドメイン間で安全に認証情報を交換するための標準プロトコルです。弊社では、Microsoft Entra IDを使用したSAML認証を使用しています。詳細な設定方法については、以前書いた記事をご参照ください。
パスワード認証
ユーザー名とパスワードを使用して認証する方法です。パスワード認証は、使用するパスワード次第で非常に安全性が低くなります。特に、強度の低いパスワードや、使い回されたパスワードを使用することは不正ログイン被害のリスクを高めてしまいます。
この記事では、これらの認証方式のうちパスワード認証を禁止する方法を書いていきます。
認証ポリシーを使ってSnowflakeで利用できる認証方式を制限する
Snowflakeには、利用可能な認証方式を制限するために、認証ポリシーという機能が存在します。この機能は、接続元のクライアントや認証方式、IdP連携等のセキュリティ統合に制限をかけることができる機能です。
認証ポリシーによって制御可能な項目は以下のとおりです。
- 認証方式: Key-Pair認証、OAuth認証、SAML認証、パスワード認証
- 接続元のクライアント: SnowflakeのUI、SnowSQL CLI、SDK経由のアクセス
- セキュリティ統合: SAML認証やOAuth認証を使用している場合に、許可可能な外部サービス
- MFA強制: パスワード認証やSAML認証を使用している場合に、MFAを必須とするか否か
この認証ポリシーはアカウントレベル、もしくはユーザーレベルで設定が可能です。アカウント全体で基本的な認証ポリシーを設定しておき、例外対応のためにユーザーレベルで認証ポリシーを適用する、といった運用が可能です。
この認証ポリシーを利用してパスワード認証を禁止します。冒頭の結論に書いた通り、以下のSQLでパスワード認証を禁止することができます。
-- ポリシー管理専用のロールを運用している方はそちらを利用してください USE ROLE SECURITYADMIN; -- データベースとスキーマは任意のものを利用してください USE SCHEMA SYSTEM.AUTHENTICATION_POLICY; -- 認証ポリシーの作成 CREATE OR REPLACE AUTHENTICATION POLICY ACCOUNT_AUTHENTICATION_POLICY CLIENT_TYPES = ('ALL') AUTHENTICATION_METHODS = ('SAML', 'OAUTH', 'KEYPAIR') SECURITY_INTEGRATIONS = ('ALL'); -- アカウントへ認証ポリシーの適用 ALTER ACCOUNT SET AUTHENTICATION POLICY ACCOUNT_AUTHENTICATION_POLICY;
弊社での運用
弊社では、この認証ポリシーをアカウントレベル、ユーザーレベルの両方で運用しています。具体的には、以下の要求を満たすために2つの認証ポリシーを運用しています。
- IdP上のユーザーを利用する場合はSAML認証、またはOAuth認証しか認めない。
- IdP上に存在しないユーザーはシステム間連携で必要な場合を除き、原則作成しない。作成する場合は暗号化された鍵を用いたKey-Pair認証のみ許可する。
これらの要件を満たすため、以下のSQLで表現される認証ポリシーを作成・適用しています。
-- ポリシー管理専用のロールを運用している方はそちらを利用してください USE ROLE SECURITYADMIN; -- データベースとスキーマは任意のものを利用してください USE SCHEMA SYSTEM.AUTHENTICATION_POLICY; -- アカウント全体で使用する認証ポリシーの作成 -- SAML と OAUTH のみ許可している CREATE OR REPLACE AUTHENTICATION POLICY ACCOUNT_AUTHENTICATION_POLICY CLIENT_TYPES = ('ALL') AUTHENTICATION_METHODS = ('SAML', 'OAUTH') SECURITY_INTEGRATIONS = ('ALL'); -- アカウントへ認証ポリシーの適用 ALTER ACCOUNT SET AUTHENTICATION POLICY ACCOUNT_AUTHENTICATION_POLICY;
-- ユーザー単位で使用する認証ポリシーの作成 -- 接続クライアントは DRIVER のみ許可 -- 認証方式も KEYPAIR のみ許可 -- セキュリティ統合は認証方式に SAML, OAUTH を使用していなければ利用できないので指定しない CREATE OR REPLACE AUTHENTICATION POLICY NON_INTERACTIVE_ACCESS_AUTHENTICATION_POLICY CLIENT_TYPES = ('DRIVER') AUTHENTICATION_METHODS = ('KEYPAIR'); -- XXXXXXX というユーザーに対して認証ポリシーの適用。 ALTER USER "XXXXXXX" SET AUTHENTICATION POLICY NON_INTERACTIVE_ACCESS_AUTHENTICATION_POLICY;
この運用により、パスワード認証は禁止され、鍵の管理が必要なKey-Pair認証の利用も特定のユーザーのみに限定されます。そのため、セキュリティリスクを抱える対象範囲を狭めることができています。
それでもパスワード認証を使い続ける必要があるんだ…
最後に、パスワード認証を使い続ける必要がある場合の対策について触れておきます。ここまで、パスワード認証を禁止する内容を書きました。しかし、SAML認証やOAuth認証を利用できない場合はパスワード認証を使い続ける必要があります。Snowflakeは、パスワード認証を使い続ける場合でも、安全性を担保する仕組みを持っているので紹介したいと思います。
ネットワークポリシー
Snowflakeでは、IPアドレスレベルの通信制御を実現するための機能としてネットワークポリシーを設定できます。Snowflakeの利用において、オフィスネットワークやVPN経由でのアクセスのみに制限が可能であれば設定するべきでしょう。
パスワードポリシー
Snowflakeでは、ユーザーの設定するパスワードの強度をパスワードポリシーという機能で強制することが可能です。パスワードの長さや、含まれる文字列の数などを細かく指定することができます。また、利用可能期間や過去に使用したパスワードの禁止、ログイン試行回数上限の設定なども設定が可能です。
Snowflakeがデフォルトで提供しているパスワードポリシーは以下の設定になっています。
- 最低8文字以上
- 数値を最低1文字以上
- 大文字と小文字がそれぞれ最低一文字以上
パスワードポリシーを設定する場合、それぞれのパラメータの設定値は、会社で定められたポリシーに則って設定してください。情報処理推進機構が推奨しているように、一般的にパスワードは「使い回されておらず」「長く」「複雑」であることが重要なので、そういった条件を満たせるパスワードポリシーを作るのが良いでしょう。
Multi-factor authentication (MFA)
Snowflakeのパスワード認証は、MFAの設定も可能です。SnowflakeのMFAでは、Cisco DUOという製品を利用します。
Cisco DUOが提供するDUO Mobileという専用アプリをモバイル端末にインストールし、MFAの設定を行います。MFA設定完了後は、ログイン時にPush通知を受け取り、DUO Mobileから許可することで、ログインが完了するフローに変わります。
そして、MFAの設定をユーザーに強制することが、認証ポリシーによって実現できます。 以下のように MFA_ENROLLMENT = REQUIRED
を指定することでMFAの設定を強制することができます。
CREATE AUTHENTICATION POLICY require_mfa_authentication_policy AUTHENTICATION_METHODS = ('SAML', 'PASSWORD') CLIENT_TYPES = ('SNOWFLAKE_UI', 'SNOWSQL', 'DRIVERS') MFA_AUTHENTICATION_METHODS = ('PASSWORD', 'SAML') MFA_ENROLLMENT = REQUIRED; ALTER ACCOUNT SET AUTHENTICATION POLICY require_mfa_authentication_policy;
先日、発表されたSnowflakeアカウントに対する侵害では、被害を受けた多くのアカウントでMFAを設定していなかったようです。パスワード認証を使い続ける必要がある方は、MFAの設定を必須とするべきでしょう。
というか、
Don't Use Passwords in Your Snowflake Account.
おわりに
この記事では『Don't Use Passwords in Your Snowflake Account』というタイトルで、Snowflakeのアカウントレベルでパスワード認証を禁止する方法を紹介しました。セキュリティはどんな場面でも重要ですが、データ基盤は企業のすべての情報を扱うため、特に注意を払わなければならないシステムの一つです。パスワード認証をアカウントレベルで禁止することで、意図しない脆弱な認証経路を廃することができ、Snowflakeアカウントをより安全に運用することができるようになります。まだ、設定を行っていない方は、この機会にぜひ設定してみてください。
バクラク事業部では現在、データ基盤で利用するデータウェアハウスソリューションをGoogle BigQueryからSnowflakeへ移管するプロジェクトを進めています。そして、移管後にどういったデータ基盤を構築していくか、ワクワクしながら考えているフェーズです。まだまだ伸びしろが多く、やりたいこともたくさんあるので、一緒にワクワクしながらデータ基盤を作っていける仲間を募集しています。まずは、カジュアル面談からご応募ください!お話しましょう!お待ちしています!
データ関連の求人票
open.talentio.com open.talentio.com
*1:弊社ではLooker Studio向けのカスタムコネクターを自社開発しており、Snowflakeにカスタムクライアントを定義して、OAuth認証使ったSnowflakeへのアクセスを実現しています。