Streamlit in Snowflake のセキュリティ概要¶
このトピックでは、Snowflakeアカウントで Streamlit in Snowflake を管理するシステム管理者向けのセキュリティの概要を説明します。セキュリティモデルを理解し、適切な制御を実装することで、開発者は安全なアプリケーションを構築でき、管理者は機密データとリソースに対するガバナンスを維持できます。
セキュリティモデル¶
Streamlit in Snowflake は、認証、ロールベースのアクセス制御、ネットワークポリシー、データガバナンス機能を含むSnowflakeの包括的なセキュリティモデルに従っています。アプリは、既存のセキュリティインフラストラクチャと統合するファーストクラスのSnowflakeオブジェクトです。
所有者の権利実行¶
デフォルトでは、Streamlitアプリはストアドプロシージャと同様に、所有者の権限で実行されます。これには次のような結果があります。
アプリは、ビューアーではなく、アプリ所有者の権限を使用してクエリを実行します。
アプリの所有者のロールは、アプリがどのようなデータや操作にアクセスできるかを決定します。
ビューアーは、基になるテーブルやビューに直接アクセスすることなく、アプリと対話することができます。
このモデルは、サービスアカウントのトークンが不要になり、Snowflakeの認証およびアクセス制御機能とシームレスに統合されます。詳細については、 所有者の権利と Streamlit in Snowflake アプリの理解 をご参照ください。
コンテンツセキュリティポリシー¶
すべてのStreamlitアプリは、 `コンテンツセキュリティポリシー<https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP>`_(CSP)の中で実行され、どのリソースをロードできるかを制限します。このポリシーは、クロスサイトスクリプト(XSS)やその他のコードインジェクション攻撃に対する多層防御を提供します。CSP は現時点では構成できません。
CSP は以下の外部リソースをブロックします。
外部ドメインからのコード(スクリプト、スタイル、フォント)の読み込み
外部ドメインからのiframeへのアプリの埋め込み
CSP では、以下の外部リソースを使用できます。
HTTPS ソースからの画像とメディア:アプリは、外部の画像ホスティングサービスや画像を返す APIs を含む、あらゆる HTTPS URL から画像やメディアファイルを読み込むことができます。これには外部アクセス統合は必要ありません。
データ URIs およびBLOB URLs:アプリでは、画像やメディアに埋め込みデータ(データ URIs)と動的に生成されたコンテンツ(blob URLs)を使用できます。これは、チャート、図、ユーザーがアップロードしたコンテンツの表示などの機能をサポートしています。
MapboxとCartoのリソース:MapboxとCartoからのリソースの限定サブセットは、マッピングの視覚化をサポートすることが許可されています。
注釈
condaを使用して依存関係を管理するウェアハウスランタイムの場合、Mapboxを使用するにはAnacondaの規約に同意する必要があります。詳細については、 Anacondaのサードパーティパッケージの使用 をご参照ください。
外部ドメインからの画像やメディアの読み込みは、 Streamlit in Snowflake ではサポートされていますが、 Snowflake Native App Framework ではサポートされていません。
CSP はまた、
eval()のような、一般に安全でないと考えられているフロントエンドの呼び出しもブロックします。
この制限的なポリシーは、外部スクリプトに依存するほとんどのサードパーティの JavaScript ライブラリやカスタムコンポーネントがStreamlitアプリで動作しないことを意味します。CSP 制限に関する情報については、 Streamlit in Snowflake で外部リソースを読み込む際の制限 をご参照ください。
必須のセキュリティ設定¶
安全で適切に機能する Streamlit in Snowflake 環境には、次のセキュリティ構成が不可欠です。
ネットワークアクセス構成¶
ネットワークアクセスを構成して、アプリがSnowflakeと通信できるようにします。
すべてのデプロイ用:
StreamlitアプリとSnowflake間の通信を有効にするために、
*.snowflake.appをネットワーク許可リストに追加します。ネットワーク構成で WebSockets がブロックされていないことを確認してください。
詳細については、 You can't load the Streamlit app をご参照ください。
プライベート接続:
組織でプライベート接続が必要な場合は、Snowflakeアクセスと Streamlitアプリアクセスの両方に対して AWS PrivateLink、Azure Private Link、またはGoogle Cloud Private Service Connectを構成します。詳細については、 Private connectivity for Streamlit in Snowflake をご参照ください。
ロールベースのアクセス制御¶
Streamlitアプリを管理するためのロール階層を確立します。
推奨ロール構造:
作成者ロール:アプリがデプロイされるスキーマに対する CREATESTREAMLIT 権限を持つロール。
ビューアーロール:エンドユーザー向けのアプリに対する USAGE 権限を持つロール。
次の例は、Streamlitアプリのロール階層を作成する方法を示しています。
-- Create dedicated roles for Streamlit
CREATE ROLE streamlit_developer;
CREATE ROLE streamlit_viewer;
-- Grant hierarchy
GRANT ROLE streamlit_viewer TO ROLE streamlit_developer;
-- Grant privileges for app creation
GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_developer;
GRANT USAGE ON SCHEMA streamlit_db.apps TO ROLE streamlit_developer;
GRANT CREATE STREAMLIT ON SCHEMA streamlit_db.apps TO ROLE streamlit_developer;
GRANT USAGE ON COMPUTE_POOL streamlit_compute_pool TO ROLE streamlit_developer;
GRANT USAGE ON INTEGRATION python_package_index TO ROLE streamlit_developer;
-- Grant privileges for app viewing
GRANT USAGE ON WAREHOUSE streamlit_wh TO ROLE streamlit_viewer;
GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_viewer;
GRANT USAGE ON SCHEMA streamlit_db.apps TO ROLE streamlit_viewer;
GRANT USAGE ON STREAMLIT streamlit_db.apps.my_app TO ROLE streamlit_viewer;
アプリ開発者は streamlit_wh の USAGE も必要ですが、これはビューアーロールから継承されます。必要な権限については、 Streamlitアプリの作成と使用に必要な権限 をご参照ください。
シークレット管理¶
外部サービスまたは機密性の高い認証情報にアクセスするアプリの適切なシークレット管理を構成します。
適切な権限を付与して、アプリのシークレットアクセスを有効にします。
-- Grant privileges on secrets to app owner role GRANT READ ON SECRET my_secret TO ROLE streamlit_developer; GRANT USAGE ON INTEGRATION my_external_access_integration TO ROLE streamlit_developer;
コンテナランタイムアプリの場合、アプリコードにシークレットを埋め込むのではなく、シークレットアクセスをラップする SQL 関数を作成します。
詳細については、 シークレットを管理し、Streamlitアプリを設定する をご参照ください。
コンテキスト関数および行レベルのセキュリティ¶
アプリがコンテキスト関数(CURRENT_USER() など)を使用する場合、または行アクセスポリシーが設定されたテーブルにアクセスする場合は、アプリ所有者のロールにグローバル READSESSION 権限を付与します。
USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_developer;
注釈
行アクセスポリシーで CURRENT_ROLE() を使用するアプリは、デフォルトで所有者の権利で実行されるため、閲覧者のロールではなく、常にアプリの所有者のロールを返します。
詳細と例については、Streamlit in Snowflake での行アクセスポリシー をご参照ください。
コンテナランタイムのみ:パッケージリポジトリセキュリティ¶
コンテナランタイム用に1つ以上のパッケージインデックスを構成します。
コンテナランタイムは、PyPI のような外部リポジトリからパッケージをインストールできます。JFrog アーティファクトのような、厳選されたパッケージインデックスを使用してパッケージソースを制御することも、またはデフォルトのパッケージインデックス PyPI を使用することもできます。使用するパッケージインデックスに関係なく、外部アクセス統合(EAI)を作成して、アプリが依存関係をインストールできるようにする必要があります。
厳選されたパッケージインデックスを使用すると、次のような利点があります。
これにより、サプライチェーンの攻撃を防ぎ、信頼できるソースからのパッケージを保証します。
どのパッケージやバージョンがアプリで利用できるかを制御できます。
パッケージのインストールの監査証跡を提供します。
詳細については、 コンテナランタイムの依存関係の管理 をご参照ください。
ウェアハウスランタイムのみ。外部製品規約¶
ウェアハウスランタイムはcondaを使用してアプリの依存関係を管理します。アプリでMapboxを使用する場合は、 `外部製品規約<https://www.snowflake.com/legal/external-offering-terms/>`_ に同意する必要があります。
このパッケージの使用に関する情報については、 Anacondaのサードパーティパッケージの使用 をご参照ください。
利用可能なセキュリティ機能¶
アプリのセキュリティとガバナンスを強化するために、次のセキュリティ機能を利用できます。
外部アクセス統合¶
アプリがアクセスできる外部ネットワークおよびサービスを制御します。
ネットワークルールを作成して、許可されたエンドポイントを定義します。
ネットワークルールと認証シークレットを参照する外部アクセス統合を作成します。
Streamlitアプリに外部アクセス統合を割り当てる。
これにより、アプリが不正なアウトバウンド接続を行うことを防ぎ、外部アクセスの監査証跡を提供します。
詳細については、 Streamlit in Snowflake の外部ネットワークアクセス をご参照ください。
Git統合¶
StreamlitアプリとGitリポジトリを統合し、バージョン管理と変更追跡を実現します。
Gitリポジトリオブジェクト(READ、 WRITE または OWNERSHIP)に対する適切な権限を付与します。
Git統合を使用して、コード変更の監査追跡を維持します。
実稼働アプリに変更を展開する前に、コードの確認プロセスを実装します。
詳細については、 Streamlit in Snowflake アプリとGitリポジトリの同期 をご参照ください。
プライベート接続¶
厳格なネットワークセキュリティ要件を持つ組織の場合は、プライベート接続を構成して、すべてのStreamlitトラフィックがプライベートネットワーク内にとどまるようにします。 Streamlit in Snowflake は、以下のプライベート接続オプションをサポートしています。
プライベート接続は、パブリックインターネットへの公開を排除し、追加のネットワーク分離を提供します。
詳細については、 Private connectivity for Streamlit in Snowflake をご参照ください。
ログおよびトレース¶
ウェアハウスランタイムの場合、ログとトレースを有効にして、アプリの動作をモニターし、問題をトラブルシューティングします。
イベントテーブルを作成し、アカウントに関連付けます。
Streamlitアプリを含むデータベースの適切なログとトレースレベルを設定します。
セキュリティイベント、エラー、異常な動作について、ログを定期的に確認する。
ログとトレースはコンテナランタイムではまだサポートされていません。
詳細については、 Streamlit in Snowflake 用のログおよびトレース をご参照ください。
管理者のベストプラクティス¶
以下のベストプラクティスは、安全なStreamlit環境を維持するのに役立ちます。
専用のロールとスキーマを使用する:
開発、テスト、実稼働アプリ用に別々のスキーマを作成します。
実稼働アプリに誤って変更されないように、環境ごとに異なるロールを使用します。
個々のユーザーアカウントではなく、サービスロールに実稼働アプリの所有権を付与する。
最小権限アクセスの実装:
各ロールに最低限必要な権限のみを付与します。
ロールのメンバーシップと権限を定期的に確認および監査する。
絶対に必要な場合を除き、アプリ所有者に ACCOUNTADMIN またはその他の強力なロールを付与することは避けてください。
アプリのライフサイクルの管理:
アプリの承認とデプロイのプロセスを確立する。
アプリを実稼働に昇格させる前に、コードレビューを必要とします。
どのアプリが機密データにアクセスし、追加の監視が必要かをドキュメント化します。
未使用のアプリや非推奨になったアプリを定期的に確認し、削除する。
リソースの使用状況をモニターする:
アプリのワークロードに適したウェアハウスのサイズを設定する。
コンピューティングコストをモニターし、異常な使用パターンに関するアラートを設定する。
コンテナランタイムの場合、適切な MIN_NODES および MAX_NODES 設定でコンピューティングプールを構成します。
コストとリソースを分離するには、異なるアプリ環境用に別々のウェアハウスを使用します。
リソース管理の詳細については、 Streamlit in Snowflake のコスト管理 および Streamlitアプリのランタイム環境 をご参照ください。
セキュアなアプリ開発を実践します:
認証情報や API キーをアプリコードに直接埋め込まないでください。
機密情報の保存にはSnowflakeシークレットを使用します。
SQL インジェクションを防ぐために、ユーザー入力を検証してサニタイズします。
アプリを通じて公開されるデータを、ビューア―が表示する必要があるもののみに制限します。
幅広い対象者と共有する前に、アプリを徹底的にテストします。
所有者の権利のセキュリティに関する考慮事項の詳細については、 所有者の権利とアプリのセキュリティ をご参照ください。
定期的なセキュリティ監査の実行:
CREATESTREAMLIT 権限を持つロールを精査します。
どのアプリがどのデータソースにアクセスするかを監査します。
外部アクセス統合とネットワークルールを確認します。
元の従業員や非アクティブなアカウントが所有するアプリをチェックします。
Gitリポジトリのアクセスとコミット履歴を確認します。
以下のクエリを使用して、Streamlitアプリを監査します。
-- List all Streamlit apps and their owners
SHOW STREAMLITS;
-- Check privileges on a specific app
SHOW GRANTS ON STREAMLIT streamlit_db.apps.my_app;
-- List all roles with CREATE STREAMLIT privileges
SHOW GRANTS OF CREATE STREAMLIT;