sambaのvfs, scannedonly
scannedonlyとは、sambaのvfs。
その名前の通り、スキャン済みのもののみ開いたりダウンロードできるようになる。
scannedonlyのインストール
scannedonlyのvfsは、実はSambaに含まれる。
あれ?じゃあすぐ使えるの?と思ったのだが、それは間違いで、実際にスキャンを行うdaemonを別にインストールする必要がある。
その代わりと言っては何だが、clamdを立ち上げる必要はない。
security/scannedonlyからインストールできる。
以下はインストール例。sysctl.confに一行追加しとけよ、と言われるのでその通りにしておく。
$ sudo pkg install scannedonly
Updating repository catalogue
The following 1 packages will be installed:
Installing scannedonly: 0.21
The installation will require 61 KB more space
24 KB to be downloaded
Proceed with installing packages [y/N]: y
scannedonly-0.21.txz 100% 24KB 24.3KB/s 24.3KB/s 00:00
Checking integrity... done
[1/1] Installing scannedonly-0.21... done
**************************************************
* WARNING! *
* *
* Make sure you've enough socket buffer size. *
* Consider increasing kern.ipc.maxsockbuf adding *
* at least the following sysctl setting to *
* /etc/sysctl.conf: *
* *
* kern.ipc.maxsockbuf=589824 *
* *
**************************************************
[vanilla@yaryka ~]$
scannedonlyの設定の流れ
scannedonlyの設定には、前章のとおりにsysctl.confを修正することに加え、①vfsとしてのscannedonlyの設定、②daemonとしてのscannedonlyの設定が必要
まず③のdaemonとしての設定から。
scannedonly daemonの設定
/etc/rc.confで行う。
設定例は以下のとおり。
scannedonly_clamav_enable="YES"
scannedonly_clamav_flags=" --scanroot /usr/home/vanilla/share --big 20 -t 8 -m 20"
おなじみの一行目はシステム起動時にdaemonも起動させる指定。
二行目でdaemonに与えるオプションを指定する。
上記の-scanrootは、スキャン対象のファイルが置かれるトップディレクトリを指定する。
daemonは、ここで指定されたディレクトリ外のファイルのウイルススキャンを要求されても無視する。
その他のオプションには;
-p --portnum: ポート番号。ネットワークソケット経由でスキャンするならこちら。
-s path --socket=path : UNIX domainソケット。デフォルトは/var/run/scannedonlyd.sock
-t 4 --maxthreads=4 : ウイルススキャンを行うスレッドの数。デフォルトは4。
-b 10 --big=10 : 「大きいファイルだ」と認識するサイズをメガバイト単位で指定。後ほど触れる。
-q 1000 --queuelen=1000 : スキャン待ちできる数。これを超えて要求されたウイルススキャンは無視される。
-m 20 --time=20 : ここで指定された分ごとにステータスメッセージをログに吐く。
scannedonlyのスレッドと「大きいファイル」について
scannedonlyはデフォルトでスキャン用に4スレッドを用意する。
複数のスキャン要求が来たとき、scannedonlyは「大きいファイル」を特定の1スレッドのみに割り当てる。残りのスレッドは「小さいファイル」をざくざくスキャンする。
こうすることでスキャンの待ち行列をスムーズに解消しようと試みる。
「大きいファイル」は前述の-bigで指定するサイズで決まる。
この値は、共有ファイルにどんなファイルがあるかを前提に変えたらよい。
デフォルトの10MBはちょっと小さいので、20MBにした。
scannedonly vfsの設定
smb.confに書く。
shareごとに設定できる。
以下が設定例。
最後の行だけ特殊。後述。
[share]
(略)
vfs objects = scannedonly # scannedonlyを有効に。
scannedonly:domain_socket = True # domain socketを使うよ
scannedonly:socketname = /var/run/scannedonlyd.sock # domain socketの指定
scannedonly:hide_nonscanned_files = True # 未スキャンファイルを隠し、(下の行に続く)
scannedonly:scanning_message = is being scanned for viruses # スキャン中である旨表示する。
scannedonly:allow_nonscanned_files = True # Officeドキュメントを共有するならTrueに。後述。
起動
scannedonly daemonを起動し、そのあとsambaを(再)起動。
$ sudo service scannedonly start
Starting scannedonly_clamav.
$ sudo service samba restart
Performing sanity check on Samba configuration: OK
Stopping smbd.
Stopping nmbd.
Waiting for PIDS: 4847.
Removing stale Samba tdb files: ....... done
Starting nmbd.
Starting smbd.
$
このとき、/var/log/messagesには以下の表示があるはず。
Mar 21 21:13:35 yaryka scannedonlyd_clamav[5741]: Starting with socket /var/run/scannedonlyd.sock and 8 threads
Mar 21 21:13:47 yaryka scannedonlyd_clamav[5741]: Finished building databases. Ready for scanning with 8 threads
実験:未スキャンのファイルはどう表示されるか。
さっそく共有フォルダにファイルを放り込んでみよう。
小さいファイルだと変わらないようにみえるが、ちょっと大きいファイルになると、コピーが終わってからスキャンが終わるまで、以下のような表示になるはず。
なお、hide_nonscanned_filesをFalseにした場合、コピーが終わった瞬間にファイルは表示される。
スキャンが終わってなくても表示される。
されるのだが、開こうとしたりコピーしようとすると、「アクセス権がない」旨のメッセージが表示されて蹴られる。
ユーザからしてみれば、ファイルが見えるのに開けないのはストレスでしかない。
hide_nonscanned_filesはTrueをお勧めする。
しかし。
Officeドキュメントを共有する場合
scannedonlyの仕組みで困るのは、Officeドキュメント。
というのも、Officeはファイルを頻繁に開け閉めするから。
その都度、スキャンが走り、終わるまでファイルを開けなくなる。
要するに、使い物にならん。
そこで下記の行を追加して、未スキャンファイルも開けるようにするほかない。
うーん…。
scannedonly:allow_nonscanned_files = True
まあ、仕方ないよね。
バックヤードでは
さて。scannedonlyのバックヤードはどうなっているのだろうか。
実ディレクトリを見てみると、このようになっている。
$ ls -la
total 84360
drwxrwxrwx 2 vanilla clamav 512 Mar 21 01:17 .
drwxr-xr-x 3 vanilla vanilla 512 Mar 3 22:40 ..
-rwxr--r-- 1 vanilla clamav 0 Mar 21 21:17 .scanned:Sophos Virus Removal Tool.exe
-rwxr--r-- 1 vanilla clamav 86325064 Mar 17 23:35 Sophos Virus Removal Tool.exe
$
ディレクトリに置かれたファイルと同じファイル名、ただしファイル名の先頭に「.scanned:」と付いたサイズ0バイトのファイルができる。
このファイルでスキャン済みかどうかを、scannedonlyは判断している。
ちなみに、オリジナルのファイルを消すと.scannedの方も消える。
.scannedだけが残るということはないからご安心めされよ。
もちろん、ファイルを更新した際には再スキャンが行われる。
大きなファイルを共有フォルダにコピーしはじめ、そのあとに小さなファイルを共有フォルダに置くと、小さいファイルはすぐに表示される。
複数スレッドで処理していることと、大きいファイルは1スレッドでしか処理しないことからこのような動作になる。
また、しばらくすると、/var/log/messagesにはログが増えているはず。
Mar 21 21:33:47 yaryka scannedonlyd_clamav[5741]: Status: scanned 3 files and 0 large files in 20 minutes; min 0/max 4 requests on small queue, min 0/max 0 requests on large queue
実験: virusが見つかったらどうなる?
試してみた。
testvirus.txtというファイルを突っ込んでみると、コピーが終わっても共有フォルダには表示がされない。
代わりに、同じファイル名、ただしファイル名先頭に「VIRUS_found_in_」、末尾に「.txt」と付いたサイズ0のファイルが作られ表示される。
このとき、実ディレクトリはこのようになっている。
つまりオリジナルのファイルは「.virus:」と頭に付けられて、ユーザからは見えなくなっている。
$ ls -la
total 12
drwxrwxrwx 2 vanilla clamav 1024 Mar 21 01:44 .
drwxr-xr-x 3 vanilla vanilla 512 Mar 3 22:40 ..
-rwxr--r-- 1 vanilla clamav 68 Mar 21 21:44 .virus:testvirus.txt
-rwxr--r-- 1 vanilla clamav 0 Mar 21 21:44 VIRUS_found_in_testvirus.txt.txt
$
さらにこのとき、/var/log/messagesには以下のように。
1,2行目がウイルス発見時のもの、3行目はstatus report時のものである。
Mar 21 21:42:51 yaryka scannedonlyd_clamav[5741]: 0:0: WARNING: /usr/home/vanilla/share/testvirus.txt contains virus Eicar-Test-Signature!
Mar 21 21:42:51 yaryka scannedonlyd_clamav[5741]: 0: moving /usr/home/vanilla/share/testvirus.txt to /usr/home/vanilla/share/.virus:testvirus.txt
Mar 21 21:44:59 yaryka scannedonlyd_clamav[6836]: Warning: 1 files failed to scan in 1 minutes (error or virus found)
以上