誰が token を取り消したか、後から分からない ── Audit Log で token と project の変更をたどる

上原正吉(EarthLink Network Co., Ltd.)。AI会社・AI社員による業務自動化と、人の逐次介入なしに24時間自動開発を回す仕組みを自社で実践しています。開発ノウハウと具体的な設定方法、運用して分かった改善点を公開しています。

誰が token を取り消したか、後から分からない ── Audit Log で token と project の変更をたどる

誰が token を取り消したか、後から分からない ── Audit Log で token と project の変更をたどる

この記事は、連載「dotvault の使い方 ── .env を手で配るのをやめ、CI・チーム・AI エージェントに 1 コマンドで配るまで」の第 10 回です。この連載が終わる時に、dotvault を誰でも無料で使える形で公開する予定です。

CI の dotvault pull が、ある日 AUTH_REQUIRED で止まります。エラーの文は「invalid, expired or revoked service token」です。token が無効なのか、期限が切れたのか、誰かが止めたのか。止めたのなら、誰がいつ止めたのか。この 1 行からは分かりません。

token を作る人と止める人がばらばらだと、誰がいつその token を止めたかを後からたどる手段がありません。チャットの履歴を探し、関係しそうな人に聞いて回ることになります。

この回では、dotvault の管理コンソールの Audit Log で、誰が、いつ、どの token を止めたかをたどります。この回で確かめたのは、service token の発行と停止、project の archive と削除の 4 つです。この 4 つは、操作した人(Actor)と対象(Target)つきで 1 行ずつ残ります。Action・Target ID・Actor・日付で絞り込め、絞り込んだ画面は URL からそのまま開き直せます。

結論

  • CI が AUTH_REQUIRED で止まったら、まず dotvault whoami で token の先頭 8 文字を見ます。 est_ に続く 8 文字は、その token の Token ID の先頭です。Token ID は secret ではありません。
  • Audit Log の Action で service_token.revoked を選ぶと、token を止めた操作だけが並びます。 止めた人の email、時刻、token の名前が 1 行に出ます。
  • Target ID に Token ID を入れると、1 つの token の発行から停止までが並びます。 発行の行には、どの環境に向けて作ったかと期限も残ります。
  • token の名前は重なることがあるので、見分けるのは Token ID です。
  • 絞り込みは URL に残ります。 日付・Actor・Action・Target ID の絞り込みを URL ごと保存しておけば、同じ画面をすぐ開き直せます。この記事の画面は、すべて無料の plan(free)で撮りました。

本文(読了 約8分)

前提

7 回目(service token の発行と CI からの pull)の続きです。読んでいなくても、画面の流れは追えます。

1. CI の pull が止まった時に、手元で分かること

まず、CI で何が起きたかを端末で見ます。下の図の上半分は、token を作った直後に CI と同じ条件で pull した出力です。下半分は、管理コンソールでその token を Revoke(使えなくする操作)した後に、同じ pull をもう一度打った出力です。

端末の画面(再構成)。Before の見出しの下で dotvault --version が 0.16.0 を出し、dotvault whoami が「Service token (DOTVAULT_TOKEN=est_1ad24f14…) — CI / Lambda mode」と出し、dotvault pull demo-app --env production が「Wrote 5 keys」と「1 file synced」を出して成功している。After の見出しの下では同じ pull が「✖ AUTH_REQUIRED: invalid, expired or revoked service token」で止まり、echo $? は 3。続く dotvault list --project demo-app も同じ AUTH_REQUIRED で止まり、echo $? は 3。

Revoke の後の pull は、終了コード 3(AUTH_REQUIRED)で止まります。エラーの文は、token が無効・期限切れ・止められた、のどれかだと言うだけです。

手がかりになるのは、dotvault whoami の出力の est_1ad24f14… です。est_ に続く 8 文字は、その token の Token ID の先頭です。管理コンソールで token を作った時の画面にも、「Token ID は secret ではない。token の est_ と . の間の部分」と書かれています。この 8 文字を控えて、管理コンソールに移ります。

dotvault whoami は dotvault のサーバーに問い合わせないので、止められた token でも同じ 1 行を出します。whoami の出力には、図では省いた続きの行があり、そこにも書かれているとおり、token が使えるかどうかは dotvault list --project <project 名> で確かめます。終了コード 3(AUTH_REQUIRED)なら、token は止められたか、期限切れか、無効です。

2. Audit Log で、token を止めた操作を探す

管理コンソールのサイドバーの Audit Log を開きます。1 行が 1 回の操作で、Timestamp(時刻)・Actor(操作した人)・Action(操作の種類)・Target(対象)・Metadata(補足)の 5 列が並びます。

上の Action の一覧から service_token.revoked を選んで Apply を押すと、token を止めた操作だけが残ります。

Audit Log(英語 UI)の絞り込み欄と一覧の切り抜き。Action に service_token.revoked を選んだ状態で 3 行。一番上は 11/2/2026, 5:39:38 PM、Actor はデモのユーザー dev-a の email と web、Target は service_token/1ad24f14e0c281bc75dd253374de3ac3、Metadata は already_revoked:false と name:ci-deploy。残りの 2 行は claude-agent-admin と claude-agent の token を止めた行。

一番上の行が、さきほど CI を止めた操作です。読み方は次のとおりです。

列値読み方
Timestamp5:39:38 PM止めた時刻
Actordev-a の email・web止めた人の email。web は管理コンソールからの操作
Targetservice_token/1ad24f14…止めた token の Token ID
Metadataname:ci-deploytoken の名前
Metadataalready_revoked:false止める前は使える状態だった

Target の Token ID は 1ad24f14 で始まり、dotvault whoami の 8 文字と合います。CI を止めたのはこの操作で、止めたのはデモのユーザー dev-a だと分かります。残りの 2 行は、8 回目で AI エージェント用に作り、最後に止めた 2 本の token です。

3. Target ID で、1 つの token の発行から停止までを並べる

次に、その token に何があったかを、発行までさかのぼって見ます。Action を「— any —」に戻し、Target ID に Token ID を最後まで入れて Apply を押します。Token ID は、Audit Log の Target の列か、Service Tokens の一覧の Copy ボタンから写せます。

Audit Log(英語 UI)の切り抜き。Target ID に 1ad24f14e0c281bc75dd253374de3ac3 を入れた状態で 2 行。上は 5:39:38 PM の service_token.revoked(already_revoked:false・name:ci-deploy)、下は 5:38:09 PM の service_token.created(envs:production・expires_at:1796200689・name:ci-deploy)。どちらも Actor はデモのユーザー dev-a の email と web。

この token についての行が 2 つだけ並びます。下の service_token.created が発行、上の service_token.revoked が停止です。発行の行の Metadata には、作った時の中身が残っています。

  • envs:production は、production の環境だけに向けて作った token だということです。
  • expires_at:1796200689 は期限で、1970 年からの秒数(Unix 時刻)で書かれています。この値は、発行のちょうど 30 日後の時刻です。
  • name:ci-deploy は、作った時に付けた名前です。

誰が、いつ、どの環境に向けて作り、誰が、いつ止めたかが、この 2 行で分かります。

Target ID は、ID 全体と一致する行だけを出します。1ad24f14 のように途中までを入れても、行は出ません。

4. 同じ名前の token は、Token ID で見分ける

Service Tokens の画面で、絞り込みを「Revoked only」にすると、止めた token が並びます。

Service Tokens(英語 UI)の一覧の切り抜き。絞り込みは Revoked only で 5 行。ci-nightly、ci-deploy(1ad24f14e0c281bc75dd253374de3ac3・Envs は production・Last used (hourly) は 11/2/2026, 5:39:10 PM・Last-use IP は伏せ字)、もう 1 つの ci-deploy(1f121d8e8c10adc7fab44f81a9a587f5)、claude-agent、claude-agent-admin。Status はすべて revoked。

ci-deploy という名前の token が 2 つあります。1 つは 7 回目で作ったもので、もう 1 つはこの回で作ったものです。dotvault は同じ名前の token を作れるので、名前だけでは、どちらを止めたかが分かりません。見分けるのは Token ID です。CI の dotvault whoami が出す 8 文字と、Audit Log の Target と、この一覧の Token ID は、同じ ID でつながっています。

この一覧の「Last used (hourly)」は、token が最後に使われた時刻です。この回の ci-deploy は 5:39:10 PM に使われ、その 28 秒後の 5:39:38 PM に止められています。ただし、この欄は token ごとに 1 時間に 1 回だけ記録されるので、いつも一番新しい利用とは限りません。画面の下にも、その旨が書かれています。

token の名前は、CI の名前と環境を入れるなど、重ならないように付けておくと、一覧で探しやすくなります。

5. 日付で絞って、その日からの token の発行と停止、project の archive と削除を見る

ある日からの token の発行と停止、project の archive と削除を見たい時は、Since(この日から)と Until(この日まで)で絞ります。Since に日付を入れて Apply を押すと、その日からのこの 4 つの操作の行が並びます。

Audit Log(英語 UI)の切り抜き。Since に 2026/11/02 を入れた状態で 4 行。project/demo-scratch の project.archived(5:46:25 PM)と project.deleted(5:47:27 PM・Metadata に secrets_deleted:0)、service_token/1ad24f14… の service_token.revoked と service_token.created。project の 2 行は Actor が f4785468-4031-7039-7e91-a00634e86a4f という ID と web、token の 2 行は Actor が dev-a の email と web。

token の 2 行に加えて、project の 2 行が出ています。demo-scratch は、この回の撮影のために作った project で、project.archived で archive し、project.deleted で消しました。消した行の Metadata の secrets_deleted:0 は、消した時にその project に入っていた secret の数です。project の archive と delete の手順は、3 回目で扱いました。

project の 2 行は、Actor が email ではなく f4785468-… という ID で出ています。これは dev-a のユーザー ID で、token の行と同じ人の操作です。Actor の欄の見出しが「Actor (email / sub)」となっているとおり、Actor の絞り込みには email も ID(sub)も入れられます。

Actor に入れたもの出た行
dev-a の emailtoken の 2 行
f4785468(ID の先頭)4 行すべて

email で絞ると、ID で出ている行は外れます。ある人の行を Audit Log から漏らさず拾いたい時は、ID で絞ります。Actor は Target ID と違い、途中までの文字でも絞れます。

6. 絞り込みは URL に残る

Audit Log の画面の上には「絞り込みの設定は URL に残るので、画面をそのまま渡せる」と書かれています。この回で使った絞り込みは、それぞれ次の URL になりました。

https://app.dotvault.io/admin/audit?action=service_token.revoked
https://app.dotvault.io/admin/audit?target=1ad24f14e0c281bc75dd253374de3ac3
https://app.dotvault.io/admin/audit?since=2026-11-02
https://app.dotvault.io/admin/audit?actor=f4785468&since=2026-11-02

& でつなげば、絞り込みを重ねられます。?action=service_token.revoked&since=… なら、その日から止めた token だけが出ます。調べた画面の URL をメモに貼っておけば、後で同じ画面をすぐ開き直せます。Service Tokens の画面の上にある「Audit log」のリンクからも、Audit Log に移れます。

まとめ

CI の pull が止まった時は、dotvault whoami で Token ID の先頭を見て、Audit Log の Action で service_token.revoked を選び、Target ID に Token ID を入れます。止めた人、時刻、その token をいつ誰がどの環境に向けて作ったかが、Actor と Target つきの行で並びます。token の発行と停止、project の archive と削除は、誰がいつ行ったかが Actor と Target つきで残り、無料の plan でも後から追えます。


dotvault は、.env や設定ファイルの secret をサーバー側に置き、権限のある人・CI・AI エージェントが 1 コマンドで受け取るサービスです(https://dotvault.io)。この連載が終わる時に、dotvault を誰でも無料で使える形で公開する予定です。公開したら、この連載の手順どおりに使い始められます。

興味のある方は、ぜひ「いいね」と記事の購読をお願いいたします。

自社プロダクトは https://www.eln.ne.jp/products にまとめています。

筆者について

上原正吉。EarthLink Network Co., Ltd. 代表。AI社員に日々の業務を任せ、開発では人が逐一指示しなくても作業が進むHOOTL(Human Out Of The Loop)の仕組みを自社で実践しています。このブログでは、業務自動化と24時間自動開発のノウハウ、具体的な設定方法、日々の運用で見つかった問題と改善を共有します。

また、AIで業務や開発を組み替えたい会社・チーム向けに、AI活用のコンサルティングも受け付けています。ご相談は www.eln.ne.jp からどうぞ。


EarthLink Network は、会社の全業務を AI で回すために、必要になったものを自社で作っています。いま作っているプロダクトの一覧と概要は、こちらにまとめています。

→ EarthLink Network が自社でつくっている18のプロダクト

会社と各プロダクトの詳細は、公式サイト www.eln.ne.jp をご覧ください。