Пятница. Вспомнился эпизод из сериала, где ФБР врывается в офис, чтобы изьять у Главного героя флешку с секретными файлами, а он судорожно пытается всё стереть на ней.
А что, если решить задачу иначе?
(дисклеймер: всё ниженаписанное - сляпано тяп-ляп, в рамках теоретического решения задачи, и непригодно к продакшену)
Итак, у нас с собой некая флешка, с которой можно загрузиться, и что-то там посмотреть. При этом, информация не должна попасть в посторонние руки - даже если кто-то флешку отнимает. Ну, или по крайней мере это не так просто сделать.
Шифрование? Хорошо, но будет больно, и всё равно данные попадут не в те руки.
Удаление данных? "Лицом в пол, руки за голову!" - не успеете.
Значит, данных на флешке быть вообще не должно. Особенно, если данных много, 100500 секретных файлов с картинками.
Но при этом с ними надо работать, как?
Для начала нам понадобится удаленный сервер, где-то очень далеко. А на этом сервере - ну возьмем, скажем, терабайт данных, не будем жадничать.
Создадим под него место:
fallocate -l 1T bigdata.img
losetup -f --show bigdata.img
/dev/loop1
cryptsetup luksFormat /dev/loop1
cryptsetup open /dev/loop1 xxx
mkfs.ext4 /dev/mapper/xxx
cruptsetup close xxx
losetup -d /dev/loop1То есть, подготовили зашифрованный "диск" с данными. Лежит он далеко и не для всех.
Подключать его будем через ISCSI, для этого настроим раздачу:
apt install tgt
tgt-setup-lun -n games -d /.../bigdata.img 127.0.0.1
cd /etc/tgt/cond.d
tgt-admin --dump > games.confТеперь там в этом файле будет примерно такое:
default-driver iscsi
<target iqn.2001-04.com.server-games>
backing-store /..../bigdata.img
initiator-name 127.0.0.1
</target>
Для того, чтобы не светить эту раздачу на весь интернет - добавим запретов на файрволе:
iptables -A INPUT -p tcp -d 127.0.0.1 --dport 3260 -j ACCEPT
iptables -A INPUT -p tcp --dport 3260 -j REJECT --reject-with tcp-resetИ заодно можно внести эти правила куда-нибудь в /etc/rc.local, чтобы они точно применились при перезагрузке.
Теперь создаем двух юзеров:
adduser guest
adduser ghost
chown ghost:ghost /.../bigdata.imgи два скрипта:
vim /usr/local/bin/idle
-------
#!/bin/sh
trap "exit 0" INT
while true; do
sleep 1000;
done
-------
chmod 755 /usr/local/bin/idle
usermod -s /usr/local/bin/idle guest
vim /usr/local/bin/datakiller
-------
#!/bin/sh
export PATH=/usr/bin
nohup dd if=/dev/urandom of=/.../bigdata.img BS=10M count=100000 &
-------
chmod 755 /usr/local/bin/datakiller
usermod -s /usr/local/bin/datakiller ghost
Первый скрипт не делает ничего, только висит и ждет Ctrl-C, его назначаем шеллом юзеру guest,
второй скрипт затирает диск с данными мусором, работая в фоне, его назначаем шеллом юзеру ghost.
И вот теперь, наконец, переходим к загрузочной флешке.
Флешка должна загружаться - это как минимум, и чем меньше на ней будет всего - тем лучше. Терабайт, конечно же, не нужен.
На нее необходимо установить базовые программы:
apt install open-iscsi cryptsetupЧтобы не оставить лишних следов - запрещаем сохранение истории для юзера, а лучше и для рута тоже:
vim ~/.profile
---------
.....
HISTFILE=/dev/null
HISTSIZE=0
HISTFILESIZE=0
unset HISTCONTROL
---------Теперь не будет сохраняться, что там кто вводил.
Настраиваем подключение - запускаем в терминале такую конструкцию:
ssh -L 127.0.0.1:3260:127.0.0.1:3260 guest@serverЭта команда пробрасывает подключение к локальному порту на удаленный сервер, где на этом же порту слушает tgtd.
Запускать можно от обычного пользователя.
Запрет на сохранение истории нужен как раз для того, чтобы спрятать лишний раз guest@server
Теперь, не завершая ее, открываем во втором терминале (другое окно или Ctrl-Alt-F2) консоль рута, и ищем тагеты:
iscsiadm -m discovery -t st -p 127.0.0.1
127.0.0.1:3260,1 iqn.2001-04.com.server-games
iscsiadm -m node -l -T iqn.2001-04.com.server-games
... successfull
ls /dev/disk/by-path/ip-*
/dev/disk/by-path/ip-127.0.0.1\:3260-iscsi-iqn.2001-04.com.server-games-lun1
cryptsetup open /dev/disk/by-path/ip-127.0.0.1\:3260-iscsi-iqn.2001-04.com.server-games-lun1 xxx
mount /dev/mapper/xxx /mnt
cd /mnt
tar cf - /usr/* | tar xf -
tar cf - /home/* | tar xf -
mount -o bind /mnt/usr /usr
mount -o bind /mnt/home /home
И вот у нас "на флешке" целый терабайт места.
Точнее, в /home и /usr, но можно точно так же добавить еще и /var c /etc
Осталось записать это в скрипт:
#!/bin/sh
iscsiadm -m node -l -T iqn.2001-04.com.server-games
cryptsetup open /dev/disk/by-path/ip-127.0.0.1\:3260-iscsi-iqn.2001-04.com.server-games-lun1 xxx
mount /dev/mapper/xxx /mnt
mount -o bind /mnt/usr /usr
mount -o bind /mnt/home /home
Который нужно выполнять после подключения первого скрипта, с SSH.
Теперь на флешку можно устанавливать что угодно: DE, Гном или Кеды, хранить гигабайты документов и так далее - всё это будет на удаленном сервере, вопрос лишь в качестве связи с ним.
Доступно будет на любом компьтере, на котором удалось загрузиться с флешки, ввести ssh-команду и потом скрипт коннекта.
Если какие-то нехорошие люди захотят это похитить - достаточно выдернуть флешку из компьютера, и она обнулится, ведь без подключенного диска она фактически пустая.
А для диска нужен пароль ssh и пароль luks.
Если они очень настойчивые - у нас есть юзер ghost, можно даже подсказку положить, чтобы сами, всё сами...
Но это всё, разумеется, чисто теоретически. Я попробовал - оно работает, так сказать, в лабораторных условиях: до сервера всего лишь несколько сотен километров...
Всем удачных выходных!
