アクセス制御の構成¶
このトピックでは、アカウントの セキュリティ保護可能なオブジェクト のアクセス制御セキュリティを構成する方法について説明します。
このトピックの内容:
アカウント管理¶
アカウント管理者としての追加ユーザーの指定¶
デフォルトでは、各アカウントにはアカウント管理者として指定された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 アクションを許可することをお勧めします。
ワークフローは次のとおりです。
カスタムロールを作成します。
ロールに権限のセットを付与します。
ビジネスニーズに合わせて、 SQL アクションを実行するためにロールに付与された権限を必要とする1人以上のユーザーにロールを付与します。
ロールを別のロールに付与して、ロール階層を作成または追加します。必須ではありませんが、このステップを強くお勧めします。詳細については、 ロール階層の作成 (このトピック内)をご参照ください。
このセクションでは、 r1
という名前のロールを作成し、そのロールに次の権限を付与する手順について説明します。権限により、セッションでロールをアクティブ化するユーザーは、単一のテーブル d1.s1.t1
をクエリできます。
権限 |
オブジェクト |
メモ |
---|---|---|
USAGE |
ウェアハウス データベース スキーマ |
オブジェクト(テーブルやビューなど)をクエリするには、ロールにウェアハウスに対する USAGE 権限が必要です。ウェアハウスは、クエリを実行するためのコンピューティングリソースを提供します。 スキーマ内のオブジェクトを操作するには、コンテナーデータベースとスキーマに対する USAGE 権限もロールに必要です。 |
SELECT |
テーブル |
ロールが作成された後、そのロールに追加の権限を付与して、そのロールを持つユーザーが同じオブジェクトまたは追加のオブジェクトに対して、追加の SQL アクションを実行できるようにすることができます。
ロールを作成する¶
CREATE ROLE を使用して
r1
ロールを作成します。ロールを作成できるのは、ユーザー管理者(つまり、 USERADMIN システムロール以上のユーザー)またはアカウントの CREATE ROLE 権限を持つ別のロールのみです。
CREATE ROLE r1 COMMENT = 'This role has all privileges on schema_1';
ロールに権限を付与する¶
このセクションの前半のテーブルで定義されている権限を
r1
ロールに付与します。SECURITYADMIN システムロールを使用して、オブジェクトに対する権限をロールに付与できます。その他のオプションについては、 GRANT <権限> をご参照ください。
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;
ユーザーにロールを付与する¶
ロール
r1
ロールをユーザーsmith
に割り当てます。SECURITYADMIN ロールは、ユーザーにロールを付与するために使用できます。その他のオプションについては、 GRANT ROLE をご参照ください。
GRANT ROLE r1 TO USER smith;
オプションで、新しいカスタムロールをユーザーの既定のロールとして設定します。次回、ユーザーが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番目のロールに付与できます。ロールに関連付けられた権限は、階層内のそのロールの 上 のロール(親ロール)によって継承されます。
次の図は、ロール階層の例と各ロールに付与される権限を示しています。
別のロールにロールを付与する¶
上位レベルの階層のロールに、ロールを割り当てます。この例では、 カスタムロールの作成 で作成した 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 | +-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------+
オブジェクトに対する将来の付与の割り当て¶
付与管理を簡素化するために、 将来の付与 では、データベースまたはスキーマにある特定の 型 の新しい(つまり、将来の)オブジェクトに付与する権限の初期セットを定義できます。データベースまたはスキーマで新しいオブジェクトが作成されると、定義された権限が指定されたロールに自動的に付与されます。
将来の付与では、指定されたタイプの新しいオブジェクトに付与される権限の 初期 セットのみを定義します。個々のオブジェクトが作成されると、管理者は明示的に追加の権限を付与したり、オブジェクトに対する権限を取り消したりできます。これにより、スキーマまたはデータベース内のすべてのオブジェクトに対するきめ細かいアクセス制御が可能になります。
考慮事項¶
同じデータベースで、データベースとスキーマのために将来の付与が 同じオブジェクト型で 定義される場合、スキーマレベルの付与はデータベースレベルの付与よりも優先され、データベースレベルの付与は無視されます。この動作は、1つまたは別のロールに付与された将来のオブジェクトに対する権限に適用されます。
たとえば、次のステートメントは、データベースレベルとスキーマレベルで同じ型のオブジェクトに対して異なる権限を付与します。
データベース
d1
内にあるすべての将来のテーブルに対する SELECT 権限をロールr1
に付与します。GRANT SELECT ON FUTURE TABLES IN DATABASE d1 TO ROLE r1;
スキーマ
d1.s1
内にあるすべての将来のテーブルに対する INSERT および DELETE 権限をロールr2
に付与します。GRANT INSERT,DELETE ON FUTURE TABLES IN SCHEMA d1.s1 TO ROLE r2;
スキーマ
d1.s1
のオブジェクト型のr1
ロールに割り当てられた将来の付与は完全に無視されます。スキーマd1.s1
に新しいテーブルが作成されると、r2
ロールのテーブルに対して定義された将来の権限のみが付与されます。データベースレベルの将来の付与は、通常のアクセススキーマと 管理アクセススキーマ の両方に適用されます。
データベースまたはスキーマオブジェクトに対する将来の付与の定義¶
ON FUTURE キーワードで GRANT <権限> コマンドを使用して、指定された型の将来のオブジェクトに対する権限を付与します。
データベースまたはスキーマオブジェクトに対する将来の付与の取り消し¶
ON FUTURE キーワードで REVOKE <権限> コマンドを使用して、将来のオブジェクトに対する付与を取り消します。
オブジェクトのクローニングと将来の付与¶
データベースまたはスキーマがクローンされると、将来の付与はそのクローンにコピーされます。この動作は、通常のオブジェクトの付与と一貫性を維持します。つまり、ソースオブジェクト(つまり、データベース)に対する権限の付与はそのクローンにコピーされませんが、すべての子オブジェクト(つまり、データベース内のテーブル)に対する権限の付与はクローンにコピーされます。
スキーマ内のオブジェクトのクローンが作成されると、クローン操作の CREATE <オブジェクト> ステートメントで COPY GRANTS オプションが指定されていない限り、スキーマ内のこのオブジェクトタイプに対して定義された将来の付与がクローンオブジェクトに適用されます。その場合、新しいオブジェクトは元のオブジェクトのアクセス許可を保持し、その型のオブジェクトに対する将来の付与を継承 しません 。
従来のコンソールを使用した将来の付与の管理¶
Classic Console を使用して、将来の付与を定義することもできます。
- 将来のデータベースオブジェクトに対する権限付与:
- 将来のスキーマオブジェクトに対する権限付与:
特定のスキーマの行を選択します。セキュリティパネルが開きます。
Grant Privileges を選択します。 Grant Privileges ダイアログが開きます。
Grant privileges on ドロップダウンリストから future
object_type
を選択して、特定のオブジェクト型の新しいオブジェクトに対する将来の付与を定義します。残りのドロップダウンリストから、指定したタイプの新しいオブジェクトに付与する権限と、権限が付与されるロールを選択します。
Grant Privileges を選択します。
将来の付与を Snowsight で管理するには、ワークシートで SQL ステートメントを実行します。
管理アクセススキーマの作成¶
管理アクセススキーマは、オブジェクトの権限管理をロックダウンすることでセキュリティを向上させます。
通常の(管理されていない)スキーマでは、オブジェクト所有者(オブジェクトに対する OWNERSHIP 権限のあるロール)は、オブジェクトへのアクセスを他のロールに付与できます。
管理アクセススキーマを使用すると、オブジェクトの所有者は付与を決定する機能を失います。スキーマの所有者(スキーマに対する OWNERSHIP 権限があるロール)または MANAGE GRANTS 権限があるロールのみが、スキーマ内のオブジェクトに対する権限を付与できます(将来の付与 を含みます)。
ウェブインターフェイスまたは SQL を使用して、管理アクセススキーマを作成できます。
- Classic Console:
- SQL:
WITH MANAGED ACCESS キーワードを使用して、 CREATE SCHEMA ステートメントを実行します。
ウェブインターフェイスまたは SQL を使用して、通常のスキーマを管理アクセススキーマに(またはその逆に)変更できます。
- Classic Console:
Databases » <データベース名> » Schemas » <スキーマ名> » Alter a schema をクリックします。
- SQL:
ENABLE | DISABLE MANAGED ACCESS キーワードで ALTER SCHEMA ステートメントを実行します。
次の表は、通常のアクセススキーマまたは管理アクセススキーマでオブジェクトの権限を管理できるロールを示しています。
ロール |
通常のスキーマでオブジェクト権限を付与できます |
管理アクセススキーマでオブジェクト権限を付与できます |
---|---|---|
SYSADMIN |
いいえ |
いいえ |
SECURITYADMIN 以上 |
はい |
はい |
データベース所有者 |
いいえ |
いいえ |
スキーマ所有者 |
いいえ |
はい |
オブジェクト所有者 |
はい |
いいえ |
MANAGE GRANTS 権限のある任意のロール |
はい |
はい |
Snowsightでオブジェクトの権限を管理する¶
Snowsight を使用して、ロールへのデータベースオブジェクト権限の付与を管理することができます。これらの権限を管理するには、オブジェクト上の OWNERSHIP 権限またはグローバル MANAGE GRANTS 権限を持つロールを使用します。
Snowsight を使用して付与を管理する場合、 SQL で GRANT PRIVILEGE または REVOKE PRIVILEGE コマンドを実行するのと同じです。例えば、 Snowsight を使用して ACCOUNTADMIN ロールにビューに対する USAGE 権限を付与することができます。
オブジェクトに対する権限の付与¶
ロールにデータベースオブジェクト権限を付与するには、次を行います。
Snowsight にサインインします。
Data » Databases を選択します。
特定のデータベースとスキーマの場合、権限を付与するデータベースオブジェクトを選択します。
Object Details で Privileges セクションを見つけます。
+ Privilege を選択します。
権限を付与するロールを選択します。
ロールに付与する権限を選択します。
ロールが他のロールに権限を付与できるようにする場合は、 Grant option を選択します。
ロールに付与するオブジェクト権限ごとにステップを繰り返します。
Grant Privileges を選択します。
オブジェクトに対する権限を取り消しする¶
ロールからデータベースオブジェクト権限を取り消すには、次を行います。
Snowsight にサインインします。
Data » Databases を選択します。
特定のデータベースとスキーマの場合、権限を取り消したいデータベースオブジェクトを選択します。
Object Details で Privileges セクションを見つけます。
表示されている特定のロールの場合、行にカーソルを合わせると表示される Edit Role 鉛筆アイコンを選択します。
表示されるダイアログで、 x を選択して特定のロールから権限を取り消します。
Update Privileges を選択します。
ロールに付与された権限を特定する。¶
特定のロールに付与された権限を表示するには、 SHOW GRANTS コマンドを実行するか、 Snowsight で次を行います。
Snowsight にサインインします。
Admin » Users & Roles » Roles を選択します。
Table を選択し、付与された権限を表示するロールを探します。
付与された権限を表示したいロールを選択し、詳細を表示します。
ロールの Privileges セクションを確認します。
非アカウント管理者の有効化による、従来のコンソール内での使用状況と請求履歴のモニター¶
Snowflakeは、データストレージ/転送およびウェアハウスの使用/ロードに関する広範なアカウントの使用量と請求情報を提供します。
- Snowsight:
Select Admin » Cost Management。
- Classic Console:
- 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;