GCPのサービスアカウントでファイルを操作する時の注意点
GCPのサービスアカウントを利用して、Google Driveのファイルを読み書きする場合、これまではサービスアカウントのメールアドレスをファイルの共有に追加するといった事をしていました。しかし、いつの間にかこの手法が使えなくなっていたようです。また、その場合、サービスアカウントからファイルを操作する際の手法が変更になっていたようで、これらの注意点についてまとめてみることにしました。
※あまりGASでサービスアカウントを使ってファイル操作はしたことがないので気が付きませんでした。確かに最近、この件についてどこかで情報を見た記憶があるのですが、ニュースソースを見つけられず。
目次
共有へ追加できなくなった?
これまで、サービスアカウントが読み書きする必要のあるファイルについては、Google Drive上の対象のファイルについて共有に「iam.gserviceaccount.com」のドメインのアカウントを追加する事で許可としてきました。2021年頃までは確かにこの方法で動いていました。おそらく昨今のセキュリティ向上の一環でOAuth2.0認証でなければアクセスさせないように制限が加わったのかもしれません。
自分が何かしたのかな?と探索したところ、こちらのサイトに理由が書かれていました。
- Google Workspaceの管理コンソールに於いて、ドライブとドキュメントの共有オプションが「オン」以外の場合追加できない
- 許可リスト登録済みドメインとして、iam.gserviceaccount.comを追加しようとしても追加する事は出来ません
- また、追加してもサービスアカウントがアクセスするには色々権限が必要
故に厳密にいえば共有不可ではないものの、現在この方法は推奨されていないようです。外部共有がオンじゃなければダメとなると、通常の企業のセキュリティポリシーを考えるとオンには出来ません。組織部門を切ってその組織部門だけこの設定にし、専用のアカウントを用意して、専用の場所でだけ許可するといった厳格な運用が必要になります。
図:管理コンソールでの外部共有の設定
図:サービスアカウントを共有に追加した様子
サービスアカウントを利用する
サービスアカウントをGASから操作する
すでに過去のエントリーで、GASからサービスアカウントを利用しての操作自体は実現しています。Google Vertex APIを利用するケースなどでGASのoauthScopesに「https://www.googleapis.com/auth/cloud-platform」を追加して、最初に認証をする事でトークンを取得しリクエストをするという形を取ります。
また、この手法以外ではStackOverflowでも言及されていますが、対象のGCPプロジェクトの対象のスコープをGoogle Workspaceのドメイン全体の委任に追加するという手法を合わせて行います。しかし、ドメイン全体の委任で追加する手法は、セキュリティ的にどうなのよ?という懸念もあることから、利用する場合はかなり厳格にアカウント管理や適用範囲を絞っておく必要性があります。
サービスアカウントにファイルを読み書きさせる場合
ドメイン全体に委任しての操作はちょっとアレという事であれば、やはりここはOAuth2.0認証でサービスアカウントの認証を行い、トークンをもってしてAPIから操作する必要性があります。この場合、対象のファイルに対してサービスアカウントのメアドを追加する必要もないので、ドライブ共有オプションをオンにする必要もありません。
こちらで紹介されてるような、Googleグループにサービスアカウントを追加して、信頼ルールとして追加するといった手法もあるようなのですが、この手段はEnterprise Standard以上でなければ利用が出来ません。
その詳細は前述のGoogle Bardを呼び出すの中に記述されてるような手法で、スコープとしてはGoogle Sheets APIなど対象のドキュメントのAPIを加えておきます(手動で、https://www.googleapis.com/auth/spreadsheetsを追加)。あらかじめ有効なAPIとサービスにてGoogle Sheets APIを追加しておく必要があります。Google DriveのScopeも追加しておきましょう。
OAuthライブラリで認証を行う事で許可されて読み書きが可能になります。
とはいえ、こちらの方法は方法でClient IDやSecret、OAuth2.0認証によるAccess Tokenを利用してアクセスさせているのでトークンの流出等といったリスクがありますので厳格に管理する必要性があるのには変わりません。
図:Sheets APIを有効化
図:Scopeとして追加する
サービスアカウントが作ったファイルについて
サービスアカウントでファイルを作成すると、不思議な挙動になります。この辺りについてはこちらのサイトが非常に細かく検証とまとめを行っています。
- ファイルのオーナーはサービスアカウントとなる(自分ではない)
- ファイルの置き場は、サービスアカウントのマイドライブにフォルダが作成されて、ファイルが作成され、フォルダが自分に共有される
- ファイルを削除してもサービスアカウントがある限り、サービスアカウントのマイドライブに存在し続ける
- ファイルのオーナーは自分に変更することが出来る。但し変更には制限が伴う
- サービスアカウントを削除するとこれらのファイルも全て削除される
- 故にファイルについては共有ドライブなどに移動するのが望ましい
関連リンク
- 【GAS】サービスアカウントとして Google Cloud のAPIを使用する方法
- サービスアカウントを使って Google Drive(マイドライブ) に作成したファイルのオーナーはサービスアカウント
- Google Workspace:ドライブとドキュメントの共有オプションが「オン」以外の場合、サービスアカウントを「共有」に加えることができない
- サービス アカウント認証情報
- 共有制限付きのGoogleスプレッドシートをGCPサービスアカウントで読み込む方法
- Google Service Account can't be added to sheet in shared drive
- Google Service Account that has access to Shared Drives without explicit access permission
- Google Sheet API stopped working post restricting Drive's External sharing to Allowlisted domains
- Google Spreadsheet をサービスアカウントに共有せずにGoogle Spreadsheet APIから読みだす方法
- Google ドライブの信頼ルール(ベータ版)を使用してファイルの共有をより細かく管理
- Google Sheets API スコープの選択
- Okta ハッキング、会社のラップトップで個人の Google アカウントを使用した従業員が非難される
- JSONを返すちょっとしたAPIならスプレッドシートでサクッと
- サービスアカウントにどの権限が割り当たっているか確認したい
- Google Cloud のサービス アカウント キーを安全に管理する
- GitHub Actions からのキーなしの認証の有効化
- AWS の機能を GCP のサービスアカウントで認証して利用する