アクセス権限レポートからSNOWFLAKEのアクセス制御を見直す方法

Snowflake Labsのsfgrantreportツールを利用して、SnowflakeのObjectアクセス権限レポートを取得する方法について書きました。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、データアナリティクス事業本部のnkhrです。

Snowflakeは、さまざまなリソースをObjectとして管理しています。アクセス制御設計を行わずに、Objectを増やしている場合、アクセス制御がしっちゃかめっちゃかになっているかもしれません。

今回は、Snowflake-Labsのsfgrantreportツールにより、Snowflakeのアクセス制御レポート出力し、内容を確認したいと思います。

ツールのインストール環境は、以下の通りです。

OS Microsoft Windows 10 Pro
ターミナル Powershell 7

Snowflakeのアクセス制御概要

Snowflakeオブジェクト構造

まず最初に、SnowflakeのObjectについて少し説明します。下図のボックスが1つのObject Typeを表します。Objectに対する権限は、Role Objectで管理します。

(図はSnowflake公式サイトより抜粋:https://docs.snowflake.com/ja/user-guide/security-access-control-overview.html

各Objectへのアクセス権限には、2つのパターンがあります。

  • OWNERSHIPによる権限:オブジェクト所有ROLEにはOWNERSHIP権限が付与されます
    • オブジェクトには、OWNERSHIP(所有者)権限をもつROLEが1つ存在します。
    • SchemaでMANAGED ACCESSを有効にした場合は、SCHEMA配下のオブジェクトの権限操作は、SCHEMAのOWNERSHIP権限をもつROLEで一元的に制御できます
  • ROLEに付与された権限:ROLEにObjectへの操作権限付与できます

Snowflake Roleオブジェクト階層構造

アクセス制御を管理するROLE Object自体も階層構造を持ちます。Snowflakeは利用開始時に5つのROLEが存在します(2022/01時点)。

  • ACCOUNTADMIN:全ての操作権限をもつデフォルトROLE
  • SECURITYADMIN:GRANTSやPOLICY関係の操作権限をもつデフォルトROLE
  • USERADMIN:SECURITYADMINが持つ権限のうち、USER、ROLEの操作に特化したデフォルトROLE
  • SYSADMIN:DatabaseやWarehouseの操作権限を持つデフォルトROLE
  • PUBLIC:全てのUserやROLEから利用できるROLE、明示的なアクセス制御が不要な場合以外は利用しない
  • (Support申請により利用可能)ORGADIN:組織(Organizations)の操作ROLE

ROLEの階層構造は以下の通りです。CUSTOM ROLEは、利用者が作成するROLEの総称です。ROLE名は任意で設定できます。

(図はSnowflake公式サイトより抜粋:https://docs.snowflake.com/en/user-guide/security-access-control-overview.html

アクセス権限レポートの出力

sfgrantreport設定

sfgrantreportのインストール手順を参考に、以下のツールをインストールしました。

  1. snowslqのインストール(sfgrantreportはsnowsqlを利用してレポート生成用クエリを発行します)

    https://docs.snowflake.com/ja/user-guide/snowsql.html

  2. snowsqlのバージョン確認

        ❯ snowsql -v
        Version: 1.2.21

  3. Install GraphViz (sfgrantreportでROLEの関係図を画像で作成するために利用する)

    https://graphviz.org/download/

  4. GraphVizのバージョン確認

        ❯ dot -v
        dot - graphviz version 2.49.3 (20211023.0002)

  5. sfgrantreportインストール

    https://github.com/Snowflake-Labs/sfgrantreport/releases

    • sfgrantreport.win.<version>.zipファイルをダウンロード・解凍する
    • 「SFGrantReport.exe」ファイルが含まれるパスを環境変数のPATHに追加する
  6. sfgrantrepotの動作確認
        ❯ SFGrantReport.exe --help
        Snowflake Grant Report Version 2021.10.12.0
        SFGrantReport 2021.10.12.0
        Copyright © 2020-2021

クエリ実行用ROLEの作成

sfgrantrepot (version 2021.10.12.0)では、SNOWFLAKEデータベース(デフォルトで存在するSnowflake社からの共有データベース)のViewを利用してアクセス制御情報を収集します。

そのため、SNOWFLAKEデータベースに対するIMPORTED PRIVILEGES権限(共有データベースを利用するための権限)を持つROLEを利用して実行する必要があります。

-- ROLE作成
USE ROLE SECURITYADMIN;
CREATE ROLE REPORT_EXEC_ROLE;
GRANT ROLE REPORT_EXEC_ROLE TO USER <report-execution-user-name>;
USE ROLE ACCOUNTADMIN;
GRANT IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE TO REPORT_EXEC_ROLE;

-- ROLE削除(レポート生成後)
USE ROLE SECURITYADMIN;
DROP ROLE REPORT_EXEC_ROLE;

レポートの出力実行

snowsqlをクエリ実行で利用するため、snowsqlのconfig設定において、利用ユーザとROLEを指定ます。

cd ~/.snowsql
vim config

--- config内容
[connections.cm]
accountname = <account>.ap-northeast-1.aws
username = <username>
password = <password>
rolename = REPORT_EXEC_ROLE
warehousename = <warehouse name for user>

利用ユーザでMFA有効化が行われている場合は、DUOアプリのPush Notificationを設定しておく必要があります。(実行時にPush NotificationでMFA認証を行います)

レポート出力は、下記のコマンドを実行します。「-c cm」はsnowsqlのconfigファイルに設定されているconnections名を指定します。

SFGrantReport.exe -c cm -o <path-to-report-output-folder>

アクセス権限レポートの確認

出力レポートファイル

実行時に指定「-o」した出力先フォルダに以下のようなファイルが出力されます。

まずは以下の2ファイルを参照すると良いと思います。

  • SFGrantReport.<connection name>.<time>.html
    • DatabaseとRoleのアクセス制御の関係を画像で参照可能
    • DatabaseやRoleの数が少なくない場合は、こちらの画像からのアクセス制御の確認は難しい
  • SFGrantReport.ALL.<connection name>.<time>.xlsx
    • 各Objectごとのアクセス制御状況を確認可能
    • 見たいObjectが決まっている場合は個別のExcelファイルを参照しても同様の情報が得られる

確認ポイント例

SFGrantReport.ALL.<connection name>.<time>.xlsxの各タブ内の確認ポイントの一例です。

  • 「Users」タブ
    • 「EXT_AUTHN_DUO」列の値が「TRUE」の場合はMFA設定済み、「FALSE」の場合はMFA未設定。最低でもACCOUNTADMINを利用できるユーザは、MFAを設定しておくこと。
  • 「Roles」タブ
  • 「Roles.Hierarchy」タブ

    • ROLEの継承関係が確認できる。Databaseアクセスに関する継承関係は、ACCOUNTADMIN>SYSADMIN>Function ROLE>ACCESS ROLEの階層構造が基本
  • 「Roles.ShowRoles」タブ
    • Roleの一覧が表示される。ほとんどすべてのROLEのOWNERSHIPがACCOUNTADMINとなっている場合は所有者について検討したほうが良いかもしれない。ROLE管理(自動化やアカウント、ROLE払い出しプロセスなど)をACCOUNTADMINでないと行えなくなるため、SECURITYADMINやUSERADMIN、またはユーザ管理のCUSTOM ROLEをOWNERとする方が良いかもしれない。
  • 「Grants」タブ
    • Objectのアクセス制御はこのタブに全てまとめられている「ObjectType」列で対象Objectを絞れる
    • GrantsタブのObjectTypeごとのリストや権限テーブルは「Grants.Lst.<ObjectType>」タブ、または「Grants.Tbl.<ObjectType>」タブからも参照できる
    • 各Objectごとのチェックポイントについては長くなるので割愛する
  • 「DB.<Databasename>」タブ
    • Database内のオブジェクト(Database, Schema, Table, View)一覧と、オブジェクトへのアクセス権限をもつROLEの権限内容のマッピングを確認できる
    • 確認したいDatabaseが決まっている場合は、こちらのビューから確認したほうがやりやすいかもしれないです

まとめ

今回はSnowflakeのオブジェクトアクセス制御のレポート生成について紹介しました。Snowflakeのアクセス制御を設計なしに進めると、ROLE階層がスパゲッティになったり、多くの操作でACCOUNTADMIN権限を利用するなど後での対応コストが大きくなる可能性があります。

ACCOUNTADMINは通常の操作では極力使わない(必ずMFAを設定する)方が良いため、アクセス制御について理解する一助になればと思います。

以上、nkhrでした。