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}"
      
      





どこで:



スクリプトusb_on.shおよびusb_off.sh udevは、次のデータを渡します。





スクリプト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リクエストでは、次の変数が渡されます。





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。 今後の計画


改善する必要があるもの:




All Articles