アクセス制御の概要

このトピックでは、Snowflakeの主なアクセス制御トピックに関する情報を提供します。

このトピックの内容:

アクセス制御フレームワーク

アクセス制御に対するSnowflakeのアプローチは、次の両方のモデルの側面を組み合わせたものです。

  • 任意アクセス制御(DAC): 各オブジェクトには所有者があり、所有者はそのオブジェクトへのアクセス権を付与できます。

  • ロールベースのアクセス制御(RBAC): アクセス権限がロールに割り当てられ、ロールはユーザーに割り当てられます。

Snowflakeのアクセス制御を理解するための重要な概念は次のとおりです。

  • セキュリティ保護可能なオブジェクト: アクセスを付与できるエンティティ。付与によって許可されない限り、アクセスは拒否されます。

  • ロール: 権限を付与できるエンティティ。次に、ロールがユーザーに割り当てられます。ロールを他のロールに割り当て、ロール階層を作成することもできます。

  • 権限: オブジェクトへの定義されたレベルのアクセス。複数の個別の権限を使用して、付与されるアクセスの粒度を制御できます。

  • ユーザー: Snowflakeによって認識されるユーザーID(個人またはプログラムに関連付けられているかどうか)。

Snowflakeモデルでは、セキュリティ保護可能なオブジェクトへのアクセスは、ロールに割り当てられた権限を介して許可され、その権限はユーザーまたはその他のロールに割り当てられます。あるロールを別のロールに付与すると、ロール階層が作成されます。これについては、 ロール階層と権限の継承 セクション(このトピック内)で説明します。

さらに、各セキュリティ保護可能なオブジェクトには、他のロールへのアクセスを付与できる所有者がいます。このモデルは、各ユーザーまたはユーザーのグループに権利と権限が割り当てられるユーザーベースのアクセス制御モデルとは異なります。Snowflakeモデルは、制御と柔軟性の両方を大幅に提供するように設計されています。

Access control relationships

セキュリティ保護可能なオブジェクト

すべてのセキュリティ保護可能なオブジェクトは、コンテナーの階層内の論理コンテナー内に存在します。最上位のコンテナーは、顧客の組織です。テーブル、ビュー、関数、ステージなどのセキュリティ保護可能なオブジェクトはスキーマオブジェクトに含まれ、スキーマオブジェクトはデータベースに含まれます。Snowflakeアカウントのすべてのデータベースは、アカウントオブジェクトに含まれています。このオブジェクトとコンテナの階層を以下に示します。

Hierarchy of securable database objects

オブジェクトを 所有 するということは、 ロール がオブジェクトに OWNERSHIP 権限 を持っていることを意味します。セキュリティ保護可能な各オブジェクトは、単一のロールによって所有されます。通常はデフォルトで、このロールがオブジェクトの作成に使用されます。このロールがユーザーに割り当てられると、ユーザーはオブジェクトに対する制御を実質的に共有します。 GRANT OWNERSHIP コマンドを使用すると、オブジェクトの所有権をあるロールから別のロール(データベースロールを含む)に譲渡できます。このコマンドは、各コンテナ内のセキュリティ保護が可能なオブジェクトも指定します。

通常のスキーマでは、所有者のロールにはデフォルトでオブジェクトに対するすべての権限があります。これには、オブジェクトに対する権限を他のロールに付与する、または取り消す機能も含まれます。さらに、所有権をあるロールから別のロールに移すことができます。しかし、 管理アクセススキーマ では、オブジェクトの所有者は付与を決定する能力を失います。スキーマの所有者(つまり、スキーマに対する OWNERSHIP 権限があるロール)または MANAGE GRANTS 権限があるロールのみが、スキーマ内のオブジェクトに対する権限を付与できます。

オブジェクトに対して SQL アクションを実行する機能は、ユーザーセッションでアクティブなロールに付与された権限によって定義されます。以下は、Snowflakeにあるさまざまなオブジェクトで使用できる SQL アクションの例です。

  • ウェアハウスを作成する機能。

  • スキーマに含まれるテーブルをリストする機能。

  • テーブルにデータを追加する機能。

ロール

ロールは、セキュリティ保護可能なオブジェクトに対する 権限 の付与や取り消しができるエンティティです。ロールはユーザーに割り当てられ、ユーザーが組織内のビジネス機能に必要なアクションを実行できるようにします。ユーザーには複数のロールを割り当てることができます。これにより、ユーザーはロールを切り替えて(現在のSnowflakeセッションでアクティブなロールを選択する)、個別の権限セットを使用して異なるアクションを実行できます。

Snowflakeアカウントには、少数の システム定義のロール があります。システム定義のロールはドロップできません。さらに、Snowflakeによってこれらのロールに付与された権限は、取り消すことができません。

必要な権限を持つロールを付与されたユーザーは、特定のビジネスおよびセキュリティのニーズを満たすカスタムロールを作成できます。

ロールを他のロールに付与して、ロールの階層を作成することもできます。ロールに関連付けられた権限は、階層内でそのロールより上のロールすべてに継承されます。ロールの階層と権限の継承の詳細については、 ロールの階層と権限の継承 (このトピック内)をご参照ください。

注釈

ロールの所有者(つまり、ロールに対して OWNERSHIP 権限を持つロール)は、所有されているロールの権限を継承 しません。権限の継承は、ロール階層内のみで可能です。

システム定義のロールには追加の権限を付与できますが、非推奨です。システム定義のロールは、アカウント管理に関連する権限で作成されます。ベストプラクティスとして、アカウント管理権限とエンティティ固有の権限を同じロールに混在させることはお勧めしません。追加の権限が必要な場合、Snowflakeは、カスタムロールに追加の権限を付与し、システム定義のロールにカスタムロールを割り当てることをお勧めします。

ロールのタイプ

次のロール型は、スコープを除いて本質的に同じです。どちらの型でも、管理者はアカウント内のオブジェクトへのアクセスを承認および制限できます。

注釈

製品ドキュメントに記載されている場合を除き、 ロール という用語はいずれかの型を指します。

アカウントロール

アカウント内の 任意の オブジェクトに対して SQL アクションを許可するには、オブジェクトに対する権限をアカウントロールに付与します。

データベースロール

SQL アクションを1つのデータベースとデータベース内の任意のオブジェクトに制限するには、オブジェクトに対する権限を 同じデータベース内 のデータベースロールに付与します。

データベースロールは、セッションで直接 アクティブ化 できないことに注意してください。セッションでアクティブ化できるアカウントロールにデータベースロールを付与します。

データベースロールの詳細については、次をご参照ください。

インスタンスロール

クラス のインスタンスへのアクセスを許可するには、アカウントロールにインスタンスロールを付与します。

クラスは、各ロールに付与される権限が異なる1つ以上のクラスロールを持つことができます。クラスのインスタンスが作成されると、インスタンスロールをアカウントロールに付与して、インスタンスメソッドへのアクセスを付与できます。

インスタンスロールは、セッションで直接 アクティブ化 できないことに注意してください。セッションでアクティブ化できるアカウントロールにインスタンスロールを付与します。

詳細については、 インスタンスロール をご参照ください。

アクティブロール

アクティブロール は、セッションでユーザーが実行するすべてのアクションの承認元として機能します。 プライマリロールとセカンダリロール の両方とも、ユーザーセッションで有効にすることができます。

ロールは、次のいずれかの方法でアクティブロールになります。

  • セッションが最初に確立されると、ユーザーの既定のロールと既定のセカンダリロールが、それぞれセッションのプライマリロールとセカンダリロールとしてアクティブ化されます。

    セッションの確立に使用されるクライアント接続プロパティは、使用するプライマリロールまたはセカンダリロールを明示的に上書きできることに注意してください。

  • USE ROLE または USE SECONDARY ROLES ステートメントを実行すると、それぞれ別のプライマリロールまたはセカンダリロールがアクティブになります。いずれかのコマンドが再度実行されると、これらのロールはセッション中に変更される可能性があります。

システム定義のロール

ORGADMIN

(別名: 組織管理者)

組織レベルで運用を管理するロール。より具体的には、このロールは、

ACCOUNTADMIN

(別名アカウント管理者)

SYSADMIN および SECURITYADMIN システム定義のロールをカプセル化するロール。これはシステムの最上位のロールであり、アカウント内の限られた/制御された数のユーザーにのみ付与する必要があります。

SECURITYADMIN

(別名:セキュリティ管理者)

オブジェクトの付与をグローバルに管理し、ユーザーとロールを作成、モニター、管理できるロール。より具体的には、このロールは、

  • MANAGE GRANTS セキュリティ権限が付与されており、付与の取り消しを含め、あらゆる付与を変更できます。

  • システムロール階層を介して USERADMIN ロールの権限を継承します(つまり、 USERADMIN ロールを SECURITYADMIN に付与)。

USERADMIN

(別名:ユーザーおよびロール管理者)

ユーザーとロールの管理のみに専用のロール。より具体的には、このロールは、

  • CREATE USERおよびCREATE ROLEのセキュリティ権限が付与されています。

  • アカウントにユーザーとロールを作成できます。

    このロールは、所有するユーザーとロールを管理することもできます。オブジェクトのプロパティを変更できるのは、オブジェクト(つまり、ユーザーまたはロール)に対する OWNERSHIP 権限を持つロールまたはそれ以上のロールのみです。

SYSADMIN

(別名システム管理者)

アカウントでウェアハウスとデータベース(およびその他のオブジェクト)を作成する権限を持つロール。

推奨 されているように、最終的にすべてのカスタムロールを SYSADMIN ロールに割り当てるロール階層を作成する場合、このロールには、ウェアハウス、データベース、およびその他のオブジェクトに対する権限を他のロールに付与する機能もあります。

PUBLIC

アカウント内のすべてのユーザーおよびすべてのロールに自動的に付与される疑似ロール。PUBLIC ロールは、他のロールと同様にセキュリティ保護可能なオブジェクトを所有できます。ただし、ロールが所有するオブジェクトは、定義上、アカウント内の他のすべてのユーザーとロールが使用できます。

通常、このロールは、明示的なアクセス制御が不要で、すべてのユーザーがアクセスに関して平等であると見なされる場合に使用されます。

カスタムロール

カスタム アカウントロール は、 USERADMIN ロール(またはそれ以上のロール)、および CREATE ROLE 権限が付与されたロールを使用して作成できます。

カスタムデータベースロールは、データベース所有者(つまり、データベースに対する OWNERSHIP 権限を持つロール)により作成できます。

デフォルトでは、新しく作成されたロールは、どのユーザーにも割り当てられず、他のロールにも付与されません。

システム内のセキュリティ保護可能なオブジェクトの所有者として機能するロールを作成する場合、Snowflakeは、最上位のカスタムロールをシステムロール SYSADMIN に割り当てて、カスタムロールの階層を作成することをお勧めします。このロール構造により、システム管理者は、ウェアハウスやデータベースオブジェクトといったアカウント内のすべてのオブジェクトを管理する一方で、ユーザーとロールの管理を USERADMIN ロールに制限できます。

逆に、カスタムロールがロールの階層を介して SYSADMIN に割り当てられていない場合、システム管理者はロールが所有するオブジェクトを管理できません。MANAGE GRANTS 権限を付与されたロール(デフォルトでは SECURITYADMIN ロールのみ)のみがオブジェクトを表示し、アクセス付与を変更できます。

カスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。

権限

アクセス制御権限により、Snowflakeの特定のオブジェクトにアクセスして操作を実行できるユーザーが決まります。セキュリティ保護可能なオブジェクトごとに、付与できる権限のセットがあります。既存のオブジェクトの場合、個々のオブジェクトに権限を付与する必要があります(例: mytable テーブルの SELECT 権限)。付与管理を簡素化するために、 将来の付与 では、スキーマで作成されたオブジェクトの初期権限セット(つまり、 myschema スキーマで作成されたすべての 新規 テーブルに対する SELECT 権限を指定のロールに付与)を定義できます。

権限は、 GRANT <権限> および REVOKE <権限> コマンドを使用して管理されます。

  • 通常の(つまり、管理されていない)スキーマでは、これらのコマンドの使用は、オブジェクトを所有するロール(つまり、オブジェクトに対する OWNERSHIP 権限がある)、またはオブジェクトに対する MANAGE GRANTS グローバル権限があるロール(デフォルトでは SECURITYADMIN ロールのみ)に制限されます。

  • 管理アクセススキーマ では、オブジェクトの所有者は付与決定を行うことができなくなります。スキーマの所有者または MANAGE GRANTS 権限のあるロールのみが、将来の付与を含むスキーマ内のオブジェクトに対する権限を付与し、権限管理を一元化できます。

MANAGE GRANTS グローバル権限を保持するロールは、現在の(付与者)ロールに追加の権限を付与できることに注意してください。

詳細については、 アクセス制御権限 をご参照ください。

ロール階層と権限の継承

次の図は、システム定義ロールの階層と、追加のユーザー定義アカウントロールおよびデータベースロールの推奨構造を示しています。サンプル階層の最上位のデータベースロールは、カスタム(つまり、ユーザー定義)アカウントロールに付与されます。次に、このロールは、システム定義の SYSADMIN ロールがカスタムアカウントロールとデータベースロールの権限を継承できるようにする推奨構造の別のカスタムロールに付与されます。

Role hierarchy example

注釈

ORGADMIN は、組織レベルで運用を管理する別個のシステムロールです。このロールは、システムロールの階層には含まれていません。

ロール階層と権限の継承のより具体的な例については、次のシナリオを検討してください。

  • ロール3がロール2に付与されました。

  • ロール2がロール1に付与されました。

  • ユーザー1にロール1が付与されました。

Privilege inheritance for granted roles

このシナリオでは、

  • ロール2は権限Cを継承します。

  • ロール1は権限BおよびCを継承します。

  • ユーザー1には3つの権限すべてがあります。

データベースロールおよびロール階層

現在、データベースロールには次の制限が適用されます。

  • 共有 にデータベースロールが付与されている場合は、そのデータベースロールに他のデータベースロールを付与することはできません。たとえば、データベースロール d1.r1 が共有に付与されている場合は、データベースロール d1.r2d1.r1 に付与しようとするとブロックされます。

    さらに、データベースロールが 別の データベースロールに付与されている場合は、被付与者のデータベースロールを共有に付与することはできません。

    共有に付与されたデータベースロールは、アカウントロールだけではなく、他のデータベースロールにも付与できます。

  • ロール階層内のデータベースロールにアカウントロールを付与することはできません。

施行モデル: プライマリロールおよびセカンダリロール

すべてのアクティブなユーザーセッションには、 プライマリロール とも呼ばれる「現在のロール」があります。セッションが開始されると(例: ユーザーが JDBC/ODBC を介して接続するか、Snowflake ウェブインターフェイスにログイン)、現在のロールは次の条件基づいて決定されます。

  1. 接続の一部としてロールが指定され、そのロールが接続ユーザーに既に付与されているロールである場合は、指定されたロールが現在のロールになります。

  2. ロールが指定されておらず、接続しているユーザーに既定のロールが設定されている場合は、そのロールが現在のロールになります。

  3. ロールが指定されておらず、接続しているユーザーに既定のロールが設定されていない場合は、システムロール PUBLIC が使用されます。

さらに、 セカンダリ ロールのセットをユーザーセッションでアクティブ化できます。ユーザーは、プライマリロールとセカンダリロールに付与された集約権限を使用して、セッション内のオブジェクトに対して SQL アクションを実行できます。ロールは、セッションでアクティブ化する前にユーザーに付与する必要があります。セッションには1度に1つのアクティブなプライマリロールが必要ですが、同時に任意の数のセカンダリロールをアクティブ化できます。

注釈

データベースロールは、プライマリロールにもセカンダリロールにもなりません。データベースロールに付与された権限を引き受けるには、データベースロールをアカウントロールに付与します。セッションで アクティブ化 できるのは、アカウントロールのみです。

CREATE <オブジェクト> ステートメントを実行する認証は、プライマリロールからのみ取得されます。オブジェクトが作成されると、その所有権は現在アクティブなプライマリロールに設定されます。ただし、その他の SQL アクションの場合は、アクティブなプライマリまたはセカンダリロールに付与された権限を使用してアクションを承認できます。たとえば、セカンダリロール階層内のいずれかのロールがオブジェクトを所有している場合(つまり、オブジェクトに対する OWNERSHIP 権限を持っている場合)、セカンダリロールは、オブジェクトに対する DDL アクションの実行を承認します。プライマリロールとすべてのセカンダリロールの両方が、ロール階層の下位にあるロールから権限を継承します。

Primary and Secondary Role Operations

セキュリティモデルに多数のロールが含まれ、それぞれが認証を介して細かく許可されている組織の場合は、セカンダリロールを使用するとロール管理が簡素化されます。ユーザーに付与されたすべてのロールは、セッションでアクティブ化できます。セカンダリロールは、データベース間の結合など、各データベース内のオブジェクトにアクセスするためのアクセス権限を持つロールの親ロールを作成する必要がある SQL 操作に特に役立ちます。

セッションの過程で、ユーザーは USE ROLE または USE SECONDARY ROLES コマンドを使用して現在のプライマリまたはセカンダリロールを変更できます。ユーザーは、 CURRENT_SECONDARY_ROLES 関数を使用して、現在のセッションに対するすべてのアクティブなセカンダリロールを表示できます。

使用するために1つ以上の権限を必要とするオブジェクトを作成する場合は、それらの権限の付与を検索するときに、プライマリロールと、それが直接的または間接的に継承するロールのみが考慮されます。

1つ以上の権限を必要とするその他のステートメント(例: テーブルのクエリには、データベースとスキーマの USAGE 権限を持つテーブルに対する SELECT 権限が必要)の場合、プライマリロール、セカンダリロール、およびその他の継承されたロールは、それらの権限の付与を検索するときに考慮されます。

注釈

Snowflakeには、認証チェックをバイパスできる「スーパーユーザー」または「スーパーロール」という概念はありません。すべてのアクセスには、適切なアクセス権限が必要です。