- Linuxを実行するカスタムPC(suse 11、mint 16);
- ユーザーは、USBドライブがルーティングされる端末でリモートで作業します。
- ユーザーには、rdesktop / freerdpを実行する以外のパーソナルコンピューターに対する権限はありません。
タスク:
- USBドライブの接続の事実を監視します。
- USBドライブ上のファイルの記録と変更の事実を追跡します。
必要な後退。 このような従業員の監視の道徳的側面については説明しません。 従業員が熟知している企業標準と企業セキュリティ要件があります。
1. USBデバイスの接続の事実を追跡する
このタスクを達成するために、イベントが発生したときにスクリプトを実行できるudevプロパティを使用しました。 USBデバイスの接続と切断を担当するルールを作成します。
touch /etc/udev/rules.d/usb.rules
usb.rulesファイルの内容:
ACTION=="add", SUBSYSTEM=="block", ENV{ID_BUS}=="usb|mmc|memstick|ieee1394", RUN+="/bin/bash /etc/udev/usb_on.sh %E{ID_SERIAL_SHORT} %E{ID_MODEL} %E{ID_VENDOR}" ACTION=="remove", SUBSYSTEM=="block", ENV{ID_BUS}=="usb|mmc|memstick|ieee1394", RUN+="/bin/bash /etc/udev/usb_off.sh %E{ID_SERIAL_SHORT} %E{ID_MODEL} %E{ID_VENDOR}"
どこで:
- ACTION-監視アクション、追加-デバイス接続、削除-切断。
- ENV-タイプごとの監視対象デバイスのリスト。
- RUN-実行可能なアクション。 この場合、イベントに応じて、usb_on.shおよびusb_off.shスクリプトが実行されます。
スクリプトusb_on.shおよびusb_off.sh udevは、次のデータを渡します。
- %E {ID_SERIAL_SHORT}-USBデバイスのシリアル番号。
- %E {ID_MODEL}-USBデバイスのモデル。
- %E {ID_VENDOR}はUSBデバイスの製造元です。
スクリプトusb_on.sh:
/usr/bin/curl -d "host=$(hostname)&serial=$1&name=$2&vendor=$3&file=on&sub=true" --noproxy 10.0.40.16 http://10.0.40.16/usb/input.php
スクリプトusb_off.sh:
/usr/bin/curl -d "host=$(hostname)&serial=$1&name=$2&vendor=$3&file=off&sub=true" --noproxy 10.0.40.16 http://10.0.40.16/usb/input.php
これらのスクリプトは唯一のアクションを実行します-アドレス10.0.40.16/usb/input.phpに http POSTリクエストを送信します(プロキシサーバーをバイパスしてリクエストを送信するには、 noproxyディレクティブ10.0.40.16が必要です)。 このPOSTリクエストでは、次の変数が渡されます。
- host-コンピューター名はhostnameコマンドの結果です。
- serial-USBデバイスのシリアル番号(%E {ID_SERIAL_SHORT})
- 名前-USBデバイスのモデル(%E {ID_MODEL})
- ベンダー-USBデバイスの製造元(%E {ID_VENDOR})
- ファイルはアクションです。 on-接続、off-切断(file-このファイルで実行されたファイルに関する情報もここに入力されるため、フィールドの名前が選択されます)
- sub = true-Webフォーム上のボタンクリックの模倣。
2.サーバー情報の収集
実行中のスクリプトusb_on.shおよびusb_off.shからわかるように、すべての情報は、単純なWebフォームとリクエストハンドラで構成されるphpスクリプトに転送されます。
<form action="" method="post" enctype="multipart/form-data"> <input type="submit" name="sub" value=""> <input type="text" name="host" maxlength=255 size=100> <input type="text" name="serial" maxlength=255 size=100> <input type="text" name="name" maxlength=255 size=100> <input type="text" name="vendor" maxlength=255 size=100> <textarea id="file" name="file"></textarea> </form>
ハンドラーは1つのことを行います-受信したデータをMySQLデータベースのusbテーブルに追加します
mysql_query("INSERT INTO `usb` (`id`, `date`, `host`, `ip`, `serial`, `name`, `vendor`, `file`) VALUES (NULL, '$time', '$_POST[host]', '$_SERVER[REMOTE_ADDR]', '$_POST[serial]', '$_POST[name]', '$_POST[vendor]', '$_POST[file]')");
テーブル構造:
CREATE TABLE IF NOT EXISTS `usb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date` bigint(20) NOT NULL, `ip` varchar(15) COLLATE utf8_bin NOT NULL, `host` varchar(50) COLLATE utf8_bin NOT NULL, `serial` varchar(100) COLLATE utf8_bin NOT NULL, `name` varchar(100) COLLATE utf8_bin NOT NULL, `vendor` varchar(100) COLLATE utf8_bin NOT NULL, `file` text COLLATE utf8_bin, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
3.ファイル操作の監視
接続されたメディア上のファイルに対して実行された操作を追跡する機能を実行するために、次のスクリプトが作成されました。
touch /var/tmp/usb.check # check=1 while [ $check ] # do if [ -f /var/tmp/usb.check ] # then ACCESS='' # CREATE='' MODIFY='' # , /media , , , , /var/tmp/usb.check ACCESS=`find /media -anewer /var/tmp/usb.check -type f` CREATE=`find /media -cnewer /var/tmp/usb.check -type f` MODIFY=`find /media -newer /var/tmp/usb.check -type f` if [ ! -z "$ACCESS" ] then ACCESS="access "$ACCESS # /usr/bin/curl -d "host=$(hostname)&serial=$2&name=$3&vendor=$4&file=$ACCESS&sub=true" --noproxy 10.0.40.16 http://10.0.40.16/usb/input.php fi if [ ! -z "$CREATE" ] then CREATE="create "$CREATE /usr/bin/curl -d "host=$(hostname)&serial=$2&name=$3&vendor=$4&file=$CREATE&sub=true" --noproxy 10.0.40.16 http://10.0.40.16/usb/input.php fi if [ ! -z "$MODIFY" ] then MODIFY="modify "$MODIFY /usr/bin/curl -d "host=$(hostname)&serial=$2&name=$3&vendor=$4&file=$MODIFY&sub=true" --noproxy 10.0.40.16 http://10.0.40.16/usb/input.php fi fi touch /var/tmp/usb.check # sleep 5 # done
このスクリプトは自動実行に追加され、バックグラウンドで実行されます。
保存された情報を選択するために、指定された期間および選択されたPCのデータベースレコードから選択するphpスクリプトが作成されました。 情報出力の例:
4. PCスプレッド
なぜなら ネットワークには多くのPCがありますが、これを半自動モードで行うことが決定されました。 つまり、ファイルから配布するPCのリストを読み取り、必要なファイルをPCに転送するスクリプトが作成されます。 これは、ユーティリティsshpass(自動パスワード入力用)およびscp(コピー)を使用して行われます。
まず、/ etc / ssh / ssh_configのStrictHostKeyCheckingディレクティブを変更します。
StrictHostKeyChecking no
これは、sshキーが信頼できるリストに自動的に追加されるように行われます。
配布スクリプト自体:
#!/bin/bash while read line; do array[$index]="$line" index=$(($index+1)) done < hosts.conf for ((a=0; a < ${#array[*]}; a++)) do remote=`echo ${array[$a]} | awk '{ print $1 }'` echo "$remote begin"; /usr/bin/sshpass -p "root_password" /usr/bin/scp /home/user/usb_mon/usb.rules admin@$remote:/etc/udev/rules.d/usb.rules /usr/bin/sshpass -p "root_password" /usr/bin/scp /home/user/usb_mon/*.sh admin@$remote:/etc/udev/ /usr/bin/sshpass -p "root_password" /usr/bin/scp /home/user/usb_mon/boot.local admin@$remote:/etc/rc.d/boot.local echo "$remote end"; done
なぜなら 一部のPCの電源がオフになっている可能性があります。スクリプトは、ログへのすべての情報の出力とその後の分析とともに起動されます。
./deploy.sh &> deploy.log &
PS。 今後の計画
改善する必要があるもの:
- POSTリクエストによる情報転送のセキュリティ
- サービスファイル(Thumbs.dbなど)のログを削除します
- アクションが実行されたファイルのシャドウコピー。