WebDAV未サポートのコピー複合機から、NAS 仮想マシン の NextCloud サーバへ、受信したFAXのPDFファイルを SFTP で転送し、 NextCloud 側で閲覧可能にする仕組みを構築します。
WebDAVを使えないFUJIFILM複合機
前回、QNAP Xeon搭載NAS上のUbuntu 22.04 Server仮想マシンに構築したNextCloudファイル共有を、FUJIFILM製のコピー複合機が受信するFAXのPDF文書の転送先にしたいのですが、残念ながら当該機がサポートするプロトコルはSMB、FTP、SFTPに限られ、WebDAVが使えません。
複合機とNextCloudは、互いに物理的にも異なるネットワークに属することからSMBもそぐわないことから、今回SFTPで転送する仕組みを構築することにしました。
SFTPの準備
まず、複合機がアクセスしてくる際に使用するユーザアカウントを、NextCloud仮想マシン上に作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ sudo adduser faxadmin Adding user `faxadmin' ... Adding new group `faxadmin' (1001) ... Adding new user `faxadmin' (1001) with group `faxadmin' ... Creating home directory `/home/faxadmin' ... Copying files from `/etc/skel' ... New password: Retype new password: passwd: password updated successfully Changing the user information for faxadmin Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y |
そしてこのユーザを後述の理由により、rootグループに加えます。
1 2 3 4 5 6 7 8 9 10 |
$ getent group root root:x:0: $ sudo usermod -aG root faxadmin $ getent group root root:x:0:faxadmin $ groups faxadmin faxadmin : faxadmin root |
次に /etc/ssh/sshd_configを編集して、このユーザはSFTP専用とし、chrootでルートディレクトリを前回NextCloudに設定したグループ共有フォルダへ、設定します。
1 2 3 4 5 6 7 8 |
#Subsystem sftp /usr/lib/openssh/sftp-server Subsystem sftp internal-sftp -f AUTH -l INFO Match User faxadmin ChrootDirectory /media/vol1/nextcloud/data/__groupfolders AllowTcpForwarding no ForceCommand internal-sftp X11Forwarding no |
chrootやNextCloudのパーミッション嗜好
chrootで指定するディレクトリの所有者はrootでなければならないほか、パーミッションが適切に設定されていないと、アクセス試行がBroken Pipeにより失敗してしまいます。
1 2 3 4 |
$ sftp -oPort=NNNN faxadmin@MYDOMAIN.EXAMPLE.COM faxadmin@MYDOMAIN.EXAMPLE.COM's password: packet_write_wait: Connection to NNN.NNN.NNN.NNN port NNNN: Broken pipe Connection closed |
また、NextCloudがデータディレクトリのパーミッションをチェック、書き換えてしまうようで、
両者が納得する落とし所を探って数時間、以下のように設定することでようやく抜け出すことができました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo tree /media 755 | /media 755 | └── vol1 755 | └── nextcloud 750 | └── data ←NextCloudがチェック 755 | ├── faxuser1 755 | ├── faxuser2 755 | ├── __groupfolders ←chrootココ 755 | └── 1 775 | ├── c 644 | └── ****.pdf 775 | ├── m 775 | └── s |
こうすれば動作する、という自信はむしろ有りませんが、もしSFTPでBroken Pipeを食らったり、変えたはずのパーミッションが元に戻ってしまっている、などの現象に遭遇したら、この辺りが解決の糸口になるかも知れません。
FUJIFILM複合機にジョブフロー設定
サーバ側の受け入れ体制は整ったので、複合機(FUJIFILM C5570を例にします)のWeb UIにアクセスして、FAX受信時のジョブフローを設定します。
管理者アカウントでログインしたら、Appの一覧から Job Flow Sheets を選択。
Job Flow Sheetリストの Edit ボタンをクリックします。
既に定義してあるシートを選択。
Recipients一番下の Transer via SFTP をクリックします。
適当な名前を付け、サーバ名にFQDNとカスタムポート番号、保存先相対パス、ログイン情報を設定します。
コピー複合機側の作業は以上です。
SSH-RSAを有効化
NextCloud仮想マシンのsshやsftpに対し、既に別のPCから接続に問題がないことは確認済みですが、いざコピー複合機からのアクセスを試行すると失敗してしまいます。この時サーバ側のログには、次のようなエントリが挙がっていました。
1 |
faxcloud sshd[594303]: Unable to negotiate with 192.168.###.### port 27665: no matching host key type found. Their offer: ssh-rsa [preauth] |
複合機側はまだSSH-RSAを使っているようです。これは複合機側の設定で変えられそうにないので、サーバ側で許可するよう、 sshd_config に次の設定を追加します。
1 2 |
HostKeyAlgorithms=ssh-rsa,ssh-rsa-cert-v01@openssh.com PubkeyAcceptedAlgorithms=+ssh-rsa,ssh-rsa-cert-v01@openssh.com |
なおこの設定は、上述の Matching User 項に入れると怒られるので、不本意ながらグローバルに適用すると、複合機からのアクセスが成功するようになりました。
NextCloudへの反映
NextCloudのデータディレクトリへNextCloud以外の手段でコピーされたファイルは、そのままではNextCloud上で見えることはなく、次のコマンドを実行する必要があります。
1 2 3 4 5 6 7 8 9 |
$ sudo nextcloud.occ files:scan --all Starting scan for user 1 out of 3 (faxuser1) Starting scan for user 2 out of 3 (faxuser2) Starting scan for user 3 out of 3 (ncadmin) +---------+-------+--------------+ | Folders | Files | Elapsed time | +---------+-------+--------------+ | 23 | 20 | 00:00:00 | +---------+-------+--------------+ |
これでページをリフレッシュすると、ようやく現れました。
SFTPのセッションが切れたら後処理で再スキャンコマンドが動くような仕組みが理想的なのでしょうが、ひとまず単純にcronで定期実行することにします。
NextCloudユーザがファイルを消せない
ほっとするのもつかの間、最後にNextCloudへ一般ユーザで入って確認してみると、SFTP経由で転送されたファイルの削除ができません。
ターミナルからフォルダ内の様子を確認すると、
1 2 3 4 5 6 7 8 |
# ls -l /media/vol1/nextcloud/data/__groupfolders/1/c/ -rw-r--r-- 1 faxadmin faxadmin 272291 Dec 13 15:14 01092022105831.pdf -rw-r--r-- 1 faxadmin faxadmin 78987 Dec 13 12:03 01122022134206-0001.pdf -rw-r--r-- 1 faxadmin faxadmin 78987 Dec 13 12:07 01122022134206-0002.pdf -rw-r--r-- 1 faxadmin faxadmin 78987 Dec 13 12:02 01122022134206.pdf -rw-r--r-- 1 faxadmin faxadmin 20229 Dec 13 11:58 13122022115806.pdf -rw-r--r-- 1 faxadmin faxadmin 36972 Dec 13 15:18 13122022151824.pdf -rw-r--r-- 1 root root 16 Dec 13 16:04 test.txt |
最後の test.txt はNextCloudからアップロードしたテキストファイルで、これはもちろん削除可能です。
sftpを通じてアップロードされたファイルの所有権とパーミッションに原因があるのは明白なので、付け刃的ですが共有フォルダ以下を全て所有者を root:root へ変更して解決します。
1 2 3 4 5 6 7 8 |
# chown -R root:root /media/vol1/nextcloud/data/__groupfolders/1/ # ls -l /media/vol1/nextcloud/data/__groupfolders/1/c/ -rw-r--r-- 1 root root 78987 Dec 13 12:03 01122022134206-0001.pdf -rw-r--r-- 1 root root 78987 Dec 13 12:07 01122022134206-0002.pdf -rw-r--r-- 1 root root 78987 Dec 13 12:02 01122022134206.pdf -rw-r--r-- 1 root root 20229 Dec 13 11:58 13122022115806.pdf -rw-r--r-- 1 root root 36972 Dec 13 15:18 13122022151824.pdf -rw-r--r-- 1 root root 16 Dec 13 16:04 test.txt |
毎分更新バッチ
以上、SFTPから転送されたファイルに対して必要な処理を次のバッチにまとめ、
1 2 3 4 |
#!/bin/bash echo "[`date +"%k:%M:%S"`]" /usr/bin/chown -R root:root /media/vol1/nextcloud/data/__groupfolders/1/ /snap/bin/nextcloud.occ files:scan --all |
cronにスケジュールを登録しました(就業時間中は毎分実行させます)。
1 2 3 4 |
# scp2nxc_sync.sh : NEXTCLOUD SCP FILE RESYNC */1 7-20 * * 1-5 root /root/scp2nxc_sync.sh > /tmp/scp2nxc_sync.log 2>&1 02 0-6,21-23 * * 1-5 root /root/scp2nxc_sync.sh > /tmp/scp2nxc_sync.log 2>&1 02 * * * 6-7 root /root/scp2nxc_sync.sh > /tmp/scp2nxc_sync.log 2>&1 |
こうしてFAX受信フォルダの疑似クラウド化は完成しました。今後ユーザからWindowsエクスプローラでの操作の要望が挙がるようならば、WebDAVによる操作を検証してみるつもりです。