スマートフォン・タブレットからインターネットサーバーオペレーション

APPW.jp
 
ConoHa VPS移設記/番外編/Ubuntu 26.04 LTS

FTPサーバー再検討とLet's Encrypt自動更新

⑰で全17工程を完了した後、実運用の中で見えてきた2つの残作業。 スマホアプリの不安定さから始まったFTPサーバー再検討と、④から持ち越していたLet's Encrypt自動更新への切り替え。 どちらも「動いてはいるが詰めきれていない」部分に向き合った記録。

作業期間: 6日間(全17工程+今回の残作業)

01発端:OpenSSL更新でvsftpdに再びログインできなくなった

⑨でひと通り動作確認まで終えていたvsftpdだったが、⑭MongoDBの作業中(PECL拡張用にlibssl-devを導入した際、依存関係でOpenSSL本体がセキュリティパッチ版に更新された)を境に、FileZilla・スマホアプリともFTPSでログインできなくなる事態が発生した。

FileZilla エラー
レスポンス: 331 Please specify the password. エラー: GnuTLS エラー -15 gnutls_record_recv 内: An unexpected TLS packet was received.

サーバー側のログでは`PASS`まで正常に処理され「OK LOGIN」まで到達しているにもかかわらず、クライアント側では直後に接続が切断される、という食い違った状態だった。 vsftpd再起動・TLS 1.3無効化・暗号スイートの絞り込み(この過程で一度、証明書が実はECDSA証明書だったのをRSA用と誤認し、状況を悪化させる対応をしてしまった)などを試したが解決せず、 localhostからの接続でも同じ現象が再現することから、ネットワーク経路ではなくvsftpd(2015年が最終リリース)とOpenSSL 3.5系の組み合わせ自体の非互換という結論に至った。

最終的に、既に確立していたSSH鍵認証の仕組みをそのまま使えるSFTPへ切り替えることで実務上の問題を解消し、vsftpd自体の追及は保留にした。 これが、後述するPure-FTPdへの乗り換え検討の直接のきっかけになった。

02FTPサーバー再検討の発端

SFTPへ切り替えて解決したはずだったが、実運用の中でスマホのFTPクライアントアプリ2種類を使い分けていることが判明。 片方(高機能、SFTP鍵認証対応)はファイルが不規則に0バイトでコピーされる現象があり、もう片方(シンプル機能、この現象は未発生)はSFTP非対応でFTPSのみ対応、という状況だった。 SFTPを主運用としつつ、アプリ都合のフェールオーバーとしてFTPも検討することになった。

vsftpdには戻らない方針 上記の通り、根本原因が「メンテナンスの止まったソフトウェア対、更新され続けるOpenSSL」という構造的な脆さだった以上、乗り換え候補としてPure-FTPd(vsftpdの延長として設定が近い)・ProFTPD(高機能・複雑)を検討し、継続的にメンテナンスされている点を優先してPure-FTPdを候補とした。

平文FTPも選択肢に上がったが、シンプルアプリがFTPS対応と判明したため、Pure-FTPdへの乗り換えで進める方針に。 既存のLet's Encrypt証明書、ufw・ConoHaセキュリティグループの設定(ポート21・パッシブレンジxxxxx-xxxxx)をそのまま流用できる見込み。 vsftpdとポートが競合するため、切り替え時はアンインストールしてから試す必要がある点を確認した。

実装は本題の移設シリーズから外れる発展的な話のため、SFTPが主運用として機能している間に、時間のある時に試す方針とし、今回は検討の経緯を記録するところまでとした。

03Let's Encrypt自動更新への切り替え

④で手動DNS-01チャレンジを選んだ理由(DNS未切替・サイト移行未完了)は解消されたため、通常のHTTP-01(webroot方式)へ切り替えた。 VirtualHostを自動書き換えする--apacheプラグインではなく、既存の作り込み(PHP-FPMソケット、mod_wsgiのProxyPass、.html内PHP実行の個別設定等)に触れないwebroot方式を選択。

つまずき①:mail.gwaw.jpの404

gwaw.jpのwebrootチャレンジで、mail.gwaw.jp分だけ404エラー。原因は、mail.gwaw.jpがメールサーバーのホスト名であって対応するWebサイト(VirtualHost)が存在しないことだった。 新規サイトを作る必要はなく、既存のgwaw.jp(80番)のVirtualHostにServerAliasとしてmail.gwaw.jpを追加するだけで解決した。

/etc/apache2/sites-available/gwaw_jp.conf(80番)
<VirtualHost *:80> ServerName gwaw.jp ServerAlias www.gwaw.jp mail.gwaw.jp ...

つまずき②:「キープ」か「リプレース」か

本番実行時、既存証明書を「キープ」するか「リプレース」するか尋ねられる。今回の目的は証明書の中身ではなく次回以降の自動更新方法(手動DNS-01→webroot)を切り替えることなので、「リプレース」を選ぶ必要があった。

「キープ」を選ぶと目的未達成に 更新方法の設定は/etc/letsencrypt/renewal/各ドメイン.confに記録される。「キープ」だとwebrootでの実行が事実上スキップされ、この設定ファイルが書き換わらない可能性があった。次回の自動更新で相変わらず手動DNS-01を試みて失敗する、という結果になりかねなかった。

つまずき③:CAA再チェックエラーとステージング環境の不調

appw.jpで「Rechecking CAA for "www.appw.jp"...failed」が発生。CAAレコード自体は未設定(誰でも発行可のはず)で、時間を置いて再試行したところ成功した。一時的な通信の不具合だったと考えられる。

続けてcertbot renew --dry-runが5サイトとも「Secondary validation RPC failed」で失敗。Let's Encryptコミュニティフォーラムで同一のエラーメッセージの実例を複数確認したところ、Let's Encrypt社員自身が「現在ステージング環境で問題が発生しており対応中」と回答している事例が見つかった。 本番の証明書発行自体は直前に正常完了していたこともあり、こちら側の設定ではなくLet's Encrypt側のステージング環境(--dry-run専用のインフラ)の一時的な不調と判断し、時間を置いての再確認とした。

自動更新タイマーの確認

login-user@新サーバー
$ systemctl list-timers | grep certbot Fri 2026-09-11 13:37:19 JST 2h 9min certbot.timer certbot.service
確認完了 タイマー自体は正しく有効化され、次回実行が予定されている。ステージング環境の不調が解消され次第、改めて--dry-runで最終確認する運びとした。

04移設全体を振り返って

ログイン時のメッセージで、ディスク使用量が旧サーバーの85.2%から新サーバーでは38.7%まで大きく減少していることを確認した。 Anacondaを持ち込まなかったこと、torchのGPU関連パッケージを除外したこと、gensim・MeCab辞書を必要な範囲だけにしたことなど、今回の見直し作業の成果がそのまま数字に表れた形になった。

6日間、全17工程+番外編

空いた時間を使って6日間での完走。前回(2021年)からの記憶違いもいくつかあったが、SSLプロトコルの脆弱性、SPF/DKIMが丸ごと欠けていた3ドメイン、Dovecot 2.4の全面刷新、vsftpdとOpenSSLの相性問題、Node.js側で削除されたAPIなど、実際に手を動かさなければ見えてこなかった発見が数多くあった。 Ubuntu LTSの2年ごとのアップグレードサイクルに合わせて今後も移行していく上で、今回の記録がそのまま次回の見通しに繋がるはずである。

← ⑰ Supervisor(最終回)
ConoHa VPS移設記 完

『ConoHa VPS移設記 番外編 FTP再検討とLet's Encrypt自動更新』を公開しました。