SaaS

GAS:Chrome拡張機能の申請とリスク評価の自動化

どーもbarusuです。

アドベントカレンダー2025、13日目の記事です。

Cloudnative IRS Advent Calendar 2025 – Adventar

今日はChrome拡張の管理のお話です。
会社によって様々だと思いますが、今日はChrome拡張をホワイトリストで運用している環境向けのお話です。

はじめに

Chrome拡張機能は便利な反面、中にはブラウザの閲覧履歴を収集したり、入力情報を外部に送信したりするけしからん奴らもあります。
なので多くの企業ではChrome Browser Cloud Managementを使って拡張機能のインストールを制限し、ホワイトリスト方式で運用しています。

ホワイトリスト運用には以下のような課題があって、ちゃんと管理するのはもう大変です。

  • 申請のたびに手動でセキュリティ調査が必要
  • 権限の危険度を毎回調べるのが面倒
  • 調査基準が担当者によってバラバラになりがち。基準揃えるのも大変
  • 対応が遅れると従業員の生産性に影響するし、「こんな程度の依頼で待たせるとかありえん」って言われる
    • 言われるならまだマシで、そのうち申請や相談すら来なくなったり…
    • 抜け道としてChrome以外のブラウザを使われるようになったり…

こんなのいちいちやってらんないよォォォ!!

これらの課題を解決するために、申請→調査の部分を簡略化するの仕組みを作ってみました。。

できあがるもの

従業員がChrome拡張機能のインストールを申請すると、以下のような通知がSlackに届きます。

AIがリスクスコアを算出し、「承認推奨」「要確認」「却下推奨」といった判定を自動で行ってくれます。

システム構成

全体の構成は以下のようになっています。

使用するサービス

サービス役割
Google Form申請フォーム
Google Apps Script(GAS)処理の中核。メタデータ取得、AI連携、通知を担当
Spreadsheet申請履歴の記録
Gemini API /OpenAI APIリスク評価を行うAI
Slack評価結果の通知先

処理の流れ

ポイント解説

1.AIによる情報収集とリスク評価

このシステムの最も重要な部分です。

本システムでは、Web Search機能を活用して、拡張機能の情報収集とリスク評価を一度に行います。

2.Web Searchを使うメリット

  • 安定性:Chrome Web StoreのHTML構造変更に影響されない
  • 情報の幅:Web全体から関連情報を収集できる
  • セキュリティ情報:ニュース記事や脆弱性報告も参照可能

3.評価基準

AIは以下の基準に基づいてリスクスコア(0〜100)を算出します。

高リスク要因(スコア加算)

  • 全サイトへのアクセス権限(<all_urls>など)
  • 通信傍受権限(webRequestBlocking
  • ネイティブアプリ連携(nativeMessaging
  • ユーザー数が少ない(1,000未満)
  • 評価が低い(3.0未満)
  • セキュリティ問題のニュース報告あり
  • 開発者が不明

軽減要因(スコア減算)

  • 大手企業の公式拡張(Google、Microsoftなど)
  • ユーザー数が多い(10万以上)
  • 高評価(4.5以上)
  • 活発にアップデートされている

4.判定基準

リスクスコアリスクレベル推奨アクション
0〜49🟢 LOW承認推奨
50〜69🟡 MEDIUM追加確認を推奨
70〜100🔴 HIGH却下推奨

💡 ポイント:AIはWeb検索で収集した情報源(URL)も出力しますが、当GASではこの出力を省略しています。必要であれば適宜GASを調整してください。

5.結果の通知と記録

評価結果はSlackに通知すると同時に、スプレッドシートにも記録するようにしています。
「いつ、誰が、どの拡張機能を申請し、どのような評価だったか」という履歴が確認できます。

実際のスプレッドシートはこんな感じ

作り方解説

この仕組みを構築するには、以下の準備が必要です。
あまりこういうの作ったことないぜ!って方でもなるべく迷わないように書いているので長いです。すんません。

作業時間の目安は1〜2時間程度です。
このブログの執筆にかかった時間が6時間なので、1/3くらいですね!

事前に用意するもの

カテゴリ必要なもの備考
GoogleGoogleアカウントGoogle Workspaceアカウント
AI APIGemini APIキー
または
OpenAI APIキー
Geminiは無料枠あり
OpenAIは従量課金
SlackSlackワークスペースの管理者権限App作成とBot Token取得に必要

💡 ポイント:Google Form、スプレッドシート、Google Apps Scriptは手順の中で作成します。Slack Appも同様です。


Step 1:AI APIキーの取得

まず、リスク評価に使用するAIのAPIキーを取得します。
Gemini APIとOpenAI APIのどちらかを選択してください。

Gemini APIの場合
  1. Google AI Studioにアクセス
  2. Google アカウントでログイン
  3. 左メニューから「Get API Key」をクリック
  4. 「Create API Key」をクリック
  5. プロジェクトを選択(または新規作成)
  6. 表示された API キーをコピーして控えておく 例: AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

💡 ポイント: Gemini APIは無料枠があるのでテスト目的程度であれば無料枠で十分です

OpenAI APIの場合
  1. OpenAI Platformにアクセス
  2. アカウントを作成またはログイン
  3. 右上のアイコン →「View API Keys」
  4. 「Create new secret key」をクリック
  5. 名前を入力(例: chrome-extension-checker
  6. 表示されたAPIキーをコピーして控えておく
   例: sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

⚠️ 注意: OpenAI API は従量課金です。利用料金が発生するため、Usage Limits の設定をおすすめします。


Step 2:Slack Appの作成

次に、評価結果を通知するためのSlack Appを作成します。

2-1. Slack Appを新規作成

  1. Slack API にアクセス
  2. 「Create New App」をクリック
  3. 「From scratch」を選択
  4. 以下を入力:
    • App NameChrome拡張チェッカー(任意の名前)
    • Workspace:インストール先のワークスペースを選択
  5. 「Create App」をクリック

2-2. Botの権限を設定

  1. 左メニューから「OAuth & Permissions」をクリック
  2. 「Scopes」セクションまでスクロール
  3. 「Bot Token Scopes」の「Add an OAuth Scope」をクリック
  4. 以下の2つを追加
    • chat:write(メッセージを送信)
    • chat:write.public(参加していないチャンネルにも投稿可能)

2-3. Appをワークスペースにインストール

  1. 左メニューから「Install App」をクリック
  2. 「Install to Workspace」をクリック
  3. 権限を確認して「許可する」をクリック
  4. 表示されるBot User OAuth Tokenをコピーして控えておく
   例: xoxb-1234567890-1234567890123-XXXXXXXXXXXXXXXXXXXXXXXX

2-4. 通知先チャンネルの準備

  1. Slack で通知先のチャンネルを決める(または新規作成)
    • 例:#chrome-extension-requests
  2. チャンネル ID を取得:
    • チャンネル名をクリック → 一番下に表示されるIDをコピー
    • または、チャンネルのリンクをコピーするとURLに含まれています
   <https://yourworkspace.slack.com/archives/C0123456789>
                                             ↑ これがチャンネルID
  1. Bot をチャンネルに招待:
    • チャンネルで /invite @作ったbotの名前と入力して送信

Step 3:Google Formの作成

申請を受け付けるフォームを作成します。

3-1. フォームを新規作成

  1. Google Formsにアクセス
  2. 「空白」をクリックして新規フォームを作成
  3. フォームのタイトルを入力
    • 例: Chrome拡張機能 インストール申請

3-2. 質問項目を追加

以下の2つの質問を追加します。

質問 1:拡張機能URL

  • 右側の「+」ボタンで質問を追加
  • 質問文:拡張機能URL
  • 回答形式:「記述式」
  • 「必須」をON

質問 2: 利用目的

  • 右側の「+」ボタンで質問を追加
  • 質問文:利用目的
  • 回答形式:「段落」
  • 「必須」をON

3-3. メールアドレスの収集を設定

  1. 上部の「設定」タブをクリック
  2. 「回答」セクションを開く
  3. 「メールアドレスを収集する」をON
  4. 「回答のコピーを回答者に送信」はお好みで設定

3-4. 完成イメージ


Step 4:スプレッドシートの準備

フォームの回答を記録するスプレッドシートを作成します。

4-1. 回答用スプレッドシートを作成

  1. Step 3で作成したGoogleフォームの編集画面を開く
  2. 「回答」タブをクリック
  3. 「スプレッドシートにリンク」アイコン(緑色)をクリック
  4. 「新しいスプレッドシートを作成」を選択
  5. スプレッドシート名を入力
  • 例:Chrome拡張申請管理
  1. 「作成」をクリック

4-2. 申請管理用シートを追加

  1. 作成されたスプレッドシートを開く
  2. 下部の「+」ボタンで新しいシートを追加
  3. シート名をRequests に変更

💡 ポイント:「フォームの回答 1」シートはフォーム送信の生データが記録されます。
Requestsシートには GAS が処理結果(AI 評価、ステータスなど)を記録します。

4-3. Spreadsheet IDを控える

スプレッドシートのURLからIDをコピーしておきます。

https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/edit
                                       ↑ この部分が Spreadsheet ID

Step 5:Google Apps Script(GAS)の設定

Googleフォームに紐づくGASを作成します。

5-1. スクリプトエディタを開く

  1. Googleフォームの編集画面に戻る
  2. 右上の「︙」(縦三点)メニューをクリック
  3. 「スクリプト エディタ」を選択

5-2. プロジェクト名を設定

  1. 左上の「無題のプロジェクト」をクリック
  2. プロジェクト名を入力
  • 例:Chrome拡張申請システム

5-3. ファイルを作成

GAS プロジェクトに以下の5ファイルを作成します。

  1. 左側のファイル一覧の「+」→「スクリプト」をクリック
  2. 以下のファイルを順番に作成:
ファイル名役割
Codeメイン処理(最初からあるコード.gsをリネーム)
Config設定値の管理
LLMAnalyzerAI APIとの連携(Web Search含む)
SlackNotifierSlack通知
SheetManagerスプレッドシート操作

💡 ポイント.gsの拡張子は自動で付くのでファイル名だけ入力すればOKです。

5-4. コードを配置

各ファイルに対応するコードをコピー&ペーストします。

コードはGitHubリポジトリで公開しています:barusu-cn/cnblog-20251213

5-5. スクリプト プロパティを設定

APIキーなどの機密情報を設定します。

  1. 左側の歯車アイコン「プロジェクトの設定」をクリック
  2. 「スクリプト プロパティ」セクションまでスクロール
  3. 「スクリプト プロパティを追加」をクリック
  4. 以下のプロパティを追加:
プロパティ
LLM_PROVIDERgemini(またはopenai
GEMINI_API_KEYStep 1で取得したGemini APIキー
OPENAI_API_KEYStep 1で取得したOpenAI APIキー(使用する場合)
SLACK_BOT_TOKENStep 2で取得したBot Token(xoxb-...
SLACK_CHANNEL_IDStep 2で取得したチャンネル ID(C0123456789
SPREADSHEET_IDStep 4で控えたSpreadsheet ID
  1. 「スクリプト プロパティを保存」をクリック

Step 6: トリガーの設定

フォーム送信時に自動で処理が実行されるよう、トリガーを設定します。

6-1. トリガー画面を開く

  1. GASエディタの左側メニューから「トリガー」(時計アイコン)をクリック
  2. 「トリガーを追加」をクリック

6-2. トリガーを設定

以下のように設定します。

項目設定値
実行する関数onFormSubmit
実行するデプロイHead
イベントのソースフォームから
イベントの種類フォーム送信時
エラー通知設定お好みで(「毎日通知を受け取る」推奨)
  1. 「保存」をクリック

6-3. 権限の承認

初回保存時に権限の承認を求められます。

  1. 「権限を確認」をクリック
  2. Google アカウントを選択
  3. 「詳細」→「〇〇(安全ではないページ)に移動」をクリック ⚠️ これは自分で作成したスクリプトのため、安全です
  4. 「許可」をクリック

6-4. フォームとの連携

  1. Google Formの編集画面に戻る
  2. 右上の「︙」メニュー →「スクリプト エディタ」をクリック
    • これでFormとGASプロジェクトが連携されます
  3. 再度トリガー画面を開き、設定したトリガーが「フォームから」になっていることを確認

Step 7:動作確認

すべての設定が完了したら、テストしてみましょう。

7-1. テスト申請を送信

  1. Google Formのプレビュー画面を開く(目のアイコン)
  2. 以下のように入力して送信:
    • 拡張機能URLhttps://chrome.google.com/webstore/detail/notion-web-clipper/knheggckgoiihginacbkhaalnibhilkk
    • 利用目的テスト送信です

7-2. 結果を確認

  1. Slack:だいたい1分くらい経てば通知が届きます
  2. スプレッドシートRequests シートに申請内容が記録されています
  3. GAS ログ:エラーがないか確認
    • GAS エディタ →「実行数」→ 該当の実行をクリック

7-3. うまくいかない場合

症状確認ポイント
Slackに通知が来ないBotToken、ChannelIDが正しいか確認。Botが通知先チャンネルに招待されているか確認
AI評価が失敗するAPIキーが正しいか確認。APIの利用制限に達していないか確認
スプレッドシートに記録されないSpreadsheet IDが正しいか確認。シート名が Requestsになっているか確認
トリガーが動かないトリガー設定でフォームと連携されているか確認

完成!

以上でセットアップは完了です。

カスタマイズのヒント

動かしてみるとわかるんですが、このシステムはけっこう応用の余地があります。
まずはこの構成で動くものを作ってみて、そこから自分たちの運用に合わせてアレンジしていってもらえればと思います。

判定基準を変えたい場合

GASのLLMAnalyzer.gsにあるAIへのプロンプトをいじればOKです。
「ユーザー数5,000未満もリスク扱いにしたい」とか「この権限は別に許容する」とか、好きに調整できます。

承認ワークフローを追加したい場合

Slackの通知に「承認」「却下」ボタンを付けて、「承認」を押したらChrome ポリシー APIを叩いてホワイトリストに自動追加〜みたいなこともできます。

自動承認したい場合

AIの判定が「LOW(承認推奨)」だったら人を介さず自動でホワイトリスト追加、というのもありですね。
信頼できそうな拡張機能の処理を完全自動化できます。


おわりに

というわけで、GoogleForm × GAS+AI × Slackを組み合わせたChrome拡張機能の申請・評価システムを紹介しました。
私の記事あるあるなのですが、毎度毎度作り方解説が重厚になってしまいますね。
しゃーない。どうせなら作り方までちゃんと載せないとただの自慢になっちゃうじゃん?って思う派ですし。
運用した結果どうでしたー、的な話であれば作り方は割愛するんですけどね。

ともあれ動くものを作るのはやっぱり楽しいですねー。
思った通りの設計と、構築をしてから実際に動かして狙い通りの動作になったときのワクワクたるや。
今回ご紹介したものは構成も割とシンプルですし、この仕組みを応用して別の申請や問い合わせに横展開しても面白いと思います。

ではまた別のブログでお会いしましょうー。
対あり、ダイアリー。(最近葛葉さんにハマっている)

ばるす

パチンコ屋→焼き肉屋→情シスを経てクラウドネイティブへ入社。
趣味はギター,キーボード,アウトプット,散歩,読書など。
苦手なものは朝と事務作業。得意分野は眠ること。