業務委託・受託・転職 で職場を離れるとき、サーバ側のクレデンシャル失効化 (revoke) はすぐ思いつく。しかし ローカルマシン側の整理 ── git の email、AWS/GCP の CLI 設定、kubectl の cluster、Docker のレジストリ、ブラウザの SSO セッション、Keychain に保存されたパスワード ── は意外と見落とされやすく、「うっかり事故」の温床 になる。本稿は、データエンジニアが離任時にやっておくべきローカルクリーンアップを 検出スクリプト + 個別コマンド で体系化する。
1. なぜローカル整理が必要か ── 3 タイプの「うっかり事故」
- 1個人 commit に元職場メアドが残る: git の global email が前職のままだと、退職後に書いた個人 OSS / 自社 repo の commit author が元職場メアドになる。公開 repo なら GitHub 上で誰でも見える
- 2CLI 補完で前職プロファイルが選ばれる: `aws --profile <Tab>` や `gcloud config configurations list` で旧プロファイルが残っており、深夜の作業で誤って前職リソースに接続・破壊する
- 3監査ログに離任後の自分の操作が残る: ブラウザの SSO セッションが切れていない、AWS SSO のキャッシュが残っている等で、CloudTrail / GCP Audit Logs / GitHub Audit Logs に「離任後の自分」が記録され、後から責任を問われかねない
2. 作業の全体像
| # | 対象 | 代表的な保存場所 | リスクの方向 |
|---|---|---|---|
| 1 | git config | `~/.gitconfig`, repo の `.git/config` | 個人 commit に職場メアドが残る |
| 2 | GitHub PAT / SSH / gh CLI | `~/.ssh/`, gh の token store | 離任後の repo アクセス |
| 3 | AWS CLI / SSO | `~/.aws/`, `~/.aws/sso/` | 誤アクセス・操作監査 |
| 4 | gcloud / GCP | `~/.config/gcloud/` | 誤アクセス・操作監査 |
| 5 | Azure CLI | `~/.azure/` | 誤アクセス・操作監査 |
| 6 | Docker registry | `~/.docker/config.json` | 誤 push、トークン漏洩 |
| 7 | kubectl | `~/.kube/config` | 誤 apply / delete |
| 8 | DB クライアント | `~/.pgpass`, `~/.my.cnf`, BQ / Snowflake 設定 | 誤接続 |
| 9 | SaaS API トークン | shell rc, `~/.env*`, 各リポの `.env` | Slack / Linear / Notion / OpenAI / Anthropic etc |
| 10 | VPN / SSH | `~/.ssh/config`, OpenVPN/WireGuard プロファイル | 誤接続 |
| 11 | macOS Keychain | Keychain Access の Internet password / Application password | ブラウザ・アプリの自動ログイン残存 |
| 12 | ブラウザ | Chrome プロファイル、Cookie、IndexedDB | SSO セッション残存 |
| 13 | MFA / Authenticator | スマホアプリ (Google / Microsoft Authenticator / Authy / 1Password / Okta Verify / Duo Mobile) | 手動のみ。push 通知 / 紛失時の事故 |
| 14 | SSO / Security Key | Okta / Auth0 / Azure AD / Google Workspace の登録デバイス、YubiKey 登録先 | 離任後の認証残存 |
| 15 | ローカルファイル | `~/Projects/<元職場>`, ダウンロード、Documents | 情報持出に該当する場合あり |
まず git config を個人メアドに戻し、PAT / SSH / 各種 CLI を revoke する。これで「離任後に動かしてしまう」事故の経路が大幅に減る。ローカルファイルの掃除や Keychain は後回しでよい (事故が起きにくい)。
3. git config を個人メアドに戻す
最も多発する事故が「離任後の個人 commit が元職場メアドで残る」。global config を確認・修正する。
# 現在の global 設定を確認git config --global user.namegit config --global user.email
# 個人メアドに戻すgit config --global user.name "Your Personal Name"git config --global user.email "you@example.com"
# 個別 repo に local config を持つものがないか確認# (~/Projects 配下の全 repo を走査)find ~/Projects -name '.git' -type d 2>/dev/null | while read d; do repo=$(dirname "$d") email=$(git -C "$repo" config --local user.email 2>/dev/null) if [ -n "$email" ]; then echo "[$repo] local email: $email" fidone複数案件を並走するなら git config の `includeIf` が便利。`~/.gitconfig` に `[includeIf "gitdir:~/work/clientA/"] path = ~/.gitconfig-clientA` と書き、案件ディレクトリごとに別の email / signing key を自動適用できる。離任時はそのディレクトリと `.gitconfig-clientA` を削除すれば完了。
4. GitHub: PAT / SSH キー / gh CLI / GPG
- Personal Access Token (PAT): GitHub → Settings → Developer settings → Personal access tokens で 元職場 org 用に発行したものを全て revoke
- SSH key: GitHub → Settings → SSH keys で 元職場専用に発行したものを削除。`~/.ssh/` 配下の `id_*_clientA` のような key file 自体も削除可
- Deploy keys: 個別 repo の Settings → Deploy keys から削除 (admin 権限が要る)
- gh CLI: `gh auth logout --hostname github.com` で hostname 別にログアウト (個人 token は残せる)
- GPG/SSH signing key: 元職場用に発行したものは GitHub から removed + `gpg --delete-secret-key` でローカルからも削除
- Codespaces / Actions secrets: 個人で持つものなし、org 側で revoke 任せ
# 鍵ファイル一覧 (公開鍵だけ表示、秘密鍵の中身は出さない)ls -la ~/.ssh/
# .ssh/config の中で元職場のホスト名を grepgrep -E "Host |HostName |User " ~/.ssh/config 2>/dev/null
# 削除する場合 (例: clientA 用)# rm ~/.ssh/id_ed25519_clientA ~/.ssh/id_ed25519_clientA.pub# ssh-add -d ~/.ssh/id_ed25519_clientA # ssh-agent からも削除5. AWS CLI / SSO
AWS は configure ファイル + SSO キャッシュ + aws-vault キーチェーン + ECR ログインの 4 系統。全部見る。
# プロファイル一覧 (~/.aws/credentials, ~/.aws/config)aws configure list-profiles
# 各プロファイルの中身は ~/.aws/config と credentials にcat ~/.aws/config 2>/dev/null | grep -E '^\[|sso_|region|role_arn'cat ~/.aws/credentials 2>/dev/null | grep '^\['
# SSO キャッシュ (退社後も数時間有効なことがある)ls -la ~/.aws/sso/cache/ 2>/dev/null
# aws-vault を使っている場合 (macOS Keychain)aws-vault list 2>/dev/null# 1. アクティブな SSO セッションをログアウトaws sso logout --profile clientA
# 2. configure からプロファイルを削除 (sed で section 抜き取り)# 自動 sed はリスクがあるので手動編集を推奨# エディタで開く:$EDITOR ~/.aws/config$EDITOR ~/.aws/credentials
# 3. SSO キャッシュを物理削除rm -rf ~/.aws/sso/cache/
# 4. aws-vault のキーチェーン項目削除aws-vault remove clientA
# 5. ECR のログイントークン (~/.docker/config.json の auths) も忘れずにdocker logout 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com6. Google Cloud / gcloud
# 設定中のプロファイル (configurations) 一覧gcloud config configurations list
# ログイン中のアカウント一覧gcloud auth list
# Application Default Credentials の存在確認ls -la ~/.config/gcloud/application_default_credentials.json 2>/dev/null
# 削除コマンドgcloud auth revoke you@clientA.com # ユーザ認証 revokegcloud auth application-default revoke # ADC revokegcloud config configurations delete clientA-prod # configuration 削除
# キャッシュ全削除 (個人アカウントも消える点に注意)# rm -rf ~/.config/gcloud/7. Azure CLI
# 現在のアカウント一覧az account list -o table
# サインアウト (全アカウント)az logout
# 特定のテナントだけログアウトaz logout --username you@clientA.onmicrosoft.com
# 設定ファイルls -la ~/.azure/# 中身を捨てるなら:# rm -rf ~/.azure/8. Docker / コンテナレジストリ
`~/.docker/config.json` の `auths` に各レジストリのトークンが暗号化されずに残る (Base64 のみ)。ECR / GHCR / GAR / Docker Hub に対して `docker logout` を打つ。
# 現在の auth 状態cat ~/.docker/config.json | python3 -m json.tool 2>/dev/null
# ログアウト (registry 単位)docker logout # Docker Hubdocker logout ghcr.io # GitHub Container Registrydocker logout 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com # ECRdocker logout asia-northeast1-docker.pkg.dev # GARdocker logout clientA.azurecr.io # ACR9. kubectl / Kubernetes
# 現在の context / cluster / user 一覧kubectl config get-contextskubectl config get-clusterskubectl config get-users
# 削除 (個別)kubectl config delete-context clientA-prodkubectl config delete-cluster clientA-prodkubectl config delete-user clientA-prod
# kubeconfig 全置換 (個人用だけ残す場合は別ファイルから KUBECONFIG=... で読込)
# OIDC キャッシュ (kubelogin / oidc-login)ls -la ~/.kube/cache/# rm -rf ~/.kube/cache/oidc-login/ # 退社後ログインしないなら削除10. データベース・分析ツール
- PostgreSQL: `~/.pgpass` を編集して元職場ホストの行を削除
- MySQL: `~/.my.cnf` の `[client]` から password を削除
- BigQuery: gcloud の ADC + `~/.config/gcloud/` (上記 6 と同じ)
- Snowflake: `~/.snowsql/config` の connection を削除、`snowsql` の token cache (`~/.cache/snowflake/`) も
- dbt profiles: `~/.dbt/profiles.yml` の元職場 target を削除
- TablePlus / DBeaver / DataGrip: GUI クライアント側で接続を削除 (内部に保存される)
# 元職場の host 名 (例: clientA, internal.clientA.co.jp) を grepgrep -rE "clientA|internal\.clientA" \ ~/.pgpass \ ~/.my.cnf \ ~/.dbt/profiles.yml \ ~/.snowsql/config \ 2>/dev/null11. SaaS API トークン (環境変数 / .env / shell rc)
Slack / Linear / Notion / OpenAI / Anthropic / Stripe / Sentry / DataDog / PagerDuty など、案件に応じて取得した API トークンが shell の rc ファイルや `.env` 系に散らばっている。
# zsh/bash の rc に書かれた export を grepgrep -nE "(TOKEN|KEY|SECRET|PASSWORD|PASS)\s*=" \ ~/.zshrc ~/.bashrc ~/.profile ~/.zshenv ~/.bash_profile 2>/dev/null
# ホームディレクトリ直下の .env 系ls -la ~/.env* 2>/dev/null
# プロジェクトディレクトリの .env (大量にあるので head で 20 件まで)find ~/Projects -name '.env*' -type f 2>/dev/null | head -20
# direnv の .envrc も忘れずにfind ~/Projects -name '.envrc' -type f 2>/dev/null | head12. VPN / SSH config
- OpenVPN: `~/Library/Application Support/Tunnelblick/Configurations/` (macOS) / Tunnelblick の GUI から削除
- WireGuard: WireGuard アプリから tunnel を削除
- Cisco AnyConnect: 設定ファイル + Keychain の証明書
- SSH config: `~/.ssh/config` から `Host clientA-*` 等を削除、`~/.ssh/known_hosts` の bastion entry も `ssh-keygen -R hostname`
13. macOS Keychain (Mac の人向け)
ブラウザの自動入力やアプリの認証 token がここに残る。Keychain Access.app で検索するか、`security` コマンドで grep。
# Internet password (ブラウザ等) を検索security dump-keychain login.keychain-db 2>/dev/null | \ grep -E '"srvr"|"acct"|"svce"' | \ grep -i clientA
# 削除 (1 件ずつ) ── 慎重に# security delete-internet-password -s clientA.atlassian.net# security delete-generic-password -s "clientA Slack"Keychain には個人サービスのパスワードも混在する。自動 delete は絶対にやらない。Keychain Access.app で 1 件ずつ検索 → delete が安全。
14. ブラウザ (プロファイル分離 / SSO セッション)
個別 cookie を消すより、プロファイルごと削除する方が確実。元職場用に独立プロファイルを作っていた場合、それを丸ごと消せば cookie / 履歴 / 拡張機能 / 保存パスワード / 同期データが一括で消える。
- Chrome: `chrome://settings/manage-profile` で元職場プロファイルを削除 (Cookie / 履歴 / 拡張 / 保存パスワード一括除去)
- Edge: `edge://settings/profiles` で同様にプロファイル削除
- Brave / Arc / Vivaldi: 各ブラウザのプロファイル管理から削除
- Safari: macOS Sonoma+ の Workspace 機能 (プロファイル分離) で元職場 Workspace を削除。古い macOS なら Cookie / Website data を Domain 単位で削除
- Firefox: Multi-Account Containers の Container 削除 + `about:profiles` でプロファイル削除
- Google Workspace: `myaccount.google.com` → 「セキュリティ」→ 「お使いのデバイス」 で離任端末のセッションをサインアウト
- Microsoft 365: `mysignins.microsoft.com` → 「最近のサインイン」 + 「デバイス」 確認、不要なものを削除
- 個別 cookie 削除 (プロファイル残す場合): DevTools (F12) → Application → Storage → Cookies / IndexedDB / Local Storage を元職場ドメインで削除
新規案件に入ったタイミングで Chrome / Edge の専用プロファイルを作るのがお勧め。離任時に「プロファイル削除」だけで終わるので作業が桁違いに楽。複数案件並走時の cookie 混線・誤ログインも防げる。
15. MFA / Authenticator / SSO デバイス (手動のみ・忘れがち)
ここは CLI で検出できない。スマホアプリや 1Password 等の vault を 目視で開いて確認・削除する 必要がある。事故率は低いが、漏らすと「離任後も push 通知が来る」「紛失時に元職場アカウントへ侵入される」など面倒なことになる。
- Google Authenticator / Microsoft Authenticator / Authy: スマホアプリで元職場の TOTP エントリ (AWS / GitHub / Okta / SSO 等) を長押し削除。Authy は Settings → My Account → Devices で離任端末を delete
- 1Password / Bitwarden / LastPass: vault 内の元職場用パスワード + TOTP + Secure Notes を削除 (or 元職場 vault から退会)
- Okta Verify: アプリ内で元職場アカウントを削除 (退会後も push 通知が届くケースあり)
- Duo Mobile: 元職場のアカウントを app から remove (Account → 元職場 → ︙ → Remove)
- YubiKey / Security Key (FIDO2): GitHub / Okta / AWS IAM / Google アカウント等で 元職場用に登録した key を deregister。物理 key 自体は残しても、サービス側登録を消す
- Touch ID / Face ID for sudo: 自前 Mac で `sudo` 用に登録した biometric は残してよい (個人用継続)。元職場貸与 Mac は返却で完結
- バックアップコード: 1Password / 物理メモ等で元職場サービスの backup code を保存していたら削除
16. ローカルファイル (機密情報の物理削除)
契約・NDA に従う。一般的には離任時に元職場関連ファイルの返却・削除が求められる。
- `~/Projects/<元職場>`: コードベース。git remote から復元できる場合でも、ローカル消去が契約上の前提
- `~/Downloads`, `~/Documents`: 議事録 / 仕様書 / 顧客データ。grep で漏れがないか確認
- Slack ダウンロード / メール添付: 案件チャットからの DL ファイル
- スクリーンショット: `~/Desktop`, `~/Pictures/Screenshots` 等。秘密情報を含むものは復元不能な方法で削除
- ゴミ箱の物理消去: macOS は `rm` でも APFS のスナップショットに残る場合あり、SSD では `srm` も非推奨。論理削除で十分なケースがほとんどだが、契約上「完全消去証明」が求められるなら専用ツール
17. 検出スクリプト (まとめて列挙)
削除はせず、検出だけする スクリプト。出力を見て個別に削除コマンドを実行する。
本記事の検出スクリプトは github.com/hukuhuku-inc/field-notes-scripts で公開しています (MIT ライセンス)。以下のワンライナーで取得・実行できます ── `curl -fsSLO https://raw.githubusercontent.com/hukuhuku-inc/field-notes-scripts/main/engineer-handover/handover-detect.sh && chmod +x handover-detect.sh && KEYWORDS='clientA client-a.co.jp' ./handover-detect.sh`。Issue / PR で改善歓迎。
#!/usr/bin/env bash# handover-detect.sh: ローカルに残る元職場関連の設定を列挙する。# 削除はしない。表示された項目を人間が個別に判断して削除する。## Usage: KEYWORD=clientA ./handover-detect.shset -uo pipefailKW="${KEYWORD:-clientA}"
print_section() { printf "\n\033[1;33m=== %s ===\033[0m\n" "$1"; }
print_section "git config (global)"git config --global user.namegit config --global user.email
print_section "リポジトリ local email (~/Projects 配下)"find ~/Projects -name '.git' -type d 2>/dev/null | while read -r d; do repo=$(dirname "$d") email=$(git -C "$repo" config --local user.email 2>/dev/null) [ -n "$email" ] && echo "[$repo] $email"done
print_section "AWS profiles"aws configure list-profiles 2>/dev/nullls -la ~/.aws/sso/cache/ 2>/dev/null | head -5
print_section "gcloud configurations / accounts"gcloud config configurations list 2>/dev/nullgcloud auth list 2>/dev/null
print_section "Azure accounts"az account list -o table 2>/dev/null
print_section "Docker registries (~/.docker/config.json auths)"python3 -c "import json, osp = os.path.expanduser('~/.docker/config.json')if os.path.exists(p): d = json.load(open(p)) for k in (d.get('auths') or {}): print(' -', k)" 2>/dev/null
print_section "kubectl contexts / clusters"kubectl config get-contexts 2>/dev/null
print_section "DB 設定の KEYWORD grep"grep -rE "$KW" ~/.pgpass ~/.my.cnf ~/.dbt/profiles.yml ~/.snowsql/config 2>/dev/null
print_section "shell rc の TOKEN/KEY/SECRET 系 export"grep -nE "(TOKEN|KEY|SECRET|PASSWORD)\s*=" \ ~/.zshrc ~/.bashrc ~/.profile ~/.zshenv ~/.bash_profile 2>/dev/null \ | head -20
print_section "ホーム直下の .env 系"ls -la ~/.env* 2>/dev/null
print_section "プロジェクトの .env (~/Projects 配下、上位 20 件)"find ~/Projects -maxdepth 3 -name '.env*' -type f 2>/dev/null | head -20
print_section "SSH config の Host 行"grep -E "^Host |^HostName " ~/.ssh/config 2>/dev/null | head -20
print_section "Keychain で KEYWORD を含むエントリ (macOS)"if command -v security >/dev/null; then security dump-keychain login.keychain-db 2>/dev/null \ | grep -E '"srvr"|"acct"|"svce"' \ | grep -i "$KW" | head -20fi
echoecho "完了。出力を見て、個別に削除コマンドを実行してください。"自動削除は絶対にやらない。個人プロファイルと業務プロファイルがファイル内で混在しているケースが多く、一括 sed / rm では事故が起きる。人間が見て、判断して、消す。
18. クリーンアップ後の動作確認
- git: 個人 repo に空 commit `git commit --allow-empty -m 'verify' && git log -1 --format='%ae'` で author が個人メアドであること
- AWS: `aws sts get-caller-identity --profile clientA` でエラーが返ること
- gcloud: `gcloud auth list` に元職場アカウントが無いこと
- Docker: `docker pull ghcr.io/clientA/private-image` でログイン必須の error が返ること
- kubectl: `kubectl get pods --context clientA-prod` で context not found
- ブラウザ: 元職場の社内ツール URL を開き、ログイン画面に戻ること
19. 関連エピソード (今後の予定)
- EP.02 (予定): 新しい案件にジョインするときのセットアップ ── git includeIf、案件別 AWS profile、ディレクトリ分離
- EP.03 (予定): 複数案件を並走するときの権限分離 ── direnv / mise / aws-vault / kubectx
- EP.04 (予定): 引き継ぎドキュメントの書き方 ── 依存サービス / 当番表 / 暗黙知の言語化
次の話
次回は 「新しい案件にジョインするとき」のセットアップを取り上げます。git includeIf、案件別 AWS profile、ディレクトリ分離、aws-vault、direnv ── 「最初に綺麗にセットアップしておけば、離任時の片付けも楽になる」 という観点で書きます。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。