Snowflake

Claude に Snowflake を触らせるとき、守りは設定ファイルではなくロールで決める

設定ファイルは見た目で分け、ロールは中身で止める
Ryosuke Ishii

Claude から Snowflake に SQL を送れるようにすると、集計や調べものは速くなります。一方で、AI が表を消したり書き換えたりしないかが気になります。手元で使っている MCP(AI が外の道具を使うための接続口)には、送ってよい SQL の種類を絞る設定があります。この設定でどこまで守れるのかを、自社の Snowflake の試験用の置き場で1つずつ試しました。

設定ファイルは見た目で分け、ロールは中身で止める
設定ファイルは見た目で分け、ロールは中身で止める

試した環境

使っているのは Snowflake Labs が公開している MCP サーバー(snowflake-labs-mcp)です。Claude アプリの設定に登録し、Claude から SQL を送れるようにしています。

この MCP には、SQL の種類ごとに「送ってよい/よくない」を決める設定ファイルがあります。種類の名前は Select・Create・Delete・Drop などです。今回の設定は、「種類が分からない(Unknown)」だけを止め、ほかは通す形にしていました。

試すときは、作業の前に毎回、接続先が自社のアカウントかを問い合わせで確かめました。作るのは試験用の置き場の中だけにしています。

設定ファイルで止まるもの、止まらないもの

1つずつ送った結果です。

命令結果
CREATE TABLE・CREATE OR REPLACE TABLE通る
INSERT・UPDATE・DELETE・MERGE通る
TRUNCATE TABLE・DROP TABLE通る
SELECT … UNION ALL SELECT …止まる
SHOW TABLES止まる
GRANT止まる
CREATE SEMANTIC VIEW止まる
CALL・EXECUTE IMMEDIATE通る

削除・表ごと消す・中身を空にする・上書きして作る命令は、どれも通りました。設定で許可しているので、ここは設定どおりです。

止まったのは、UNION・SHOW・GRANT のように、設定ファイルの一覧に名前が無い種類でした。CREATE SEMANTIC VIEW は新しい構文のため「種類が分からない」に分類され、止まりました。

包み直すと通ってしまう

止まる命令も、書き方を変えると通りました。

  • UNION:`SELECT * FROM ( … UNION ALL … )` のように副問い合わせに包むと、全体が SELECT 扱いになって通る
  • SHOW・GRANT・DELETE:`EXECUTE IMMEDIATE $$ BEGIN … END $$` の中に入れると、外側が「命令の実行」扱いになって通り、中身も実行される
  • CALL:手続きの呼び出しは、中で何をしても CALL として通る

GRANT は、自分で作った試験用の表に対してだけ試し、すぐに元へ戻しました。

設定ファイルは、送られてきた文の見た目で種類を決めています。中で何が実行されるかまでは見ていません。そのため、AI が止まった命令を書き直して試すと、設定の柵を越えてしまいます。AI は止められると別の書き方を試すことがあるので、これは起こりうる話です。

読むだけのロールで入り直す

そこで、Snowflake の側で「読むだけ」のロール(何ができるかの役割)と、そのロールだけを持つ利用者を作りました。読めるのは、渡した置き場のビューとセマンティックビューだけです。このロールで入り直し、同じ抜け道を試しました。

命令結果
EXECUTE IMMEDIATE の中で DELETE止まる(対象が見えない)
EXECUTE IMMEDIATE の中で CREATE TABLE止まる(権限が無い)
CREATE TABLE止まる(権限が無い)
渡したビュー・セマンティックビューを読む通る

ロールに権限が無ければ、包み直しても中身ごと止まります。Snowflake は、文の見た目ではなく、実際に何をしようとしたかで権限を確かめているからです。

このロールと利用者を作る SQL(CREATE ROLE・CREATE USER・GRANT)は、AI には送らせず、人が Snowsight の画面で流しました。権限を作る作業そのものを AI に任せると、守りの意味が無くなるためです。

作った利用者は、Snowsight の「ガバナンスとセキュリティ」→「ユーザーとロール」で確かめられます。

読むだけの利用者。ユーザータイプは「サービス」、入り方は鍵(キーペア)、既定のロールは読むだけのロール
読むだけの利用者。ユーザータイプは「サービス」、入り方は鍵(キーペア)、既定のロールは読むだけのロール

ユーザータイプを「サービス」にしたので、パスワードではログインできず、鍵(キーペア)でしか入れません。既定のロールは読むだけのロールです。人が画面からこの利用者でログインして作業する、ということも起きません。

Claude アプリには、今の接続とは別に、この読むだけの利用者で入る接続をもう1本足しました。調べものは読むだけの接続、試験用の置き場で作業するときだけ作業用の接続、と使い分けます。

Claude からの接続を2本に分ける
Claude からの接続を2本に分ける

長い処理は MCP に向かない

もう1つ分かったことがあります。Snowflake の予測モデルの学習(4分ほどかかる処理)を MCP から送ると、MCP の待ち時間切れで止まりました。

ところが Snowflake 側では学習が続いていて、あとでモデルはできていました。もう一度送ると「既にある」と返ってきます。待ち時間切れは、処理が失敗したという意味ではありません。

長くかかる処理は MCP ではなく、手元のプログラムから Snowflake の接続ライブラリで直接送るようにしました。

まとめ

  • MCP の設定ファイルは、文の見た目で種類を分けるだけ。副問い合わせや EXECUTE IMMEDIATE に包むと止まる命令も通るので、「うっかり」を減らす柵として使う
  • 本番を守る鍵はロール。AI が使う接続は、読むだけのロールの利用者で入る。ロールや利用者を作る作業は人がやる
  • MCP の待ち時間切れは失敗とは限らない。長い処理は MCP を使わず、直接送る
ABOUT ME
石井 亮介(りょうさん)
石井 亮介(りょうさん)
データパレード 代表取締役
㈱データパレードの代表取締役で、高田馬場の町中華「一番飯店」のChief Data Officerも務めています。BIツールのセールスエンジニア・システムエンジニア・カスタマーサクセス歴15年。大学のデータサイエンス教育で講師も担当してきました。現在は自社業務のほとんどをAIに移管し、AI10部署と50を超える自動処理が24時間動く「AI経営」を実践中。その実践知をこのブログで発信しています。
記事URLをコピーしました