本文へ移動
Step 03 · Identity

Google 共有ドライブ + サービスアカウント 7 種Drive mirror & identities

松葉のファイル本体は Cloud Storage に置きますが、Box ごとに「Drive 同期」を ON にすると、社内側でいつもの Google Drive 体験で参照できる片方向ミラーが走ります。その同期先となる共有ドライブ「社内アーカイブ」と、アプリ各サービスの身分証となるサービスアカウント(SA)7 種を準備しました。

サービスアカウント(SA)は、人間ユーザのアカウントとは別の「アプリ専用のアカウント」です。kintone で「API トークン」を発行する感覚に近いですが、SA は権限を Google Cloud / Workspace 全体に細かく持たせられるのが特徴です。

所要時間: 15 分 前提条件: Step 00 完了 後続: Step 04 / 05 / 06 / 07 / 08
01

共有ドライブ「社内アーカイブ」Shared drive

Drive 同期が ON の Box は、本ドライブ配下に {Box 名} のフォルダを生成し、ファイル / フォルダ操作をリアルタイム(数秒〜数十秒)でミラーします。同期は松葉 → Drive の片方向のみで、Drive 側で削除しても松葉本体には影響しません。

項目値
共有ドライブ名社内アーカイブ(Google Workspace 内)
所有者社内の Workspace(example.com)
松葉からアクセスする SAsync の実行 SA
SA に付与したロールコンテンツ管理者(fileOrganizer)
なぜ「閲覧者」「投稿者」ではダメかDrive Resumable Upload(中断・再開可能な大容量転送)+ appProperties(松葉側の ID を Drive ファイルに記録する仕組み)が「閲覧者・投稿者」では使えないため
02

サービスアカウント 7 種Seven service accounts

サービスアカウントは用途別に分け、それぞれに「触ってよいリソース」だけを必要最小限で付与しています(最小権限の原則)。これにより、片方のアプリが侵害されてももう片方のリソースには影響しません。

SA担当アプリ主な役割
web の実行 SAmatsuba-webUI(Next.js)。内部から matsuba-api を呼び出す
api の実行 SAmatsuba-api業務 API(Hono)。GCS 署名 URL 発行、認証、Pub/Sub publish
sync の実行 SAmatsuba-syncDrive 同期。共有ドライブ「社内アーカイブ」のメンバー
scanner の実行 SAmatsuba-scannerウイルススキャン(ClamAV)。バケット間 rewrite
batch(Jobs)の実行 SAmatsuba-batch定期処理(保持期間削除 / DLQ 監視 等)
隔離読取専用 SA(誰にも紐付けない)感染ファイル取り出し専用。system_admin が必要時のみ手動で借りる
デプロイ用 SAGitHub ActionsCI/CD でのデプロイ実行。Step 05 で WIF 経由のみで使える設定に

意図的に紐付けない SA がある理由: 隔離読取専用 SA は「感染検出で隔離されたファイル」を読める唯一の SA ですが、普段は誰のアプリにも紐付けていません。system_admin が監査ログ付きで手動 impersonate(一時的に身代わり)した時だけ使える形にすることで、隔離ファイルへの恒常的なアクセス経路を構造的に作らせない設計にしています。

03

SA とリソースの紐付けSA-to-resource map

図 · 7 SA が触るリソースの最小権限マップ
SERVICE ACCOUNTSweb の実行 SAapi の実行 SAsync の実行 SAscanner の実行 SAbatch(Jobs)の実行 SA隔離読取専用 SA手動 onlyデプロイ用 SAWIF onlyRESOURCES未検査バケット検査済みバケット隔離バケットミラー + 共有 ZIP バケットPub/Sub topic + DLQSecret Manager共有ドライブ(同期先)Cloud Run / Artifact Registry主要な書き込み権限読み取り / 通常権限境界・特殊用途

図の読み方: 矢印が無い箇所が「触れない」関係です。例えば api の実行 SA は隔離バケットに矢印が 引かれていない=感染ファイルを取り出す経路が存在しません。誤動作・脆弱性があっても、隔離ファイルが業務 API 経由で復活する可能性を構造的に排除しています。

04

JSON 鍵ファイルを 1 つも発行しない方針Keyless principle

従来の運用: SA を作ると JSON 形式の「鍵ファイル」を発行し、それをサーバや開発者 PC に置いて使うのが一般的でした。鍵が漏れる = アカウントが乗っ取られる、というリスクが常に付きまといます。

本構築の方針: 7 つの SA すべてに対して、JSON 鍵を発行していません。Cloud Run は SA を直接アタッチ(インスタンス起動時に身分を引き継ぐ)、GitHub Actions は Workload Identity Federation(次ページ)で動的に身代わり。社内 PC にも、リポジトリにも、Secret Manager にも、SA の鍵は 1 つも存在しません。