2026 六国リモート Mac:Jenkins/Buildkite エージェントの認証情報(マシンユーザー、OIDC、PAT)と GitHub Actions/GitLab runner の共存——ミューテックスとリース FinOps チェックリスト

約 17 分で読めます · MACCOME

シンガポール、日本、韓国、香港、米国東海岸、米国西海岸にまたがる専用リモート MacホストでJenkinsまたはBuildkiteの macOS エージェントを動かし、すでにGitHub ActionsまたはGitLabのセルフホスト runner を運用している場合、予算と監査で苦しくなるのは多くの場合 vCPU ではなく、第二のコントローラがもたらす認証情報の爆発半径です。90 日 PAT を誰が保持するか、どのユーザーコンテキストが match 復号のキーチェーンと ASC セッションを所有するか、バーストホストの再構築時にシークレットがイメージに固定されていないか、といった論点です。本稿では三本の台帳——認証情報トポロジー、ミューテックス規則、リース会計——を示し、Jenkins/Buildkite の段階的リース runbookおよびrunner のラベルとシークレットチェックリストと補完的です。そちらがキューを扱う一方、こちらはアイデンティティ、OIDC、失効経路を扱います。

同一の六国ホストに「第二の CI コントローラ」が載ったときの六つの認証情報失敗モード

  1. すべてのエージェントが同一の対話型 macOS ユーザーの HOME を共有~/.ssh に Jenkins、buildkite-agentactions-runner が同居すると、git credential-osxkeychain のプロンプトが出た瞬間に無人 CI が不安定なグリーンになります。
  2. 組織横断 PAT が日次バーストイメージに焼き込まれている:週次でホストが入れ替わりつつ組織トークンが凍結されていると、単一ビルダーを超えて影響範囲が広がります。
  3. match 復号と公証アップロードにミューテックスがない:同一の match リポジトリや ASC API セッションに同時パイプラインが触れると、間欠的な 401/403 が「Apple 側のノイズ」と誤読されます。
  4. クラウド管理面上の OIDC audience の不一致:リポジトリや環境まで絞られていない Buildkite/GitHub の信頼ポリシーでは、ジョブが必要とする以上のトークン表面にエージェントが届いてしまいます。
  5. キーチェーン領域と LaunchDaemon の順序が文書化されていない:再起動後に Jenkins が runner より先に立ち上がり、誰かが再試行するまで空のパーティションしか読めない、といった状態になります。
  6. FinOps がコア数だけを追い「認証情報の寿命 × リース」を追わない:日次ホスト上の長寿命キーは請求書では安く見えても、セキュリティカレンダーでは許容できません。

六国構成の価値は予測可能なコロケーションと専用 IOです。認証情報トポロジーが曖昧なままでは混乱だけがスケールします。Xcode Cloud ハイブリッド CIも走らせるなら、ASC と内部レジストリのどちらにどのアイデンティティが触れてよいかを明記しない限り、ハイブリッドマトリクスはハイブリッドインシデントになります。

認証情報 RACIを導入してください。プラットフォームがマシンユーザーと OIDC 束縛を、リポジトリがワークフロー範囲を、セキュリティが失効ドリルを所有します。第二コントローラが本番に入ると、ここに隙があるだけで一気に破綻します。

観点 長寿命 PAT/デプロイキーを優先 OIDC/短命トークンを優先
リース 月次以上のベースラインホストに限り、イメージ外からシークレット注入するとき 信頼条件が厳しければ日次/週次バーストでも利用可
監査粒度 「誰がどのホストに PAT を置いたか」の追加ログが必要になり、ローテーションは四半期決算に寄りがち クラウドがリポジトリ・環境・プールまで束縛でき、ジョブ単位の帰属がしやすい
Jenkins プラグイン群 多くのプラグインが静的資格情報ファイルを前提とする 明示的なパイプライン改修が必要で、初期コストは高い
Buildkite フックがシークレットを黙ってエクスポートしうる フックは組み立てだけにし、シークレットは OIDC で交換した短命トークンから渡す
GHA/GitLab runner セルフホスト runner は長い .credentials ファイルを抱えがち クラウド STS への OIDC が主流——まずこちらに合わせる
warning

赤線:組織全体に効く長寿命 PAT やルート級デプロイキーを日次バーストホストに置かないでください。どうしても必要なら、同じ承認チケットでシークレットの寿命をリース上限に束縛してください。

六ステップ runbook:「動く」から「失効でき台帳に載せられる」まで

  1. シークレット表面を棚卸し:Jenkinsfile、Buildkite パイプライン、GitHub ワークフローにまたがる環境変数とファイルを洗い、組織横断とリポジトリ限定にラベル付けします。
  2. 別々のマシンユーザーと HOME ツリーを割り当てる——例:jenkinsbuildkiterunner。CI 用途での対話型ログイン共有は禁止します。
  3. 排他リソースにミューテックス:match 復号、公証アップロード、ASC ブラウザセッションは直列化し、ロック名は ROUTING.md とパイプラインコメントに残します。
  4. OIDC 信頼条件をレビュー可能なテキストで書く:audience、リポジトリ、ref プレフィックス、環境名を列挙し、IAM または社内 STS と突き合わせます。
  5. 四半期ごとの失効ドリル:トークン種別を無作為に一つ失効させ、三本のエージェントが期待どおり劣化するか、黙って続くことがないか確認します。
  6. 認証情報の寿命をリース FinOps シートへ載せる:長寿命はベースラインだけ、バーストは短命 STS だけ——段階的リース表と同じページに置きます。
bash
# Example mutex (replace flock backend with your coordination service)
exec 9>/var/lock/match-decrypt.lock
flock -n 9 || { echo "match decrypt busy"; exit 42; }

# Example split users (LaunchDaemon sketch—do not copy paths blindly)
# UserName=buildkite vs UserName=runner — each HOME keeps its own git credential helper config

Grafana またはレビューメモに書き込む三つのメトリクス(ベースラインは各自で調整)

  • バーストホスト上で 30 日超 PAT を読んでいるジョブ:目標 0%。週次サンプリングで >3% ならセキュリティ例外チケットを起票します。
  • match/公証ステップのみのミューテックス待ち P95(秒):P95 が >600s のままキュー深度だけが伸びるなら、コンパイル並列を増やす前に直列エクスポート用ホストを足します(閾値は例示です)。
  • OIDC トークン交換失敗率を管理面とリージョンで分割し、六国フットプリントの一つだけ STS RTT が悪化しているなら、runner 同時実行を上げる前にネットワークトポロジーを直します。

2026 年において「SSH で入ってキーチェーンを手で直す」やイメージ内の万能 frozen .env が、第二コントローラを入れないより悪い理由

手作業のキーチェーン対応は監査に耐えません。最後にアンロックしたのが誰か、対話セッションが開いたままかは SOC2 の証跡になりません。万能の .env は単一リポジトリからコンテナを起動できる誰にでも表面を広げ、ジョブ単位の OIDC 最小権限と正反対です。

Jenkins/Buildkite と runner を共存させたいときに、専用 Apple Silicon で安定したリージョン egress とベースライン対バーストのリース分離が欲しければ、MACCOME クラウド Mac miniが物理的なアンカーとして適していることが多く、シンガポール・日本・韓国・香港・米国東西で日次/週次/月次/四半期リースを選べます。コンパイル吞吐を追う前にどのアイデンティティがどのホストにどれだけ滞在してよいかを台帳に載せてください——シミュレータ五つと公証三本分を走らせながら日次ホストに 90 日 PAT を凍結しないでください。

締め:CREDENTIAL_ROUTING.md を CLONE_POLICY の兄弟として置く

三つの表を出荷してください:マシンユーザー ↔ HOME 対応ミューテックス対象 ↔ ロック名OIDC 信頼 ↔ STS 範囲。初日の新メンバーが、ジョブがどのアイデンティティを使うか、失敗時にどのトークン種別を失効させるか、バーストに 90 日 PAT が無い理由を答えられるようにします。

runner のシークレットチェックリストと組み合わせるときは、「GitHub 側 OIDC」と「macOS キーチェーン領域」を同一変更チケットにまとめないと、クラウド上の信頼ポリシーは完璧でもベアメタルのパーティションは空のまま、というズレが残ります。

FAQ

Jenkins、Buildkite、GitHub Actions の runner は同一ホストに共存できますか?

ユーザー分割・キーチェーン領域・排他ステップの直列化があれば可能です。スタック全体で長寿命 PAT を共有しないでください。キューの詳細は段階的リース runbookを参照してください。公開リース段階はレンタル料金をご覧ください。

長寿命シークレットを月次ベースラインホストに載せる理由は何ですか?

日次ホストは入れ替わりが速く、静的シークレットがイメージやバックアップへ漏れやすいです。ベースラインホストが監査上のアイデンティティを固定します。運用の補足はヘルプセンターも併せてご確認ください。