閉域網のWebメールに「インターネット側」を足したコードより先に要ったのはファイアウォールの依頼票だった
Webメール連携を、LGWAN側とインターネット側の2系統に対応させた。思い込みで5回つまずき、最後に要ったのはコードではなく、NW管理者への「穴あけ依頼」。メールは収受文書にそのまま取り込める。
導入予定の団体のメールサーバは、LGWAN側とインターネット側の両方にあった。
Roundcubeを選んだ話のときの実装は、接続先1系統(LGWAN内のメールサーバ)だけだった。NW管理者に確認すると、「NGWサーバからインターネット側メールサーバへの通信は通せる」と言う。10月19日、それなら両方つなごう、と決めた。
設計は、素直に2系統にした
- 接続先を PROFILE(1:LGWAN / 2:インターネット) で分ける。設定表はインターネット側だけ接頭辞
INET_を付け、INET_USE=1で有効になる。受信・送信・Sieve・TLS緩和・ログインID規則を、別々に持つ。 - 資格情報の主キーを
(PROFILE, KEY_KBN, KEY_CD)に広げた。1人が両側で、別パスワード・別アドレスを持てる。 - Roundcubeは1セッション=1サーバ。複数アカウント切替のプラグインには頼らず、ツールバー右端の「インターネットメール / LGWANメール」で、セッションを畳んで、新しいトークンで入り直す方式にした。パスワードはURLにもPOSTにも載せない(使い捨てトークン)。
ここまでは順調だった。つまずいたのは、全部私の思い込みだった。
思い込みで5回つまずいた
| 失敗 | 中身 |
|---|---|
| 1:ログインIDに@が要ると思った | LGメールは@より前だけがログインID。規則(アドレス全体 / @より前)と、職員ごとの個別指定の二段にした。決めるのはNGW側で、Roundcubeには決定済みのIDを渡す |
2:IDに@が無いと、差出人が ID@サーバ名 になる | Roundcubeの仕様。user_create フックでNGW側のアドレスと氏名を入れて解決。ただし既存ユーザー行には効かない |
| 3:同じアドレスの別サーバで入り直せない | refresh_session が username しか見ていなかった。PROFILEも比較して解決 |
| 4:切り替えたのに、設定が前の側のまま | smtp_host / *_conn_options / managesieve_host は起動時1回の設定では足りない。プラグインが startup / authenticate のたびに config->set する |
| 5:両側のドメインは同じと決めていた | 別ドメインの団体向けに INET_MAIL_DOMAIN(職員マスタのアドレスの@以降を読み替える)を足した |
1つ1つは小さい。でも「普通はこうだろう」で作った箇所が、そのまま穴になる。5つのうち4つは、実機でログインしてみて初めて分かった。
山場は、ファイアウォールだった
コードが動いても、NGWサーバからインターネット側メールサーバへ出られなければ、何も起きない。
- NGWサーバ → メールサーバの TCP 993(IMAPS)/ 587(送信)/ 必要なら 4190(Sieve) の許可が要る。
- DNS解決(または hosts 登録)が要る。
- 閉域網に置いたサーバがインターネットへ穴を空けるのは、セキュリティ上は慎重に扱うべき変更だ。
だから、先に依頼票を用意した。何を、どこへ、なぜ。許可は宛先とポート単位で、最小にする。項目はREADMEに書いた。コードより、この紙のほうが先に要った。
穴が開いたあとに困るのが、証明書だ。古い証明書やホスト名の不一致だと、Roundcubeのログは Could not connect ... Unknown reason としか言わない。そこで診断CLIを用意した(Roundcubeの記事にも出てくる道具だ)。
$ php ngwMailConnCheck.php <ホスト> <ポート> [relax]
DNS → 到達 → TLS → 証明書 → CAPABILITY の順に出す。「穴が開いたか」「証明書か」「認証か」を切り分ける道具で、FW依頼のあと最初に叩く。NO Login failed と出たら、経路はOKでパスワードだけ違う、と読める。
メールは、収受文書にそのまま取り込む
メールが読めるだけでは、業務につながらない。ツールバーの「収受転送」で、開いているメールを収受の新規画面へ、同じタブで写す。中間画面もアラートも無い(画面はベータに上げた話にある)。
- 登録までは自動化しない。 分掌事務・簿冊は職員が選ぶ。
- 添付は職員の端末に落とさず、サーバの作業場所に置く。登録して文書Noが決まってから、文書の添付フォルダへ取り込む。
- 落とし穴は1つ。取り込み先の階層に、アップローダ雛形(
TEMP/index.php)を複製しないと、一覧に出ない。
実データで見えた数字
導入団体の職員マスタで、メールアドレスが使えたのは在職508人中 320人だった。空欄が178、不正が10。不正10件のうち7件は、全角英字・全角@・U+2010のハイフンだった。
マスタを書き換えず、正規化関数で半角へ寄せることにした。直すのは現場でなく、読む側だ。
検証は、LGWAN側がローカルのDovecot、インターネット側が別ドメインの外部メール。送信はそれぞれ別のSMTPを通ることを、Postfixのログで確かめた。
残っている宿題
- 既定で開く側は、いつもLGWAN。前回の側は覚えない。
- ログインID規則を後から変えると、Roundcubeのアドレス帳が別人扱いになる。導入前に決める。
AIとの協働作業での学び
「普通はこう」を、AIも私も持ち込む。 失敗1〜5は、AIが書いたコードでも私の指示でも、同じ種類の間違いだった。仕様に書いていない前提を、どちらも黙って置く。実機で入ってみるまで、それは見えなかった。
コードが終わっても、終わりではない。 動くものを作るのは速くなった。でも、閉域網の外へ出る穴は、AIには開けられない。依頼票を先に整えるところまでが、こちらの仕事だと思っている。
切り分けの道具を先に作ると、後が楽になる。 診断CLIは、障害のためでなく「依頼が通った日に、何を見ればいいか」のために作った。AIにログを読ませるより先に、人間が3秒で当たりを付けられる出力にしておく。