MacのVPNが毎回Keychainへのアクセスを求める理由
Mac VPNの各プロンプトがどのコンポーネントから出ているかを特定し、重複する接続試行を止め、キーチェーン全体をリセットせずにKeychainアクセスを修復します。
Connectを一度クリックすれば、サインインウィンドウは一つで済むはずです。Macでは三つ出ることが多く、しかも所有者はほとんど同じではありません:ローカルの資格情報プロンプトの持ち主はキーチェーンであり、VPNゲートウェイは認証を、クライアントは自身の通知を持っています。すべてを黙らせるスイッチを探す代わりに、各ウィンドウを独自の修正を持つ別々の不具合として扱ってください。以下の手順は一度の意図的な接続試行を辿り、繰り返せる確認で終わります。
設定を変える前に各ダイアログの持ち主を名付ける
最初の一歩は設定ではなく記録です。接続を一度試し、現れる各ウィンドウについて、ダイアログに表示されたアプリ名、秘密を除いた正確な文言、それが現れた段階、キャンセルしたときに何が起きたかという四つの項目を書き留めます。この三行で、私が見てきたほぼすべての報告を網羅できます。
持ち主が正しい修正を決め、間違った修正こそが一つのプロンプトを三つに変える原因です:
| Window | Who owns it | Correct fix | What not to do |
|---|---|---|---|
| “wants to use your confidential information stored in…” | The item's access control list in your login keychain | Approve the specific client helper, once, after checking the name | Resetting the login keychain, or granting Always Allow to every application |
| “Sign in to <organization>” or an MFA push | The gateway's identity provider | Use the client's supported session renewal, or re-authenticate | Scripting a fixed password or code into the client |
| “Connection failed”, “Update required”, a policy banner | The client or your organization | Read the first error and fix its cause | Hiding notices by editing a preference file the client rewrites |
同じ試行の中で戻ってくるプロンプトは、次の試行で戻ってくるものとは別の信号です。前者は通常、接続があなたの下で再起動したことを意味し、後者は通常、保存された資格情報が再び求められていることを意味します。この二つにはほとんど共通点がないので、キーチェーンに触る前にどちらなのかを記録してください。
トンネルを起動しているものがいくつあるか調べる
Macで同じVPNを起動できる仕組みは四つあります:メニューバーの操作、ログイン項目、On Demandルール、そしてスクリプトやエージェントです。二つが発火すると、一つ目がまだ認証を待っている間に二つ目の起動が届き、重複ウィンドウが生じて何も進みません。まず何が設定されているかを列挙します:scutil --nc list は、システム設定が認識しているVPNサービスと現在の状態を出力します。独自のネットワーク拡張を同梱するクライアントはプロファイルをアプリ内に保持し、そこに表示されないことがあるため、クライアント自身の接続一覧も確認してください。
次に競合する起動元を探します。scutil --nc show "Work VPN" は組み込みサービスの構成辞書をOn Demandルール込みで出力します — インターフェースが変わるたびに再接続するルールは、Wi-Fiが移動するたび、またはディスプレイがネットワークスタックを起こすたびに、トンネルを再起動し、認証プロンプトを再び開きます。システム設定 > 一般 > ログイン項目でログイン項目を確認し、ユーザーごとのエージェントを次で一覧します ls ~/Library/LaunchAgents。MDMが管理するセキュリティスタックに属するものはそのままにし、削除しても次のチェックインで押し戻されるのが普通です。
試行中に実際に何が動いているかを見るには:ps -Ao pid,comm | grep -iE 'vpn|tunnel|extension'。一つを期待する場面でクライアントのヘルパーが二つあれば、「なぜプロンプトが二度出たのか」を資格情報の問題よりずっと頻繁に説明できます。
キーチェーンをリセットせずにKeychainアクセスを修復する
プロンプトは保存された項目のアクセス制御リストから出ており、VPNプロトコルからではありません。各項目は、どのアプリが尋ねずに読めるかを記録しています。クライアント更新後、尋ねるヘルパーの名前や署名が変わる一方で項目は古い方を載せたままなので、macOSは接続のたびに再び尋ねます。その一つの項目について新しいヘルパーを承認することが修正のすべてであり、すべてのアプリを承認することではありません。
VPNに触れずに、ACLが原因だと確認できます:security find-generic-password -s "service-name" -g は同じ項目をターミナルから読み取ります。そのコマンドでもプロンプトが出るなら、ダイアログはキーチェーンのものであり、トンネルはきっかけにすぎません。Appleの 三つのボタンに関するガイダンス — 一度だけ許可、常に許可、拒否 — は、拒否こそがプロンプトを次の試行ではなく即座に再表示させるからこそ一度読む価値があります。
間違ったヘルパーを承認した場合は、Keychainアクセスで項目を開き、Access Controlに切り替えてそのエントリを削除してください — これがロールバックです。ログインキーチェーンを削除したり、それを再構築する修復ツールを実行したりすると、無関係なパスワードも捨ててしまい、問題よりはるかに大きな変更になります。
サインインとポリシーの手順は、それを持つフローに保つ
ブラウザのサインインやMFAチャレンジはゲートウェイに属します。組織がセッションの永続化や証明書ベースの認証を提供しているなら、それがより少ない頻度で認証するためのサポートされた方法なので、それを使ってください。クライアントに固定コードを入力したり、プロンプトが出ないようにスクリプトにパスワードを保存したりすると、対話的な要素を静的シークレットに置き換え、次にポリシーが変わるときに失敗します。
組織の通知は抑止すべきでない唯一のカテゴリです。通常はポスチャチェックや許容使用の確認を強制し、隠すとトンネルが動いていてもデバイスが非準拠になり得ます。エラーダイアログはもう一つのカテゴリで、最初のエラーテキストを残してください — 二つ目のダイアログは、再試行後に同じ失敗を報告しているだけのことが多いからです。
一度の試行で確認し、その後再起動後に確認する
重複する起動元を取り除き、キーチェーンの項目を修復したら、一度だけ試します。メニューバーのヘルパーを含むすべてのクライアントインスタンスを終了し、一度接続して、ウィンドウを数えます。求めているのは、項目が再構築された場合のキーチェーンの承認と、一つの認証ステップだけで、それ以上は不要です。 scutil --nc status "Work VPN" は組み込みサービスに対してConnectedを報告するはずです。
その後、一度再起動して繰り返します。再起動後にだけ戻るプロンプトは資格情報ではなくログイン項目やOn Demandルールを指し、セッション内で戻るものはACLや二つ目の起動元を指します。二度のパスの後もなお繰り返すなら、管理者に渡すのに役立つのは最初の試行の三行の表 — 持ち主、正確な文言、段階 — であり、ダイアログのスクリーンショットではありません。
目標はプロンプトを減らすことであり、黙らせることではありません。承認ステップを隠す接続は、もはや監査できない接続であり、次の証明書ローテーションではどのコンポーネントが失敗しているのか分からないまま直面します。