昔の回避策が OpenVPN の実行ファイルを別の場所へ移し、元のパスにはシェルのラッパーを残していました。数か月後にアップグレードが入り、その回避策を戻す作業は、どのファイルが本当のクライアントなのかを当てる遊びに変わります。コマンド名、サービスに設定された実行ファイル、パッケージ自身のファイル一覧はどれも違う対象を指し得るので、一つだけ直して他を放っておくと、直ったように見えて挙動は悪くなるホストが出来上がります。

サービスが起動するパスから始める

端末と systemd ユニットでは、実行ファイルの解決方法が違います。シェルは PATH を探し、ユニットはパスを名指しし、しかも drop-in による上書きは、いま読んでいるファイルに触れずにそのパスを差し替えられます。この違いが、この作業の混乱の大半を説明します。どのファイルを直すべきかも、この違いで決まります。

ユニットに何を実行するのかを尋ね、それを変更する drop-in も含めて確認し、正しいと思い込んでいる断片ではなく、結果として得られる ExecStart 行を読みます。次に、そのパスをシンボリックリンク越しに最終的なファイルまでたどります。隠しディレクトリへ exec で終わるラッパーは、こうした古い修正でよくある形です。

何かを変える前に、解決したパスを書き留めます。

systemctl cat [email protected] | grep -n 'ExecStart'
readlink -f "$(command -v openvpn)"

コマンド名とサービスのパスを比べる

二つの答えはしばしば異なりますが、その違いはただちに異常というわけではありません。NetworkManager のプラグインが独自のパスを起動することもあり、コンテナがさらに別のパスをマウントすることもあります。

大事なのは、通信をさばくプロセスをどの持ち主が起動しているかを知ることです。ユニットが /usr/local/sbin/openvpn-wrapper を動かしているのに、シェルが /usr/sbin/openvpn を解決しているなら、二つ目のファイルを直してもサービスには何の影響もありません。

各候補をどのパッケージが持っているかを尋ね、そのファイルがパッケージ管理下なのか、ローカルに置かれたものなのかを判断します。所有パッケージのないファイルは、誰かが意図してそこに置いたファイルであり、削除する前に名前と持ち主と理由を与える価値があります。逆の間違いもよくあり、フォーラムの投稿が同じディレクトリを使っていたという理由で、古い保存済みバイナリでパッケージのファイルを上書きしてしまうのです。

パッケージのファイルはパッケージデータベースに語らせる

ソフトウェアが Debian パッケージ由来なら、パッケージデータベースは、そのファイルがインストールされた内容とまだ一致しているかを教えてくれます。これは整合性に関する狭い問いであり、セキュリティの判定ではありませんが、何を直すかを決めるとき、この違いは重要です。不一致はインストール後にファイルが変わったことを意味し、それが昔の回避策なのか正規のローカル編集なのかは分かりません。出力はどちらかを決めないので、結論ではなく手がかりとして読んでください。

検証を実行し、空の結果を何かの証拠とみなすのではなく、出力を読みます。

dpkg -S /usr/sbin/openvpn
dpkg --verify openvpn

dpkg のマニュアル には、検証がインストール済みのファイルをローカルに記録されたメタデータと比較し、保存されているチェックサムがあればそれを使うと記されています。変更されたパッケージのファイルには気づきますが、代わりに別のバイナリが起動されているかまでは分かりません。

直す前に状態を記録する

解決した起動パス、ファイルとパッケージの関係、ラッパーの場所、それを導入した変更記録を集めます。あとで必要になる統合作業がラッパーに含まれているなら、保護された場所へコピーします。

こうしたスクリプトは時に資格情報やゲートウェイの詳細を含むため、読む前にラッパーの内容をサポートスレッドへ貼り付けないでください。

トンネルを再起動すると、ホストの管理に使っているセッションが切れることがあるため、作業中にサービスが使うプロファイルと接続中の利用者を記録します。

起動を検証してからラッパーを片付ける

修正のあとサービスを起動し、プロセスが意図したパスで動いていることを確かめます。手で実行したバージョン確認はファイルが動くことを示しますが、ユニットがそれを使っていることまでは示しません。

元のオプションを無視するバイナリの差し替えは、証明書の問題のように見える形で失敗するため、次にクライアントを再接続し、プロファイルがまだ認証できるかを確認します。

退避させたラッパーは、それを導入したのと同じ変更記録を通じて片付けます。終わった修正は、どの実行ファイルが動き、なぜそうなのか、どのファイルを外したのかを語り、ファイル名を戻して願うこととは違います。

関連記事