Это — продолжение к первой части, его сугубо практически-скриптовое окончание. Напомню, что мы быстро, просто и главное эффективно сооружаем полноценное крипто-хранилище на базе FreeBSD, на котором не стыдно и что-то компрометирующее-чувствительное хранить.
На нашем сервере будет лежать скрипт на языке expect — устанавливаем его из коллекции портов (которую можно поставить с DVD):
cd /usr/ports/lang/expect
make install
Идем в папку /root и делаем файл:
cd /root
vi shd
Вставляем туда такой длинный текст:
#!/usr/local/bin/expect -f set timeout 300 #--------------- # Nastroiki set raz1 ad4s3d set raz2 ad6 set key1 send.doc set key2 ads.txt set dir1 /mnt/1 set dir2 /root/test # direktoria s kluchami na fleshke bez sleshov v nachale i kontse # dlya ukazania korna (/) flashki piwem "" - set usbdir1 "" set usbdir1 tmp/trash set usbdir2 tmp # dalshe ne menyat #--------------- set pass 0000 set v0 0 set v1 0 set v2 0 set v3 0 set v4 5 set v5 0 set v6 1 log_user 0 spawn df expect "da0s\[1-9]" { set usbname $expect_out(0,string) catch {system umount /dev/$usbname}} puts "__________________________________ !!! Vremya dlya otveta na voprosi ogranicheno 5-u minutami!!! __________________________________ Vstavti USB flash s kluchami v Server " while { $v0 eq 0} { spawn ls /dev expect "da0s\[1-9]" { set usbname $expect_out(0,string) set v0 1 puts "__________________________________ USB Flash obnaruzhena" system mount_msdosfs /dev/$usbname /mnt/usb } } spawn ls /mnt/usb$usbdir expect "$key1" {set v1 1} if {$v1 eq 1} { puts "__________________________________ Naiden kluch $key1" spawn df expect "$raz1" {set v3 1} if {$v3 eq 0} { puts "__________________________________ Podkluchaem razdel $raz1" while {$v4 > 0} { puts "__________________________________ Vvedite kluch dlya razdela $raz1 :" expect_user -re "(.*)\n" {set pass $expect_out(0,string) set v6 1 } spawn geli attach -k /mnt/usb/$usbdir1$key1 /dev/$raz1 expect "Enter passphrase:" send "$pass\r" expect "Wrong key" {set v4 [expr $v4-1] set v6 0} if {$v6 eq 0} {puts "!!! Nepravilniy kluch !!! Ostalos popitok $v4" } else {spawn mount /dev/$raz1.eli $dir1 expect "Operation not permitted" {set v6 2} if {$v6 eq 2} {puts "Neobjodima proverka diska pered podklucheniem veroyatno bilo avarionoie otkluchenoe electropitania zhdite okonchaniya___________________________" system fsck -t ufs /dev/$raz1.eli && mount /dev/$raz1.eli $dir1 set v4 0 } else {set v4 0} }} } else {puts "__________________________________ Razdel $raz1 uzhe podkluchen" } } else {puts "__________________________________ !!! Kluch $key1 ne nauden"} set v0 0 set v1 0 set v2 0 set v3 0 set v4 5 set v5 0 set v6 1 spawn ls /mnt/usb/$usbdir expect "$key2" {set v1 1} if {$v1 eq 1} { puts "__________________________________ Naiden kluch $key2" spawn df expect "$raz2" {set v3 1} if {$v3 eq 0} { puts "__________________________________ Podkluchaem razdel $raz2" while {$v4 > 0} { puts "__________________________________ Vvedite kluch dlya razdela $raz2 :" expect_user -re "(.*)\n" { set pass $expect_out(0,string) set v6 1 } spawn geli attach -k /mnt/usb/$usbdir2/$key2 /dev/$raz2 expect "Enter passphrase:" send "$pass\r" expect "Wrong key" {set v4 [expr $v4-1] set v6 0} if {$v6 eq 0} {puts "!!! Nepravilniy kluch !!! Ostalos popitok $v4" } else {spawn mount /dev/$raz2.eli $dir2 expect "Operation not permitted" {set v6 2} if {$v6 eq 2} {puts "Neobjodima proverka diska pered podklucheniem veroyatno bilo avarionoie otkluchenoe electropitania zhdite okonchaniya___________________________" system fsck -t ufs /dev/$raz2.eli && mount /dev/$raz2.eli $dir2 set v4 0 } else {set v4 0} }} } else {puts "__________________________________ Razdel $raz2 uzhe podkluchen" } } else {puts "__________________________________ !!! Kluch $key2 ne nauden"} system umount /dev/$usbname && df -h
Имена, под которыми у вас шифродиски:
set raz1 ad4s3dbr]
set raz2 ad6
Имена ключей соответствующие дискам:
set key1 ad4s3d.key
set key2 ads.txt
Папки куда монтируем диски, они должны быть уже созданы (mkdir) и чтобы сразу раздавать файлы должны быть в папке Samba’ы:
set dir1 /mnt/1
set dir2 /root/test
Папки, где лежат ключ «/» слеш сзади и спереди не ставим:
set usbdir1 tmp/trash
set usbdir2 tmp
Чтобы скрипт запускался его надо сделать исполняемым:
chmod 755 shd
Теперь делаем программу для запуска все операции, на Windows машине создаем папку с в которой создаем файл start.bat:
а в нем такой вот текст:
@echo off
plink.exe -t -ssh 192.168.1.100 -l root -pw expect /root/shd
pause
Даем ему права на исполнение:
chmod 755 shd
Итак, выше в командной строке — IP нашего сервера и строка запуска скрипта shd
. В эту же папку кладем файл plink.exe, качаем его отсюда.
Уже можно пробовать запускаем файл start.bat, так как это первый заход по ssh (ну на чужой машине возможно первый) — создаем ssh-ключи, в следующие разы это не повторится. Сначала вводим пароль админа, потом система пытается подключить 1 usb флешку (в сервере должна быть одна) и ищет там ключи, если находит ключи предлагает ввести пароль, в конце вводит на экран команду df -h
— ниже видно, что подключилось!
Теперь делаем все одним исполняемым файлом, — который, кстати, не содержит ни ключей, ни паролей, а только IP сервера, — в принципе можно его не прятать, но мы его всё-равно пошифруем.
Скачиваем программу BAT to EXE converter: к сожалению, на новые версии программы наложено ограничение — можно запускать результат только на том ПК, на котором он был сделан, так что пользуемся старой версией, скачиваем её например отсюда.
Batch file
— это наш start.bat, галочки как на картинке, во вкладке Include
добавляем plink.exe, во вкладке Versioninfomations
можно выбрать иконку.
Теперь почти всё! Чтобы зашифрованный диск у нас не висел вечно — будем его отключать, пока по расписанию.
Для начала узнаем, какое у нас время:
date
Результат явно опаздывает от реальности:
Tue Sep 6 13:46:45 MSD 2011
Меняем на:
date 201109061703
Tue Sep 6 17:03:00 MSD 2011
Лезем в планировщик (можно так его назвать):
crontab –e
Добавляем строчку, которая отключит шифродиск в 5:17
минут утра каждого дня, правила редактирования такие же как в vi:
17 5 * * * /sbin/umount /dev/ad6.eli && /sbin/geli detach /dev/ad6.eli
Это скрипт, который отключает шифродиски в течение 24 часов при их простое. Скрипт анализирует активность Samba, реагирует на действия с файлами или на открытую сетевую папку — в этом заключается некий побочный эффект: Samba при открытой папке хранит дату её открытия, даже если вы в ней просидите 3 часа дата не изменится, поэтому при закрытии папки и отсутствии другой активности скрипт может резко сработать! Так же скрипт может сработать, если вы только что подключили шифродиски и на сам файл-сервер еще не зашли, а скрипт уже запустился!
Итак, идем в папку /root и делаем файл:
cd /root
vi status_off
Вставляем следующий код:
#!/usr/local/bin/expect -f # Nastroiki # out - 1 chas = 10000 # cmd - "commanda" ili "commanda $ comanda & ... " set out 1000 set cmd "/sbin/umount /dev/ad6.eli && /sbin/geli detach /dev/ad6.eli" #dalshe ne menyat set timeout 300 set date 0 set v1 0 set l 0 set rez 0 set file 0 log_user 0 spawn /bin/date expect "\[0-9]\[0-9]:\[0-9]\[0-9]:\[0-9]\[0-9]" { set date $expect_out(0,string) regsub -all {:} $date {} date } spawn /usr/local/bin/smbstatus -L expect { "\[0-9]\[0-9]:\[0-9]\[0-9]:\[0-9]\[0-9]" { set l $expect_out(0,string) system /bin/echo "$l" >> /root/t.d exit } "No locked files" { if { [catch {set file [open "/root/t.d" r]}]} { } { seek $file -9 end set v1 [read $file 9] regsub -all {:} $v1 {} v1 } } } set rez [expr $date-$v1] if {$rez<0} { set rez [expr ($date+240000)-$v1] } if {$rez>$out} { catch {system $cmd} catch {system /bin/rm /root/t.d} } else {exit}
set cmd "/sbin/umount /dev/ad6.eli && /sbin/geli detach /dev/ad6.eli"
Здесь в кавычках пишем свою команду, которую хотим выполнить, при срабатывание нашего условия, тут две команды объединенные && — это значит, что вторая не начнется пока не кончится первая команда. Чтобы отключить второй диск добавляем в строчку еще такую же команду (с новыми именами), соединяя её с первым блоком & — это значит, что начало исполнения этой команды не зависит от успешного завершения предыдущей.
set out 10000
— максимальное время простоя, значение рассчитывается по формуле out = N часов Х 10000 + N минут X 100 + N секунд
.Даем ему права на исполнение:
chmod 755 status_off
Лезем в планировщик (можно так его назвать):
crontab –e
Добавляем строчку, которая будет запускать скрипт каждые 37 минут, правила редактирования такие же как в vi:
37 * * * * /usr/local/bin/expect -f /root/status_off >> /dev/null 2>&1
~
Ну, вот и всё, пользуйтесь! Теперь, организованно пользуясь (лично или коллективно) подобной файловой свалкой, вы лишаете сейчас кого-то гипотетического права посягнуть на ваши секреты.