
Google Cloud の ADC ファイルを 1Password に保存して、平文保存しないようにするスクリプトを作ってみた
はじめに
こんにちは。すらぼです。
私は gcloud コマンドを業務でよく利用するのですが、ローカルから実行する場合は ADC(Application Default Credentials) の保管方法についてずっと頭を悩ませていました。ADC のファイルは、平文でローカルに保存されるため、昨年から発生した Shai-Hulud のようなスキャン型マルウェアに感染した場合、容易に認証情報を詐取されてしまうためです。
今回は、これの対策のためにカスタムスクリプトを作ってみました。GitHub で公開しているので、皆さんも使えるようにしています。簡単な中身の紹介と合わせて、使い方の説明をしていきます。
できたもの
以下のリポジトリに保存されています。
実際の使い方
まず、以下のコマンドからインストールします。
インストールが完了すると gcloud コマンドを実行する際、 1Password 経由で認証情報を取り扱うようになります。
git clone https://github.com/Gre212/gcloud-1p-wrapper.git
cd gcloud-1p-wrapper
./install.sh
インストールが完了したら、新しいシェルセッションを起動して以下の初期化コマンドを実行します。
$ gcloud-op-init
コマンドを実行すると、ターミナルは以下のような画面が表示され、通常の ADC 取得と同じ流れで認証を行います。

gcloud-op-init 実行時のターミナル

Google アカウント選択の画面(ブラウザが自動で立ち上がる)
アカウントを選択すると、以下のように 1Password の認証画面が表示されます。
このタイミングで、ADC が 1Password の Vault に保存されます。

1Password 認証の画面
1Password への ADC 保存が完了すると、ターミナルでは以下の画面が表示されます。
このとき、ADC をはじめとしたローカルに保存されるクレデンシャルを含むファイルの削除を行っています。

ADC の取得後、クレデンシャルが含まれるファイルを削除
動作確認のために、 gcloud projects list を実行すると、正しく動作することが確認できました
gcloud コマンドをそのまま利用していますが、インストール時に 1Password から認証情報を取得するようにラッパースクリプトを作っているため、通常と同じような利用ができます。

動作確認
ユーザーを切り替えたい時
ユーザーを切り替えたいときは gcloud-op-init コマンドを再度実行して、認証したいユーザーに切り替えてください。
$ gcloud-op-init
terraform を使いたい時
Google Cloud が公式で推奨している IaC ツールとして、terraform を使いたいケースもあるかと思います。
本スクリプトでは terraform-op コマンドを用意しており、このコマンドを使うことで自動的に 1Password から認証情報が読み込まれます。
gcloud コマンドと同様、透過的に動作するので terraform コマンドと同じように使うことができます。
$ terraform-op init
$ terraform-op plan
$ terraform-op apply
仕組み
このスクリプトは、2つのコンポーネントで成り立っています。
1. ADC の取得と保存(gcloud-op-init)
まず、初期化時の処理です。 gcloud-op-init を実行したとき以下のような処理が行われます。
2. gcloud コマンド実行時の認証フロー
次に、実際に gcloud でコマンドを実行した時のフローです。
gcloud コマンドを、同名のスクリプトでラップすることで自前の処理を差し込んでいます。
注意点・制約
注意点として、現時点では SDK には非対応です
SDK は内部的に ADC を読みに行きますが、今回の方式では ADC の物理ファイルが存在しないため認証に失敗します。
SDK を利用したい場合は、五十嵐さんが作った gc-vault をお試しください。
終わりに
非常にシンプルで薄いラッパーですが、平文トークンの長期保持を回避できました。
勢いで作ったので粗い部分もあるかもしれませんが、適宜アップデートをしつつより良いものにしていければと思います。
この記事、このツールが誰かの助けになれば幸いです。以上、すらぼでした。








