Просмотров: 5813

Зашифрованное хранилище - делаем на коленке. Часть 2


Это — продолжение к первой части, его сугубо практически-скриптовое окончание. Напомню, что мы быстро, просто и главное эффективно сооружаем полноценное крипто-хранилище на базе 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 — ниже видно, что подключилось!

freebsd security encrypt шифрование приватность защита код кодировка ключ шифр безопасность доступ шифровка кодирование

Теперь делаем все одним исполняемым файлом, — который, кстати, не содержит ни ключей, ни паролей, а только IP сервера, — в принципе можно его не прятать, но мы его всё-равно пошифруем.

Скачиваем программу BAT to EXE converter: к сожалению, на новые версии программы наложено ограничение — можно запускать результат только на том ПК, на котором он был сделан, так что пользуемся старой версией, скачиваем её например отсюда.

freebsd security encrypt шифрование приватность защита код кодировка ключ шифр безопасность доступ шифровка кодирование

Batch file — это наш start.bat, галочки как на картинке, во вкладке Include добавляем plink.exe, во вкладке Versioninfomations можно выбрать иконку.

1 вариант скрипта отключения

Теперь почти всё! Чтобы зашифрованный диск у нас не висел вечно — будем его отключать, пока по расписанию.

Для начала узнаем, какое у нас время:

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

2 вариант скрипта отключения — продвинутый

Это скрипт, который отключает шифродиски в течение 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

~

Ну, вот и всё, пользуйтесь! Теперь, организованно пользуясь (лично или коллективно) подобной файловой свалкой, вы лишаете сейчас кого-то гипотетического права посягнуть на ваши секреты.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru pikabu.ru blogger.com liveinternet.ru livejournal.ru google.com bobrdobr.ru yandex.ru del.icio.us

Подписка на обновления блога → через RSS, на e-mail, через Twitter
Теги: , , , , , ,
Эта запись опубликована: Четверг, 29 марта 2012 в рубрике Unix'овое.

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Зарегистрировать/комментатор

Для регистрации укажите свой действующий email и пароль. Связка email-пароль позволяет вам комментировать и редактировать данные в вашем персональном аккаунте, такие как адрес сайта, ник и т.п. (Письмо с активацией придет в ящик, указанный при регистрации)

(обязательно)


⇑ Наверх
⇓ Вниз