アクセス制御の構成

このトピックでは、アカウントの セキュリティ保護可能なオブジェクト のアクセス制御セキュリティを構成する方法について説明します。

このトピックの内容:

アカウント管理

アカウント管理者としての追加ユーザーの指定

デフォルトでは、各アカウントにはアカウント管理者として指定された1人のユーザーがいます(ユーザーはシステム定義の ACCOUNTADMIN ロールを付与されています)。アカウント管理者として少なくとも1人の他のユーザーを指定することをお勧めします。これにより、アカウント管理者の1人がログインできない場合は特に、アカウントレベルのタスクを実行できる少なくとも1人のユーザーがアカウントに常に存在するようになります。

これらの追加のアカウント管理者については、新しいユーザーを作成するか、既存のユーザーを指定するかを選択できますが、必ず次を指定してください。

  • ユーザーに ACCOUNTADMIN ロールを付与しますが、このロールをデフォルトとして設定 しないで ください。代わりに、下位レベルの管理ロール(例: SYSADMIN)またはカスタムロールをデフォルトとして指定します。これにより、アカウント管理者が誤って ACCOUNTADMIN ロールを使用してオブジェクトを作成することを防止できます。

  • 各ユーザーにメールアドレスが指定されていることを確認します(多要素認証に必要)。

例えば、 user2 という名前の既存のユーザーに ACCOUNTADMIN および SYSADMIN のロールを付与し、既定のロールとして SYSADMIN を指定します。

GRANT ROLE ACCOUNTADMIN, SYSADMIN TO USER user2;

ALTER USER user2 SET EMAIL='user2@domain.com', DEFAULT_ROLE=SYSADMIN;

アカウント管理者ごとに MFA を有効化

Snowflakeアカウントの最高レベルのセキュリティを確保するため、機密データを変更または表示できるユーザーには、多要素認証(MFA)の使用をログインの必須条件とすることを 強く お勧めします。

この推奨事項は特に ACCOUNTADMIN のロールがあるユーザーに適用されますが、SECURITYADMIN および SYSADMIN のロールがあるユーザーを含むように拡張することもできます。

詳細については、 アクセス制御の考慮事項 および 多要素認証(MFA) をご参照ください。

カスタムロールの作成

「最小権限」の一般原則に従うために、組織内の ビジネス機能に合わせた カスタムロールを作成して、セキュリティ保護可能なオブジェクトの狭いセットで SQL アクションを許可することをお勧めします。

ワークフローは次のとおりです。

  1. カスタムロールを作成します。

  2. ロールに権限のセットを付与します。

  3. ビジネスニーズに合わせて、 SQL アクションを実行するためにロールに付与された権限を必要とする1人以上のユーザーにロールを付与します。

  4. ロールを別のロールに付与して、ロール階層を作成または追加します。必須ではありませんが、このステップを強くお勧めします。詳細については、 ロール階層の作成 (このトピック内)をご参照ください。

このセクションでは、 r1 という名前のロールを作成し、そのロールに次の権限を付与する手順について説明します。権限により、セッションでロールをアクティブ化するユーザーは、単一のテーブル d1.s1.t1 をクエリできます。

権限

オブジェクト

メモ

USAGE

ウェアハウス w1

データベース d1

スキーマ s1

オブジェクト(テーブルやビューなど)をクエリするには、ロールにウェアハウスに対する USAGE 権限が必要です。ウェアハウスは、クエリを実行するためのコンピューティングリソースを提供します。

スキーマ内のオブジェクトを操作するには、コンテナーデータベースとスキーマに対する USAGE 権限もロールに必要です。

SELECT

テーブル t1

ロールが作成された後、そのロールに追加の権限を付与して、そのロールを持つユーザーが同じオブジェクトまたは追加のオブジェクトに対して、追加の SQL アクションを実行できるようにすることができます。

ロールを作成する

  1. CREATE USER を使用して r1 ロールを作成します。

    ロールを作成できるのは、ユーザー管理者(つまり、 USERADMIN ロール以上のユーザー)またはアカウントの CREATE ROLE 権限を持つ別のロールのみです。

    CREATE ROLE r1
       COMMENT = 'This role has all privileges on schema_1';
    

ロールに権限を付与する

  1. このセクションの前半のテーブルで定義されている権限を r1 ロールに付与します。

    このコマンドを実行できるのは、 MANAGE GRANTS グローバル権限を持つロールまたはそれ以上のロールのみです。デフォルトでは、 SECURITYADMIN ロールのみが MANAGE GRANTS 権限を持っています。

    GRANT USAGE
      ON WAREHOUSE w1
      TO ROLE r1;
    
    GRANT USAGE
      ON DATABASE d1
      TO ROLE r1;
    
    GRANT USAGE
      ON SCHEMA d1.s1
      TO ROLE r1;
    
    GRANT SELECT
      ON TABLE d1.s1.t1
      TO ROLE r1;
    

ユーザーにロールを付与する

  1. ロール r1 ロールをユーザー smith に割り当てます。

    このコマンドを実行できるのは、ユーザーに対する OWNERSHIP 権限を持つロール、 MANAGE GRANTS グローバル権限を持つロール、またはこれらのロールのいずれよりもロール階層の上位にあるロールのみです。

    GRANT ROLE r1
       TO USER smith;
    
  2. オプションで、新しいカスタムロールをユーザーの既定のロールとして設定します。次回、ユーザーがSnowflakeにログインすると、セッションで既定のロールが自動的にアクティブになります。

    このコマンドを実行できるのは、ユーザーに対する OWNERSHIP 権限を持つロールまたはそれ以上のロールのみです。

    次のコマンドは、ユーザー smith の既定のロールを設定します。

    ALTER USER smith
       SET DEFAULT_ROLE = r1;
    

読み取り専用カスタムロールの作成

特定のスキーマ(例: d1.s1)にあるすべてのテーブルのクエリに限定されたロールが必要だと想定します。このロールを使用してコマンドを実行するユーザーは、テーブルデータを更新したり、追加のデータベースオブジェクトを作成したり、テーブルをドロップしたりすることはできません。このロールは、テーブルデータのクエリに限定されています。

読み取り専用のロールを作成するには、 カスタムロールの作成 (このトピック内)で説明されている基本的なステップを実行します。 ロールへの権限の付与 セクションで、読み取り専用ロール(これらの手順では read_only という名前)に次のオブジェクト権限を付与します。

権限

オブジェクト

メモ

USAGE

ウェアハウス

オブジェクト(テーブルやビューなど)をクエリするには、ロールにウェアハウスに対する USAGE 権限が必要です。ウェアハウスは、クエリを実行するためのコンピューティングリソースを提供します。

SELECT

テーブル

スキーマ内のオブジェクトを操作するには、コンテナーデータベースとスキーマに対する USAGE 権限もロールに必要です。

GRANT <権限> ステートメントは次のとおりです。

GRANT USAGE
  ON DATABASE d1
  TO ROLE read_only;

GRANT USAGE
  ON SCHEMA d1.s1
  TO ROLE read_only;

GRANT SELECT
  ON ALL TABLES IN SCHEMA d1.s1
  TO ROLE read_only;

GRANT USAGE
  ON WAREHOUSE w1
  TO ROLE read_only;

注釈

GRANT SELECT ON ALL TABLES IN SCHEMA <スキーマ> ステートメントは、すべての 既存の テーブルに対してのみ SELECT 権限を付与します。すべての 将来 のテーブルに対する SELECT 権限をロールに付与するには、次のステートメントを実行します。

GRANT SELECT ON FUTURE TABLES IN SCHEMA d1.s1 TO ROLE read_only;

ロール階層の作成

カスタムロールを作成するときは、最終的に高レベルの管理者ロールに割り当てられるロール階層を作成することを検討してください。一般に、SYSADMIN ロールは他のすべてのロールが階層内で割り当てられているロールと同じように機能しますが、十分な権限のあるロールがこの機能を提供できることに注意することが重要です。SYSADMIN ロールは、アカウントでウェアハウス、データベース、およびデータベースオブジェクトを作成し、それらの権限を他のロールに付与する権限があるシステム定義のロールです。デフォルトのシステム階層では、最上位の ACCOUNTADMIN ロールがシステム管理者ロールを管理します。

ロールを2番目のロールに付与して、ロール階層を作成します。その後、その2番目のロールを3番目のロールに付与できます。ロールに関連付けられた権限は、階層内のそのロールの のロール(親ロール)によって継承されます。

次の図は、ロール階層の例と各ロールに付与される権限を示しています。

Role hierarchy and privileges granted to each role

別のロールにロールを付与する

上位レベルの階層のロールに、ロールを割り当てます。この例では、 カスタムロールの作成 で作成した r1 ロール(このトピック内)を SYSADMIN ロールに割り当てています。SYSADMIN ロールは、 r1 ロールに付与されたオブジェクト権限を継承します。

GRANT ROLE r1
   TO ROLE sysadmin;

注釈

より複雑な例では、 custom ロールを SYSADMIN の別の子ロール(またはデータベースを作成するための十分な権限があるカスタムロールなどの別の管理者ロール)に割り当てることができます。SYSADMIN ロールは、 custom ロールとその親ロールに割り当てられた結合された権限を継承します。階層内の custom の上のロールがオブジェクトを所有している場合、ロール階層により、 SYSADMIN ロールのメンバーもそれらのオブジェクトを(間接的に)所有し、期待どおりに管理できます。

付与された権限の表示

オブジェクトに付与されている現在の権限セットを表示するには、 SHOW GRANTS コマンドを実行します。

注釈

特定のオブジェクトで SHOW GRANTS コマンドを実行するには、そのオブジェクトタイプに対して SHOW コマンドを実行する場合と同じオブジェクト権限が必要です。

例えば、テーブルで SHOW GRANTS コマンドを実行するには、テーブルとコンテナデータベースおよびスキーマに対する次の権限が必要です。

データベース

USAGE

スキーマ

USAGE

テーブル

任意の権限

たとえば、スキーマの現在の権限を表示するには、次のコマンドを実行します。

SHOW GRANTS ON SCHEMA <database_name>.<schema_name>;

たとえば、 カスタムロールの作成 (このトピック内)で付与された database_a.schema_1 の権限を表示するには、次のコマンドを実行します。

SHOW GRANTS ON SCHEMA database_a.schema_1;

Snowflakeは次の結果を返します。

+-------------------------------+-----------------------+------------+----------------------+------------+--------------------------+--------------+---------------+
| created_on                    | privilege             | granted_on | name                 | granted_to | grantee_name             | grant_option | granted_by    |
|-------------------------------+-----------------------+------------+----------------------+------------+--------------------------+--------------+---------------|
| 2022-03-07 09:04:23.635 -0800 | USAGE                 | SCHEMA     | D1.S1                | ROLE       | R1                       | false        | SECURITYADMIN |
+-------------------------------+-----------------------+------------+----------------------+------------+--------------------------+--------------+---------------+

SHOW GRANTS コマンドを実行して、ロールに付与された現在の権限セット、またはユーザーに付与された現在のロールセットを表示することもできます。

SHOW GRANTS TO ROLE <role_name>;
SHOW GRANTS TO USER <user_name>;

たとえば、次のコマンドを実行して、 カスタムロールの作成 (このトピック内)で作成した r1 ロールに付与された権限を表示します。

SHOW GRANTS TO ROLE r1;

Snowflakeは次の結果を返します。

+-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------+
| created_on                    | privilege | granted_on | name                 | granted_to | grantee_name | grant_option | granted_by    |
|-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------|
| 2022-03-07 09:08:43.773 -0800 | USAGE     | DATABASE   | D1                   | ROLE       | R1           | false        | SECURITYADMIN |
| 2022-03-07 09:08:55.253 -0800 | USAGE     | SCHEMA     | D1.S1                | ROLE       | R1           | false        | SECURITYADMIN |
| 2022-03-07 09:09:07.206 -0800 | SELECT    | TABLE      | D1.S1.T1             | ROLE       | R1           | false        | SECURITYADMIN |
| 2022-03-07 09:08:34.838 -0800 | USAGE     | WAREHOUSE  | W1                   | ROLE       | R1           | false        | SECURITYADMIN |
+-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------+

オブジェクトに対する将来の付与の割り当て

付与管理を簡素化するために、 将来の付与 では、データベースまたはスキーマにある特定の の新しい(つまり、将来の)オブジェクトに付与する権限の初期セットを定義できます。新しいオブジェクトが作成されると、定義された権限が指定されたロールに自動的に付与されます。

将来の付与では、指定されたタイプの新しいオブジェクトに付与される権限の 初期 セットのみを定義します。個々のオブジェクトが作成されると、管理者は明示的に追加の権限を付与したり、オブジェクトに対する権限を取り消したりできます。これにより、スキーマまたはデータベース内のすべてのオブジェクトに対するきめ細かいアクセス制御が可能になります。

考慮事項

  • データベースレベルでオブジェクトに定義された将来の許可は、将来作成されるそのタイプのすべてのオブジェクトに適用されます。詳細については、 データベースまたはスキーマオブジェクトに対する将来の付与の定義 (このトピック内)をご参照ください。

  • 各オブジェクトタイプ(スキーマ、テーブル、ビュー、ストリームなど)に個別に将来の付与を定義する必要があります。詳細については、 既存のデータベースまたはスキーマオブジェクトに対する将来の付与の定義 (このトピック内)をご参照ください。

  • 将来の付与を使用して定義された権限は、オブジェクトの作成時に自動的に付与されます。

  • 将来の許可が、データベースレベルとスキーマレベルの両方で定義されている場合、スキーマレベルの許可はデータベースレベルの許可よりも優先され、データベースレベルの許可は無視されます。

  • データベースレベルの将来の許可は、通常のアクセススキーマと管理アクセススキーマの両方に適用されます。詳細については、 将来の付与を管理するために必要なセキュリティ権限 (このトピック内)をご参照ください。

将来の付与を管理するために必要なセキュリティ権限

将来のオブジェクトに対する権限を付与または取り消すには、次の権限が必要です。

データベースレベル

データベースにある将来のオブジェクトの権限を付与または取り消すには、 MANAGE GRANTS グローバル権限が必要です。SECURITYADMIN および ACCOUNTADMIN システムロールのみが MANAGE GRANTS 権限を持っています。ただし、この権限はカスタムロールに付与できます。

スキーマレベル

管理アクセススキーマ(つまり、 CREATE SCHEMA ... WITH MANAGED ACCESS 構文を使用して作成されたスキーマ)では、スキーマの所有者(つまり、スキーマに対する OWNERSHIP 権限を持つロール)のみが、スキーマ内の将来のオブジェクトに対する権限を付与できます。

標準スキーマでは、スキーマにある将来のオブジェクトの権限を付与または取り消すには、 MANAGE GRANTS グローバル権限が必要です。

データベースまたはスキーマオブジェクトに対する将来の付与の定義

GRANT <権限> ... TO ROLE コマンドと ON FUTURE キーワードを使用して、データベースまたはスキーマオブジェクトに将来の権限を割り当てることができます。

データベースレベルで将来の付与を設定するためのコード例:

use role accountadmin;

-- Grant the USAGE privilege on all future schemas in a database to role r1
grant usage on future schemas in database d1 to role r1;

スキーマレベルで将来の付与を設定するためのコード例:

use role accountadmin;

-- Grant the SELECT privilege on all future tables in a schema to role r1
GRANT SELECT ON FUTURE TABLES IN SCHEMA d1.s1 TO ROLE r1;

-- Grants the SELECT and INSERT privileges on all future tables in a schema to r1
grant select,insert on future tables in schema d1.s1 to role r1;

既存のデータベースまたはスキーマオブジェクトに対する将来の付与の定義

将来の許可は、新しいオブジェクトのみに関係します。 GRANT <権限> ... TO ROLE コマンドを使用して、既存のオブジェクトのロールに目的の権限を明示的に付与する必要があります。

コード例:

use role accountadmin;

-- Grant the USAGE privilege on all existing schemas in a database to role r1
grant usage on all schemas in database d1 to role r1;

-- Grant the SELECT privilege on all existing tables in a schema to role r1
grant select on all tables in schema d1.s1 to role r1

データベースまたはスキーマオブジェクトに対する将来の付与の取り消し

ON FUTURE キーワードを指定した REVOKE <権限> ... FROM ROLE コマンドを使用して、データベースオブジェクトに対する将来の付与を取り消すことができます。

注釈

データベースオブジェクトに対する将来の付与の取り消しは、既存のオブジェクトではなく、指定された型の将来のオブジェクトに対して付与された権限のみを削除します。既存のオブジェクトに付与された権限は保持されます。

コード例:

use role accountadmin;

-- Revoke the USAGE privilege on all existing schemas in a database from role r1
revoke usage on all schemas in database d1 from role r1;

-- Revoke the SELECT and INSERT privileges on tables in a schema from the role r1
revoke select,insert on future tables in schema d1.s1 from role r1;

ウェブインターフェイスを使用した将来の付与の管理

ウェブインターフェイスを使用して、将来の付与を定義することもできます。

将来のデータベースオブジェクトに対する権限付与
  1. Databases Databases tab をクリックします。

  2. 特定のデータベースの行をクリックします。セキュリティパネルが開きます。

  3. Grant Privileges ボタンをクリックします。 Grant Privileges ダイアログが開きます。

  4. Grant privileges on ドロップダウンリストから future オブジェクトタイプ を選択して、特定のオブジェクトタイプの新しいオブジェクトに対する将来の権限付与を定義します。

  5. 残りのドロップダウンリストから、指定したタイプの新しいオブジェクトに付与する権限と、権限が付与されるロールを選択します。

  6. Grant Privileges ボタンをクリックします。

将来のスキーマオブジェクトに対する権限付与
  1. Databases Databases tab » <データベース名> » Schemas をクリックします。

  2. 特定のスキーマの行をクリックします。セキュリティパネルが開きます。

  3. Grant Privileges ボタンをクリックします。 Grant Privileges ダイアログが開きます。

  4. Grant privileges on ドロップダウンリストから future オブジェクトタイプ を選択して、特定のオブジェクトタイプの新しいオブジェクトに対する将来の権限付与を定義します。

  5. 残りのドロップダウンリストから、指定したタイプの新しいオブジェクトに付与する権限と、権限が付与されるロールを選択します。

  6. Grant Privileges ボタンをクリックします。

制限と制約

次の制限と制約は、データベースまたはスキーマレベルでの将来の付与に適用されます。

  • 次の将来の付与はサポートされていません。

    • データ共有

    • データ複製

  • 将来の付与は、次の制限付きで名前付きステージでサポートされます。

    • READ 権限なしでは WRITE 権限を指定できません。

    • WRITE 権限が存在する場合、 READ 権限を取り消すことはできません。

    • 内部ステージでは、 READ または WRITE 権限を持つ将来の付与のみが具体化されます。

    • 外部ステージの場合、 USAGE 権限を持つ将来の付与のみが具体化されます。

  • テーブルの名前を変更または交換する場合、将来の付与は適用されません。

  • セキュリティ保護可能なオブジェクトタイプごとに、可能な OWNERSHIP 権限の将来の付与は1件のみです。

  • データベース内の管理対象アクセススキーマのオブジェクトに対する OWNERSHIP 権限のデータベースレベルにおける将来の付与は影響を受けません。

  • データベースがクローンされると、クローンされたデータベース内のスキーマは、ソーススキーマから将来の権限をコピーします。これにより、ソースオブジェクト(つまり、データベース)の許可はクローンにコピーされず、すべての子オブジェクト(つまり、データベース内のスキーマ)の付与がクローンにコピーされる通常のオブジェクト許可との一貫性が維持されます。

管理アクセススキーマの作成

管理アクセススキーマは、オブジェクトの権限管理をロックダウンすることでセキュリティを向上させます。

通常の(管理されていない)スキーマでは、オブジェクト所有者(オブジェクトに対する OWNERSHIP 権限のあるロール)は、オブジェクトへのアクセスを他のロールに付与できます。

管理アクセススキーマを使用すると、オブジェクトの所有者は付与を決定する機能を失います。スキーマの所有者(スキーマに対する OWNERSHIP 権限があるロール)または MANAGE GRANTS 権限があるロールのみが、スキーマ内のオブジェクトに対する権限を付与できます(将来の付与 を含みます)。

ウェブインターフェイスまたは SQL を使用して、管理アクセススキーマを作成できます。

Classic Web Interface

Databases Databases tab » <データベース名> » Schemas » Create Schema をクリックします。

SQL

WITH MANAGED ACCESS キーワードを使用して、 CREATE SCHEMA ステートメントを実行します。

ウェブインターフェイスまたは SQL を使用して、通常のスキーマを管理アクセススキーマに(またはその逆に)変更できます。

Classic Web Interface

Databases Databases tab » <データベース名> » Schemas » <スキーマ名> » Alter a schema をクリックします。

SQL

ENABLE | DISABLE MANAGED ACCESS キーワードで ALTER SCHEMA ステートメントを実行します。

次の表は、通常のアクセススキーマまたは管理アクセススキーマでオブジェクトの権限を管理できるロールを示しています。

ロール

通常のスキーマでオブジェクト権限を付与できます

管理アクセススキーマでオブジェクト権限を付与できます

SYSADMIN

いいえ

いいえ

SECURITYADMIN 以上

はい

はい

データベース所有者

いいえ

いいえ

スキーマ所有者

いいえ

はい

オブジェクト所有者

はい

いいえ

MANAGE GRANTS 権限のある任意のロール

はい

はい

非アカウント管理者の有効化により、従来のウェブインターフェイス内で使用量と請求履歴をモニター

Snowflakeは、データストレージ/転送およびウェアハウスの使用/ロードに関する広範なアカウントの使用量と請求情報を提供します。

Snowsight

Select Admin » Usage

Classic Web Interface

Account Account tab » Billing & Usage をクリックします。

SQL

次のいずれかをクエリします。

デフォルトでは、アカウント管理者のみがこの情報にアクセスし、表示できます。

注釈

現在、 Snowsight は、アカウント管理者に対して使用状況と請求情報のみを表示します。他のロールにこの情報を表示する機能を付与することはできません。

アカウント管理者ではないユーザーがこの情報にアクセス/表示できるようにするには、システム定義またはカスタムのロールに次の権限を付与します。ロールに権限を付与すると、ロールを付与されたすべてのユーザーがこの履歴/使用情報にアクセスできます。

権限

オブジェクト

説明

MONITOR USAGE

アカウント(つまり、グローバル権限)

ロールを付与されたユーザーが、ウェブインターフェイスで使用状況と請求情報を表示し、Information Schemaで対応するテーブル関数をクエリできるようにします。

さらに、この権限を使用すると、 SHOW DATABASES および SHOW WAREHOUSES コマンドは、他の権限の付与に関係なく、アカウント内のすべてのデータベースとウェアハウスのリストをそれぞれ返します。

IMPORTED PRIVILEGES

snowflake データベース

ロールを付与されたユーザーが、使用状況と請求情報を含むビューを含む、すべてのACCOUNT USAGE ビューをクエリできるようにします。

詳細については、 他のロールに対するSnowflakeデータベースの使用の有効化 をご参照ください。

たとえば、これらの権限を custom ロールに付与するには、次を実行します。

GRANT MONITOR USAGE ON ACCOUNT TO ROLE custom;

GRANT IMPORTED PRIVILEGES ON DATABASE snowflake TO ROLE custom;