Пятница. Вспомнился эпизод из сериала, где ФБР врывается в офис, чтобы изьять у Главного героя флешку с секретными файлами, а он судорожно пытается всё стереть на ней.
А что, если решить задачу иначе?
(дисклеймер: всё ниженаписанное - сляпано тяп-ляп, в рамках теоретического решения задачи, и непригодно к продакшену)
Итак, у нас с собой некая флешка, с которой можно загрузиться, и что-то там посмотреть. При этом, информация не должна попасть в посторонние руки - даже если кто-то флешку отнимает. Ну, или по крайней мере это не так просто сделать.
Шифрование? Хорошо, но будет больно, и всё равно данные попадут не в те руки.
Удаление данных? "Лицом в пол, руки за голову!" - не успеете.
Значит, данных на флешке быть вообще не должно. Особенно, если данных много, 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, можно даже подсказку положить, чтобы сами, всё сами...
Но это всё, разумеется, чисто теоретически. Я попробовал - оно работает, так сказать, в лабораторных условиях: до сервера всего лишь несколько сотен километров...
Всем удачных выходных!
