制限された呼び出し元権限と|sis|

デフォルトでは、すべての|sis|アプリは、呼び出し元の権限ではなく、:doc:`所有者の権限で実行</developer-guide/streamlit/object-management/owners-rights>`されます。Streamlitアプリ開発者は、コンテナランタイムアプリを所有者の権限で実行するか、制限された呼び出し元権限で実行するかを定義できます。制限された呼び出し元権限はウェアハウスのランタイムではサポートされていません。

制限された呼び出し元権限は、Streamlitアプリを呼び出し元権限で実行することを許可しますが、アプリがどの呼び出し元権限で実行されるかを制限します。制限された呼び出し元権限では、管理者が明示的に許可しない限り、Streamlitアプリは特定の権限で実行できません。管理者は、:ref:`呼び出し元グラント<label-streamlit_restricted_callers_rights_required_caller_grants>`を使用して、アプリがどの呼び出し元権限で実行できるかを定義します。この方法で、Streamlitアプリは(ビューアーに代わって)アクセスを許可されたデータのみにアクセスします。

詳細については、 制限された呼び出し元権限 をご参照ください。

必要な呼び出し元グラント

ビューアに代わってテーブル、ストアドプロシージャ、またはウェアハウスにアクセスするには、Streamlitアプリ開発者はMANAGE CALLER GRANTS権限を持つユーザーから呼び出し元グラントを付与されている必要があります。

ワークフロー例

  1. 管理者は、``data_science_manager``ロールに MANAGE CALLER GRANTSを付与します。

    GRANT MANAGE CALLER GRANTS ON ACCOUNT TO ROLE data_science_manager;
    
    Copy
  2. ``data_science_manager``ロールを持つユーザーは、``streamlit_app_developer``ロールに次の権限を付与します。

    • ``streamlit_app_developer``ロールに対し、呼び出し元としてのSELECT権限を付与します。これにより、このロールが所有するStreamlitアプリが``streamlit_db.streamlit_schema.streamlit_table``テーブルにアクセスする際、そのテーブルに対するSELECT権限を持って動作できるようになります。

      GRANT CALLER SELECT ON TABLE streamlit_db.streamlit_schema.streamlit_table TO ROLE streamlit_app_developer;
      
      Copy
    • ``streamlit_wh``ウェアハウスを使用するために、``streamlit_app_developer``ロールに対して呼び出し元の使用権限を付与します。

      GRANT CALLER USAGE ON WAREHOUSE streamlit_wh TO ROLE streamlit_app_developer;
      
      Copy

呼び出し元グラントの詳細については、label-restricted-callers-rights-about-grants`および:doc:/sql-reference/sql/grant-caller`をご参照ください。

|sis|における制限された呼び出し元権限のユースケース

|sis|での制限された呼び出し元権限により、以下を統制できます。

  • Streamlitアプリが利用可能なページ

  • Streamlitアプリが利用可能なデータ

  • CURRENT_ROLEがアクセスできる行アクセスポリシーを持つデータ

  • アクセス可能なウェアハウス

  • Streamlitアプリで呼び出すことができるストアドプロシージャ

コンテナランタイムにおける制限された呼び出し元権限

コンテナランタイムでは、所有者の権限と制限された呼び出し元の権限を同じアプリで組み合わせることができます。

  • 所有者の権限を使用する接続を作成するには、:code:`st.connection("snowflake")`を使用します。

  • 制限付き呼び出し元権限を使用する接続を作成するには、:code:`st.connection("snowflake-callers-rights")`を使用します。

詳細については、Streamlitドキュメントの|st.connection|_および|SnowflakeConnection|_をご参照ください。

次の例は、呼び出し元権限接続を作成する方法を示しています。

import streamlit as st

conn = st.connection("snowflake-callers-rights")
df = conn.query("SELECT CURRENT_USER()")
st.write(f"Running as: {df[0][0]}")
Copy

コンテナランタイムで制限された呼び出し元権限を使用するためのヒントと制限

  • :code:`Sf-Context-Current-User-Token`ヘッダーで提供されるトークンは2分間のみ有効で、アプリセッションの開始時に作成されます。呼び出し元権限の接続は、if-elseブロックやページの後方ではなく、アプリスクリプトの先頭に作成してください。

  • 制限された呼び出し元権限接続は、|sf-web-interface|で選択したロールではなく、ビューアーの既定のロールを使用します。

  • 複数の接続を作成することで、同じアプリで制限付き呼び出し元権限接続と通常の所有者権限接続の両方を使用できます。

  • 制限された呼び出し元権限接続は、アプリがコンテナランタイムを使用している場合にのみ機能します。ローカル開発環境またはウェアハウスランタイム環境で、制限された呼び出し元権限接続を使用しようとすると、エラーが発生します。

  • 制限された呼び出し元権限はセカンダリロールをサポートしていません。

重要

制限された呼び出し元権限の接続は、セッションスコープです。制限された呼び出し元権限の接続から返されたデータをキャッシュする必要がある場合は、キャッシュデコレーターでセッションスコープを使用する必要があります。これにより、セッション間でデータが共有されるのを防ぎます。キャッシュでセッションスコープを使用するには、キャッシュデコレーターで:code:`scope="session"`を設定します詳細については、Streamlitドキュメントの|st.cache_data|_をご参照ください。