vpnui.exe に人が入力する方法と、-s を使って標準入力から vpncli.exe に回答を流し込むスクリプトの方法、Cisco Secure Client は同じログイン要求に答える二つの手段を用意しています。後者なら GUI の画面を読み取らずに定時接続を実現でき、ログインは資格情報として保護すべきファイルに変わります。どちらを選ぶかは、機械の前に人がいるかどうかと、パスワードがどれくらいの頻度で変わるかで決まります。どちらの方法でもゲートウェイが求める内容は変わらず、変わるのは答える側だけです。

どちらの道も行き着く先は同じトンネルなので、比較するのは運用であってプロトコルではありません。

同じ要求に答える二つの方法

GUI の道は設計上インタラクティブで、クライアントが問いかければ誰かが答え、その人が放っておく限りセッションは続きます。人間が使うノート PC では、要求がゲートウェイの認証方式に合わせて変わるため、誰もパスワードを平文でディスクに置かずに済むので、これが正解です。

スクリプトの道は、キオスク、実験室のマシン、誰も入力しない定時タスクに向いています。取引は明確で、無人接続と引き換えにディスク上の資格情報ファイルを受け入れます。ゲートウェイが証明書認証や SAML 認証を提供しているなら、より強い方式なら避けられる要求に答えるためだけにファイルが存在することになるので、この取引は通常割に合いません。

同じマシンで両方を同時に混ぜないでください。コマンドラインとグラフィカルクライアントは同じセッション状態を取り合い、これが次の節の問題になります。

回答ファイルに必要なもの

クライアントは順に問いかけます — ゲートウェイ、場合によってはグループ選択、ユーザー名、パスワード、そしてバナーの確認です。すべてに答えるファイルは、実際の値を入れると次のようになります:

connect vpn.example.com
MyGroup
alice
correct-horse-battery
y

そのファイルを確実に作る方法は、一度手作業で接続し、入力した行と押した Enter をすべて書き留め、その順序をそのまま再現することです。グループとユーザー名をプロファイルに保存する環境では、その要求が表示されない位置に空行が必要になることがあり、最終行には依然として改行が必要です。一行足りないファイルは、明確なエラーで失敗する代わりに最後の要求で止まることが多く、そのせいでネットワークのせいにされます。ファイルと自分の記録は、一度は順序、もう一度は空白行のために二度突き合わせてください。

ファイルは同期フォルダの外に置き、タスクを実行するアカウントだけが読めるようにします。そのパスワードは平文なのでファイルは資格情報であり、リポジトリにも共有ドライブにも、チケットの添付にも置けません。クライアントはこの点を警告してくれません。

GUI を先に落とす必要がある理由

GUI のプロセスを終了させてからスクリプトを始め、作業ディレクトリとクライアントのビルドの両方が関係するため CLI は自身のインストールディレクトリから実行してください。説明用のラッパー:

@echo off
taskkill /IM vpnui.exe /F >nul 2>&1
cd /d "%PROGRAMFILES(x86)%\Cisco\Cisco Secure Client"
vpncli.exe -s < C:\secure\login.txt

ここでは終了コードは信頼できる成功の合図ではありません。クライアントは進行状況を出力し、トンネルは別プロセスに保たれるので、出力から接続状態の行を読み、それから VPN に依存する作業を始めてください。

GUI の終了を飛ばすと、既存のセッションがユーザーの残した状態のままなのに、スクリプトは動いているように見えることがあります。この不具合は断続的に見え、まさに一週間の推測に耐えてしまう種類のバグです。

セッションは確認するもので、仮定するものではありません

スクリプトが戻ったら、トンネルの中にしか存在しないもの、つまり内部ホストや社内リゾルバーだけが答える DNS サフィックスを確認します。クライアントの出力で接続状態の行も読み、それ以外は遅い成功ではなく失敗として扱ってください。セッションが既にあるのにファイルを再実行すると、クライアントが中途半端な設定のまま残ることがあるので、先に切断するか、セッションがあるときはログインを飛ばしてください。

次に、再接続を誰が担うかを決めます。内部アドレスに ping してログインを再実行するループは、キオスクを何か月もオンラインに保てますが、パスワードが初めて変わったときにアカウントをロックすることもあります。試行回数に上限を設け、超えたら警告し、古いパスワードがロックまで再試行を続けるのではなく、ID チームにファイルを更新してもらいましょう。

古い vpnclient.exe は同じ道具ではありません

同じ自動化が古い名前でも存在し、両者は互換ではありません。廃止された Cisco IPsec クライアントは vpnclient.exe を使い、connect 動詞、プロファイル名、ユーザー、パスワードを一つのコマンドラインに並べるインライン引数を取っていましたが、vpncli.exe は標準入力に -s を付けた要求の並びを期待します。そのため古いフォーラムのスクリプトを現在のマシンにコピーすると、実行はされるが何も見えず、ゲートウェイのせいにされるコマンドになります。

引数を編集する前に、どのクライアントが入っていて、スクリプトが実際にどちらを呼んでいるかを確認してください。名前の違いは定時タスクで見落とすほど小さく、引き継いだスクリプトが更新後に動かなくなったときに最初に確かめるべき点です。

関連記事