Squarantine ~ Kuroboxを使った
USBメモリセキュリティソリューション
オープンフォース/南部製作所
●
河野悦昌
話す内容は
GPL
自己紹介
●
オープンフォース
● 徳島で(2009年11月現在)
●
月例勉強会
●
南部製作所
●
徳島で
● SIで
●
何でも作るよ!
目次
営業の表現、約束
営業の表現、約束
プログラマのコード
USBメモリ感染
● Autorun.inf
● 2008/3〜 学術機関で大変※1!
● 2009/??〜 医療機関で大変※2!
● 2009/12〜 土木建築業界で(ry
※1 当社比
※2 当社比
※(ry
Autorun.inf
● [AutoRun]
● open=RavMon.exe
● shellopen=嬉蝕(&O)
● shellopenCommand=RavMon.exe
● shellexplore=彿坿砿尖匂(&X)
● shellexploreCommand="RavMon.exe -e"
●
● [AutoRun]
● open=inhm0.exe
● shellopenCommand=inhm0.exe
●
実行ファイル
● -rwx------ 1 nanbuwks root 107803 2009-07-26 08:34 063h1.exe
● -rwx------ 1 nanbuwks root 111497 2009-08-27 08:41 0uh9l3x.exe
● -rwx------ 1 nanbuwks root 104415 2009-06-22 17:40 0yml2bch.bat
● -rwx------ 1 nanbuwks root 114911 2009-09-08 08:40 29na61fj.exe
● -rwx------ 1 nanbuwks root 104395 2009-07-02 08:37 2w2.com
● -rwx------ 1 nanbuwks root 103257 2009-08-18 08:33 3nh99cah.exe
● -rwx------ 1 nanbuwks root 103992 2009-08-11 11:43 8d.bat
● -rwx------ 1 nanbuwks root 115605 2009-09-28 08:42 9npxi.bat
● -rwx------ 1 nanbuwks root 57 2009-10-11 13:53 autorun.inf
● -rwx------ 1 nanbuwks root 104166 2009-06-21 08:30 c.bat
● -rwx------ 1 nanbuwks root 103780 2009-06-27 08:47 h8c1o3b0.exe
● -rwx------ 1 nanbuwks root 112472 2009-08-30 08:32 hps.bat
● -rwx------ 1 nanbuwks root 115418 2009-10-09 08:33 inhm0.exe
● -rwx------ 1 nanbuwks root 116496 2009-10-03 08:29 isaecyu.exe
● -rwx------ 1 nanbuwks root 104963 2009-07-23 08:45 jq.exe
● -rwx------ 1 nanbuwks root 114414 2009-09-18 08:45 lf9.exe
● -rwx------ 1 nanbuwks root 113980 2009-09-13 08:31 m3nxw.exe
● -rwx------ 1 nanbuwks root 104593 2009-06-25 08:46 pumk0lf.com
USBメモリを使用禁止に?
● cf,
● http://itpro.nikkeibp.co.jp/article/COLUMN/20080313/296190/
● 「会社でのUSBメモリー使用は禁止が基本,」
代替手段や利用時の選定/運用条件を明確に – 情報漏えいと戦う現場...:ITpro
●
しかし・・・
●
手軽なので使いたいという要望
●
偉い取引先とのやりとりで他に方法のない場合は?
● 以下の場合は? (使わざるを得ない)
– デジカメ接続やiPod
– プレゼン用バックアップ
通常は
● USBメモリ検疫マシンを用意
●
ウイルススキャンソフトでチェックしてから
Yet Another?
●
もっとがっちり管理できるもの
●
偉い管理者はいるけど、身近に管理者がいない組
織で運用するもの
● たとえば、10人ぐらいのグループとか
●
コピー記録
● 使用USBメモリを登録制に
●
ウイルススキャンではなくて
!!そもそも!!(怒
● MS-DOS時代の老人には
● Autorun.infで自動実行自体がおかしい!
● 間違って .exe ファイルを実行させてしまうのがおかし
い!
– 拡張子表示しないのがおかしい!
– ダブルクリックで実行するのがおかしい!
●
このようなことがなければウイルスなんて!
●
実行ファイルを持ち込みしないというルールだけで
● データファイルのBufferOverrunやマクロウイルス以
外は!つまり99%は防げるのだ!
●.exeファイルを禁止にするルールは?
● .exeファイルを禁止して困ること
●
ドライバインストーラ
●
プログラムインストーラ
● 既に、Gmailは.exeファイル送受信できないように
なっているじゃないか
●
さらに上位に管理者がいる想定なので
●
ドライバ、プログラムインストールはまともな管理者
が対応
ルール
● exeファイルは原則禁止にしてもよくね?
● .scr .bat .cmd .com .pif も
● .vbs .vbe .js .jse .wsf .wsh も 禁止でよくね?
● ZIPは解凍チェックでいいんじゃね?
● Autorun.infは抹消して
●
使う度に強制フォーマットしてもよくね?
構想
● USB HUBみたいなの
●
を机に1つ
● 実はLinux Box
● LANでつなげる
目標
●
手軽に使える
●
ローカルの場合に比べて使い勝手を落とさない
●
管理者フリーで
● 机6台集めた島に1台
●
問題があったら危険をよくわかるように
●
実戦型
● ???
● あと10年戦える
●
何と?
阻止目標
● 組織内で利用しているものと同じ型番のUSBメモリ
をこっそり置いてくる
●
→組織内メンバーが「誰だよ出しっぱなしにしてる奴は
ぶつぶつ」と保管場所に収納
– →誰かが取り出して使用
●
本来はラベルをつけるだけで防止できるが
●
ついうっかりを防止するもの
「戦う」のに必要なものは?
●
ネットワークが信頼できない環境で使える
●
必要以上の情報を記録しない
●
更新しなくても確実に動く
●
原理的に強いルール
●
簡単で、わかりやすい仕組み
●
「抜け道」の管理が容易
抜け道
●
拡張子を変更
●
対人間用偽装拡張子の場合は完全に防げる
●
バッファオーバーフローなどの脆弱性をつくもの
●
イメージファイル
●
動画ファイル
– BOFはアプリケーションソフトの脆弱性を塞ぐ方向で対処
●
マクロウイルス
●
マクロ使わないのがデフォルトで良くね?
●
メールボックスファイル
●
メールボックスファイルも禁止した方がいいかな?
複数のUSBメモリを識別する
● 新しいUSBメモリは登録しないと使えない
● 登録したUSBメモリごとにルールをつける
●
デジカメは?
●
メディアチェンジ
● SDカードリーダは?
●
メディアチェンジ
● LUN? 
● USB HDDは?
●
複数のパーティション
パーティション領域
ごとに管理
これを使うにあたって
併用すべきもの
● Windows Update
●
監視ツール
● Windows側でUSBストレージを使えなくする
●
レジストリを変更
●
その他
●
アップデート
●
監視
●
拡張子を常に表示
●
隠しファイルを常に表示
プログラマのコード
営業の表現、約束
プログラマのコード
KUROBOX
● Debian Lennyをインストール
●
簡単!
●
基本的な設定をしておく
●
固定アドレスにして
– Vim /etc/network/networking
● LOCALE設定
– dpkg-reconfigure locales
● TIMEZONE設定
– dpkg-reconfigure tzdata
USB管理
● UDEVをほげほげすればいいかな?
● udevinfo -p /sys/class/scsi_disk -a
● usbmountパッケージをほげほげかな?
● UUIDでほげほげかな?
● 取得コマンド vol_id
● /dev/disk/by-uuid/
[43140643.390000] usb 2-1: configuration #1 chosen from 1 choice
[43140643.420000] scsi25 : SCSI emulation for USB Mass Storage devices
[43140643.430000] usb 2-1: New USB device found, idVendor=13fe, idProduct=1f23
[43140643.430000] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[43140643.440000] usb 2-1: Product: silicon-power
[43140643.450000] usb 2-1: Manufacturer:
[43140643.450000] usb 2-1: SerialNumber: E6950500FFFF1B8F
[43140643.460000] usb-storage: device found at 17
[43140643.460000] usb-storage: waiting for device to settle before scanning
[43140648.460000] usb-storage: device scan complete
[43140648.460000] scsi 25:0:0:0: Direct-Access silicon-power PMAP PQ: 0 ANSI: 0 CCS
[43140649.490000] sd 25:0:0:0: [sdm] 15659008 512-byte hardware sectors (8017 MB)
[43140649.500000] sd 25:0:0:0: [sdm] Write Protect is off
[43140649.500000] sd 25:0:0:0: [sdm] Mode Sense: 23 00 00 00
[43140649.500000] sd 25:0:0:0: [sdm] Assuming drive cache: write through
[43140649.530000] sd 25:0:0:0: [sdm] 15659008 512-byte hardware sectors (8017 MB)
[43140649.540000] sd 25:0:0:0: [sdm] Write Protect is off
[43140649.540000] sd 25:0:0:0: [sdm] Mode Sense: 23 00 00 00
[43140649.540000] sd 25:0:0:0: [sdm] Assuming drive cache: write through
[43140649.550000] sdm: sdm1
[43140649.560000] sd 25:0:0:0: [sdm] Attached SCSI removable disk
テスト機材● USBメモリ
● 8G
● SILICON POWER Ultima-II 8GB
usbmountパッケージ
● 渡ってくる環境変数(一部)
● PHYSDEVDRIVER: usb-storage
● ACTION: add
● MINOR: 4
● PHYSDEVPATH: /devices/platform/orion-
ehci.0/usb1/1-1/1-1:1.0
● PHYSDEVBUS: usb
● udevからusbmountがキックされている。
● udevを直接触ってもうまく動いた(ように見えた)の
で、今回は使わなかった
udevをほげほげ
● /etc/udev/rules.d/10-local.rules
● /usr/bin/usbadd
SUBSYSTEMS=="usb",ACTION=="add" 
, ATTRS{serial}=="E6950500FFFF1B8F",
NAME="%k", SYMLINK="hogehoge" 
RUN+="/usr/bin/usbadd"
SUBSYSTEMS=="usb",ACTION=="remove", 
ATTRS{serial}=="E6950500FFFF1B8F",
NAME="%k", SYMLINK="hogehoge" 
RUN+="/usr/bin/usbremove"
#! /usr/bin/perl
use DBI;
open(FILE,">>/tmp/usbplug") or die;
print FILE "--------------", "n";
foreach my $key( keys %ENV ){
print FILE "$key: $ENV{$key}", "n";
}
close(FILE);
udevでほげほげ
●
渡ってくる環境変数 うまくいったようだが・・・
● ・・・何度も繰り返すと内容が違う?
ID_FS_LABEL_SAFE:
ID_BUS: usb
ID_INSTANCE: 0:0
ID_SERIAL: _silicon-power_E6950500FFFF1B8F-0:0
DEVTYPE: partition
SUBSYSTEM: block
ID_FS_VERSION: FAT32
ID_FS_USAGE: filesystem
DEVLINKS: /dev/ohm-mp3 /dev/block/8:193 /dev/disk/by-id/usb-_silicon-power_E6950500FFFF1B8F-0:0-part1 /dev/disk/by-path/platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/953B-4C7E
ID_VENDOR:
DEVPATH: /block/sdm/sdm1
PHYSDEVDRIVER: sd
ID_FS_TYPE: vfat
ID_FS_LABEL_ENC:
UDEV_LOG: 7
DEVNAME: /dev/sdm1
ID_FS_UUID_ENC: 953B-4C7E
MAJOR: 8
ID_FS_LABEL:
UDEVD_EVENT: 1
SEQNUM: 1395
ID_REVISION: PMAP
ID_PATH: platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0
ID_MODEL: silicon-power
ACTION: add
ID_FS_UUID: 953B-4C7E
ID_TYPE: disk
MINOR: 193
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1/2-1:1.0/host26/target26:0:0/26:0:0:0
ID_SERIAL_SHORT: E6950500FFFF1B8F
PHYSDEVBUS: scsi
8回目
ID_FS_LABEL_SAFE:
ID_BUS: usb
ID_INSTANCE: 0:0
ID_SERIAL: _silicon-power_E6950500FFFF1B8F-0:0
DEVTYPE: partition
SUBSYSTEM: block
ID_FS_VERSION: FAT32
ID_FS_USAGE: filesystem
DEVLINKS: /dev/ohm-mp3 /dev/block/8:193 /dev/disk/by-id/usb-_silicon-power_E6950500FFFF1B8F-0:0-part1 /dev/disk/by-path/platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/953B-4C7E
ID_VENDOR:
DEVPATH: /block/sdm/sdm1
PHYSDEVDRIVER: sd
ID_FS_TYPE: vfat
ID_FS_LABEL_ENC:
UDEV_LOG: 7
DEVNAME: /dev/sdm1
ID_FS_UUID_ENC: 953B-4C7E
MAJOR: 8
ID_FS_LABEL:
UDEVD_EVENT: 1
SEQNUM: 1395
ID_REVISION: PMAP
ID_PATH: platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0
ID_MODEL: silicon-power
ACTION: add
ID_FS_UUID: 953B-4C7E
ID_TYPE: disk
MINOR: 193
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1/2-1:1.0/host26/target26:0:0/26:0:0:0
ID_SERIAL_SHORT: E6950500FFFF1B8F
PHYSDEVBUS: scsi
7回目
ID_BUS: usb
ID_INSTANCE: 0:0
ID_SERIAL: _silicon-power_E6950500FFFF1B8F-0:0
DEVTYPE: disk
SUBSYSTEM: block
DEVLINKS: /dev/ohm-mp3 /dev/block/8:192 /dev/disk/by-id/usb-_silicon-power_E6950500FFFF1B8F-0:0 /dev/disk/by-path/platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0
ID_VENDOR:
DEVPATH: /block/sdm
PHYSDEVDRIVER: sd
UDEV_LOG: 7
DEVNAME: /dev/sdm
MAJOR: 8
UDEVD_EVENT: 1
SEQNUM: 1394
ID_REVISION: PMAP
ID_PATH: platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0
ID_MODEL: silicon-power
ACTION: add
ID_TYPE: disk
MINOR: 192
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1/2-1:1.0/host26/target26:0:0/26:0:0:0
ID_SERIAL_SHORT: E6950500FFFF1B8F
PHYSDEVBUS: scsi
6回目
SUBSYSTEM: bsg
UDEV_LOG: 7
DEVLINKS: /dev/ohm-mp3 /dev/char/253:1
DEVNAME: /dev/26:0:0:0
MAJOR: 253
UDEVD_EVENT: 1
DEVPATH: /class/bsg/26:0:0:0
SEQNUM: 1398
PHYSDEVDRIVER: sd
ACTION: add
MINOR: 1
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1/2-1:1.0/host26/target26:0:0/26:0:0:0
PHYSDEVBUS: scsi
4回目
SUBSYSTEM: usb_device
UDEV_LOG: 7
DEVLINKS: /dev/ohm-mp3 /dev/char/189:145
DEVNAME: /dev/usbdev2.18
MAJOR: 189
UDEVD_EVENT: 1
DEVPATH: /class/usb_device/usbdev2.18
SEQNUM: 1389
PHYSDEVDRIVER: usb
ACTION: add
MINOR: 145
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1
PHYSDEVBUS: usb
5回目
SUBSYSTEM: usb_endpoint
UDEV_LOG: 7
DEVLINKS: /dev/ohm-mp3 /dev/char/252:6
DEVNAME: /dev/usbdev2.18_ep00
MAJOR: 252
UDEVD_EVENT: 1
DEVPATH: /class/usb_endpoint/usbdev2.18_ep00
SEQNUM: 1390
PHYSDEVDRIVER: usb
ACTION: add
MINOR: 6
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1
PHYSDEVBUS: usb
3回目
SUBSYSTEM: usb_endpoint
UDEV_LOG: 7
DEVLINKS: /dev/ohm-mp3 /dev/char/252:5
DEVNAME: /dev/usbdev2.18_ep02
MAJOR: 252
UDEVD_EVENT: 1
DEVPATH: /class/usb_endpoint/usbdev2.18_ep02
SEQNUM: 1388
PHYSDEVDRIVER: usb-storage
ACTION: add
MINOR: 5
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1/2-1:1.0
PHYSDEVBUS: usb
2回目
SUBSYSTEM: usb_endpoint
UDEV_LOG: 7
DEVLINKS: /dev/ohm-mp3 /dev/char/252:4
DEVNAME: /dev/usbdev2.18_ep81
MAJOR: 252
UDEVD_EVENT: 1
DEVPATH: /class/usb_endpoint/usbdev2.18_ep81
SEQNUM: 1387
PHYSDEVDRIVER: usb-storage
ACTION: add
MINOR: 4
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1/2-1:1.0
PHYSDEVBUS: usb
1回目
PRODUCT: 13fe/1f23/110
DEVTYPE: usb_device
SUBSYSTEM: usb
DEVLINKS: /dev/ohm-mp3 /dev/char/189:145
DEVPATH: /devices/platform/orion-ehci.1/usb2/2-1
UDEV_LOG: 7
DEVNUM: 018
MAJOR: 189
TYPE: 0/0/0
BUSNUM: 002
DEVNAME: /dev/2-1
DEVICE: /proc/bus/usb/002/018
UDEVD_EVENT: 1
SEQNUM: 1384
ACTION: add
MINOR: 145
PHYSDEVBUS: usb
1度プラグすると8回呼び出されていた
1回にするためには?
● 10-local.rulesに指定を記述
●
どうやって決めるか調査
– # udevadm monitor --env > test
1回プラグインすると30回呼び出されている
1回目
UEVENT[1258010794.164083] add /devices/platform/orion-ehci.1/usb2/2-1 (usb)
ACTION=add
DEVPATH=/devices/platform/orion-ehci.1/usb2/2-1
SUBSYSTEM=usb
MAJOR=189
MINOR=145
DEVTYPE=usb_device
PHYSDEVBUS=usb
・
・
・
1回にするためには?
● 多分、最後のイベントが最後のrules呼び出しに対
応しているものだろう
● ここでこれが出ているということは、rulesが認識するかな?
30 回目
UDEV [1258010808.466678] add /block/sdm/sdm1 (block)
UDEV_LOG=7
ACTION=add
DEVPATH=/block/sdm/sdm1
SUBSYSTEM=block
MAJOR=8
MINOR=193
DEVTYPE=partition
PHYSDEVPATH=/devices/platform/orion-ehci.1/usb2/2-1/2-1:1.0/host26/target26:0:0/26:0:0:0
PHYSDEVBUS=scsi
PHYSDEVDRIVER=sd
SEQNUM=1395
UDEVD_EVENT=1
ID_VENDOR=
ID_MODEL=silicon-power
ID_REVISION=PMAP
ID_SERIAL=_silicon-power_E6950500FFFF1B8F-0:0
ID_SERIAL_SHORT=E6950500FFFF1B8F
ID_TYPE=disk
ID_INSTANCE=0:0
ID_BUS=usb
ID_PATH=platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0
ID_FS_USAGE=filesystem
ID_FS_TYPE=vfat
ID_FS_VERSION=FAT32
ID_FS_UUID=953B-4C7E
ID_FS_UUID_ENC=953B-4C7E
ID_FS_LABEL=
ID_FS_LABEL_ENC=
ID_FS_LABEL_SAFE=
DEVNAME=/dev/sdm1
DEVLINKS=/dev/ohm-mp3 /dev/block/8:193 /dev/disk/by-id/usb-_silicon-power_E6950500FFFF1B8F-0:0-part1 /dev/disk/by-path/platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/953B-4C7E
1回にするためには?
● 10-local.rules
● 結果 1度だけ呼び出され、希望の環境が取得できた
ID_FS_LABEL_SAFE:
ID_BUS: usb
ID_INSTANCE: 0:0
ID_SERIAL: _silicon-power_E6950500FFFF1B8F-0:0
DEVTYPE: partition
SUBSYSTEM: block
ID_FS_VERSION: FAT32
ID_FS_USAGE: filesystem
DEVLINKS: /dev/ohm-mp3 /dev/block/8:209 /dev/disk/by-id/usb-_silicon-power_E6950500FFFF1B8F-0:0-part1 /dev/disk/by-path/platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/953B-4C7E
ID_VENDOR:
DEVPATH: /block/sdn/sdn1
PHYSDEVDRIVER: sd
ID_FS_TYPE: vfat
ID_FS_LABEL_ENC:
UDEV_LOG: 7
DEVNAME: /dev/sdn1
ID_FS_UUID_ENC: 953B-4C7E
MAJOR: 8
ID_FS_LABEL:
UDEVD_EVENT: 1
SEQNUM: 1453
ID_REVISION: PMAP
ID_PATH: platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0
ID_MODEL: silicon-power
ACTION: add
ID_FS_UUID: 953B-4C7E
ID_TYPE: disk
MINOR: 209
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1/2-1:1.0/host28/target28:0:0/28:0:0:0
ID_SERIAL_SHORT: E6950500FFFF1B8F
PHYSDEVBUS: scsi
SUBSYSTEMS=="block",ACTION=="add", KERNEL=="sd*[0-9]",
NAME="%k", SYMLINK="ohm-mp3" 
RUN+="/usr/bin/usbadd"
取り外しをフックするためには?
●
トリガのかけかたが不明
●
とりあえず全部有りにすると・・・
● 1度のリムーブで14個のイベントがひっかかる
●
そこでこのようにしたらうまくいくことがわかった。
ACTION=="remove", 
RUN+="/usr/bin/usbremove"
SUBSYSTEMS=="block",ACTION=="add",
KERNEL=="sd*[0-9]", NAME="%k", 
env{usbstorage}="true", RUN+="/usr/bin/usbadd"
ACTION=="remove",env{usbstorage}=="true", 
RUN+="/usr/bin/usbremove"
取り外しをフックするためには?
●
このように調整して
●
結局この値を取得する事にした
●
ID_FS_LABEL_SAFE:
ID_BUS: usb
ID_INSTANCE: 0:0
ID_SERIAL: _silicon-power_E6950500FFFF1B8F-0:0
usbstorage: true
DEVTYPE: partition
SUBSYSTEM: block
ID_FS_VERSION: FAT32
ID_FS_USAGE: filesystem
DEVLINKS: /dev/block/65:113 /dev/disk/by-id/usb-_silicon-power_E6950500FFFF1B8F-0:0-part1 /dev/disk/by-path/platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/953B-4C7E
ID_VENDOR:
DEVPATH: /block/sdx/sdx1
PHYSDEVDRIVER: sd
ID_FS_TYPE: vfat
ID_FS_LABEL_ENC:
UDEV_LOG: 7
DEVNAME: /dev/sdx1
ID_FS_UUID_ENC: 953B-4C7E
MAJOR: 65
ID_FS_LABEL:
UDEVD_EVENT: 1
SEQNUM: 1752
ID_REVISION: PMAP
ID_PATH: platform-orion-ehci.1-usb-0:1:1.0-scsi-0:0:0:0
ID_MODEL: silicon-power
ACTION: remove
ID_FS_UUID: 953B-4C7E
ID_TYPE: disk
MINOR: 113
PHYSDEVPATH: /devices/platform/orion-ehci.1/usb2/2-1/2-1:1.0/host38/target38:0:0/38:0:0:0
ID_SERIAL_SHORT: E6950500FFFF1B8F
PHYSDEVBUS: scsi
SUBSYSTEMS=="usb",ACTION=="add",
KERNEL=="sd*[0-9]", NAME="%k", 
env{usbstorage}="true", RUN+="/usr/bin/usbadd"
ACTION=="remove",env{usbstorage}=="true", 
RUN+="/usr/bin/usbremove"
ユーザプログラムでは
●
使えそうな環境変数
● ID_INSTANCE: 0:0
● ID_SERIAL: USB_2.0_Flash_Disk_AA04012700007544-0:0
● DEVPATH: /block/sdb/sdb1
● ID_FS_TYPE: vfat
● DEVNAME: /dev/sdb1
● ID_FS_UUID_ENC: 403F-4B1B
● ACTION: add
● ID_FS_UUID: 403F-4B1B
●
ユーザプログラムでは
●
処理に時間がかかってはいけない
●
フォーマットなどは時間がかかる。
●
どうする?
– usbadd → usbadd2 &
– usbremove → usbremove2 &
●
できた!
samba,swat
●
インストールして適当に設定
● mkdir /mnt/share/
● debian:/etc/udev/rules.d# mkdir /mnt/share/ok
● debian:/etc/udev/rules.d# mkdir /mnt/share/ng
● Apt-get install swat (samba,samba-commonもインストールされる)
● /etc/init.d/openbsd-inetd restart
● Swat でアクセス可能に
– /var/squarantine/usbstorages/ … guest ok browseable ok
– /var/squarantine/attention … guest ok browseable ok readonly
– /var/squarantine/responsible … guest no browseable no
– ログファイルサイズを10000(KB)に
sambaとの連携
●
プラグしたら自動でマウント
● debian:/mnt# cat /usr/bin/usbadd
● #! /usr/bin/perl
● open(FILE,">/tmp/usbplug") or die;
● foreach my $key( keys %ENV ){
● print FILE "$key: $ENV{$key}", "n";
● }
● close(FILE);
● system("mkdir /mnt/usbshare1");
● system("mount $ENV{'DEVNAME'} /mnt/usbshare1");
● system("ln -s /mnt/usbshare1 /mnt/share/ok");
●
●
できた!
DBとの連携
● MySQLをインストール
● テーブル media 作成
● プラグしたらmediaを検索し、登録していなかったら
未登録画面が出る
● id int(11) auto_increment |
● id_serial text
● nickname text
● memo text
● flags int(11)
できた!
Webとの連携
● Apache2,PHP,modMySQLをインストール
● Apt-get install php5-mysql mysql-server
● ln -s /var/squarantine/www squarantine
● 未登録USBメモリの登録画面を作る
できた!
0 未登録
1 使用禁止
2 使用停止
4 保留
8 強制フォーマット
16 問合せフォーマット
32 実行ファイル強制削除
64 実行ファイル問合せ削除
128 信頼済(管理者のみ利用)
強制フォーマット
● mkfs.vfatする
● apt-get install dosfstools
できた!
system("mkfs.vfat $ENV{'DEVNAME'} > /dev/null");
system("mkdir -p /mnt$ENV{'DEVNAME'}");
system("mount -o umask=000 $ENV{'DEVNAME'} /var/squarantine/usbstorages/$nickname");
強制削除処理
● Exeファイル等を強制的に削除
● Autorun.infも
● 実行ファイルを含んだZIPファイルも
● # apt-get install libarchive-zip-perl
できた!
use File::Find;
use Archive::Zip;
my $dir = '.';
find( ¥&wanted, ($dir) );
sub wanted {
my $file = $File::Find::name;
if ( $file =~ /.(exe|com|cmd|bat|scr|pif|vbs|vbe|js|jse|wsf|wsh)$/i ){
・
・
・
マニュアル削除処理
print("<h1>このUSBデバイスの消毒を開始します</h1>");
echo $_var["devname"];
?>
<b>以下のボタンを押して開始してください</b>
<form action="regist.php" method="POST">
<input type="submit">
<input type="hidden" name="devname" value="<?php echo $_var["devname"]; ?>">
<input type="hidden" name="id" value="<?php echo $_var["id"]; ?>">
<input type="hidden" name="mode" value="delete">
</form>
print "<h1>消毒中...</h1>";
print "<pre>";
print $_var["devname"]."n";
passthru("sudo mount ".$_var["devname"]." /mnt".$_var["devname"]);
//passthru("sudo mount");
//print "-------------n";
passthru("sudo usbsearchdelete /mnt".$_var["devname"]);
passthru("sudo umount ".$_var["devname"]);
passthru("sudo mount ".$_var["devname"]." /var/squarantine/usbstorages/".$org["nickname"]);
//passthru("sudo mount");
//passthru("sudo echo mount ".$_var["devname"]." /var/squarantine/usbstorages/".$org["nickname"]);
//passthru("echo 123");
//passthru("find /etc -name a*");
print "</pre>";
print "<h2>終了しました</h2>";
● PHPで削除実行ページを作成
●
終了すれば自動マウント
できた!
マニュアルフォーマット処理
●
問い合わせ画面→フォーマット→マウント
できた!
print "<h1>format中...</h1>";
print "<pre>";
passthru("sudo mkfs.vfat ".$_var["devname"]);
passthru("sudo mount ".$_var["devname"]." /var/squarantine/usbstorages/".$org["nickname"]);
passthru("echo sudo mount ".$_var["devname"]." /var/squarantine/usbstorages/".$org["nickname"]);
#passthru("find /etc -name a*");
print "</pre>";
print "<h2>終了しました</h2>";
print "<a href="file:".$conf["SAMBAPATH"]."">こちらからアクセスしてください</a>";
オペレーションレスリムーブ
● syncでマウントすると・・・
● 0.1MB/sec
●
遅い!
● Asyncでマウントして
● 9秒毎にcronでsyncするように設定
– 合間に抜いてしまう事故が発生
● 5秒ごとにsyncするように改善
できた!
sync
sleep 5
sync
sleep 5
sync
sleep 5
sync
sleep 5
sync
sleep 5
sync
sleep 5
sync
sleep 5
sync
sleep 5
sync
sleep 5
sync
sleep 5
sync
sleep 5
sync
sleep 5
* * * * * /etc/squarantine/sync.sh
オペレーションレスリムーブ
●
取り外したら自動でアンマウント
●
できた!
・
・
・
##UNMOUNT##
system("umount ".$ENV{'DEVNAME'});
##MOUNTPOINT DELETE##
my $dbh = DBI->connect("DBI:mysql:squarantine", "****", "****") || die "CONNECT ERROR $DBI::ERRSTR";
my $sth = $dbh->prepare("select nickname,memo,flags from media where id_serial='".$ENV{'ID_SERIAL'}."'");
$sth->execute;
$num_rows = $sth->rows;
for ($i=0; $i<$num_rows; $i++) {
@a = $sth->fetchrow_array;
$nickname = $a[0];
}
$dirname=$nickname;
$dirname =~ s/[<>:*?|"/]//g;
・
・
・
アクセス記録
● sambaのログをそのまま見る
● chmod 755 /var/log/samba
● ln -s /var/log/samba
/var/squarantine/www/sambalog
●
将来はもうちょっと改善を…
オマケ
● Attention共有 (readonly)
●
クライアント初期設定用ファイルを置いておく
– スクリプトファイル
● ローカルでのUSBメモリアクセス禁止
– レジストリファイル
●
自動アップデート
●
ショートカットを配置
– Squarantine へのショートカット
– クライアントのデスクトップに置いておく
将来の課題
● KuroBox は大きいなあ
● Beagleboardあたり
●
隔離機能は?
● CDとかDVDとかは?
●
ウイルススキャンエンジンは?
参考資料
● 会社でのUSBメモリー使用は禁止が基本,
● 代替手段や利用時の選定/運用条件を明確に – 情報漏
えいと戦う現場...:ITpro
● http://itpro.nikkeibp.co.jp/article/COLUMN/2008031
3/296190/
● 「USB メモリを安易にパソコンに接続しないように!
」
● — USB メモリなどの外部記憶媒体からウイルス感染し
ないために!! —
● http://www.ipa.go.jp/security/txt/2007/07outline.html

Squarantine 〜Kuroboxを使ったUSBメモリセキュリティソリューション〜