NGW TECH BLOG
← 記事一覧へ
·#097

閉域網の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秒で当たりを付けられる出力にしておく。